diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 400efa9..36e5c67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,19 +14,52 @@ importers: prompts: dependencies: + '@aws-sdk/client-s3': + specifier: ^3.965.0 + version: 3.965.0 + '@kevisual/logger': + specifier: ^0.0.4 + version: 0.0.4 + '@kevisual/notifier': + specifier: ^0.0.2 + version: 0.0.2 + '@kevisual/router': + specifier: ^0.0.52 + version: 0.0.52 + bullmq: + specifier: ^5.66.4 + version: 5.66.4 es-toolkit: specifier: ^1.43.0 version: 1.43.0 + eventemitter3: + specifier: ^5.0.1 + version: 5.0.1 + ioredis: + specifier: ^5.9.0 + version: 5.9.0 nanoid: specifier: ^5.1.6 version: 5.1.6 + pocketbase: + specifier: ^0.26.5 + version: 0.26.5 unstorage: specifier: ^1.17.3 - version: 1.17.3 + version: 1.17.3(ioredis@5.9.0) devDependencies: '@kevisual/ai': specifier: ^0.0.19 version: 0.0.19 + '@kevisual/context': + specifier: ^0.0.4 + version: 0.0.4 + '@kevisual/oss': + specifier: ^0.0.16 + version: 0.0.16 + '@kevisual/query': + specifier: ^0.0.35 + version: 0.0.35 '@kevisual/types': specifier: ^0.0.10 version: 0.0.10 @@ -42,21 +75,205 @@ importers: packages: + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-s3@3.965.0': + resolution: {integrity: sha512-BTeaaU1iK0BfatTCrtYjNkIHCoZH256qOI18l9bK4z6mVOgpHkYN4RvOu+NnKgyX58n+HWfOuhtKUD4OE33Vdw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.965.0': + resolution: {integrity: sha512-iv2tr+n4aZ+nPUFFvG00hISPuEd4DU+1/Q8rPAYKXsM+vEPJ2nAnP5duUOa2fbOLIUCRxX3dcQaQaghVHDHzQw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.965.0': + resolution: {integrity: sha512-aq9BhQxdHit8UUJ9C0im9TtuKeK0pT6NXmNJxMTCFeStI7GG7ImIsSislg3BZTIifVg1P6VLdzMyz9de85iutQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/crc64-nvme@3.965.0': + resolution: {integrity: sha512-9FbIyJ/Zz1AdEIrb0+Pn7wRi+F/0Y566ooepg0hDyHUzRV3ZXKjOlu3wJH3YwTz2UkdwQmldfUos2yDJps7RyA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.965.0': + resolution: {integrity: sha512-mdGnaIjMxTIjsb70dEj3VsWPWpoq1V5MWzBSfJq2H8zgMBXjn6d5/qHP8HMf53l9PrsgqzMpXGv3Av549A2x1g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.965.0': + resolution: {integrity: sha512-YuGQel9EgA/z25oeLM+GYYQS750+8AESvr7ZEmVnRPL0sg+K3DmGqdv+9gFjFd0UkLjTlC/jtbP2cuY6UcPiHQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.965.0': + resolution: {integrity: sha512-xRo72Prer5s0xYVSCxCymVIRSqrVlevK5cmU0GWq9yJtaBNpnx02jwdJg80t/Ni7pgbkQyFWRMcq38c1tc6M/w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-login@3.965.0': + resolution: {integrity: sha512-43/H8Qku8LHyugbhLo8kjD+eauhybCeVkmrnvWl8bXNHJP7xi1jCdtBQJKKJqiIHZws4MOEwkji8kFdAVRCe6g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.965.0': + resolution: {integrity: sha512-cRxmMHF+Zh2lkkkEVduKl+8OQdtg/DhYA69+/7SPSQURlgyjFQGlRQ58B7q8abuNlrGT3sV+UzeOylZpJbV61Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.965.0': + resolution: {integrity: sha512-gmkPmdiR0yxnTzLPDb7rwrDhGuCUjtgnj8qWP+m0gSz/W43rR4jRPVEf6DUX2iC+ImQhxo3NFhuB3V42Kzo3TQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.965.0': + resolution: {integrity: sha512-N01AYvtCqG3Wo/s/LvYt19ity18/FqggiXT+elAs3X9Om/Wfx+hw9G+i7jaDmy+/xewmv8AdQ2SK5Q30dXw/Fw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.965.0': + resolution: {integrity: sha512-T4gMZ2JzXnfxe1oTD+EDGLSxFfk1+WkLZdiHXEMZp8bFI1swP/3YyDFXI+Ib9Uq1JhnAmrCXtOnkicKEhDkdhQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-bucket-endpoint@3.965.0': + resolution: {integrity: sha512-gbdv3Dl8l8xmg4oH60fXvfDyTxfx28w5/Hxdymx3vurM07tAyd4qld8zEXejnSpraTo45QcHRtk5auELIMfeag==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-expect-continue@3.965.0': + resolution: {integrity: sha512-UBxVytsmhEmFwkBnt+aV0eAJ7uc+ouNokCqMBrQ7Oc5A77qhlcHfOgXIKz2SxqsiYTsDq+a0lWFM/XpyRWraqA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.965.0': + resolution: {integrity: sha512-5rzEW08trcpHMe6jkQyYc4PL1KG/H7BbnySFSzhih+r/gktQEiE36sb1BNf7av9I0Vk2Ccmt7wocB5PIT7GDkQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.965.0': + resolution: {integrity: sha512-SfpSYqoPOAmdb3DBsnNsZ0vix+1VAtkUkzXM79JL3R5IfacpyKE2zytOgVAQx/FjhhlpSTwuXd+LRhUEVb3MaA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-location-constraint@3.965.0': + resolution: {integrity: sha512-07T1rwAarQs33mVg5U28AsSdLB5JUXu9yBTBmspFGajKVsEahIyntf53j9mAXF1N2KR0bNdP0J4A0kst4t43UQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.965.0': + resolution: {integrity: sha512-gjUvJRZT1bUABKewnvkj51LAynFrfz2h5DYAg5/2F4Utx6UOGByTSr9Rq8JCLbURvvzAbCtcMkkIJRxw+8Zuzw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.965.0': + resolution: {integrity: sha512-6dvD+18Ni14KCRu+tfEoNxq1sIGVp9tvoZDZ7aMvpnA7mDXuRLrOjRQ/TAZqXwr9ENKVGyxcPl0cRK8jk1YWjA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.965.0': + resolution: {integrity: sha512-dXEgnojaaVRl+OlOx35mg3rYEbfffIN4X6tLmIfDnaKz0hMaDMvsE9jJXb/vBvokbdO1sVB27/2FEM4ttLSLnw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-ssec@3.965.0': + resolution: {integrity: sha512-dke++CTw26y+a2D1DdVuZ4+2TkgItdx6TeuE0zOl4lsqXGvTBUG4eaIZalt7ZOAW5ys2pbDOk1bPuh4opoD3pQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.965.0': + resolution: {integrity: sha512-RBEYVGgu/WeAt+H/qLrGc+t8LqAUkbyvh3wBfTiuAD+uBcWsKnvnB1iSBX75FearC0fmoxzXRUc0PMxMdqpjJQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.965.0': + resolution: {integrity: sha512-muNVUjUEU+/KLFrLzQ8PMXyw4+a/MP6t4GIvwLtyx/kH0rpSy5s0YmqacMXheuIe6F/5QT8uksXGNAQenitkGQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.965.0': + resolution: {integrity: sha512-RoMhu9ly2B0coxn8ctXosPP2WmDD0MkQlZGLjoYHQUOCBmty5qmCxOqBmBDa6wbWbB8xKtMQ/4VXloQOgzjHXg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.965.0': + resolution: {integrity: sha512-hgbAThbsUrWtNpFBQxzXevIfd5Qgr4TLbXY1AIbmpSX9fPVC114pdieRMpopJ0fYaJ7v5/blTiS6wzVdXleZ/w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.965.0': + resolution: {integrity: sha512-aR0qxg0b8flkXJVE+CM1gzo7uJ57md50z2eyCwofC0QIz5Y0P7/7vvb9/dmUQt6eT9XRN5iRcUqq2IVxVDvJOw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.965.0': + resolution: {integrity: sha512-jvodoJdMavvg8faN7co58vVJRO5MVep4JFPRzUNCzpJ98BDqWDk/ad045aMJcmxkLzYLS2UAnUmqjJ/tUPNlzQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-arn-parser@3.965.0': + resolution: {integrity: sha512-bNGKr5Tct28jGLkL8xIkGu7swpDgBpkTVbGaofhzr/X80iclbOv656RGxhMpDvmc4S9UuQnqLRXyceNFNF2V7Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.965.0': + resolution: {integrity: sha512-WqSCB0XIsGUwZWvrYkuoofi2vzoVHqyeJ2kN+WyoOsxPLTiQSBIoqm/01R/qJvoxwK/gOOF7su9i84Vw2NQQpQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-locate-window@3.965.0': + resolution: {integrity: sha512-9LJFand4bIoOjOF4x3wx0UZYiFZRo4oUauxQSiEX2dVg+5qeBOJSjp2SeWykIE6+6frCZ5wvWm2fGLK8D32aJw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-user-agent-browser@3.965.0': + resolution: {integrity: sha512-Xiza/zMntQGpkd2dETQeAK8So1pg5+STTzpcdGWxj5q0jGO5ayjqT/q1Q7BrsX5KIr6PvRkl9/V7lLCv04wGjQ==} + + '@aws-sdk/util-user-agent-node@3.965.0': + resolution: {integrity: sha512-kokIHUfNT3/P55E4fUJJrFHuuA9BbjFKUIxoLrd3UaRfdafT0ScRfg2eaZie6arf60EuhlUIZH0yALxttMEjxQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.965.0': + resolution: {integrity: sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.2.2': + resolution: {integrity: sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==} + engines: {node: '>=18.0.0'} + + '@ioredis/commands@1.4.0': + resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} + + '@ioredis/commands@1.5.0': + resolution: {integrity: sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==} + '@kevisual/ai@0.0.19': resolution: {integrity: sha512-AFc8m6OcHZNxCb88bvzhvwWTZ4EVYyPupBzPUsLKLpdNBvsqm9TRboKCM2brJj2cqHnm+H+RbAk9AcGJkYhRCA==} + '@kevisual/context@0.0.4': + resolution: {integrity: sha512-HJeLeZQLU+7tCluSfOyvkgKLs0HjCZrdJlZgEgKRSa8XTwZfMAUt6J7qZTbrZAHBlPtX68EPu/PI8JMCeu3WAQ==} + '@kevisual/load@0.0.6': resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==} '@kevisual/logger@0.0.4': resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==} + '@kevisual/notifier@0.0.2': + resolution: {integrity: sha512-vMppLDxX3GSsXOX1qODlF0sMzZbbup5uzuYSqeURBvuu94y4w6MMaQk9SjaQfTU9yPnFuOFJZQujzlgtGFcCOQ==} + + '@kevisual/oss@0.0.16': + resolution: {integrity: sha512-kGnXySE4h8jcGrywL1RZWhOXzN3jyO8WVsX4W4zaFbfotH/zD9nIe8OfUS6a6Jci0ZL14OmDzoyaCLWHzHy0Lg==} + '@kevisual/permission@0.0.3': resolution: {integrity: sha512-8JsA/5O5Ax/z+M+MYpFYdlioHE6jNmWMuFSokBWYs9CCAHNiSKMR01YLkoVDoPvncfH/Y8F5K/IEXRCbptuMNA==} '@kevisual/query@0.0.31': resolution: {integrity: sha512-bBdepjmMICLpcj/a9fnn82/0CGGYUZiCV+usWsJZKAwVlZcnj+WtKmbgKT09KpP6g3jjYzYOaXHiNFB8N0bQAQ==} + '@kevisual/query@0.0.35': + resolution: {integrity: sha512-80dyy2LMCmEC72g+X4QWUKlZErhawQPgnGSBNR4yhrBcFgHIJQ14LR1Z+bS5S1I7db+1PDNpaxBTjIaoYoXunw==} + + '@kevisual/router@0.0.52': + resolution: {integrity: sha512-Qiv3P1XjzD813Tm79S+atrDb2eickGCI9tuy/aCu512LcoYYJqZhwwkeT4ES0DinnA13Ckqd43QWBR6UmuYkHQ==} + '@kevisual/types@0.0.10': resolution: {integrity: sha512-Q73uzzjk9UidumnmCvOpgzqDDvQxsblz22bIFuoiioUFJWwaparx8bpd8ArRyFojicYL1YJoFDzDZ9j9NN8grA==} @@ -65,6 +282,290 @@ packages: peerDependencies: dotenv: ^17 + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@peculiar/asn1-cms@2.6.0': + resolution: {integrity: sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==} + + '@peculiar/asn1-csr@2.6.0': + resolution: {integrity: sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==} + + '@peculiar/asn1-ecc@2.6.0': + resolution: {integrity: sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==} + + '@peculiar/asn1-pfx@2.6.0': + resolution: {integrity: sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==} + + '@peculiar/asn1-pkcs8@2.6.0': + resolution: {integrity: sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==} + + '@peculiar/asn1-pkcs9@2.6.0': + resolution: {integrity: sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==} + + '@peculiar/asn1-rsa@2.6.0': + resolution: {integrity: sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==} + + '@peculiar/asn1-schema@2.6.0': + resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} + + '@peculiar/asn1-x509-attr@2.6.0': + resolution: {integrity: sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==} + + '@peculiar/asn1-x509@2.6.0': + resolution: {integrity: sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==} + + '@peculiar/x509@1.14.2': + resolution: {integrity: sha512-r2w1Hg6pODDs0zfAKHkSS5HLkOLSeburtcgwvlLLWWCixw+MmW3U6kD5ddyvc2Y2YdbGuVwCF2S2ASoU1cFAag==} + engines: {node: '>=22.0.0'} + + '@smithy/abort-controller@4.2.7': + resolution: {integrity: sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.2.1': + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.2.0': + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.5': + resolution: {integrity: sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.20.1': + resolution: {integrity: sha512-wOboSEdQ85dbKAJ0zL+wQ6b0HTSBRhtGa0PYKysQXkRg+vK0tdCRRVruiFM2QMprkOQwSYOnwF4og96PAaEGag==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.7': + resolution: {integrity: sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.7': + resolution: {integrity: sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.7': + resolution: {integrity: sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.7': + resolution: {integrity: sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.7': + resolution: {integrity: sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.7': + resolution: {integrity: sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.8': + resolution: {integrity: sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.2.8': + resolution: {integrity: sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.7': + resolution: {integrity: sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.2.7': + resolution: {integrity: sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.7': + resolution: {integrity: sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/md5-js@4.2.7': + resolution: {integrity: sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.7': + resolution: {integrity: sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.4.2': + resolution: {integrity: sha512-mqpAdux0BNmZu/SqkFhQEnod4fX23xxTvU2LUpmKp0JpSI+kPYCiHJMmzREr8yxbNxKL2/DU1UZm9i++ayU+2g==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.18': + resolution: {integrity: sha512-E5hulijA59nBk/zvcwVMaS7FG7Y4l6hWA9vrW018r+8kiZef4/ETQaPI4oY+3zsy9f6KqDv3c4VKtO4DwwgpCg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.8': + resolution: {integrity: sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.7': + resolution: {integrity: sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.7': + resolution: {integrity: sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.7': + resolution: {integrity: sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.7': + resolution: {integrity: sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.7': + resolution: {integrity: sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.7': + resolution: {integrity: sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.7': + resolution: {integrity: sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.7': + resolution: {integrity: sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.2': + resolution: {integrity: sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.7': + resolution: {integrity: sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.10.3': + resolution: {integrity: sha512-EfECiO/0fAfb590LBnUe7rI5ux7XfquQ8LBzTe7gxw0j9QW/q8UT/EHWHlxV/+jhQ3+Ssga9uUYXCQgImGMbNg==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.11.0': + resolution: {integrity: sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.7': + resolution: {integrity: sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.17': + resolution: {integrity: sha512-dwN4GmivYF1QphnP3xJESXKtHvkkvKHSZI8GrSKMVoENVSKW2cFPRYC4ZgstYjUHdR3zwaDkIaTDIp26JuY7Cw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.20': + resolution: {integrity: sha512-VD/I4AEhF1lpB3B//pmOIMBNLMrtdMXwy9yCOfa2QkJGDr63vH3RqPbSAKzoGMov3iryCxTXCxSsyGmEB8PDpg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.7': + resolution: {integrity: sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.7': + resolution: {integrity: sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.7': + resolution: {integrity: sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.8': + resolution: {integrity: sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.7': + resolution: {integrity: sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + '@types/bun@1.3.5': resolution: {integrity: sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w==} @@ -75,52 +576,170 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + asn1js@3.0.7: + resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} + engines: {node: '>=12.0.0'} + + bowser@2.13.1: + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + + bullmq@5.66.4: + resolution: {integrity: sha512-y2VRk2z7d1YNI2JQDD7iThoD0X/0iZZ3VEp8lqT5s5U0XDl9CIjXp1LQgmE9EKy6ReHtzmYXS1f328PnUbZGtQ==} + bun-types@1.3.5: resolution: {integrity: sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw==} + bytestreamjs@2.0.1: + resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} + engines: {node: '>=6.0.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + dotenv@17.2.3: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + es-toolkit@1.43.0: resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ioredis@5.8.2: + resolution: {integrity: sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==} + engines: {node: '>=12.22.0'} + + ioredis@5.9.0: + resolution: {integrity: sha512-T3VieIilNumOJCXI9SDgo4NnF6sZkd6XcmPi6qWtw4xqbt8nNz/ZVNiIH1L9puMTSHZh1mUWA4xKa2nWPF4NwQ==} + engines: {node: '>=12.22.0'} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.5: + resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} + nanoid@5.1.6: resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} @@ -131,17 +750,93 @@ packages: ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pkijs@3.3.3: + resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} + engines: {node: '>=16.0.0'} + + pocketbase@0.26.5: + resolution: {integrity: sha512-SXcq+sRvVpNxfLxPB1C+8eRatL7ZY4o3EVl/0OdE3MeR9fhPyZt0nmmxLqYmkLvXCN9qp3lXWV/0EUYb3MmMXQ==} + + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + selfsigned@5.4.0: + resolution: {integrity: sha512-Yn8qZOOJv+NhcGY19iC+ngW6hlUCNpvWEkrKllXNhmkLgR9fcErm8EqZ/wev7/tiwjKC9qj17Fa/PtBNzb6q8g==} + engines: {node: '>=15.6.0'} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + ufo@1.6.2: resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} @@ -213,24 +908,539 @@ packages: uploadthing: optional: true + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + snapshots: + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.965.0 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.965.0 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-locate-window': 3.965.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-locate-window': 3.965.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.965.0 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-s3@3.965.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.965.0 + '@aws-sdk/credential-provider-node': 3.965.0 + '@aws-sdk/middleware-bucket-endpoint': 3.965.0 + '@aws-sdk/middleware-expect-continue': 3.965.0 + '@aws-sdk/middleware-flexible-checksums': 3.965.0 + '@aws-sdk/middleware-host-header': 3.965.0 + '@aws-sdk/middleware-location-constraint': 3.965.0 + '@aws-sdk/middleware-logger': 3.965.0 + '@aws-sdk/middleware-recursion-detection': 3.965.0 + '@aws-sdk/middleware-sdk-s3': 3.965.0 + '@aws-sdk/middleware-ssec': 3.965.0 + '@aws-sdk/middleware-user-agent': 3.965.0 + '@aws-sdk/region-config-resolver': 3.965.0 + '@aws-sdk/signature-v4-multi-region': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@aws-sdk/util-user-agent-browser': 3.965.0 + '@aws-sdk/util-user-agent-node': 3.965.0 + '@smithy/config-resolver': 4.4.5 + '@smithy/core': 3.20.1 + '@smithy/eventstream-serde-browser': 4.2.7 + '@smithy/eventstream-serde-config-resolver': 4.3.7 + '@smithy/eventstream-serde-node': 4.2.7 + '@smithy/fetch-http-handler': 5.3.8 + '@smithy/hash-blob-browser': 4.2.8 + '@smithy/hash-node': 4.2.7 + '@smithy/hash-stream-node': 4.2.7 + '@smithy/invalid-dependency': 4.2.7 + '@smithy/md5-js': 4.2.7 + '@smithy/middleware-content-length': 4.2.7 + '@smithy/middleware-endpoint': 4.4.2 + '@smithy/middleware-retry': 4.4.18 + '@smithy/middleware-serde': 4.2.8 + '@smithy/middleware-stack': 4.2.7 + '@smithy/node-config-provider': 4.3.7 + '@smithy/node-http-handler': 4.4.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + '@smithy/url-parser': 4.2.7 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.17 + '@smithy/util-defaults-mode-node': 4.2.20 + '@smithy/util-endpoints': 3.2.7 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-retry': 4.2.7 + '@smithy/util-stream': 4.5.8 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.7 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.965.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.965.0 + '@aws-sdk/middleware-host-header': 3.965.0 + '@aws-sdk/middleware-logger': 3.965.0 + '@aws-sdk/middleware-recursion-detection': 3.965.0 + '@aws-sdk/middleware-user-agent': 3.965.0 + '@aws-sdk/region-config-resolver': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@aws-sdk/util-user-agent-browser': 3.965.0 + '@aws-sdk/util-user-agent-node': 3.965.0 + '@smithy/config-resolver': 4.4.5 + '@smithy/core': 3.20.1 + '@smithy/fetch-http-handler': 5.3.8 + '@smithy/hash-node': 4.2.7 + '@smithy/invalid-dependency': 4.2.7 + '@smithy/middleware-content-length': 4.2.7 + '@smithy/middleware-endpoint': 4.4.2 + '@smithy/middleware-retry': 4.4.18 + '@smithy/middleware-serde': 4.2.8 + '@smithy/middleware-stack': 4.2.7 + '@smithy/node-config-provider': 4.3.7 + '@smithy/node-http-handler': 4.4.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + '@smithy/url-parser': 4.2.7 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.17 + '@smithy/util-defaults-mode-node': 4.2.20 + '@smithy/util-endpoints': 3.2.7 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-retry': 4.2.7 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@aws-sdk/xml-builder': 3.965.0 + '@smithy/core': 3.20.1 + '@smithy/node-config-provider': 4.3.7 + '@smithy/property-provider': 4.2.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/signature-v4': 5.3.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/crc64-nvme@3.965.0': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/fetch-http-handler': 5.3.8 + '@smithy/node-http-handler': 4.4.7 + '@smithy/property-provider': 4.2.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + '@smithy/util-stream': 4.5.8 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/credential-provider-env': 3.965.0 + '@aws-sdk/credential-provider-http': 3.965.0 + '@aws-sdk/credential-provider-login': 3.965.0 + '@aws-sdk/credential-provider-process': 3.965.0 + '@aws-sdk/credential-provider-sso': 3.965.0 + '@aws-sdk/credential-provider-web-identity': 3.965.0 + '@aws-sdk/nested-clients': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/credential-provider-imds': 4.2.7 + '@smithy/property-provider': 4.2.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/nested-clients': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.965.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.965.0 + '@aws-sdk/credential-provider-http': 3.965.0 + '@aws-sdk/credential-provider-ini': 3.965.0 + '@aws-sdk/credential-provider-process': 3.965.0 + '@aws-sdk/credential-provider-sso': 3.965.0 + '@aws-sdk/credential-provider-web-identity': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/credential-provider-imds': 4.2.7 + '@smithy/property-provider': 4.2.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.965.0': + dependencies: + '@aws-sdk/client-sso': 3.965.0 + '@aws-sdk/core': 3.965.0 + '@aws-sdk/token-providers': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/nested-clients': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-bucket-endpoint@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-arn-parser': 3.965.0 + '@smithy/node-config-provider': 4.3.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + '@smithy/util-config-provider': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.965.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.965.0 + '@aws-sdk/crc64-nvme': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-stream': 4.5.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@aws/lambda-invoke-store': 0.2.2 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-arn-parser': 3.965.0 + '@smithy/core': 3.20.1 + '@smithy/node-config-provider': 4.3.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/signature-v4': 5.3.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-stream': 4.5.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@smithy/core': 3.20.1 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.965.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.965.0 + '@aws-sdk/middleware-host-header': 3.965.0 + '@aws-sdk/middleware-logger': 3.965.0 + '@aws-sdk/middleware-recursion-detection': 3.965.0 + '@aws-sdk/middleware-user-agent': 3.965.0 + '@aws-sdk/region-config-resolver': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@aws-sdk/util-user-agent-browser': 3.965.0 + '@aws-sdk/util-user-agent-node': 3.965.0 + '@smithy/config-resolver': 4.4.5 + '@smithy/core': 3.20.1 + '@smithy/fetch-http-handler': 5.3.8 + '@smithy/hash-node': 4.2.7 + '@smithy/invalid-dependency': 4.2.7 + '@smithy/middleware-content-length': 4.2.7 + '@smithy/middleware-endpoint': 4.4.2 + '@smithy/middleware-retry': 4.4.18 + '@smithy/middleware-serde': 4.2.8 + '@smithy/middleware-stack': 4.2.7 + '@smithy/node-config-provider': 4.3.7 + '@smithy/node-http-handler': 4.4.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + '@smithy/url-parser': 4.2.7 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.17 + '@smithy/util-defaults-mode-node': 4.2.20 + '@smithy/util-endpoints': 3.2.7 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-retry': 4.2.7 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/config-resolver': 4.4.5 + '@smithy/node-config-provider': 4.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.965.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/protocol-http': 5.3.7 + '@smithy/signature-v4': 5.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.965.0': + dependencies: + '@aws-sdk/core': 3.965.0 + '@aws-sdk/nested-clients': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.965.0': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.965.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.11.0 + '@smithy/url-parser': 4.2.7 + '@smithy/util-endpoints': 3.2.7 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.965.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.11.0 + bowser: 2.13.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.965.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@smithy/node-config-provider': 4.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.965.0': + dependencies: + '@smithy/types': 4.11.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.2': {} + + '@ioredis/commands@1.4.0': {} + + '@ioredis/commands@1.5.0': {} + '@kevisual/ai@0.0.19': dependencies: '@kevisual/logger': 0.0.4 '@kevisual/permission': 0.0.3 '@kevisual/query': 0.0.31 + '@kevisual/context@0.0.4': {} + '@kevisual/load@0.0.6': dependencies: eventemitter3: 5.0.1 '@kevisual/logger@0.0.4': {} + '@kevisual/notifier@0.0.2': + dependencies: + dayjs: 1.11.19 + es-toolkit: 1.43.0 + + '@kevisual/oss@0.0.16': {} + '@kevisual/permission@0.0.3': {} '@kevisual/query@0.0.31': {} + '@kevisual/query@0.0.35': + dependencies: + tslib: 2.8.1 + + '@kevisual/router@0.0.52': + dependencies: + eventemitter3: 5.0.1 + path-to-regexp: 8.3.0 + selfsigned: 5.4.0 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + '@kevisual/types@0.0.10': {} '@kevisual/use-config@1.0.21(dotenv@17.2.3)': @@ -238,6 +1448,454 @@ snapshots: '@kevisual/load': 0.0.6 dotenv: 17.2.3 + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@noble/hashes@1.4.0': {} + + '@peculiar/asn1-cms@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-csr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pfx@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs8@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs9@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pfx': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.6.0': + dependencies: + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509-attr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/x509@1.14.2': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-csr': 2.6.0 + '@peculiar/asn1-ecc': 2.6.0 + '@peculiar/asn1-pkcs9': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + pvtsutils: 1.3.6 + reflect-metadata: 0.2.2 + tslib: 2.8.1 + tsyringe: 4.10.0 + + '@smithy/abort-controller@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.2.1': + dependencies: + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.5': + dependencies: + '@smithy/node-config-provider': 4.3.7 + '@smithy/types': 4.11.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.7 + '@smithy/util-middleware': 4.2.7 + tslib: 2.8.1 + + '@smithy/core@3.20.1': + dependencies: + '@smithy/middleware-serde': 4.2.8 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-stream': 4.5.8 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.7': + dependencies: + '@smithy/node-config-provider': 4.3.7 + '@smithy/property-provider': 4.2.7 + '@smithy/types': 4.11.0 + '@smithy/url-parser': 4.2.7 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.7': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.11.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.7': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.7': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.7': + dependencies: + '@smithy/eventstream-codec': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.8': + dependencies: + '@smithy/protocol-http': 5.3.7 + '@smithy/querystring-builder': 4.2.7 + '@smithy/types': 4.11.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.2.8': + dependencies: + '@smithy/chunked-blob-reader': 5.2.0 + '@smithy/chunked-blob-reader-native': 4.2.1 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/md5-js@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.7': + dependencies: + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.4.2': + dependencies: + '@smithy/core': 3.20.1 + '@smithy/middleware-serde': 4.2.8 + '@smithy/node-config-provider': 4.3.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + '@smithy/url-parser': 4.2.7 + '@smithy/util-middleware': 4.2.7 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.18': + dependencies: + '@smithy/node-config-provider': 4.3.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/service-error-classification': 4.2.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-retry': 4.2.7 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.8': + dependencies: + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.7': + dependencies: + '@smithy/property-provider': 4.2.7 + '@smithy/shared-ini-file-loader': 4.4.2 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.4.7': + dependencies: + '@smithy/abort-controller': 4.2.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/querystring-builder': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + + '@smithy/shared-ini-file-loader@4.4.2': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.7': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.7 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.10.3': + dependencies: + '@smithy/core': 3.20.1 + '@smithy/middleware-endpoint': 4.4.2 + '@smithy/middleware-stack': 4.2.7 + '@smithy/protocol-http': 5.3.7 + '@smithy/types': 4.11.0 + '@smithy/util-stream': 4.5.8 + tslib: 2.8.1 + + '@smithy/types@4.11.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.7': + dependencies: + '@smithy/querystring-parser': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.17': + dependencies: + '@smithy/property-provider': 4.2.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.20': + dependencies: + '@smithy/config-resolver': 4.4.5 + '@smithy/credential-provider-imds': 4.2.7 + '@smithy/node-config-provider': 4.3.7 + '@smithy/property-provider': 4.2.7 + '@smithy/smithy-client': 4.10.3 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.7': + dependencies: + '@smithy/node-config-provider': 4.3.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.7': + dependencies: + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.7': + dependencies: + '@smithy/service-error-classification': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.8': + dependencies: + '@smithy/fetch-http-handler': 5.3.8 + '@smithy/node-http-handler': 4.4.7 + '@smithy/types': 4.11.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.2.7': + dependencies: + '@smithy/abort-controller': 4.2.7 + '@smithy/types': 4.11.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + '@types/bun@1.3.5': dependencies: bun-types: 1.3.5 @@ -251,30 +1909,85 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + asn1js@3.0.7: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + + bowser@2.13.1: {} + + bullmq@5.66.4: + dependencies: + cron-parser: 4.9.0 + ioredis: 5.8.2 + msgpackr: 1.11.5 + node-abort-controller: 3.1.1 + semver: 7.7.3 + tslib: 2.8.1 + uuid: 11.1.0 + transitivePeerDependencies: + - supports-color + bun-types@1.3.5: dependencies: '@types/node': 25.0.3 + bytestreamjs@2.0.1: {} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 + cluster-key-slot@1.1.2: {} + cookie-es@1.2.2: {} + cron-parser@4.9.0: + dependencies: + luxon: 3.7.2 + crossws@0.3.5: dependencies: uncrypto: 0.1.3 + dayjs@1.11.19: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + defu@6.1.4: {} + denque@2.1.0: {} + + depd@2.0.0: {} + destr@2.0.5: {} + detect-libc@2.1.2: + optional: true + dotenv@17.2.3: {} + ee-first@1.1.1: {} + + encodeurl@2.0.0: {} + es-toolkit@1.43.0: {} + escape-html@1.0.3: {} + + etag@1.8.1: {} + eventemitter3@5.0.1: {} + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.2 + + fresh@2.0.0: {} + h3@1.15.4: dependencies: cookie-es: 1.2.2 @@ -287,14 +2000,89 @@ snapshots: ufo: 1.6.2 uncrypto: 0.1.3 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + inherits@2.0.4: {} + + ioredis@5.8.2: + dependencies: + '@ioredis/commands': 1.4.0 + cluster-key-slot: 1.1.2 + debug: 4.4.3 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + ioredis@5.9.0: + dependencies: + '@ioredis/commands': 1.5.0 + cluster-key-slot: 1.1.2 + debug: 4.4.3 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + iron-webcrypto@1.2.1: {} + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + lru-cache@10.4.3: {} + luxon@3.7.2: {} + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + ms@2.1.3: {} + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.5: + optionalDependencies: + msgpackr-extract: 3.0.3 + nanoid@5.1.6: {} + node-abort-controller@3.1.1: {} + node-fetch-native@1.6.7: {} + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true + node-mock-http@1.0.4: {} normalize-path@3.0.0: {} @@ -305,19 +2093,93 @@ snapshots: node-fetch-native: 1.6.7 ufo: 1.6.2 + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + path-to-regexp@8.3.0: {} + picomatch@2.3.1: {} + pkijs@3.3.3: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.7 + bytestreamjs: 2.0.1 + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + + pocketbase@0.26.5: {} + + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + radix3@1.1.2: {} + range-parser@1.2.1: {} + readdirp@4.1.2: {} + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + + reflect-metadata@0.2.2: {} + + selfsigned@5.4.0: + dependencies: + '@peculiar/x509': 1.14.2 + pkijs: 3.3.3 + + semver@7.7.3: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + standard-as-callback@2.1.0: {} + + statuses@2.0.2: {} + + strnum@2.1.2: {} + + toidentifier@1.0.1: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + ufo@1.6.2: {} uncrypto@0.1.3: {} undici-types@7.16.0: {} - unstorage@1.17.3: + unstorage@1.17.3(ioredis@5.9.0): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -327,3 +2189,7 @@ snapshots: node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.2 + optionalDependencies: + ioredis: 5.9.0 + + uuid@11.1.0: {} diff --git a/prompts/.claude/skills/list/SKILL.md b/prompts/.claude/skills/list/SKILL.md new file mode 100644 index 0000000..8a8171e --- /dev/null +++ b/prompts/.claude/skills/list/SKILL.md @@ -0,0 +1,13 @@ +--- +name: 列出前20个storage的文件名 +description: 读取storage存储的列表,并列出前20个文件名 +allowed-tools: Read, Bash +--- + +执行技能时,在项目根目录运行以下命令: + +```bash +bun .claude/skills/list/scripts/list.ts +``` + +脚本会读取 `storage` 目录下的文件,并输出前20个文件名。 \ No newline at end of file diff --git a/prompts/.claude/skills/list/scripts/list.ts b/prompts/.claude/skills/list/scripts/list.ts new file mode 100644 index 0000000..6362d7b --- /dev/null +++ b/prompts/.claude/skills/list/scripts/list.ts @@ -0,0 +1,21 @@ +import path from 'node:path' +import fs from 'node:fs' +import { createStorage } from 'unstorage' +import fsDriver from 'unstorage/drivers/fs' + +const storage = createStorage({ + driver: fsDriver({ base: 'storage' }), +}) + +async function listFiles() { + const files = await storage.getKeys() + const first20Files = files.slice(0, 20) + console.log('前20个文件名:') + first20Files.forEach((file) => { + console.log(file) + }) +} + +listFiles().catch((err) => { + console.error('Error listing files:', err) +}) \ No newline at end of file diff --git a/prompts/.env b/prompts/.env index 07b9f7a..732119b 100644 --- a/prompts/.env +++ b/prompts/.env @@ -1 +1,85 @@ -KEVISUAL_NEW_API_KEY=sk-YyVo5WqJBmAnhIPfww9XpUPvHNhsuiXs9a1OSfBul94d7O47 \ No newline at end of file +LOG_LEVEL=DEBUG +IS_DEV=true + +POSTGRES_HOST=1.15.101.247 +POSTGRES_PORT=5432 +POSTGRES_USER=postgres +POSTGRES_PASSWORD=abearxiong! +POSTGRES_DB=postgres + +# DATABASE_URL=postgresql://postgres:abearxiong!@1.15.101.247:5432/postgres +DATABASE_URL=postgresql://postgres:abearxiong@118.196.32.29:5432/postgres + +REDIS_HOST=light.xiongxiao.me +REDIS_PORT=6379 +REDIS_PASSWORD=abearxiong! +REDIS_DB=0 + +# POCKETBASE +POCKETBASE_URL=https://pocketbase.pro.xiongxiao.me +POCKETBASE_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJwYmNfMzE0MjYzNTgyMyIsImV4cCI6MTc3NTYyODY5NywiaWQiOiI0cGRtMXF4cjlkOXNuam0iLCJyZWZyZXNoYWJsZSI6ZmFsc2UsInR5cGUiOiJhdXRoIn0.2ABYhI0ayxpEV09gNvWUIM0lXfAx7hfBT02WcVPmyNw + +# S3 +S3_ACCESS_KEY_ID=AKLTOWNhNmJkNDJmNzFkNGI3MDlmMWQzYTA2ZjBkYTc2YTg +S3_ACCESS_KEY_SECRET=TWpjME9EVm1OVFJtTkROaE5ESXlaR0ptWlRnd1lqVm1Nems0TW1Ka1pUZw== +S3_REGION=cn-shanghai +S3_BUCKET_NAME=envision +S3_ENDPOINT=https://tos-s3-cn-shanghai.volces.com + +# Minio 配置 +MINIO_ENDPOINT=light.xiongxiao.me +MINIO_PORT=9000 +MINIO_BUCKET_NAME=resources +MINIO_USE_SSL=false +MINIO_ACCESS_KEY=abearxiong +MINIO_SECRET_KEY=xiongxiao + +# 域名 +DOMAIN=xiongxiao.me +PORT=4005 + +# 代理配置 +PROXY_DOMAIN=kevisual.xiongxiao.me +PROXY_RESOURCES=http://localhost:9000/resources +PROXY_ALLOWED_ORIGINS=localhost,xiongxiao.me + +KEVISUAL_NEW_API_KEY=sk-YyVo5WqJBmAnhIPfww9XpUPvHNhsuiXs9a1OSfBul94d7O47 +KEVISUAL_TOKEN="st_c7kyhg7sfhhhpiogydyogpoqzgzrnas7" +KEVISUAL_PASSWORD=123456xx + +## gitea +GITEA_URL=https://git.xiongxiao.me +GITEA_TOKEN=18cd3c00308c3813765dde41d093d48bed76fabd + +## ---- AI ---- +# BAILIAN API +BAILIAN_API_KEY='sk-0fc39ea048484ccf9e35e4ed4b4950be' +ZHIPU_API_KEY="6e7a1bc2760a4bd79c6f436b552527be.2j8Ob751NKi6oiVY" +MINIMAX_API_KEY="sk-cp-_nvABjDELuG_o3_vmvlo0uAY1jHJAxglKqKly8ihAxKJcbCyvwqsld08c3R4QZbNfocMn1juB_FdUc1sdjC-gXj5unVykTJ2a6THYaWozQkNyJ5FwJ_aJdI" +# jimeng API +JIMENG_API_KEY=4e962fc85078d5bfc02c9882bfe659eb +JIMENG_API_URL=https://jimeng-api.kevisual.cn/v1 +JIMENG_TIMEOUT=300000 + +VOLCENGINE_AUC_APPID=6968490116 +VOLCENGINE_AUC_TOKEN=t1WIgIEUswuunOReyW8kiRCe5lW_lcFB + +#------- + +DATA_WEBSITE_ID=5fd42d1d-109e-43ab-b3a7-d4fda0c92d13 + +## 微信 +# 微信开放平台 登陆 +WX_OPEN_APP_ID=wx9378885c8390e09b +WX_OPEN_APP_SECRET=4a0d588fe0de9713ad0a7e680be3d225 + +# 微信公众号 登陆 +WX_MP_APP_ID=wxff97d569b1db16b6 +WX_MP_APP_SECRET=012d84d0d2b914de95f4e9ca84923aed + +## +# Queue +QUEUE_CONCURRENCY=5 +QUEUE_MAX_FAILED=10 + +FEISHU_NOTIFY_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/c1c32e36-ddc6-4965-8943-fc826f4f5060 \ No newline at end of file diff --git a/prompts/.env.example b/prompts/.env.example new file mode 100644 index 0000000..970d4f2 --- /dev/null +++ b/prompts/.env.example @@ -0,0 +1,24 @@ +# AI Configuration +KEVISUAL_NEW_API_KEY=your_api_key_here + +# Redis +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_PASSWORD= +REDIS_DB=0 + +# jimeng API +JIMENG_API_KEY=your_jimeng_api_key +JIMENG_API_URL=https://jimeng-api.kevisual.cn/v1 +JIMENG_TIMEOUT=300000 + +# S3 +S3_BUCKET=your_bucket_name +S3_ACCESS_KEY_ID=your_access_key +S3_ACCESS_KEY_SECRET=your_secret_key +S3_REGION=cn-beijing +S3_ENDPOINT=tos-cn-beijing.volces.com + +# Queue +QUEUE_CONCURRENCY=5 +QUEUE_MAX_FAILED=10 diff --git a/prompts/QUEUE-README.md b/prompts/QUEUE-README.md new file mode 100644 index 0000000..6295642 --- /dev/null +++ b/prompts/QUEUE-README.md @@ -0,0 +1,189 @@ +# 图片生成任务系统使用指南 + +基于 BullMQ 和 Redis 的异步图片生成任务系统。 + +## 系统架构 + +``` +触发任务 → BullMQ 队列 → Worker 处理 → jimeng API 生成图片 → 上传 TOS → 更新 storage +``` + +## 前置要求 + +1. **Redis 服务**:确保 Redis 已启动 + ```bash + # 检查 Redis 状态 + redis-cli ping + ``` + +2. **环境变量配置**:确保 `.env` 文件已配置 + - Redis 连接信息 + - jimeng API 密钥 + - TOS 配置 + +3. **PM2**:用于管理 Worker 进程 + ```bash + npm install -g pm2 + ``` + +## 使用方法 + +### 1. 启动 Worker + +```bash +# 启动 Worker +bun run worker:start + +# 查看日志 +bun run worker:logs + +# 查看 Worker 状态 +bun run worker:status + +# 重启 Worker +bun run worker:restart + +# 停止 Worker +bun run worker:stop +``` + +### 2. 添加任务 + +#### 单个任务 +```bash +bun run queue:single + +# 示例 +bun run queue:single aadpldhvpwpdpwrp +``` + +#### 批量任务(所有待处理) +```bash +bun run queue:pending +``` + +### 3. 查询任务状态 + +```bash +bun run queue:status + +# 示例 +bun run queue:status aadpldhvpwpdpdpwrp +``` + +## 任务流程 + +1. **添加任务**:从 storage 读取提示词,添加到 BullMQ 队列 +2. **Worker 处理**: + - 验证提示词存在于 storage + - 调用 jimeng API 生成图片 + - 下载图片到内存 + - 上传到 TOS 服务器 + - 更新 storage 文件(添加 imageUrl) +3. **结果返回**:任务完成或失败的信息 + +## 队列配置 + +- **并发数**:5(可通过 `QUEUE_CONCURRENCY` 环境变量调整) +- **重试次数**:3 次 +- **重试策略**:指数退避(起始 5 秒) +- **失败暂停**:连续失败 10 个任务后自动暂停队列 + +## 文件结构 + +``` +src/ +├── config/ +│ ├── redis.config.ts # Redis 配置 +│ └── queue.config.ts # 队列配置 +├── services/ +│ ├── storage.service.ts # Storage 操作 +│ ├── jimeng.service.ts # jimeng API +│ └── oss.service.ts # TOS 上传 +├── queue/ +│ ├── types.ts # 类型定义 +│ ├── connection.ts # Redis 连接 +│ ├── queue.ts # BullMQ 队列 +│ ├── processor.ts # 任务处理器 +│ └── index.ts # 导出 +workers/ +└── image-worker.ts # Worker 进程 +scripts/ +├── queue-single.ts # 单个任务脚本 +├── queue-pending.ts # 批量任务脚本 +└── check-status.ts # 状态查询脚本 +``` + +## 环境变量 + +```bash +# Redis +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_PASSWORD= +REDIS_DB=0 + +# jimeng API +JIMENG_API_KEY=4e962fc85078d5bfc02c9882bfe659eb +JIMENG_API_URL=https://jimeng-api.kevisual.cn/v1 +JIMENG_TIMEOUT=30000 + +# TOS +TOS_BUCKET=kevisual-images +TOS_ACCESS_KEY_ID= +TOS_ACCESS_KEY_SECRET= +TOS_REGION=cn-beijing +TOS_ENDPOINT=tos-cn-beijing.volces.com + +# Queue +QUEUE_CONCURRENCY=5 +QUEUE_MAX_FAILED=10 +``` + +## 日志 + +Worker 日志位于 `logs/` 目录: +- `worker-error.log` - 错误日志 +- `worker-out.log` - 输出日志 + +## 常见问题 + +### 1. Worker 启动失败 + +检查 Redis 是否运行: +```bash +redis-cli ping +``` + +检查环境变量是否配置正确: +```bash +cat .env +``` + +### 2. 任务失败 + +查看 Worker 日志: +```bash +bun run worker:logs +``` + +查询任务状态: +```bash +bun run queue:status +``` + +### 3. 队列暂停 + +如果连续失败 10 个任务,队列会自动暂停。需要: +1. 排查失败原因 +2. 手动恢复队列(代码中暂未实现,可使用 PM2 重启) +```bash +bun run worker:restart +``` + +## 下一步 + +- 添加 Bull Board 进行可视化监控 +- 添加 HTTP API 代替 CLI 脚本 +- 添加 Prometheus 指标 +- 支持多 Worker 实例 diff --git a/prompts/TASKS-v1.0.0.md b/prompts/TASKS-v1.0.0.md new file mode 100644 index 0000000..e69de29 diff --git a/prompts/docs/prompts-01.json b/prompts/data/prompts-01.json similarity index 100% rename from prompts/docs/prompts-01.json rename to prompts/data/prompts-01.json diff --git a/prompts/docs/jimeng.md b/prompts/docs/jimeng.md new file mode 100644 index 0000000..e6321b2 --- /dev/null +++ b/prompts/docs/jimeng.md @@ -0,0 +1,11 @@ +```sh +curl -X POST https://jimeng-api.kevisual.cn/v1/images/generations \ +-H "Content-Type: application/json" \ +-H "Authorization: Bearer 4e962fc85078d5bfc02c9882bfe659eb" \ +-d '{ + "model": "jimeng-4.0", + "prompt": "生成一个水墨山水画", + "ratio": "1:1", + "resolution": "2k" +}' +``` \ No newline at end of file diff --git a/prompts/ecosystem.config.js b/prompts/ecosystem.config.js new file mode 100644 index 0000000..7c5694d --- /dev/null +++ b/prompts/ecosystem.config.js @@ -0,0 +1,19 @@ +module.exports = { + apps: [ + { + name: 'image-worker', + script: './workers/image-worker.ts', + interpreter: 'bun', + instances: 1, + autorestart: true, + watch: false, + max_memory_restart: '1G', + env: { + NODE_ENV: 'production', + }, + error_file: './logs/worker-error.log', + out_file: './logs/worker-out.log', + log_date_format: 'YYYY-MM-DD HH:mm:ss Z', + }, + ], +}; diff --git a/prompts/package.json b/prompts/package.json index 0b16798..f8c8a90 100644 --- a/prompts/package.json +++ b/prompts/package.json @@ -5,23 +5,35 @@ "main": "index.js", "scripts": { "perfect": "bun test/generate-perfect.ts", - "pony": "bun test/generate-pony.ts" + "pony": "bun test/generate-pony.ts", + "worker": "bun src/workers/index.ts" }, "keywords": [], "author": "abearxiong (https://www.xiongxiao.me)", "license": "MIT", - "packageManager": "pnpm@10.26.0", + "packageManager": "pnpm@10.27.0", "type": "module", "devDependencies": { "@kevisual/ai": "^0.0.19", + "@kevisual/context": "^0.0.4", + "@kevisual/oss": "^0.0.16", + "@kevisual/query": "^0.0.35", "@kevisual/types": "^0.0.10", "@kevisual/use-config": "^1.0.21", "@types/bun": "^1.3.5", "@types/node": "^25.0.3" }, "dependencies": { + "@aws-sdk/client-s3": "^3.965.0", + "@kevisual/logger": "^0.0.4", + "@kevisual/notifier": "^0.0.2", + "@kevisual/router": "^0.0.52", + "bullmq": "^5.66.4", "es-toolkit": "^1.43.0", + "eventemitter3": "^5.0.1", + "ioredis": "^5.9.0", "nanoid": "^5.1.6", + "pocketbase": "^0.26.5", "unstorage": "^1.17.3" } } diff --git a/prompts/scripts/show-download-error.ts b/prompts/scripts/show-download-error.ts new file mode 100644 index 0000000..716abb2 --- /dev/null +++ b/prompts/scripts/show-download-error.ts @@ -0,0 +1,28 @@ +import { IMAGE_DOWNLOAD_JOB } from '../src/task/image-creator.job' +import { Worker, Queue, Job } from 'bullmq'; +import { getRedisConnection } from '../src/module/redis.ts'; +import { pbService, jimengService, ossService } from '../src/index.ts'; + +const connection = getRedisConnection(); +const queue = new Queue(IMAGE_DOWNLOAD_JOB, { connection }); + +// 显示错误的尝试任务, queue列出来 +async function showFailedJobs() { + const failedJobs = await queue.getFailed(); + if (failedJobs.length === 0) { + console.log('No failed jobs found.'); + return; + } + + console.log(`Found ${failedJobs.length} failed jobs:`); + for (const job of failedJobs) { + console.log(`- Job ID: ${job.id}, Attempts Made: ${job.attemptsMade}, Data: ${JSON.stringify(job.data)}`); + } +} + +showFailedJobs().then(() => { + process.exit(0); +}).catch((error) => { + console.error('Error showing failed jobs:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/prompts/src/app.ts b/prompts/src/app.ts new file mode 100644 index 0000000..ce40d07 --- /dev/null +++ b/prompts/src/app.ts @@ -0,0 +1,35 @@ +import { JimengService } from './services/jimeng.service.ts'; +import { OSSService } from './services/oss.service.ts'; +import { PBService } from './services/pb.service.ts'; +import { useConfig } from '@kevisual/use-config'; + +import { App } from '@kevisual/router' +import { useContextKey } from '@kevisual/context'; +import { getRedisConnection } from './module/redis.ts'; +import { Kevisual } from '@kevisual/ai'; +export const config = useConfig(); +export const redis = useContextKey('redis', () => getRedisConnection()); +export const jimengService = useContextKey('jimeng', new JimengService({ + apiKey: config.JIMENG_API_KEY, + baseUrl: config.JIMENG_API_URL, + timeout: parseInt(config.JIMENG_TIMEOUT || '300000'), +})); + +export const ossService = useContextKey('oss', new OSSService({ + accessKeyId: config.S3_ACCESS_KEY_ID, + accessKeySecret: config.S3_ACCESS_KEY_SECRET, + bucketName: config.S3_BUCKET_NAME, + region: config.S3_REGION, + endpoint: config.S3_ENDPOINT, + prefix: 'projects/horse/', +})); +export const pbService = useContextKey('pb', new PBService({ + url: config.POCKETBASE_URL, + token: config.POCKETBASE_TOKEN, +})); + +export const app = useContextKey('app', new App()); + +export const ai = useContextKey('ai', new Kevisual({ + apiKey: config.KEVISUAL_NEW_API_KEY, +})); \ No newline at end of file diff --git a/prompts/src/index.ts b/prompts/src/index.ts index 2a51a95..e2b6e4b 100644 --- a/prompts/src/index.ts +++ b/prompts/src/index.ts @@ -11,4 +11,10 @@ async function saveToFile(data: Map, outputPath: string): Promis console.log(`Generated ${arrayData.length} prompts and saved to ${outputPath}`); } +import './routes/index.ts'; + +export * from './app.ts'; +// list all routes and import + + export { PromptGenerator, PromptGeneratorOptions, saveToFile, Prompt }; \ No newline at end of file diff --git a/prompts/src/module/config.ts b/prompts/src/module/config.ts new file mode 100644 index 0000000..7a2e631 --- /dev/null +++ b/prompts/src/module/config.ts @@ -0,0 +1,15 @@ +import { useConfig } from '@kevisual/use-config'; +export const config = useConfig(); + +export const queueConfig = { + name: 'image-generation-queue', + concurrency: parseInt(config.QUEUE_CONCURRENCY || '1'), + maxFailed: parseInt(config.QUEUE_MAX_FAILED || '2'), +}; + +export const redisConfig = { + host: config.REDIS_HOST || 'localhost', + port: parseInt(config.REDIS_PORT || '6379'), + password: config.REDIS_PASSWORD || undefined, + db: parseInt(config.REDIS_DB || '0'), +}; \ No newline at end of file diff --git a/prompts/src/module/logger.ts b/prompts/src/module/logger.ts new file mode 100644 index 0000000..5d89cef --- /dev/null +++ b/prompts/src/module/logger.ts @@ -0,0 +1,10 @@ +import { Logger } from "@kevisual/logger"; +import { config } from '@/app.ts' +import { FeishuNotifier } from "@kevisual/notifier"; +export const logger = new Logger({ + level: config.LOG_LEVEL || 'info', +}); + +export const feishuNotifier = new FeishuNotifier({ + webhook: config.FEISHU_NOTIFY_WEBHOOK_URL || '', +}); \ No newline at end of file diff --git a/prompts/src/module/redis.ts b/prompts/src/module/redis.ts new file mode 100644 index 0000000..7561885 --- /dev/null +++ b/prompts/src/module/redis.ts @@ -0,0 +1,29 @@ +import { Redis } from 'ioredis'; +import { redisConfig } from './config.ts' +export interface RedisConfig { + host: string; + port: number; + password?: string; + db: number; +} + +let redisConnection: Redis | null = null; + +export const getRedisConnection = () => { + if (!redisConnection) { + redisConnection = new Redis({ + ...redisConfig, + maxRetriesPerRequest: null + }); + + redisConnection.on('connect', () => { + console.log('Redis connected'); + }); + + redisConnection.on('error', (err) => { + console.error('Redis connection error:', err); + }); + } + + return redisConnection as any; +}; diff --git a/prompts/src/routes/create-task.ts b/prompts/src/routes/create-task.ts new file mode 100644 index 0000000..0ed9396 --- /dev/null +++ b/prompts/src/routes/create-task.ts @@ -0,0 +1,15 @@ +import { app, ossService, pbService, redis } from '@/app.ts' +import { addImageGenerateJob } from '@/task/image-creator.job.ts'; + +app.route({ + path: 'image-creator', + key: 'create-task', +}).define(async (ctx) => { + const list = await pbService.collection.getFullList({ + filter: 'status="计划中"', + }) + for (const item of list) { + await addImageGenerateJob(item); + } + console.log(`Added ${list.length} image generate jobs to the queue.`); +}).addTo(app); \ No newline at end of file diff --git a/prompts/src/routes/index.ts b/prompts/src/routes/index.ts new file mode 100644 index 0000000..cdbe615 --- /dev/null +++ b/prompts/src/routes/index.ts @@ -0,0 +1 @@ +import './create-task.ts' \ No newline at end of file diff --git a/prompts/src/services/jimeng.service.ts b/prompts/src/services/jimeng.service.ts new file mode 100644 index 0000000..e4835dc --- /dev/null +++ b/prompts/src/services/jimeng.service.ts @@ -0,0 +1,121 @@ +import { Result } from '@kevisual/query' +export interface JimengOptions { + /** API密钥,用于认证请求 */ + apiKey: string; + /** API基础URL */ + baseUrl: string; + /** 请求超时时间(毫秒) */ + timeout: number; +} + +export interface JimengGenerateOptions { + /** 图片生成提示词 */ + prompt: string; + /** 使用的模型版本,默认 jimeng-4.0 */ + model?: string; + /** 图片比例,默认 1:1 */ + ratio?: string; + /** 图片分辨率,默认 2k */ + resolution?: string; +} + +interface JimengResponse { + /** 请求创建时间戳 */ + created: number; + /** 生成的图片列表 */ + data: Array<{ + /** 图片URL */ + url: string; + }>; +} + +export class JimengService { + private apiKey: string; + private baseUrl: string; + private timeout: number; + + constructor(options: JimengOptions) { + this.apiKey = options.apiKey; + this.baseUrl = options.baseUrl || 'https://jimeng-api.kevisual.cn/v1'; + this.timeout = options.timeout; + } + + async generateImage(options: JimengGenerateOptions): Promise> { + const { + prompt, + model = 'jimeng-4.6', + ratio = '1:1', + resolution = '2k' + } = options; + + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.timeout); + + const response = await fetch(`${this.baseUrl}/images/generations`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${this.apiKey}`, + }, + body: JSON.stringify({ + model, + prompt, + ratio, + resolution, + }), + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`jimeng API error: ${response.status} ${response.statusText}`); + } + + const result = await response.json() as JimengResponse; + return { code: 200, data: result }; + } catch (error: any) { + return { code: 500, message: error.message || 'Unknown error' }; + } + } + + async downloadImage(url: string): Promise { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.timeout); + + try { + const response = await fetch(url, { + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`Failed to download image: ${response.statusText}`); + } + + const arrayBuffer = await response.arrayBuffer(); + return Buffer.from(arrayBuffer); + } catch (error: any) { + clearTimeout(timeoutId); + if (error.name === 'AbortError') { + throw new Error('Image download timeout'); + } + throw error; + } + } + /** 获取图片过期时间 */ + async getExpiredTime(url: string): Promise<{ expiredAt: number, expired: boolean }> { + // https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/c018e06ee6654dd78ccacb29eff4744e~tplv-tb4s082cfz-aigc_resize:0:0.png?lk3s=43402efa&x-expires=1767852000&x-signature=34yf37N955BP37eLaYEzKeLQn0Q%3D&format=.png + const urlObj = new URL(url); + let expires = urlObj.searchParams.get('x-expires'); + if (!expires) { + expires = '0'; + } + const expiredAt = parseInt(expires) * 1000; + const expired = Date.now() > expiredAt; + return { expiredAt, expired }; + } +} + diff --git a/prompts/src/services/oss.service.ts b/prompts/src/services/oss.service.ts new file mode 100644 index 0000000..4b68af5 --- /dev/null +++ b/prompts/src/services/oss.service.ts @@ -0,0 +1,36 @@ +import { OssBase } from '@kevisual/oss/s3.ts'; +import { S3Client } from '@aws-sdk/client-s3' +export type OSSOptions = { + accessKeyId: string; + accessKeySecret: string; + region: string; + bucketName: string; + endpoint: string; + prefix?: string; +} +export class OSSService extends OssBase { + declare client: S3Client; + endpoint: string; + constructor(options: OSSOptions) { + const client = new S3Client({ + region: options.region, + endpoint: `${options.endpoint}`, + credentials: { + accessKeyId: options.accessKeyId, + secretAccessKey: options.accessKeySecret, + }, + }); + super({ + client, + bucketName: options.bucketName, + prefix: options.prefix || '', + }); + this.endpoint = options.endpoint; + } + + getLink(objectName: string): string { + const endpoint = this.endpoint; + return `${endpoint}/${this.bucketName}/${this.prefix}${objectName}`; + } +} + diff --git a/prompts/src/services/pb.service.ts b/prompts/src/services/pb.service.ts new file mode 100644 index 0000000..a7d56d8 --- /dev/null +++ b/prompts/src/services/pb.service.ts @@ -0,0 +1,67 @@ +import PocketBase from 'pocketbase'; +import { EventEmitter } from 'eventemitter3' + +type PBOptions = { + url: string; + token?: string; +} +export class PBCore { + declare client: PocketBase; + emitter = new EventEmitter(); + token?: string; + constructor(options: PBOptions) { + this.client = new PocketBase(options.url); + this.token = options.token || ''; + if (this.token) { + this.client.authStore.save(this.token); + } + } + + async loginAdmin(email: string, password: string) { + const authData = await this.client.collection("_superusers").authWithPassword(email, password); + this.emitter.emit('login', authData); + console.log('PocketBase admin logged in:', authData); + return authData; + } +} + +export class PBService extends PBCore { + collectionName = 'images_generation_tasks'; + constructor(options: PBOptions) { + super(options); + } + getCollection(name: string) { + return this.client.collection(name); + } + + async initPbService() { + const isLogin = this.client.authStore.isValid; + console.log('PocketBase is logged in:', isLogin); + } + async importData(data: any[]) { + const collection = this.getCollection(this.collectionName); + for (const item of data) { + await collection.create(item); + } + } + get collection() { + return this.client.collection(this.collectionName); + } +} + +const ImageTaskStatus = ['提示词优化中', '计划中', '生成图片中', '图片下载中', '暂停中', '已完成', '失败'] as const; + +type Data = { + images: { type: 'jimeng' | 'tos', url: string }[]; +} +export type ImageCollection = { + id: string; + created: string; + updated: string; + title: string; + tags: any; + summary: string; + description: string; + data: Data; + status: typeof ImageTaskStatus[number]; +} \ No newline at end of file diff --git a/prompts/src/services/storage.service.ts b/prompts/src/services/storage.service.ts new file mode 100644 index 0000000..99f9271 --- /dev/null +++ b/prompts/src/services/storage.service.ts @@ -0,0 +1,58 @@ +import { createStorage } from 'unstorage'; +import fsDriver from 'unstorage/drivers/fs'; + +export interface PromptData { + value: string; + id: string; + perfect: string; + imageUrl?: string; + generatedAt?: number; +} + +export class StorageService { + private storage: ReturnType; + + constructor() { + this.storage = createStorage({ + driver: fsDriver({ base: 'storage' }), + }); + } + + async get(id: string): Promise { + const filename = id.endsWith('.json') ? id : `${id}.json`; + const data = await this.storage.getItem(filename); + return data || null; + } + + async getPendingPrompts(): Promise { + const keys = await this.storage.getKeys(); + const pending: PromptData[] = []; + + for (const key of keys) { + if (key === 'usage.json') continue; + + const data = await this.storage.getItem(key); + if (data && !data.imageUrl) { + pending.push(data); + } + } + + return pending; + } + + async update(id: string, data: Partial): Promise { + const filename = id.endsWith('.json') ? id : `${id}.json`; + const existing = await this.storage.getItem(filename); + + if (existing) { + await this.storage.setItem(filename, { ...existing, ...data }); + } + } + + async hasImage(id: string): Promise { + const data = await this.get(id); + return !!data?.imageUrl; + } +} + +export const storageService = new StorageService(); diff --git a/prompts/src/task/image-creator.job.ts b/prompts/src/task/image-creator.job.ts new file mode 100644 index 0000000..4af2a3d --- /dev/null +++ b/prompts/src/task/image-creator.job.ts @@ -0,0 +1,253 @@ +import { Worker, Queue, Job } from 'bullmq'; +import { getRedisConnection } from '../module/redis.ts'; +import { pbService, jimengService, ossService } from '../index.ts'; +import type { ImageCollection } from '../services/pb.service.ts'; + +export const IMAGE_CREATOR_JOB = 'image-creator'; +export const IMAGE_GENERATE_JOB = 'image-generate'; +export const IMAGE_DOWNLOAD_JOB = 'image-download'; + +// 状态常量 +export const ImageTaskStatus = { + PENDING: '提示词优化中' as const, + PLANNING: '计划中' as const, + GENERATING: '生成图片中' as const, + DOWNLOADING: '图片下载中' as const, + PAUSED: '暂停中' as const, + COMPLETED: '已完成' as const, + FAILED: '失败' as const, +}; + +// 生成图片任务的节流时间(毫秒) +const JIMENG_THROTTLE_DELAY = 60 * 1000; +// 下载任务最大重试次数 +const DOWNLOAD_MAX_RETRIES = 3; +// 图片生成任务最大重试次数 +const GENERATE_MAX_RETRIES = 3; + +export interface ImageCreatorJobData { + itemId: string; + prompt: string; + collectionName?: string; +} + +export interface ImageGenerateJobData { + itemId: string; + prompt: string; + collectionName?: string; +} + +export interface ImageDownloadJobData { + itemId: string; + imageUrl: string; + collectionName?: string; + index: number; +} + +// 更新 PB 状态 +async function updateItemStatus( + itemId: string, + status: string, + extraData?: Partial +): Promise { + const collection = pbService.getCollection(pbService.collectionName); + if (extraData) { + const existingItem = await pbService.collection.getOne(itemId); + const data = existingItem.data; + const existingImages = data?.images || []; + const newImages = extraData.data?.images || []; + await collection.update(itemId, { + status, + ...extraData, + data: { + ...extraData?.data, + ...data, + images: [...existingImages, ...newImages], + }, + }); + } else { + await collection.update(itemId, { + status, + }); + } +} + + +/** + * 单独添加生成图片任务 + */ +export async function addImageGenerateJob(item: ImageCollection): Promise { + const connection = getRedisConnection(); + const queue = new Queue(IMAGE_GENERATE_JOB, { connection }); + + const jobData: ImageGenerateJobData = { + itemId: item.id, + prompt: item.description || item.summary || item.title, + collectionName: pbService.collectionName, + }; + + await queue.add(IMAGE_GENERATE_JOB, jobData, { + removeOnComplete: 100, + removeOnFail: 100, + delay: JIMENG_THROTTLE_DELAY, // 任务间隔 30 秒 + }); + + await updateItemStatus(item.id, ImageTaskStatus.GENERATING); + // console.log(`[ImageGenerate] Job created for item: ${item.id}`); + await queue.close(); +} + + + +/** + * 单独添加下载图片任务 + */ +export async function addImageDownloadJob( + itemId: string, + imageUrl: string, + index?: number +): Promise { + const connection = getRedisConnection(); + const queue = new Queue(IMAGE_DOWNLOAD_JOB, { connection }); + const jobData: ImageDownloadJobData = { + itemId, + imageUrl, + collectionName: pbService.collectionName, + index: index ?? 0 + }; + + // 使用 bullmq 内置重试,指数退避 + await queue.add(IMAGE_DOWNLOAD_JOB, jobData, { + attempts: DOWNLOAD_MAX_RETRIES, + backoff: { + type: 'exponential', + delay: 2000, // 初始 2 秒 + }, + removeOnComplete: 100, + removeOnFail: 100, + }); + + await updateItemStatus(itemId, ImageTaskStatus.DOWNLOADING); + // console.log(`[ImageDownload] Job created for item: ${itemId}`); + await queue.close(); +} + +/** + * 运行独立的下载 worker + */ +export async function runImageDownloadWorker(): Promise { + const connection = getRedisConnection(); + + const worker = new Worker( + IMAGE_DOWNLOAD_JOB, + async (job: Job) => { + const { itemId, imageUrl, index } = job.data; + const attemptsMade = job.attemptsMade; + console.log(`[ImageDownload] Processing item: ${itemId}, attempt: ${attemptsMade + 1}/${DOWNLOAD_MAX_RETRIES}`); + + try { + const imageBuffer = await jimengService.downloadImage(imageUrl); + const filename = `generated_${itemId}_${index}_${Date.now()}.png`; + await ossService.putObject(filename, imageBuffer); + const ossUrl = ossService.getLink(filename) + console.log(`[ImageDownload] Image uploaded to OSS: ${ossUrl}`); + + const imageData = { type: 'tos' as const, url: ossUrl }; + await updateItemStatus(itemId, ImageTaskStatus.COMPLETED, { + data: { + images: [imageData], + }, + }); + + return { success: true, ossUrl }; + } catch (error: any) { + console.error(`[ImageDownload] Error: ${error.message}`); + + // 重试次数用尽,暂停任务 + if (job.attemptsMade >= DOWNLOAD_MAX_RETRIES - 1) { + await updateItemStatus(itemId, ImageTaskStatus.PAUSED); + } + + throw error; + } + }, + { + connection, + concurrency: 3, + } as any + ); + + worker.on('completed', (job) => { + console.log(`[ImageDownload] Job completed: ${job.id}`); + }); + + worker.on('failed', (job, err) => { + console.error(`[ImageDownload] Job failed: ${job?.id}, error: ${err.message}`); + }); + + console.log('[ImageDownload] Worker started'); +} + +/** + * 运行图片生成 worker(使用 jimeng API) + */ +export async function runImageGenerateWorker(): Promise { + const connection = getRedisConnection(); + + const worker = new Worker( + IMAGE_GENERATE_JOB, + async (job: Job) => { + const { itemId, prompt } = job.data; + const attemptsMade = job.attemptsMade; + console.log(`[ImageGenerate] Processing item: ${itemId}, attempt: ${attemptsMade + 1}/${GENERATE_MAX_RETRIES}`); + + try { + // 调用 jimeng API 生成图片 + const result = await jimengService.generateImage({ prompt }); + + if (result.code !== 200 || !result.data?.data?.length) { + throw new Error(result.message || 'Failed to generate image'); + } + const images = result.data.data; + for (const [index, img] of images.entries()) { + console.log(`[ImageGenerate] Image generated: ${img.url}`); + // 生成成功后,添加下载任务 + await addImageDownloadJob(itemId, img.url, index); + } + // 更新状态为下载中 + await updateItemStatus(itemId, ImageTaskStatus.DOWNLOADING, { + data: { images: images.map(img => ({ type: 'jimeng' as const, url: img.url })) }, + }); + + return { success: true, images }; + } catch (error: any) { + console.error(`[ImageGenerate] Error: ${error.message}`); + + // 重试次数用尽,暂停任务并停止当前 worker + if (job.attemptsMade >= GENERATE_MAX_RETRIES - 1) { + await updateItemStatus(itemId, ImageTaskStatus.PAUSED); + console.error(`[ImageGenerate] Max retries exceeded. Stopping worker...`); + await worker.close(); + } + + throw error; + } + }, + { + connection, + concurrency: 1, // jimeng API 有节流限制,设置为 1 + } + ); + + worker.on('completed', (job) => { + console.log(`[ImageGenerate] Job completed: ${job.id}`); + }); + + worker.on('failed', (job, err) => { + console.error(`[ImageGenerate] Job failed: ${job?.id}, error: ${err.message}`); + }); + + console.log('[ImageGenerate] Worker started'); +} + +export { updateItemStatus }; diff --git a/prompts/src/task/perfect-prompt.job.ts b/prompts/src/task/perfect-prompt.job.ts new file mode 100644 index 0000000..f394ea4 --- /dev/null +++ b/prompts/src/task/perfect-prompt.job.ts @@ -0,0 +1,153 @@ +import { Worker, Job } from 'bullmq'; +import { getRedisConnection } from '../module/redis.ts'; +import { Prompt, pbService, ai } from '../index.ts'; +import type { ImageCollection } from '../services/pb.service.ts'; +// 重新导出 Queue,因为需要在 addPerfectPromptJob 中使用 +import { Queue } from 'bullmq'; + +export const PERFECT_PROMPT_JOB = 'perfect-prompt'; + +// 状态常量 +export const PerfectPromptStatus = { + PENDING: '提示词优化中' as const, + COMPLETED: '已完成' as const, + FAILED: '失败' as const, +}; + +// 最大重试次数 +const MAX_RETRIES = 3; + +export interface PerfectPromptJobData { + itemId: string; + prompt: string; + collectionName?: string; +} + +// 优化提示词的模板 +const DEFAULT_PERFECT_PROMPT = `请你将以下提示词进行完善,使其更加详细和具体,适合用于生成高质量的像素艺术图像。要求如下: +1. 只返回完善后的提示词,不要包含任何多余的内容或解释。 +2. 确保提示词专注于像素艺术风格,包括但不限于像素化角色、场景和物体的描述。 +3. 使用具体的细节来增强提示词的表现力,例如颜色、构图、光影效果等。 +4. 避免使用与像素艺术无关的术语或描述。 +5. 保持提示词的简洁性,避免过于冗长,但要确保信息量充足。 +6. 如果需要颜色,需要整个图像的颜色更少的描述,而不是复杂的颜色细节, 背景默认纯蓝色。 +7. 使用中文进行描述。 +`; + +// 更新 PB 状态 +async function updateItemStatus( + itemId: string, + status: string, + extraData?: Partial +): Promise { + const collection = pbService.getCollection(pbService.collectionName); + if (extraData) { + const existingItem = await pbService.collection.getOne(itemId); + const data = existingItem.data; + await collection.update(itemId, { + status, + ...extraData, + data: { + ...extraData?.data, + ...data, + }, + }); + } else { + await collection.update(itemId, { + status, + }); + } +} + +/** + * 单独添加优化提示词任务 + */ +export async function addPerfectPromptJob(item: ImageCollection): Promise { + const connection = getRedisConnection(); + const queue = new Queue(PERFECT_PROMPT_JOB, { connection }); + + const jobData: PerfectPromptJobData = { + itemId: item.id, + prompt: item.description || item.summary || item.title || '', + collectionName: pbService.collectionName, + }; + + await queue.add(PERFECT_PROMPT_JOB, jobData, { + attempts: MAX_RETRIES, + backoff: { + type: 'exponential', + delay: 2000, + }, + removeOnComplete: 100, + removeOnFail: 100, + }); + + await updateItemStatus(item.id, PerfectPromptStatus.PENDING); + await queue.close(); +} + +/** + * 运行优化提示词 worker + */ +export async function runPerfectPromptWorker(): Promise { + const connection = getRedisConnection(); + // 获取环境变量中的 API key + const worker = new Worker( + PERFECT_PROMPT_JOB, + async (job: Job) => { + const { itemId, prompt } = job.data; + const attemptsMade = job.attemptsMade; + console.log(`[PerfectPrompt] Processing item: ${itemId}, attempt: ${attemptsMade + 1}/${MAX_RETRIES}`); + try { + if (!prompt) { + throw new Error('Prompt is empty'); + } + const promptTool = new Prompt({ perfectPrompt: DEFAULT_PERFECT_PROMPT }); + await ai.chat([ + { + role: 'user', + content: promptTool.perfect(prompt), + }, + ]); + const perfectText = promptTool.clearPerfectTags(ai.responseText); + + if (!perfectText) { + throw new Error('Generated perfect prompt is empty'); + } + + console.log(`[PerfectPrompt] Perfect prompt generated for item: ${itemId}`); + + // 更新状态为已完成,并保存优化后的提示词 + await updateItemStatus(itemId, PerfectPromptStatus.COMPLETED, { + description: perfectText, + }); + + return { success: true, perfectPrompt: perfectText }; + } catch (error: any) { + console.error(`[PerfectPrompt] Error: ${error.message}`); + + // 重试次数用尽,标记为失败 + if (job.attemptsMade >= MAX_RETRIES - 1) { + await updateItemStatus(itemId, PerfectPromptStatus.FAILED); + } + + throw error; + } + }, + { + connection, + concurrency: 2, + } + ); + + worker.on('completed', (job) => { + console.log(`[PerfectPrompt] Job completed: ${job.id}`); + }); + + worker.on('failed', (job, err) => { + console.error(`[PerfectPrompt] Job failed: ${job?.id}, error: ${err.message}`); + }); + + console.log('[PerfectPrompt] Worker started'); +} + diff --git a/prompts/src/workers/index.ts b/prompts/src/workers/index.ts new file mode 100644 index 0000000..bd6c6b5 --- /dev/null +++ b/prompts/src/workers/index.ts @@ -0,0 +1,10 @@ +import { runImageDownloadWorker, runImageGenerateWorker } from '../task/image-creator.job.ts'; + +runImageDownloadWorker(); +runImageGenerateWorker(); +// 运行半小时后停止 + +setTimeout(() => { + console.log('Stop timeed', new Date().toISOString()); + process.exit(0); +}, 60 * 60 * 1000); // 60 minutes in milliseconds \ No newline at end of file diff --git a/prompts/test/common.ts b/prompts/test/common.ts new file mode 100644 index 0000000..33e4a87 --- /dev/null +++ b/prompts/test/common.ts @@ -0,0 +1,12 @@ +import { app } from '../src/index.ts' + +export { + app +} + +const res = await app.run({ + path: 'image-creator', + key: 'create-task', +}) + +console.log('Route run result:', res) \ No newline at end of file diff --git a/prompts/test/jimeng.ts b/prompts/test/jimeng.ts new file mode 100644 index 0000000..5630834 --- /dev/null +++ b/prompts/test/jimeng.ts @@ -0,0 +1,18 @@ +import { JimengService } from '../src/services/jimeng.service.js'; +import { useConfig } from '@kevisual/use-config'; +const config = useConfig(); + +export const jimengService = new JimengService({ + apiKey: config.JIMENG_API_KEY, + baseUrl: config.JIMENG_API_URL, + timeout: parseInt(config.JIMENG_TIMEOUT || '30000'), +}); + +const createImage = async () => { + const response = await jimengService.generateImage({ + prompt: 'A beautiful landscape with mountains and a river, in the style of a watercolor painting', + }); + console.log('Generated Image URL:', response); +}; + +createImage(); \ No newline at end of file diff --git a/prompts/test/pb.ts b/prompts/test/pb.ts new file mode 100644 index 0000000..59b7ef2 --- /dev/null +++ b/prompts/test/pb.ts @@ -0,0 +1,43 @@ +import { createStorage } from 'unstorage'; +import { config } from '../src/app.ts' + +import { PBService } from '../src/services/pb.service.ts' +import path from "node:path"; +import fsDriver from "unstorage/drivers/fs"; + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +const storage = createStorage({ + driver: fsDriver({ base: 'storage' }), +}); +const pbService = new PBService({ + url: config.POCKETBASE_URL, + token: config.POCKETBASE_TOKEN, +}); + +async function main() { + // const listStorage = await storage.getKeys(); + // const keys = listStorage.filter(key => key !== 'usage.json'); + // for (const key of keys) { + // const value = await storage.getItem(key); + // console.log(`Generating PB record for key: ${value}`, value); + // const { id, perfect: description, value: summary } = value; + // pbService.collection.create({ + // title: '', + // summary, + // description, + // tags: [], + // data: {}, + // status: '计划中', + // }); + // console.log(`Created record for prompt ID: ${id}`); + // await sleep(100); // To avoid hitting rate limits + // } + + const list = await pbService.collection.getFullList({ + sort: '-created', + fields: 'id,title,summary,description,tags,status', + }) + console.log('PocketBase Records:', list.length); +} +main(); \ No newline at end of file diff --git a/prompts/test/upload-image.ts b/prompts/test/upload-image.ts new file mode 100644 index 0000000..029d4ce --- /dev/null +++ b/prompts/test/upload-image.ts @@ -0,0 +1,15 @@ +import { jimengService, ossService } from '../src/index.ts' +const url = 'https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/4947076125c64a999e4c392de03048f8~tplv-tb4s082cfz-aigc_resize:360:360.webp?lk3s=43402efa&x-expires=1770336000&x-signature=Fjeeb3qloxxzxmHJpmqu6v8fwrM%3D&format=.webp' + + +const uploadImage = async () => { + const response = await jimengService.downloadImage(url); + const filename = `uploaded_image_${Date.now()}.png`; + await ossService.putObject(filename, response); + const ossUrl = ossService.getLink(filename); + // console.log('Uploaded Image URL:', response) + // const uploadJons = await ossService.putObject('a1.json', { b: '123' }) + // console.log('Upload JSON Result:', uploadJons) + return ossUrl; +} +uploadImage(); \ No newline at end of file diff --git a/prompts/tsconfig.json b/prompts/tsconfig.json new file mode 100644 index 0000000..010ba70 --- /dev/null +++ b/prompts/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "@kevisual/types/json/backend.json", + "compilerOptions": { + "module": "NodeNext", + "target": "esnext", + "baseUrl": ".", + "typeRoots": [ + "./node_modules/@types", + "./node_modules/@kevisual/types/index.d.ts" + ], + "paths": { + "@/*": [ + "src/*" + ], + "@agent/*": [ + "agent/*" + ] + }, + }, + "include": [ + "src/**/*", + "agent/**/*", + ], +} \ No newline at end of file