diff --git a/apps/api/package.json b/apps/api/package.json index b806246af6..7f3da98972 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -18,7 +18,7 @@ "@vitest/ui": "^1.6.0", "typescript": "^5.5.3", "vitest": "^1.6.0", - "wrangler": "^3.62.0" + "wrangler": "^3.80.5" }, "dependencies": { "@axiomhq/js": "1.0.0-rc.2", @@ -27,6 +27,7 @@ "@hono/zod-validator": "^0.2.1", "@planetscale/database": "^1.16.0", "@unkey/cache": "workspace:^", + "@unkey/clickhouse-zod": "workspace:^", "@unkey/db": "workspace:^", "@unkey/encryption": "workspace:^", "@unkey/error": "workspace:^", @@ -36,7 +37,6 @@ "@unkey/logs": "workspace:^", "@unkey/metrics": "workspace:^", "@unkey/rbac": "workspace:^", - "@unkey/clickhouse-zod": "workspace:^", "@unkey/schema": "workspace:^", "@unkey/worker-logging": "workspace:^", "hono": "^4.6.3", diff --git a/apps/api/src/pkg/keys/service.ts b/apps/api/src/pkg/keys/service.ts index bd865c88c3..bf28869692 100644 --- a/apps/api/src/pkg/keys/service.ts +++ b/apps/api/src/pkg/keys/service.ts @@ -4,7 +4,7 @@ import type { Context } from "@/pkg/hono/app"; import type { Metrics } from "@/pkg/metrics"; import type { RateLimiter } from "@/pkg/ratelimit"; import type { UsageLimiter } from "@/pkg/usagelimit"; -import { BaseError, Err, FetchError, Ok, type Result, SchemaError } from "@unkey/error"; +import { BaseError, Err, FetchError, Ok, type Result, SchemaError, wrap } from "@unkey/error"; import { sha256 } from "@unkey/hash"; import type { PermissionQuery, RBAC } from "@unkey/rbac"; import type { Logger } from "@unkey/worker-logging"; @@ -142,19 +142,13 @@ export class KeyService { > > { try { - let res = await this._verifyKey(c, req); - let remainingRetries = 3; - while (res.err && remainingRetries > 0) { - remainingRetries--; - this.logger.warn("retrying verification", { - remainingRetries, - previousError: res.err.message, + const res = await this._verifyKey(c, req).catch(async (err) => { + this.logger.error("verify error, retrying without cache", { + error: err.message, }); - await this.cache.keyByHash.remove(await this.hash(req.key)); - res = await this._verifyKey(c, req); - } - + return await this._verifyKey(c, req, { skipCache: true }); + }); if (res.err) { this.metrics.emit({ metric: "metric.key.verification", @@ -188,6 +182,118 @@ export class KeyService { } } + private async getData(hash: string) { + const dbStart = performance.now(); + const query = this.db.readonly.query.keys.findFirst({ + where: (table, { and, eq, isNull }) => and(eq(table.hash, hash), isNull(table.deletedAt)), + with: { + encrypted: true, + workspace: { + columns: { + id: true, + enabled: true, + }, + }, + forWorkspace: { + columns: { + id: true, + enabled: true, + }, + }, + roles: { + with: { + role: { + with: { + permissions: { + with: { + permission: true, + }, + }, + }, + }, + }, + }, + permissions: { + with: { + permission: true, + }, + }, + keyAuth: { + with: { + api: true, + }, + }, + ratelimits: true, + identity: { + with: { + ratelimits: true, + }, + }, + }, + }); + + const dbRes = await query; + this.metrics.emit({ + metric: "metric.db.read", + query: "getKeyAndApiByHash", + latency: performance.now() - dbStart, + }); + + if (!dbRes?.keyAuth?.api) { + return null; + } + if (dbRes.keyAuth.deletedAt) { + return null; + } + if (dbRes.keyAuth.api.deletedAt) { + return null; + } + + /** + * Createa a unique set of all permissions, whether they're attached directly or connected + * through a role. + */ + const permissions = new Set([ + ...dbRes.permissions.map((p) => p.permission.name), + ...dbRes.roles.flatMap((r) => r.role.permissions.map((p) => p.permission.name)), + ]); + + /** + * Merge ratelimits from the identity and the key + * Key limits take pecedence + */ + const ratelimits: { [name: string]: Pick } = {}; + + if ( + dbRes.ratelimitAsync !== null && + dbRes.ratelimitDuration !== null && + dbRes.ratelimitLimit !== null + ) { + ratelimits.default = { + name: "default", + limit: dbRes.ratelimitLimit, + duration: dbRes.ratelimitDuration, + }; + } + for (const rl of dbRes.identity?.ratelimits ?? []) { + ratelimits[rl.name] = rl; + } + for (const rl of dbRes.ratelimits ?? []) { + ratelimits[rl.name] = rl; + } + + return { + workspace: dbRes.workspace, + forWorkspace: dbRes.forWorkspace, + key: dbRes, + identity: dbRes.identity, + api: dbRes.keyAuth.api, + permissions: Array.from(permissions.values()), + roles: dbRes.roles.map((r) => r.role.name), + ratelimits, + }; + } + private async hash(key: string): Promise { const cached = this.hashCache.get(key); if (cached) { @@ -209,6 +315,9 @@ export class KeyService { ratelimit?: { cost?: number }; ratelimits?: Array>; }, + opts?: { + skipCache?: boolean; + }, ): Promise< Result< VerifyKeyResult, @@ -216,130 +325,38 @@ export class KeyService { > > { const keyHash = await this.hash(req.key); - const { val: data, err } = await retry( - 3, - async () => - this.cache.keyByHash.swr(keyHash, async (hash) => { - const dbStart = performance.now(); - const query = this.db.readonly.query.keys.findFirst({ - where: (table, { and, eq, isNull }) => - and(eq(table.hash, hash), isNull(table.deletedAt)), - with: { - encrypted: true, - workspace: { - columns: { - id: true, - enabled: true, - }, - }, - forWorkspace: { - columns: { - id: true, - enabled: true, - }, - }, - roles: { - with: { - role: { - with: { - permissions: { - with: { - permission: true, - }, - }, - }, - }, - }, - }, - permissions: { - with: { - permission: true, - }, - }, - keyAuth: { - with: { - api: true, - }, - }, - ratelimits: true, - identity: { - with: { - ratelimits: true, - }, + + if (opts?.skipCache) { + this.logger.info("skipping cache", { + keyHash, + }); + } + const { val: data, err } = opts?.skipCache + ? await wrap( + this.getData(keyHash), + (err) => + new FetchError({ + message: "unable to query db", + retry: false, + context: { + error: err.message, + url: "", + method: "", + keyHash, }, - }, - }); - - const dbRes = await query; - this.metrics.emit({ - metric: "metric.db.read", - query: "getKeyAndApiByHash", - latency: performance.now() - dbStart, - dbRes: JSON.stringify(dbRes), - sql: query.toSQL().sql, - }); - if (!dbRes?.keyAuth?.api) { - return null; - } - if (dbRes.keyAuth.deletedAt) { - return null; - } - if (dbRes.keyAuth.api.deletedAt) { - return null; - } - - /** - * Createa a unique set of all permissions, whether they're attached directly or connected - * through a role. - */ - const permissions = new Set([ - ...dbRes.permissions.map((p) => p.permission.name), - ...dbRes.roles.flatMap((r) => r.role.permissions.map((p) => p.permission.name)), - ]); - - /** - * Merge ratelimits from the identity and the key - * Key limits take pecedence - */ - const ratelimits: { [name: string]: Pick } = {}; - - if ( - dbRes.ratelimitAsync !== null && - dbRes.ratelimitDuration !== null && - dbRes.ratelimitLimit !== null - ) { - ratelimits.default = { - name: "default", - limit: dbRes.ratelimitLimit, - duration: dbRes.ratelimitDuration, - }; - } - for (const rl of dbRes.identity?.ratelimits ?? []) { - ratelimits[rl.name] = rl; - } - for (const rl of dbRes.ratelimits ?? []) { - ratelimits[rl.name] = rl; - } - - return { - workspace: dbRes.workspace, - forWorkspace: dbRes.forWorkspace, - key: dbRes, - identity: dbRes.identity, - api: dbRes.keyAuth.api, - permissions: Array.from(permissions.values()), - roles: dbRes.roles.map((r) => r.role.name), - ratelimits, - }; - }), - (attempt, err) => { - this.logger.warn("Failed to fetch key data, retrying...", { - hash: keyHash, - attempt, - error: err.message, - }); - }, - ); + }), + ) + : await retry( + 3, + async () => this.cache.keyByHash.swr(keyHash, (h) => this.getData(h)), + (attempt, err) => { + this.logger.warn("Failed to fetch key data, retrying...", { + hash: keyHash, + attempt, + error: err.message, + }); + }, + ); if (err) { this.logger.error(err.message, { diff --git a/apps/api/wrangler.toml b/apps/api/wrangler.toml index 416b21f6b5..7aaea468c5 100644 --- a/apps/api/wrangler.toml +++ b/apps/api/wrangler.toml @@ -4,6 +4,8 @@ compatibility_date = "2024-01-01" compatibility_flags = ["nodejs_compat"] +[observability] +enabled = true ## these are in local dev [durable_objects] @@ -99,3 +101,6 @@ consumers = [ { queue = "key-migrations-production", max_batch_size = 10, max_retries = 10, dead_letter_queue = "key-migrations-production-dlq" }, { queue = "key-migrations-production-dlq", max_batch_size = 10, max_retries = 10 }, ] + +[env.production.observability] +enabled = true diff --git a/apps/logdrain/package.json b/apps/logdrain/package.json index e64c92afdc..c28c3385f5 100644 --- a/apps/logdrain/package.json +++ b/apps/logdrain/package.json @@ -20,6 +20,6 @@ "devDependencies": { "@cloudflare/workers-types": "4.20240603.0", "typescript": "^5.5.3", - "wrangler": "^3.62.0" + "wrangler": "^3.80.5" } } diff --git a/apps/semantic-cache/package.json b/apps/semantic-cache/package.json index be72cb489b..8d9418351c 100644 --- a/apps/semantic-cache/package.json +++ b/apps/semantic-cache/package.json @@ -23,7 +23,7 @@ "@unkey/tsconfig": "workspace:^", "dotenv": "^16.4.5", "typescript": "^5.5.3", - "wrangler": "^3.62.0" + "wrangler": "^3.80.5" }, "dependencies": { "@chronark/zod-bird": "^0.3.9", diff --git a/packages/api/src/openapi.d.ts b/packages/api/src/openapi.d.ts index 6dade71cf0..cb9a287aef 100644 --- a/packages/api/src/openapi.d.ts +++ b/packages/api/src/openapi.d.ts @@ -522,6 +522,8 @@ export interface components { * - INSUFFICIENT_PERMISSIONS: you do not have the required permissions to perform this action * - EXPIRED: The key was only valid for a certain time and has expired. * + * These are validation codes, the HTTP status will be 200. + * * @enum {string} */ code: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e955416391..55231cbbca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -145,10 +145,10 @@ importers: version: 5.5.3 vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0) + version: 1.6.0(@vitest/ui@1.6.0) wrangler: - specifier: ^3.62.0 - version: 3.62.0(@cloudflare/workers-types@4.20240603.0) + specifier: ^3.80.5 + version: 3.80.5(@cloudflare/workers-types@4.20240603.0) apps/billing: dependencies: @@ -665,8 +665,8 @@ importers: specifier: ^5.5.3 version: 5.5.3 wrangler: - specifier: ^3.62.0 - version: 3.62.0(@cloudflare/workers-types@4.20240603.0) + specifier: ^3.80.5 + version: 3.80.5(@cloudflare/workers-types@4.20240603.0) apps/planetfall: dependencies: @@ -860,7 +860,7 @@ importers: version: link:../../internal/worker-logging ai: specifier: ^3.0.23 - version: 3.4.7(openai@4.52.1)(react@18.3.1)(svelte@4.2.19)(vue@3.5.11)(zod@3.23.8) + version: 3.4.7(openai@4.52.1)(react@18.3.1)(svelte@4.2.19)(vue@3.5.12)(zod@3.23.8) drizzle-orm: specifier: generated version: 0.32.0-aaf764c(@cloudflare/workers-types@4.20240603.0)(@planetscale/database@1.18.0)(react@18.3.1) @@ -896,8 +896,8 @@ importers: specifier: ^5.5.3 version: 5.5.3 wrangler: - specifier: ^3.62.0 - version: 3.62.0(@cloudflare/workers-types@4.20240603.0) + specifier: ^3.80.5 + version: 3.80.5(@cloudflare/workers-types@4.20240603.0) apps/workflows: dependencies: @@ -1911,6 +1911,23 @@ packages: - zod dev: false + /@ai-sdk/vue@0.0.53(vue@3.5.12)(zod@3.23.8): + resolution: {integrity: sha512-FNScuIvM8N4Pj4Xto11blgI97c5cjjTelyk0M0MkyU+sLSbpQNDE78CRq5cW1oeVkJzzdv63+xh8jaFNe+2vnQ==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.4 + peerDependenciesMeta: + vue: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) + swrv: 1.0.4(vue@3.5.12) + vue: 3.5.12(typescript@5.5.3) + transitivePeerDependencies: + - zod + dev: false + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -2998,7 +3015,7 @@ packages: esbuild: 0.17.19 miniflare: 3.20240524.2 semver: 7.6.3 - vitest: 1.5.3(@types/node@20.14.9)(@vitest/ui@1.6.0) + vitest: 1.5.3(@types/node@20.14.9) wrangler: 3.59.0(@cloudflare/workers-types@4.20240603.0) zod: 3.23.8 transitivePeerDependencies: @@ -3023,7 +3040,7 @@ packages: esbuild: 0.17.19 miniflare: 3.20240524.2 semver: 7.6.3 - vitest: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0) + vitest: 1.6.0(@vitest/ui@1.6.0) wrangler: 3.59.0(@cloudflare/workers-types@4.20240603.0) zod: 3.23.8 transitivePeerDependencies: @@ -3042,8 +3059,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-64@1.20240620.1: - resolution: {integrity: sha512-YWeS2aE8jAzDefuus/3GmZcFGu3Ef94uCAoxsQuaEXNsiGM9NeAhPpKC1BJAlcv168U/Q1J+6hckcGtipf6ZcQ==} + /@cloudflare/workerd-darwin-64@1.20241011.1: + resolution: {integrity: sha512-gZ2PrMCQ4WdDCB+V6vsB2U2SyYcmgaGMEa3GGjcUfC79L/8so3Vp/bO0eCoLmvttRs39wascZ+JiWL0HpcZUgA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -3060,8 +3077,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20240620.1: - resolution: {integrity: sha512-3rdND+EHpmCrwYX6hvxIBSBJ0f40tRNxond1Vfw7GiR1MJVi3gragiBx75UDFHCxfRw3J0GZ1qVlkRce2/Xbsg==} + /@cloudflare/workerd-darwin-arm64@1.20241011.1: + resolution: {integrity: sha512-c26TYtS0e3WZ09nL/a8YaEqveCsTlgDm12ehPMNua9u68sh1KzETMl2G45O934m8UrI3Rhpv2TTecO0S5b9exA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -3078,8 +3095,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20240620.1: - resolution: {integrity: sha512-tURcTrXGeSbYqeM5ISVcofY20StKbVIcdxjJvNYNZ+qmSV9Fvn+zr7rRE+q64pEloVZfhsEPAlUCnFso5VV4XQ==} + /@cloudflare/workerd-linux-64@1.20241011.1: + resolution: {integrity: sha512-pl4xvHNXnm3cYh5GwHadOTQRWt4Ih/gzCOb6RW4n78oNQQydFvpwqYAjbYk32y485feLhdTKXut/MgZAyWnKyQ==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -3096,8 +3113,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20240620.1: - resolution: {integrity: sha512-TThvkwNxaZFKhHZnNjOGqIYCOk05DDWgO+wYMuXg15ymN/KZPnCicRAkuyqiM+R1Fgc4kwe/pehjP8pbmcf6sg==} + /@cloudflare/workerd-linux-arm64@1.20241011.1: + resolution: {integrity: sha512-I4HAF2Qe8xgIjAdE53viT2fDdHXkrb3Be0L3eWeeP5SEkOtQ4cHLqsOV7yhUWOJpHiI1XCDcf+wdfn0PB/EngQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -3114,8 +3131,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20240620.1: - resolution: {integrity: sha512-Y/BA9Yj0r7Al1HK3nDHcfISgFllw6NR3XMMPChev57vrVT9C9D4erBL3sUBfofHU+2U9L+ShLsl6obBpe3vvUw==} + /@cloudflare/workerd-windows-64@1.20241011.1: + resolution: {integrity: sha512-oVr1Cb7NkDpukd7v68FdxOH8vaHRSzHkX9uE/IttHd2yPK6mwOS220nIxK9UMcx5CwZmrgphRwtZwSYVk/lREQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -3123,6 +3140,14 @@ packages: dev: true optional: true + /@cloudflare/workers-shared@0.6.0: + resolution: {integrity: sha512-rfUCvb3hx4AsvdUZsxgk9lmgEnQehqV3jdtXLP/Xr0+P56n11T/0nXNMzmn7Nnv+IJFOV6X9NmFhuMz4sBPw7w==} + engines: {node: '>=16.7.0'} + dependencies: + mime: 3.0.0 + zod: 3.23.8 + dev: true + /@cloudflare/workers-types@4.20240603.0: resolution: {integrity: sha512-KmsjZcd/dPWM51FoT08cvUGCq9l3nFEriloQ12mcdJPoW911Gi5S/9Cq4xeFvTrtk9TJ2krvxP23IeobecRmOQ==} @@ -10616,7 +10641,7 @@ packages: /@types/node-forge@1.3.11: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: - '@types/node': 20.14.9 + '@types/node': 22.7.6 dev: true /@types/node@12.20.55: @@ -10650,6 +10675,12 @@ packages: undici-types: 6.19.8 dev: true + /@types/node@22.7.6: + resolution: {integrity: sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==} + dependencies: + undici-types: 6.19.8 + dev: true + /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true @@ -11085,7 +11116,7 @@ packages: pathe: 1.1.2 picocolors: 1.1.0 sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0) + vitest: 1.6.0(@vitest/ui@1.6.0) dev: true /@vitest/utils@1.5.3: @@ -11116,6 +11147,16 @@ packages: source-map-js: 1.2.1 dev: false + /@vue/compiler-core@3.5.12: + resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} + dependencies: + '@babel/parser': 7.25.8 + '@vue/shared': 3.5.12 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + dev: false + /@vue/compiler-dom@3.5.11: resolution: {integrity: sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==} dependencies: @@ -11123,6 +11164,13 @@ packages: '@vue/shared': 3.5.11 dev: false + /@vue/compiler-dom@3.5.12: + resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==} + dependencies: + '@vue/compiler-core': 3.5.12 + '@vue/shared': 3.5.12 + dev: false + /@vue/compiler-sfc@3.5.11: resolution: {integrity: sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==} dependencies: @@ -11137,6 +11185,20 @@ packages: source-map-js: 1.2.1 dev: false + /@vue/compiler-sfc@3.5.12: + resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} + dependencies: + '@babel/parser': 7.25.8 + '@vue/compiler-core': 3.5.12 + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-ssr': 3.5.12 + '@vue/shared': 3.5.12 + estree-walker: 2.0.2 + magic-string: 0.30.12 + postcss: 8.4.47 + source-map-js: 1.2.1 + dev: false + /@vue/compiler-ssr@3.5.11: resolution: {integrity: sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==} dependencies: @@ -11144,12 +11206,25 @@ packages: '@vue/shared': 3.5.11 dev: false + /@vue/compiler-ssr@3.5.12: + resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} + dependencies: + '@vue/compiler-dom': 3.5.12 + '@vue/shared': 3.5.12 + dev: false + /@vue/reactivity@3.5.11: resolution: {integrity: sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==} dependencies: '@vue/shared': 3.5.11 dev: false + /@vue/reactivity@3.5.12: + resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==} + dependencies: + '@vue/shared': 3.5.12 + dev: false + /@vue/runtime-core@3.5.11: resolution: {integrity: sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==} dependencies: @@ -11157,6 +11232,13 @@ packages: '@vue/shared': 3.5.11 dev: false + /@vue/runtime-core@3.5.12: + resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==} + dependencies: + '@vue/reactivity': 3.5.12 + '@vue/shared': 3.5.12 + dev: false + /@vue/runtime-dom@3.5.11: resolution: {integrity: sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==} dependencies: @@ -11166,6 +11248,15 @@ packages: csstype: 3.1.3 dev: false + /@vue/runtime-dom@3.5.12: + resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==} + dependencies: + '@vue/reactivity': 3.5.12 + '@vue/runtime-core': 3.5.12 + '@vue/shared': 3.5.12 + csstype: 3.1.3 + dev: false + /@vue/server-renderer@3.5.11(vue@3.5.11): resolution: {integrity: sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==} peerDependencies: @@ -11176,10 +11267,24 @@ packages: vue: 3.5.11(typescript@5.5.3) dev: false + /@vue/server-renderer@3.5.12(vue@3.5.12): + resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==} + peerDependencies: + vue: 3.5.12 + dependencies: + '@vue/compiler-ssr': 3.5.12 + '@vue/shared': 3.5.12 + vue: 3.5.12(typescript@5.5.3) + dev: false + /@vue/shared@3.5.11: resolution: {integrity: sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==} dev: false + /@vue/shared@3.5.12: + resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + dev: false + /@webassemblyjs/ast@1.12.1: resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: @@ -11356,6 +11461,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.13.0: + resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} + engines: {node: '>=0.4.0'} + hasBin: true + /acorn@8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} @@ -11443,6 +11553,50 @@ packages: - vue dev: false + /ai@3.4.7(openai@4.52.1)(react@18.3.1)(svelte@4.2.19)(vue@3.5.12)(zod@3.23.8): + resolution: {integrity: sha512-SutkVjFE86+xNql7fJERJkSEwpILEuiQvCoogJef6ZX/PGHvu3yepwHwVwedgABXe9SudOIKN48EQESrXX/xCw==} + engines: {node: '>=18'} + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 + sswr: ^2.1.0 + svelte: ^3.0.0 || ^4.0.0 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + sswr: + optional: true + svelte: + optional: true + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.24 + '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) + '@ai-sdk/react': 0.0.62(react@18.3.1)(zod@3.23.8) + '@ai-sdk/solid': 0.0.49(zod@3.23.8) + '@ai-sdk/svelte': 0.0.51(svelte@4.2.19)(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) + '@ai-sdk/vue': 0.0.53(vue@3.5.12)(zod@3.23.8) + '@opentelemetry/api': 1.4.1 + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + nanoid: 3.3.6 + openai: 4.52.1 + react: 18.3.1 + secure-json-parse: 2.7.0 + svelte: 4.2.19 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - solid-js + - vue + dev: false + /ajv-draft-04@1.0.0(ajv@8.17.1): resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -12090,7 +12244,7 @@ packages: /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 tslib: 2.7.0 transitivePeerDependencies: - supports-color @@ -12504,7 +12658,7 @@ packages: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 - acorn: 8.12.1 + acorn: 8.13.0 estree-walker: 3.0.3 periscopic: 3.1.0 dev: false @@ -12677,6 +12831,7 @@ packages: /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} + dev: false /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} @@ -13142,6 +13297,7 @@ packages: /date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: false /debounce-fn@4.0.0: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} @@ -13182,6 +13338,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug@4.3.7(supports-color@8.1.1): resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -18795,20 +18963,20 @@ packages: - utf-8-validate dev: true - /miniflare@3.20240620.0: - resolution: {integrity: sha512-NBMzqUE2mMlh/hIdt6U5MP+aFhEjKDq3l8CAajXAQa1WkndJdciWvzB2mfLETwoVFhMl/lphaVzyEN2AgwJpbQ==} + /miniflare@3.20241011.0: + resolution: {integrity: sha512-Mb3U9+QvKgIUl9LgHwBxEz8WajMRYqO5mMHRtO8yHjNCLGh24I6Ts9z13zRAYGPDd1xBQ1o983fHT9S+tn6r+A==} engines: {node: '>=16.13'} hasBin: true dependencies: '@cspotcode/source-map-support': 0.8.1 - acorn: 8.12.1 + acorn: 8.13.0 acorn-walk: 8.3.4 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20240620.1 + workerd: 1.20241011.1 ws: 8.18.0 youch: 3.3.4 zod: 3.23.8 @@ -19292,10 +19460,6 @@ packages: resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} dev: false - /node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - dev: true - /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -19567,6 +19731,10 @@ packages: has-symbols: 1.0.3 object-keys: 1.1.1 + /ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + dev: true + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -20043,6 +20211,10 @@ packages: /picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + dev: true + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -22532,7 +22704,7 @@ packages: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@types/estree': 1.0.6 - acorn: 8.12.1 + acorn: 8.13.0 aria-query: 5.3.2 axobject-query: 4.1.0 code-red: 1.0.4 @@ -22596,6 +22768,14 @@ packages: vue: 3.5.11(typescript@5.5.3) dev: false + /swrv@1.0.4(vue@3.5.12): + resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} + peerDependencies: + vue: '>=3.2.26 < 4' + dependencies: + vue: 3.5.12(typescript@5.5.3) + dev: false + /tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} dependencies: @@ -23380,13 +23560,11 @@ packages: dependencies: '@fastify/busboy': 2.1.1 - /unenv-nightly@1.10.0-1717606461.a117952: - resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} + /unenv-nightly@2.0.0-20241009-125958-e8ea22f: + resolution: {integrity: sha512-hRxmKz1iSVRmuFx/vBdPsx7rX4o7Cas9vdjDNeUeWpQTK2LzU3Xy3Jz0zbo7MJX0bpqo/LEFCA+GPwsbl6zKEQ==} dependencies: - consola: 3.2.3 defu: 6.1.4 - mime: 3.0.0 - node-fetch-native: 1.6.4 + ohash: 1.1.4 pathe: 1.1.2 ufo: 1.5.4 dev: true @@ -23786,10 +23964,32 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.9(@types/node@20.14.9) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.7 pathe: 1.1.2 picocolors: 1.1.0 - vite: 5.4.8(@types/node@20.14.9) + vite: 5.4.8 transitivePeerDependencies: - '@types/node' - less @@ -23824,6 +24024,44 @@ packages: - terser dev: true + /vite@5.4.8: + resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.24.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vite@5.4.8(@types/node@20.14.9): resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -23863,7 +24101,46 @@ packages: fsevents: 2.3.3 dev: true - /vitest@1.5.3(@types/node@20.14.9)(@vitest/ui@1.6.0): + /vite@5.4.9(@types/node@20.14.9): + resolution: {integrity: sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.14.9 + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.24.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.5.3(@types/node@20.14.9): resolution: {integrity: sha512-2oM7nLXylw3mQlW6GXnRriw+7YvZFk/YNV8AxIC3Z3MfFbuziLGWP9GPxxu/7nRlXhqyxBikpamr+lEEj1sUEw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -23893,21 +24170,20 @@ packages: '@vitest/runner': 1.5.3 '@vitest/snapshot': 1.5.3 '@vitest/spy': 1.5.3 - '@vitest/ui': 1.6.0(vitest@1.6.0) '@vitest/utils': 1.5.3 acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.12 pathe: 1.1.2 - picocolors: 1.1.0 + picocolors: 1.1.1 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.8(@types/node@20.14.9) + vite: 5.4.9(@types/node@20.14.9) vite-node: 1.5.3(@types/node@20.14.9) why-is-node-running: 2.3.0 transitivePeerDependencies: @@ -23979,6 +24255,63 @@ packages: - terser dev: true + /vitest@1.6.0(@vitest/ui@1.6.0): + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/ui': 1.6.0(vitest@1.6.0) + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.3.7 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.12 + pathe: 1.1.2 + picocolors: 1.1.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.8 + vite-node: 1.6.0 + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: true + /vlq@0.2.3: resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} dev: true @@ -24007,6 +24340,22 @@ packages: typescript: 5.5.3 dev: false + /vue@3.5.12(typescript@5.5.3): + resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.5.12 + '@vue/compiler-sfc': 3.5.12 + '@vue/runtime-dom': 3.5.12 + '@vue/server-renderer': 3.5.12(vue@3.5.12) + '@vue/shared': 3.5.12 + typescript: 5.5.3 + dev: false + /watchpack@2.4.2: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} @@ -24237,17 +24586,17 @@ packages: '@cloudflare/workerd-windows-64': 1.20240524.0 dev: true - /workerd@1.20240620.1: - resolution: {integrity: sha512-Qoq+RrFNk4pvEO+kpJVn8uJ5TRE9YJx5jX5pC5LjdKlw1XeD8EdXt5k0TbByvWunZ4qgYIcF9lnVxhcDFo203g==} + /workerd@1.20241011.1: + resolution: {integrity: sha512-ORobT1XDkE+p+36yk6Szyw68bWuGSmuwIlDnAeUOfnYunb/Txt0jg7ydzfwr4UIsof7AH5F1nqZms5PWLu05yw==} engines: {node: '>=16'} hasBin: true requiresBuild: true optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20240620.1 - '@cloudflare/workerd-darwin-arm64': 1.20240620.1 - '@cloudflare/workerd-linux-64': 1.20240620.1 - '@cloudflare/workerd-linux-arm64': 1.20240620.1 - '@cloudflare/workerd-windows-64': 1.20240620.1 + '@cloudflare/workerd-darwin-64': 1.20241011.1 + '@cloudflare/workerd-darwin-arm64': 1.20241011.1 + '@cloudflare/workerd-linux-64': 1.20241011.1 + '@cloudflare/workerd-linux-arm64': 1.20241011.1 + '@cloudflare/workerd-windows-64': 1.20241011.1 dev: true /wrangler@3.59.0(@cloudflare/workers-types@4.20240603.0): @@ -24283,32 +24632,33 @@ packages: - utf-8-validate dev: true - /wrangler@3.62.0(@cloudflare/workers-types@4.20240603.0): - resolution: {integrity: sha512-TM1Bd8+GzxFw/JzwsC3i/Oss4LTWvIEWXXo1vZhx+7PHcsxdbnQGBBwPurHNJDSu2Pw22+2pCZiUGKexmgJksw==} + /wrangler@3.80.5(@cloudflare/workers-types@4.20240603.0): + resolution: {integrity: sha512-BS8n54pwkk/NnkChgtuMUifP2I2SiJHgIUZqvmnVKm92pQE3ghellQx91FS5oCtWLXKlQiaToodERNfIDSti5g==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20240620.0 + '@cloudflare/workers-types': ^4.20241011.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true dependencies: '@cloudflare/kv-asset-handler': 0.3.4 + '@cloudflare/workers-shared': 0.6.0 '@cloudflare/workers-types': 4.20240603.0 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 chokidar: 3.6.0 - date-fns: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20240620.0 + miniflare: 3.20241011.0 nanoid: 3.3.7 path-to-regexp: 6.3.0 resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 - unenv: /unenv-nightly@1.10.0-1717606461.a117952 + unenv: /unenv-nightly@2.0.0-20241009-125958-e8ea22f + workerd: 1.20241011.1 xxhash-wasm: 1.0.2 optionalDependencies: fsevents: 2.3.3