From ea7de16117bb3e8bf875a4ea872ab46bc4a3f0d1 Mon Sep 17 00:00:00 2001 From: Dan <51248046+danton267@users.noreply.github.com> Date: Mon, 1 Jun 2026 17:02:01 +0100 Subject: [PATCH 1/4] chore(webapp): update dependencies and refactor AI tool integration to use the new API - Upgraded `@ai-sdk/openai` to version `3.0.0` and `ai` to version `6.0.116` in `package.json`. - Refactored AI tool calls in `ai-generate.tsx`, `ai-generate-payload.tsx`, and `aiQueryService.server.ts` to use updated input handling. - Changed `maxSteps` to `stopWhen` in several service files for better clarity and consistency. - Updated import statements to reflect changes in the `ai` package. - Removed unused peer dependencies from `pnpm-lock.yaml` to streamline the lock file. --- ...tParam.env.$envParam.query.ai-generate.tsx | 6 +- ...env.$envParam.test.ai-generate-payload.tsx | 8 +- .../app/v3/services/aiQueryService.server.ts | 18 +- .../v3/services/aiQueryTitleService.server.ts | 6 +- .../v3/services/aiRunFilterService.server.ts | 14 +- apps/webapp/evalite.config.ts | 12 + apps/webapp/evals/aiQuery.eval.ts | 4 +- apps/webapp/evals/aiRunFilter.eval.ts | 4 +- apps/webapp/package.json | 6 +- pnpm-lock.yaml | 816 ++++++++---------- 10 files changed, 406 insertions(+), 488 deletions(-) create mode 100644 apps/webapp/evalite.config.ts diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.query.ai-generate.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.query.ai-generate.tsx index 91ff6218944..c1626b966d2 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.query.ai-generate.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.query.ai-generate.tsx @@ -116,19 +116,19 @@ export async function action({ request, params }: ActionFunctionArgs) { for await (const part of result.fullStream) { switch (part.type) { case "text-delta": { - sendEvent({ type: "thinking", content: part.textDelta }); + sendEvent({ type: "thinking", content: part.text }); break; } case "tool-call": { sendEvent({ type: "tool_call", tool: part.toolName, - args: part.args, + args: part.input, }); // If it's a setTimeFilter call, emit the time_filter event immediately if (part.toolName === "setTimeFilter") { - const args = part.args as { period?: string; from?: string; to?: string }; + const args = part.input as { period?: string; from?: string; to?: string }; sendEvent({ type: "time_filter", filter: { diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.ai-generate-payload.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.ai-generate-payload.tsx index 6deadd16d83..d03b1985cb4 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.ai-generate-payload.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.test.ai-generate-payload.tsx @@ -1,5 +1,5 @@ import { openai } from "@ai-sdk/openai"; -import { streamText, tool } from "ai"; +import { streamText, stepCountIs, tool } from "ai"; import { type ActionFunctionArgs } from "@remix-run/server-runtime"; import { z } from "zod"; import { env } from "~/env.server"; @@ -105,19 +105,19 @@ export async function action({ request, params }: ActionFunctionArgs) { getTaskSourceCode: tool({ description: "Look up the source code of the task to understand what payload shape it expects. Use this when there is no JSON Schema available and you need to infer the payload structure from the task implementation.", - parameters: z.object({}), + inputSchema: z.object({}), execute: async () => { return getTaskSourceCode(environment.id, environment.type, taskIdentifier); }, }), }, - maxSteps: 3, + stopWhen: stepCountIs(3), }); for await (const part of result.fullStream) { switch (part.type) { case "text-delta": { - sendEvent({ type: "thinking", content: part.textDelta }); + sendEvent({ type: "thinking", content: part.text }); break; } case "tool-call": { diff --git a/apps/webapp/app/v3/services/aiQueryService.server.ts b/apps/webapp/app/v3/services/aiQueryService.server.ts index 3e40fc810de..29007e5c157 100644 --- a/apps/webapp/app/v3/services/aiQueryService.server.ts +++ b/apps/webapp/app/v3/services/aiQueryService.server.ts @@ -5,7 +5,7 @@ import { type TableSchema, type ValidationIssue, } from "@internal/tsql"; -import { streamText, type LanguageModelV1, tool } from "ai"; +import { streamText, stepCountIs, type LanguageModel, tool } from "ai"; import { z } from "zod"; import type { AITimeFilter } from "~/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.query/types"; @@ -55,7 +55,7 @@ export class AIQueryService { constructor( private readonly tableSchema: TableSchema[], - private readonly model: LanguageModelV1 = openai("gpt-4.1-mini") + private readonly model: LanguageModel = openai("gpt-4.1-mini") ) {} /** @@ -66,7 +66,7 @@ export class AIQueryService { return tool({ description: "Set the time filter for the query page UI instead of adding time conditions to the query. ALWAYS use this tool when the user wants to filter by time (e.g., 'last 7 days', 'past hour', 'yesterday'). The UI will apply this filter automatically using the table's time column (triggered_at for runs, bucket_start for metrics). Do NOT add triggered_at or bucket_start to the WHERE clause for time filtering - use this tool instead.", - parameters: z.object({ + inputSchema: z.object({ period: z .string() .optional() @@ -125,7 +125,7 @@ export class AIQueryService { validateTSQLQuery: tool({ description: "Validate a TSQL query for syntax errors and schema compliance. Always use this tool to verify your query before returning it to the user.", - parameters: z.object({ + inputSchema: z.object({ query: z.string().describe("The TSQL query to validate"), }), execute: async ({ query }) => { @@ -135,7 +135,7 @@ export class AIQueryService { getTableSchema: tool({ description: "Get detailed schema information about available tables and columns. Use this to understand what data is available and how to query it.", - parameters: z.object({ + inputSchema: z.object({ tableName: z .string() .optional() @@ -147,7 +147,7 @@ export class AIQueryService { }), setTimeFilter: this.buildSetTimeFilterTool(), }, - maxSteps: 5, + stopWhen: stepCountIs(5), experimental_telemetry: { isEnabled: true, metadata: { @@ -191,7 +191,7 @@ export class AIQueryService { validateTSQLQuery: tool({ description: "Validate a TSQL query for syntax errors and schema compliance. Always use this tool to verify your query before returning it to the user.", - parameters: z.object({ + inputSchema: z.object({ query: z.string().describe("The TSQL query to validate"), }), execute: async ({ query }) => { @@ -201,7 +201,7 @@ export class AIQueryService { getTableSchema: tool({ description: "Get detailed schema information about available tables and columns. Use this to understand what data is available and how to query it.", - parameters: z.object({ + inputSchema: z.object({ tableName: z .string() .optional() @@ -213,7 +213,7 @@ export class AIQueryService { }), setTimeFilter: this.buildSetTimeFilterTool(), }, - maxSteps: 5, + stopWhen: stepCountIs(5), experimental_telemetry: { isEnabled: true, metadata: { diff --git a/apps/webapp/app/v3/services/aiQueryTitleService.server.ts b/apps/webapp/app/v3/services/aiQueryTitleService.server.ts index 983f732453a..5bf216379e8 100644 --- a/apps/webapp/app/v3/services/aiQueryTitleService.server.ts +++ b/apps/webapp/app/v3/services/aiQueryTitleService.server.ts @@ -1,5 +1,5 @@ import { openai } from "@ai-sdk/openai"; -import { generateText, type LanguageModelV1 } from "ai"; +import { generateText, type LanguageModel } from "ai"; import { env } from "~/env.server"; /** @@ -13,7 +13,7 @@ export type AIQueryTitleResult = * Service for generating concise titles for SQL queries using AI */ export class AIQueryTitleService { - constructor(private readonly model: LanguageModelV1 = openai("gpt-4o-mini")) {} + constructor(private readonly model: LanguageModel = openai("gpt-4o-mini")) {} /** * Generate a concise title for a SQL query @@ -45,7 +45,7 @@ Examples: - "Average execution time by task" - "Recent runs with errors"`, prompt: `Generate a concise title for this SQL query:\n\n${query}`, - maxTokens: 50, + maxOutputTokens: 50, experimental_telemetry: { isEnabled: true, metadata: { diff --git a/apps/webapp/app/v3/services/aiRunFilterService.server.ts b/apps/webapp/app/v3/services/aiRunFilterService.server.ts index 4ce12b94557..989e5fe95ec 100644 --- a/apps/webapp/app/v3/services/aiRunFilterService.server.ts +++ b/apps/webapp/app/v3/services/aiRunFilterService.server.ts @@ -1,6 +1,6 @@ import { openai } from "@ai-sdk/openai"; import { type TaskTriggerSource } from "@trigger.dev/database"; -import { generateText, LanguageModelV1, Output, tool } from "ai"; +import { generateText, stepCountIs, type LanguageModel, Output, tool } from "ai"; import { z } from "zod"; import { TaskRunListSearchFilters } from "~/components/runs/v3/RunFilters"; import { logger } from "~/services/logger.server"; @@ -80,7 +80,7 @@ export class AIRunFilterService { queryQueues: QueryQueues; queryTasks: QueryTasks; }, - private readonly model: LanguageModelV1 = openai("gpt-4o-mini") + private readonly model: LanguageModel = openai("gpt-4o-mini") ) {} async call(text: string, environmentId: string): Promise { @@ -91,7 +91,7 @@ export class AIRunFilterService { tools: { lookupTags: tool({ description: "Look up available tags in the environment", - parameters: z.object({ + inputSchema: z.object({ query: z.string().optional().describe("Optional search query to filter tags"), }), execute: async ({ query }) => { @@ -101,7 +101,7 @@ export class AIRunFilterService { lookupVersions: tool({ description: "Look up available versions in the environment. If you specify `isCurrent` it will return a single version string if it finds one. Otherwise it will return an array of version strings.", - parameters: z.object({ + inputSchema: z.object({ isCurrent: z .boolean() .optional() @@ -119,7 +119,7 @@ export class AIRunFilterService { }), lookupQueues: tool({ description: "Look up available queues in the environment", - parameters: z.object({ + inputSchema: z.object({ query: z.string().optional().describe("Optional search query to filter queues"), type: z .enum(["task", "custom"]) @@ -135,13 +135,13 @@ export class AIRunFilterService { lookupTasks: tool({ description: "Look up available tasks in the environment. It will return each one. The `slug` is used for the filtering. You also get the triggerSource which is either `STANDARD` or `SCHEDULED`", - parameters: z.object({}), + inputSchema: z.object({}), execute: async () => { return await this.queryFns.queryTasks.query(); }, }), }, - maxSteps: 5, + stopWhen: stepCountIs(5), system: `You are an AI assistant that converts natural language descriptions into structured filter parameters for a task run filtering system. Available filter options: diff --git a/apps/webapp/evalite.config.ts b/apps/webapp/evalite.config.ts new file mode 100644 index 00000000000..52f5728b65b --- /dev/null +++ b/apps/webapp/evalite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "evalite/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +// evalite 1.0 runs its own Vite instance and does not pick up `vitest.config.ts`, +// so the `~/*` -> `./app/*` path alias must be wired in explicitly here (mirrors +// the plugin setup in vitest.config.ts). +export default defineConfig({ + viteConfig: { + // @ts-ignore - vite-tsconfig-paths plugin type vs evalite's bundled vite version + plugins: [tsconfigPaths({ projects: ["./tsconfig.json"] })], + }, +}); diff --git a/apps/webapp/evals/aiQuery.eval.ts b/apps/webapp/evals/aiQuery.eval.ts index b65cf076ddc..801aea7fbf1 100644 --- a/apps/webapp/evals/aiQuery.eval.ts +++ b/apps/webapp/evals/aiQuery.eval.ts @@ -3,7 +3,7 @@ import { Levenshtein } from "autoevals"; import { AIQueryService } from "~/v3/services/aiQueryService.server"; import { runsSchema } from "~/v3/querySchemas"; import dotenv from "dotenv"; -import { traceAISDKModel } from "evalite/ai-sdk"; +import { wrapAISDKModel } from "evalite/ai-sdk"; import { openai } from "@ai-sdk/openai"; dotenv.config({ path: "../../.env" }); @@ -365,7 +365,7 @@ LIMIT 100`, ]; }, task: async (input) => { - const service = new AIQueryService([runsSchema], traceAISDKModel(openai("gpt-4o-mini"))); + const service = new AIQueryService([runsSchema], wrapAISDKModel(openai("gpt-4o-mini"))); const result = await service.call(input); return JSON.stringify(result); diff --git a/apps/webapp/evals/aiRunFilter.eval.ts b/apps/webapp/evals/aiRunFilter.eval.ts index b80328789e2..28c49eceb13 100644 --- a/apps/webapp/evals/aiRunFilter.eval.ts +++ b/apps/webapp/evals/aiRunFilter.eval.ts @@ -8,7 +8,7 @@ import { type QueryVersions, } from "~/v3/services/aiRunFilterService.server"; import dotenv from "dotenv"; -import { traceAISDKModel } from "evalite/ai-sdk"; +import { wrapAISDKModel } from "evalite/ai-sdk"; import { openai } from "@ai-sdk/openai"; dotenv.config({ path: "../../.env" }); @@ -272,7 +272,7 @@ evalite("AI Run Filter", { queryQueues, queryTasks, }, - traceAISDKModel(openai("gpt-4o-mini")) + wrapAISDKModel(openai("gpt-4o-mini")) ); const result = await service.call(input, "123456"); diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 198ce88b9f5..013a9ed7942 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -27,7 +27,7 @@ "/public/build" ], "dependencies": { - "@ai-sdk/openai": "^1.3.23", + "@ai-sdk/openai": "^3.0.0", "@ai-sdk/react": "^3.0.0", "@ariakit/react": "^0.4.6", "@ariakit/react-core": "^0.4.6", @@ -138,7 +138,7 @@ "@vercel/sdk": "^1.19.1", "@whatwg-node/fetch": "^0.9.14", "@window-splitter/react": "1.1.3", - "ai": "^4.3.19", + "ai": "^6.0.116", "assert-never": "^1.2.1", "aws4fetch": "^1.0.18", "class-variance-authority": "^0.5.2", @@ -286,7 +286,7 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-turbo": "^2.0.4", - "evalite": "^0.11.4", + "evalite": "1.0.0-beta.16", "npm-run-all": "^4.1.5", "postcss-import": "^16.0.1", "postcss-loader": "^8.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58a5f3f8012..8a38560f8ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,8 +101,8 @@ importers: specifier: 20.14.14 version: 20.14.14 '@vitest/coverage-v8': - specifier: 3.1.4 - version: 3.1.4(vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3)) + specifier: 4.1.7 + version: 4.1.7(vitest@4.1.7) autoprefixer: specifier: ^10.4.12 version: 10.4.13(postcss@8.5.10) @@ -131,8 +131,8 @@ importers: specifier: ^4.0.5 version: 4.0.5(typescript@5.5.4) vitest: - specifier: 3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3) + specifier: 4.1.7 + version: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@20.14.14)(@vitest/coverage-v8@4.1.7)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3)) apps/coordinator: dependencies: @@ -243,8 +243,8 @@ importers: apps/webapp: dependencies: '@ai-sdk/openai': - specifier: ^1.3.23 - version: 1.3.23(zod@3.25.76) + specifier: ^3.0.0 + version: 3.0.41(zod@3.25.76) '@ai-sdk/react': specifier: ^3.0.0 version: 3.0.170(react@18.2.0)(zod@3.25.76) @@ -579,8 +579,8 @@ importers: specifier: 1.1.3 version: 1.1.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ai: - specifier: ^4.3.19 - version: 4.3.19(react@18.2.0)(zod@3.25.76) + specifier: ^6.0.116 + version: 6.0.168(zod@3.25.76) assert-never: specifier: ^1.2.1 version: 1.2.1 @@ -1015,8 +1015,8 @@ importers: specifier: ^2.0.4 version: 2.0.5(eslint@8.31.0) evalite: - specifier: ^0.11.4 - version: 0.11.4(bufferutil@4.0.9) + specifier: 1.0.0-beta.16 + version: 1.0.0-beta.16(ai@6.0.168(zod@3.25.76))(better-sqlite3@11.10.0)(bufferutil@4.0.9) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -1190,8 +1190,8 @@ importers: specifier: workspace:* version: link:../testcontainers vitest: - specifier: 3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3) + specifier: 4.1.7 + version: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@20.14.14)(@vitest/coverage-v8@4.1.7)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3)) internal-packages/otlp-importer: dependencies: @@ -1370,8 +1370,8 @@ importers: specifier: 5.5.4 version: 5.5.4 vitest: - specifier: 3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3) + specifier: 4.1.7 + version: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@20.14.14)(@vitest/coverage-v8@4.1.7)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3)) internal-packages/testcontainers: dependencies: @@ -2255,7 +2255,7 @@ importers: version: 7.8.0 '@prisma/client': specifier: ^7.4.2 - version: 7.8.0(prisma@7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.3.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4))(typescript@5.5.4) + version: 7.8.0(prisma@7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4))(typescript@5.5.4) '@trigger.dev/sdk': specifier: workspace:* version: link:../../packages/trigger-sdk @@ -2310,7 +2310,7 @@ importers: version: 5.0.6 prisma: specifier: ^7.4.2 - version: 7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.3.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4) + version: 7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4) tailwindcss: specifier: ^4 version: 4.0.17 @@ -2321,8 +2321,8 @@ importers: specifier: 5.5.4 version: 5.5.4 vitest: - specifier: ^3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3) + specifier: ^4.1.7 + version: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@20.14.14)(@vitest/coverage-v8@4.1.7)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3)) references/bun-catalog: dependencies: @@ -2698,7 +2698,7 @@ importers: version: link:../../packages/trigger-sdk '@uploadthing/react': specifier: ^7.0.3 - version: 7.0.3(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(react@18.3.1)(uploadthing@7.1.0(express@5.2.1)(fastify@5.4.0)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1)) + version: 7.0.3(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(react@18.3.1)(uploadthing@7.1.0(express@5.2.1)(fastify@5.8.5)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1)) ai: specifier: ^4.0.0 version: 4.0.0(react@18.3.1)(zod@3.25.76) @@ -2737,7 +2737,7 @@ importers: version: 1.0.7(tailwindcss@3.4.1) uploadthing: specifier: ^7.1.0 - version: 7.1.0(express@5.2.1)(fastify@5.4.0)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1) + version: 7.1.0(express@5.2.1)(fastify@5.8.5)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1) zod: specifier: 3.25.76 version: 3.25.76 @@ -3151,12 +3151,6 @@ packages: peerDependencies: zod: ^3.0.0 - '@ai-sdk/openai@1.3.23': - resolution: {integrity: sha512-86U7rFp8yacUAOE/Jz8WbGcwMCqWvjK33wk5DXkfnAOEn3mx2r7tNSJdjukQFZbAK97VMXGPPHxF+aEARDXRXQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - '@ai-sdk/openai@1.3.3': resolution: {integrity: sha512-CH57tonLB4DwkwqwnMmTCoIOR7cNW3bP5ciyloI7rBGJS/Bolemsoo+vn5YnwkyT9O1diWJyvYeTh7A4UfiYOw==} engines: {node: '>=18'} @@ -3205,12 +3199,6 @@ packages: peerDependencies: zod: ^3.23.8 - '@ai-sdk/provider-utils@2.2.8': - resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - '@ai-sdk/provider-utils@3.0.12': resolution: {integrity: sha512-ZtbdvYxdMoria+2SlNarEk6Hlgyf+zzcznlD55EAl+7VZvJaSg2sqPvwArY7L6TfDEDJsnCq0fdhBSkYo0Xqdg==} engines: {node: '>=18'} @@ -3253,10 +3241,6 @@ packages: resolution: {integrity: sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==} engines: {node: '>=18'} - '@ai-sdk/provider@1.1.3': - resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} - engines: {node: '>=18'} - '@ai-sdk/provider@2.0.0': resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} @@ -3281,16 +3265,6 @@ packages: zod: optional: true - '@ai-sdk/react@1.2.12': - resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true - '@ai-sdk/react@1.2.2': resolution: {integrity: sha512-rxyNTFjUd3IilVOJFuUJV5ytZBYAIyRi50kFS2gNmSEiG4NHMBBm31ddrxI/i86VpY8gzZVp1/igtljnWBihUA==} engines: {node: '>=18'} @@ -3322,12 +3296,6 @@ packages: peerDependencies: zod: ^3.23.8 - '@ai-sdk/ui-utils@1.2.11': - resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -4044,6 +4012,10 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} @@ -4052,6 +4024,10 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.22.15': resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} @@ -4079,6 +4055,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-decorators@7.22.10': resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} engines: {node: '>=6.9.0'} @@ -4185,6 +4166,10 @@ packages: resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -5422,8 +5407,8 @@ packages: '@fastify/accept-negotiator@2.0.1': resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} - '@fastify/ajv-compiler@4.0.2': - resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} + '@fastify/ajv-compiler@4.0.5': + resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} @@ -5450,8 +5435,8 @@ packages: '@fastify/static@8.2.0': resolution: {integrity: sha512-PejC/DtT7p1yo3p+W7LiUtLMsV8fEvxAK15sozHy9t8kwo5r0uLYmhV/inURmGz1SkHZFz/8CNtHLPyhKcx4SQ==} - '@fastify/websocket@11.0.1': - resolution: {integrity: sha512-44yam5+t1I9v09hWBYO+ezV88+mb9Se2BjgERtzB/68+0mGeTfFkjBeDBe2y+ZdiPpeO2rhevhdnfrBm5mqH+Q==} + '@fastify/websocket@11.2.0': + resolution: {integrity: sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==} '@fingerprintjs/fingerprintjs-pro-react@2.6.3': resolution: {integrity: sha512-/axCq/cfjZkIM+WFZM/05FQvqtNfdKbIFKU6b2yrwPKlgT8BqWkAq8XvFX6JCPlq8/udVLJjFEDCK+1JQh1L6g==} @@ -5920,10 +5905,6 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -7053,6 +7034,9 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -10473,6 +10457,9 @@ packages: '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/compression@1.7.2': resolution: {integrity: sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==} @@ -10603,6 +10590,9 @@ packages: resolution: {integrity: sha512-7MpxcJPHqQ637FCZwJLtJMaDZkcD/iyUxj0m8A+m06slFeqRiK9QtgEyuocWNRbEtCrOZOEbZPTSSR88hMZVsg==} deprecated: This is a stub types definition. decimal.js provides its own type definitions, so you do not need this installed. + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} @@ -11100,20 +11090,20 @@ packages: resolution: {integrity: sha512-K4rmtUT6t1vX06tiY44ot8A7W1FKN7g/tMkE7yZghCgNQ8b30SzljBd4ni8RNp2pJzM/HrZmphRDeIArO7oZuw==} hasBin: true - '@vitest/coverage-v8@3.1.4': - resolution: {integrity: sha512-G4p6OtioySL+hPV7Y6JHlhpsODbJzt1ndwHAFkyk6vVjpK03PFsKnauZIzcd0PrK4zAbc5lc+jeZ+eNGiMA+iw==} + '@vitest/coverage-v8@4.1.7': + resolution: {integrity: sha512-qsYPeXc5Q9dFLd1i8Ap+Bx8sQgcp+rFVQo4R0dDsWNBzl26ldVF1qOO+RL24K7FDrR6pA+50XedRLSoSG24bVQ==} peerDependencies: - '@vitest/browser': 3.1.4 - vitest: 3.1.4 + '@vitest/browser': 4.1.7 + vitest: 4.1.7 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.1.4': - resolution: {integrity: sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==} + '@vitest/expect@4.1.7': + resolution: {integrity: sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==} - '@vitest/mocker@3.1.4': - resolution: {integrity: sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==} + '@vitest/mocker@4.1.7': + resolution: {integrity: sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==} peerDependencies: msw: ^2.4.9 vite: ^6.4.2 @@ -11123,29 +11113,20 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - - '@vitest/pretty-format@3.1.4': - resolution: {integrity: sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==} - - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@vitest/pretty-format@4.1.7': + resolution: {integrity: sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==} - '@vitest/runner@3.1.4': - resolution: {integrity: sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==} + '@vitest/runner@4.1.7': + resolution: {integrity: sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==} - '@vitest/snapshot@3.1.4': - resolution: {integrity: sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==} + '@vitest/snapshot@4.1.7': + resolution: {integrity: sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==} - '@vitest/spy@3.1.4': - resolution: {integrity: sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==} + '@vitest/spy@4.1.7': + resolution: {integrity: sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==} - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - - '@vitest/utils@3.1.4': - resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==} + '@vitest/utils@4.1.7': + resolution: {integrity: sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==} '@web3-storage/multipart-parser@1.0.0': resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} @@ -11405,16 +11386,6 @@ packages: react: optional: true - ai@4.3.19: - resolution: {integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - react: - optional: true - ai@5.0.14: resolution: {integrity: sha512-xiujFa879skB7YxGzbeHAxepsr6AEaWcHPXrc5a9MRM6p4WdVAwn6mGwVZkBnhqGfZtXFr4LUnU2ayvcjWp5ig==} engines: {node: '>=18'} @@ -11624,6 +11595,9 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} + ast-v8-to-istanbul@1.0.2: + resolution: {integrity: sha512-dKmJxJsGItLmc5CYZKuEjuG6GnBs6PG4gohMhyFOWKaNQoYCuRZJDECaBlHmcG0lv2wc2E0uU8lESmBEumC3DQ==} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -12017,9 +11991,9 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -12060,10 +12034,6 @@ packages: resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} engines: {pnpm: '>=8'} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - cheminfo-types@1.8.1: resolution: {integrity: sha512-FRcpVkox+cRovffgqNdDFQ1eUav+i/Vq/CUd1hcfEl2bevntFlzznL+jE8g4twl6ElB7gZjCko6pYpXyMn+6dA==} @@ -12346,6 +12316,9 @@ packages: convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -12848,10 +12821,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -13243,6 +13212,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -13682,9 +13654,17 @@ packages: resolution: {integrity: sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==} engines: {node: '>= 0.8'} - evalite@0.11.4: - resolution: {integrity: sha512-t12sJlfkxo0Hon6MYCwOd2qliAjGObrnGL6hYXP9h8AiNAVQCiyGrFrqtOH8TIhM0kgaGrq3s/DeZ679Sr8ipw==} + evalite@1.0.0-beta.16: + resolution: {integrity: sha512-14G+Y1Rqi9xOJck1vykPwaRSPSPpSvaklMS9WjJA04KWIOUwrT3jHUyA/6GkMC0twi1vdkssGS5FstNtVqVCWQ==} hasBin: true + peerDependencies: + ai: ^6 + better-sqlite3: ^11.6.0 + peerDependenciesMeta: + ai: + optional: true + better-sqlite3: + optional: true event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -13751,8 +13731,8 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} express-rate-limit@7.5.0: @@ -13843,10 +13823,6 @@ packages: fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -13876,8 +13852,8 @@ packages: fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} - fastify@5.4.0: - resolution: {integrity: sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==} + fastify@5.8.5: + resolution: {integrity: sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==} fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} @@ -13915,6 +13891,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^4.0.4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -14950,12 +14935,8 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} jackspeak@2.3.6: @@ -14988,10 +14969,6 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -15034,6 +15011,9 @@ packages: js-sdsl@4.2.0: resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -15503,9 +15483,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} @@ -15572,9 +15549,6 @@ packages: resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -15584,6 +15558,9 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -16588,6 +16565,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + octokit@3.2.2: resolution: {integrity: sha512-7Abo3nADdja8l/aglU6Y3lpnHSfv0tw7gFPiqzry/yCU+2gTAX7R1roJ8hJrxIK+S1j+7iqRJXtmuHJ/UDsBhQ==} engines: {node: '>= 18'} @@ -16955,10 +16935,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} @@ -17097,14 +17073,14 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pino-abstract-transport@2.0.0: - resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.7.0: - resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} hasBin: true pirates@4.0.5: @@ -17940,6 +17916,9 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + real-require@1.0.0: + resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} + recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} @@ -18758,6 +18737,9 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + stream-buffers@3.0.2: resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==} engines: {node: '>= 0.10.0'} @@ -19146,10 +19128,6 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - testcontainers@11.14.0: resolution: {integrity: sha512-r9pniwv/iwzyHaI7gwAvAm4Y+IvjJg3vBWdjrUCaDMc2AXIr4jKbq7jJO18Mw2ybs73pZy1Aj7p/4RVBGMRWjg==} @@ -19166,8 +19144,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@3.1.0: - resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + thread-stream@4.2.0: + resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} + engines: {node: '>=20'} throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -19207,6 +19186,10 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyexec@1.2.3: + resolution: {integrity: sha512-g62dB+w1/OEFnPvmX0yd/HnetYITOL+1nJW7kitOycOeAvmbWC/nu0fwmmQ/kupNojqExzyC/T++pST/jRJ2mQ==} + engines: {node: '>=18'} + tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} @@ -19215,6 +19198,10 @@ packages: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.2: resolution: {integrity: sha512-mZ2sDMaySvi1PkTp4lTo1In2zjU+cY8OvZsfwrDrx3YGRbXPX1/cbPwCR9zkm3O/Fz9Jo0F1HNgIQ1b8BepqyQ==} engines: {node: '>=12.0.0'} @@ -19222,20 +19209,8 @@ packages: tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} tldts-core@7.0.7: @@ -19994,26 +19969,39 @@ packages: yaml: optional: true - vitest@3.1.4: - resolution: {integrity: sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.1.7: + resolution: {integrity: sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 + '@opentelemetry/api': ^1.9.0 '@types/node': 20.14.14 - '@vitest/browser': 3.1.4 - '@vitest/ui': 3.1.4 + '@vitest/browser-playwright': 4.1.7 + '@vitest/browser-preview': 4.1.7 + '@vitest/browser-webdriverio': 4.1.7 + '@vitest/coverage-istanbul': 4.1.7 + '@vitest/coverage-v8': 4.1.7 + '@vitest/ui': 4.1.7 happy-dom: '*' jsdom: '*' + vite: ^6.4.2 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -20189,18 +20177,6 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} @@ -20446,12 +20422,6 @@ snapshots: '@ai-sdk/provider-utils': 2.0.0(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai@1.3.23(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 - '@ai-sdk/openai@1.3.3(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.0 @@ -20501,13 +20471,6 @@ snapshots: secure-json-parse: 2.7.0 zod: 3.25.76 - '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.12(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -20556,10 +20519,6 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@1.1.3': - dependencies: - json-schema: 0.4.0 - '@ai-sdk/provider@2.0.0': dependencies: json-schema: 0.4.0 @@ -20582,16 +20541,6 @@ snapshots: react: 18.3.1 zod: 3.25.76 - '@ai-sdk/react@1.2.12(react@18.2.0)(zod@3.25.76)': - dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - react: 18.2.0 - swr: 2.2.5(react@18.2.0) - throttleit: 2.1.0 - optionalDependencies: - zod: 3.25.76 - '@ai-sdk/react@1.2.2(react@19.0.0)(zod@3.25.76)': dependencies: '@ai-sdk/provider-utils': 2.2.1(zod@3.25.76) @@ -20637,13 +20586,6 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) - '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) - '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -22714,10 +22656,14 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.24.7': {} '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.22.15': {} '@babel/helpers@7.22.15': @@ -22747,6 +22693,10 @@ snapshots: dependencies: '@babel/types': 7.27.3 + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.22.17)': dependencies: '@babel/core': 7.22.17 @@ -22873,6 +22823,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@balena/dockerignore@1.0.2': {} '@bcoe/v8-coverage@1.0.2': {} @@ -23826,7 +23781,7 @@ snapshots: '@fastify/accept-negotiator@2.0.1': {} - '@fastify/ajv-compiler@4.0.2': + '@fastify/ajv-compiler@4.0.5': dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) @@ -23856,7 +23811,7 @@ snapshots: '@lukeed/ms': 2.0.2 escape-html: 1.0.3 fast-decode-uri-component: 1.0.1 - http-errors: 2.0.0 + http-errors: 2.0.1 mime: 3.0.0 '@fastify/static@8.2.0': @@ -23866,9 +23821,9 @@ snapshots: content-disposition: 0.5.4 fastify-plugin: 5.0.1 fastq: 1.19.1 - glob: 11.0.0 + glob: 11.1.0 - '@fastify/websocket@11.0.1(bufferutil@4.0.9)': + '@fastify/websocket@11.2.0(bufferutil@4.0.9)': dependencies: duplexify: 4.1.3 fastify-plugin: 5.0.1 @@ -24282,8 +24237,6 @@ snapshots: dependencies: minipass: 7.1.2 - '@istanbuljs/schema@0.1.3': {} - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -25563,6 +25516,8 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@pinojs/redact@0.4.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -25645,11 +25600,11 @@ snapshots: prisma: 6.20.0-integration-next.8(@types/react@19.2.14)(magicast@0.3.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4) typescript: 5.5.4 - '@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.3.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4))(typescript@5.5.4)': + '@prisma/client@7.8.0(prisma@7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4))(typescript@5.5.4)': dependencies: '@prisma/client-runtime-utils': 7.8.0 optionalDependencies: - prisma: 7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.3.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4) + prisma: 7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4) typescript: 5.5.4 '@prisma/config@6.14.0(magicast@0.3.5)': @@ -25688,9 +25643,9 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/config@7.8.0(magicast@0.3.5)': + '@prisma/config@7.8.0(magicast@0.5.3)': dependencies: - c12: 3.3.4(magicast@0.3.5) + c12: 3.3.4(magicast@0.5.3) deepmerge-ts: 7.1.5 effect: 3.20.0 empathic: 2.0.0 @@ -30237,7 +30192,7 @@ snapshots: '@tailwindcss/node@4.0.17': dependencies: enhanced-resolve: 5.18.3 - jiti: 2.4.2 + jiti: 2.6.1 tailwindcss: 4.0.17 '@tailwindcss/oxide-android-arm64@4.0.17': @@ -30410,6 +30365,11 @@ snapshots: '@types/caseless@0.12.5': {} + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/compression@1.7.2': dependencies: '@types/express': 4.17.15 @@ -30569,6 +30529,8 @@ snapshots: dependencies: decimal.js: 10.6.0 + '@types/deep-eql@4.0.2': {} + '@types/diff-match-patch@1.0.36': {} '@types/docker-modem@3.0.6': @@ -31096,12 +31058,12 @@ snapshots: '@uploadthing/mime-types@0.3.0': {} - '@uploadthing/react@7.0.3(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(react@18.3.1)(uploadthing@7.1.0(express@5.2.1)(fastify@5.4.0)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1))': + '@uploadthing/react@7.0.3(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(react@18.3.1)(uploadthing@7.1.0(express@5.2.1)(fastify@5.8.5)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1))': dependencies: '@uploadthing/shared': 7.0.3 file-selector: 0.6.0 react: 18.3.1 - uploadthing: 7.1.0(express@5.2.1)(fastify@5.4.0)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1) + uploadthing: 7.1.0(express@5.2.1)(fastify@5.8.5)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1) optionalDependencies: next: 14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) @@ -31209,78 +31171,68 @@ snapshots: - '@cfworker/json-schema' - supports-color - '@vitest/coverage-v8@3.1.4(vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3))': + '@vitest/coverage-v8@4.1.7(vitest@4.1.7)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - debug: 4.4.0 + '@vitest/utils': 4.1.7 + ast-v8-to-istanbul: 1.0.2 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3) - transitivePeerDependencies: - - supports-color + istanbul-reports: 3.2.0 + magicast: 0.5.3 + obug: 2.1.1 + std-env: 4.1.0 + tinyrainbow: 3.1.0 + vitest: 4.1.7(@opentelemetry/api@1.9.0)(@types/node@20.14.14)(@vitest/coverage-v8@4.1.7)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3)) - '@vitest/expect@3.1.4': + '@vitest/expect@4.1.7': dependencies: - '@vitest/spy': 3.1.4 - '@vitest/utils': 3.1.4 - chai: 5.2.0 - tinyrainbow: 2.0.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@3.1.4(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3))': + '@vitest/mocker@4.1.7(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3))': dependencies: - '@vitest/spy': 3.1.4 + '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3) - '@vitest/pretty-format@2.1.9': + '@vitest/mocker@4.1.7(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3))': dependencies: - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@3.1.4': - dependencies: - tinyrainbow: 2.0.0 + '@vitest/spy': 4.1.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3) - '@vitest/runner@2.1.9': + '@vitest/pretty-format@4.1.7': dependencies: - '@vitest/utils': 2.1.9 - pathe: 1.1.2 + tinyrainbow: 3.1.0 - '@vitest/runner@3.1.4': + '@vitest/runner@4.1.7': dependencies: - '@vitest/utils': 3.1.4 + '@vitest/utils': 4.1.7 pathe: 2.0.3 - '@vitest/snapshot@3.1.4': + '@vitest/snapshot@4.1.7': dependencies: - '@vitest/pretty-format': 3.1.4 + '@vitest/pretty-format': 4.1.7 + '@vitest/utils': 4.1.7 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.1.4': - dependencies: - tinyspy: 3.0.2 - - '@vitest/utils@2.1.9': - dependencies: - '@vitest/pretty-format': 2.1.9 - loupe: 3.1.3 - tinyrainbow: 1.2.0 + '@vitest/spy@4.1.7': {} - '@vitest/utils@3.1.4': + '@vitest/utils@4.1.7': dependencies: - '@vitest/pretty-format': 3.1.4 - loupe: 3.1.3 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.1.7 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 '@web3-storage/multipart-parser@1.0.0': {} @@ -31585,18 +31537,6 @@ snapshots: optionalDependencies: react: 19.0.0 - ai@4.3.19(react@18.2.0)(zod@3.25.76): - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/react': 1.2.12(react@18.2.0)(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.25.76 - optionalDependencies: - react: 18.2.0 - ai@5.0.14(zod@3.25.76): dependencies: '@ai-sdk/gateway': 1.0.6(zod@3.25.76) @@ -31837,6 +31777,12 @@ snapshots: dependencies: tslib: 2.8.1 + ast-v8-to-istanbul@1.0.2: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + astral-regex@2.0.0: {} astring@1.8.4: {} @@ -32001,6 +31947,7 @@ snapshots: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 + optional: true big.js@6.2.2: {} @@ -32011,6 +31958,7 @@ snapshots: bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + optional: true bintrees@1.0.2: {} @@ -32042,7 +31990,7 @@ snapshots: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3(supports-color@10.0.0) - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.6.3 on-finished: 2.4.1 qs: 6.14.1 @@ -32056,7 +32004,7 @@ snapshots: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3(supports-color@10.0.0) - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 qs: 6.14.1 @@ -32200,7 +32148,7 @@ snapshots: dotenv: 16.6.1 exsolve: 1.0.7 giget: 2.0.0 - jiti: 2.4.2 + jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 @@ -32209,7 +32157,7 @@ snapshots: optionalDependencies: magicast: 0.3.5 - c12@3.3.4(magicast@0.3.5): + c12@3.3.4(magicast@0.5.3): dependencies: chokidar: 5.0.0 confbox: 0.2.4 @@ -32224,7 +32172,7 @@ snapshots: pkg-types: 2.3.0 rc9: 3.0.1 optionalDependencies: - magicast: 0.3.5 + magicast: 0.5.3 cac@6.7.14: {} @@ -32304,13 +32252,7 @@ snapshots: ccount@2.0.1: {} - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + chai@6.2.2: {} chalk@2.4.2: dependencies: @@ -32343,8 +32285,6 @@ snapshots: dependencies: '@kurkle/color': 0.3.4 - check-error@2.1.1: {} - cheminfo-types@1.8.1: {} chevrotain-allstar@0.3.1(chevrotain@11.0.3): @@ -32657,6 +32597,8 @@ snapshots: convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} + cookie-signature@1.0.6: {} cookie-signature@1.2.2: {} @@ -33137,8 +33079,7 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - - deep-eql@5.0.2: {} + optional: true deep-extend@0.6.0: {} @@ -33629,6 +33570,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -34255,18 +34198,25 @@ snapshots: dependencies: require-like: 0.1.2 - evalite@0.11.4(bufferutil@4.0.9): + evalite@1.0.0-beta.16(ai@6.0.168(zod@3.25.76))(better-sqlite3@11.10.0)(bufferutil@4.0.9): dependencies: '@fastify/static': 8.2.0 - '@fastify/websocket': 11.0.1(bufferutil@4.0.9) + '@fastify/websocket': 11.2.0(bufferutil@4.0.9) '@stricli/auto-complete': 1.2.0 '@stricli/core': 1.2.0 - '@vitest/runner': 2.1.9 - better-sqlite3: 11.10.0 - fastify: 5.4.0 + '@vitest/runner': 4.1.7 + '@vitest/utils': 4.1.7 + dotenv: 16.4.7 + fastify: 5.8.5 file-type: 19.6.0 + get-port: 7.2.0 + jiti: 2.6.1 + js-levenshtein: 1.1.6 table: 6.9.0 - tinyrainbow: 1.2.0 + tinyrainbow: 3.1.0 + optionalDependencies: + ai: 6.0.168(zod@3.25.76) + better-sqlite3: 11.10.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -34344,9 +34294,10 @@ snapshots: exit-hook@2.2.1: {} - expand-template@2.0.3: {} + expand-template@2.0.3: + optional: true - expect-type@1.2.1: {} + expect-type@1.3.0: {} express-rate-limit@7.5.0(express@5.0.1(supports-color@10.0.0)): dependencies: @@ -34445,7 +34396,7 @@ snapshots: etag: 1.8.1 finalhandler: 2.1.0(supports-color@10.0.0) fresh: 2.0.0 - http-errors: 2.0.0 + http-errors: 2.0.1 merge-descriptors: 2.0.0 mime-types: 3.0.0 on-finished: 2.4.1 @@ -34457,7 +34408,7 @@ snapshots: router: 2.2.0 send: 1.1.0(supports-color@10.0.0) serve-static: 2.2.1 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: @@ -34530,8 +34481,6 @@ snapshots: dependencies: fast-decode-uri-component: 1.0.1 - fast-redact@3.5.0: {} - fast-safe-stringify@2.1.1: {} fast-shallow-equal@1.0.0: {} @@ -34561,9 +34510,9 @@ snapshots: fastify-plugin@5.0.1: {} - fastify@5.4.0: + fastify@5.8.5: dependencies: - '@fastify/ajv-compiler': 4.0.2 + '@fastify/ajv-compiler': 4.0.5 '@fastify/error': 4.2.0 '@fastify/fast-json-stringify-compiler': 5.0.3 '@fastify/proxy-addr': 5.0.0 @@ -34572,7 +34521,7 @@ snapshots: fast-json-stringify: 6.0.1 find-my-way: 9.3.0 light-my-request: 6.6.0 - pino: 9.7.0 + pino: 10.3.1 process-warning: 5.0.0 rfdc: 1.4.1 secure-json-parse: 4.0.0 @@ -34607,6 +34556,10 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + fflate@0.4.8: {} fflate@0.8.2: {} @@ -34632,7 +34585,8 @@ snapshots: token-types: 6.0.3 uint8array-extras: 1.4.0 - file-uri-to-path@1.0.0: {} + file-uri-to-path@1.0.0: + optional: true fill-range@7.1.1: dependencies: @@ -34657,7 +34611,7 @@ snapshots: escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -34948,7 +34902,8 @@ snapshots: git-last-commit@1.0.1: {} - github-from-package@0.0.0: {} + github-from-package@0.0.0: + optional: true glob-parent@5.1.2: dependencies: @@ -35756,15 +35711,7 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3(supports-color@10.0.0) - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -35803,8 +35750,6 @@ snapshots: jiti@1.21.6: {} - jiti@2.4.2: {} - jiti@2.6.1: {} joi@17.7.0: @@ -35842,6 +35787,8 @@ snapshots: js-sdsl@4.2.0: {} + js-tokens@10.0.0: {} + js-tokens@4.0.0: {} js-yaml@3.14.2: @@ -36250,8 +36197,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.3: {} - lowercase-keys@1.0.1: {} lowercase-keys@2.0.0: {} @@ -36302,10 +36247,6 @@ snapshots: lz-string@1.4.4: {} - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -36321,6 +36262,13 @@ snapshots: '@babel/parser': 7.27.5 '@babel/types': 7.27.3 source-map-js: 1.2.1 + optional: true + + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 make-dir@4.0.0: dependencies: @@ -37172,7 +37120,8 @@ snapshots: mimic-response@1.0.1: {} - mimic-response@3.1.0: {} + mimic-response@3.1.0: + optional: true min-indent@1.0.1: {} @@ -37395,7 +37344,8 @@ snapshots: nanoid@5.1.5: {} - napi-build-utils@2.0.0: {} + napi-build-utils@2.0.0: + optional: true natural-compare-lite@1.4.0: {} @@ -37586,6 +37536,7 @@ snapshots: node-abi@3.75.0: dependencies: semver: 7.7.3 + optional: true node-abort-controller@3.1.1: {} @@ -37780,6 +37731,8 @@ snapshots: obuf@1.1.2: {} + obug@2.1.1: {} + octokit@3.2.2: dependencies: '@octokit/app': 14.1.0 @@ -38189,8 +38142,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} - peberminta@0.9.0: {} peek-readable@5.4.2: {} @@ -38316,25 +38267,25 @@ snapshots: pify@4.0.1: {} - pino-abstract-transport@2.0.0: + pino-abstract-transport@3.0.0: dependencies: split2: 4.2.0 pino-std-serializers@7.0.0: {} - pino@9.7.0: + pino@10.3.1: dependencies: + '@pinojs/redact': 0.4.0 atomic-sleep: 1.0.0 - fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 2.0.0 + pino-abstract-transport: 3.0.0 pino-std-serializers: 7.0.0 process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 sonic-boom: 4.2.0 - thread-stream: 3.1.0 + thread-stream: 4.2.0 pirates@4.0.5: {} @@ -38581,6 +38532,7 @@ snapshots: simple-get: 4.0.1 tar-fs: 2.1.4 tunnel-agent: 0.6.0 + optional: true preferred-pm@3.0.3: dependencies: @@ -38680,9 +38632,9 @@ snapshots: - react - react-dom - prisma@7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.3.5)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4): + prisma@7.8.0(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(better-sqlite3@11.10.0)(magicast@0.5.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.5.4): dependencies: - '@prisma/config': 7.8.0(magicast@0.3.5) + '@prisma/config': 7.8.0(magicast@0.5.3) '@prisma/dev': 0.24.3(typescript@5.5.4) '@prisma/engines': 7.8.0 '@prisma/studio-core': 0.27.3(@types/react-dom@19.0.4(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -39428,6 +39380,8 @@ snapshots: real-require@0.2.0: {} + real-require@1.0.0: {} + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 @@ -40010,12 +39964,12 @@ snapshots: escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 - http-errors: 2.0.0 + http-errors: 2.0.1 mime-types: 2.1.35 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -40237,13 +40191,15 @@ snapshots: signal-exit@4.1.0: {} - simple-concat@1.0.1: {} + simple-concat@1.0.1: + optional: true simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 + optional: true simple-oauth2@5.0.0: dependencies: @@ -40522,6 +40478,8 @@ snapshots: std-env@3.9.0: {} + std-env@4.1.0: {} + stream-buffers@3.0.2: {} stream-shift@1.0.3: {} @@ -41095,12 +41053,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - testcontainers@11.14.0: dependencies: '@balena/dockerignore': 1.0.2 @@ -41137,9 +41089,9 @@ snapshots: dependencies: any-promise: 1.3.0 - thread-stream@3.1.0: + thread-stream@4.2.0: dependencies: - real-require: 0.2.0 + real-require: 1.0.0 throttle-debounce@3.0.1: {} @@ -41171,6 +41123,8 @@ snapshots: tinyexec@1.0.1: {} + tinyexec@1.2.3: {} + tinyglobby@0.2.10: dependencies: fdir: 6.4.3(picomatch@4.0.4) @@ -41181,6 +41135,11 @@ snapshots: fdir: 6.4.4(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinyglobby@0.2.2: dependencies: fdir: 6.2.0(picomatch@4.0.4) @@ -41191,13 +41150,7 @@ snapshots: '@types/tinycolor2': 1.4.3 tinycolor2: 1.6.0 - tinypool@1.0.2: {} - - tinyrainbow@1.2.0: {} - - tinyrainbow@2.0.0: {} - - tinyspy@3.0.2: {} + tinyrainbow@3.1.0: {} tldts-core@7.0.7: {} @@ -41741,7 +41694,7 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uploadthing@7.1.0(express@5.2.1)(fastify@5.4.0)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1): + uploadthing@7.1.0(express@5.2.1)(fastify@5.8.5)(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(tailwindcss@3.4.1): dependencies: '@effect/platform': 0.63.2(@effect/schema@0.72.2(effect@3.7.2))(effect@3.7.2) '@effect/schema': 0.72.2(effect@3.7.2) @@ -41750,7 +41703,7 @@ snapshots: effect: 3.7.2 optionalDependencies: express: 5.2.1 - fastify: 5.4.0 + fastify: 5.8.5 next: 14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) tailwindcss: 3.4.1 @@ -41972,27 +41925,6 @@ snapshots: - supports-color - terser - vite-node@3.1.4(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@10.0.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-node@3.1.4(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3): dependencies: cac: 6.7.14 @@ -42068,85 +42000,63 @@ snapshots: tsx: 4.20.6 yaml: 2.8.3 - vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3): - dependencies: - '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.4(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3)) - '@vitest/pretty-format': 3.1.4 - '@vitest/runner': 3.1.4 - '@vitest/snapshot': 3.1.4 - '@vitest/spy': 3.1.4 - '@vitest/utils': 3.1.4 - chai: 5.2.0 - debug: 4.4.1 - expect-type: 1.2.1 + vitest@4.1.7(@opentelemetry/api@1.9.0)(@types/node@20.14.14)(@vitest/coverage-v8@4.1.7)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3)): + dependencies: + '@vitest/expect': 4.1.7 + '@vitest/mocker': 4.1.7(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.7 + '@vitest/runner': 4.1.7 + '@vitest/snapshot': 4.1.7 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 - std-env: 3.9.0 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.13 - tinypool: 1.0.2 - tinyrainbow: 2.0.0 + tinyexec: 1.2.3 + tinyglobby: 0.2.16 + tinyrainbow: 3.1.0 vite: 6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3) - vite-node: 3.1.4(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.12 + '@opentelemetry/api': 1.9.0 '@types/node': 20.14.14 + '@vitest/coverage-v8': 4.1.7(vitest@4.1.7) transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3): - dependencies: - '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.4(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@3.12.2)(yaml@2.8.3)) - '@vitest/pretty-format': 3.1.4 - '@vitest/runner': 3.1.4 - '@vitest/snapshot': 3.1.4 - '@vitest/spy': 3.1.4 - '@vitest/utils': 3.1.4 - chai: 5.2.0 - debug: 4.4.1 - expect-type: 1.2.1 + vitest@4.1.7(@opentelemetry/api@1.9.0)(@types/node@20.14.14)(@vitest/coverage-v8@4.1.7)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3)): + dependencies: + '@vitest/expect': 4.1.7 + '@vitest/mocker': 4.1.7(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.7 + '@vitest/runner': 4.1.7 + '@vitest/snapshot': 4.1.7 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 - std-env: 3.9.0 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.13 - tinypool: 1.0.2 - tinyrainbow: 2.0.0 + tinyexec: 1.2.3 + tinyglobby: 0.2.16 + tinyrainbow: 3.1.0 vite: 6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3) - vite-node: 3.1.4(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.12 + '@opentelemetry/api': 1.9.0 '@types/node': 20.14.14 + '@vitest/coverage-v8': 4.1.7(vitest@4.1.7) transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml vscode-jsonrpc@8.2.0: {} @@ -42219,7 +42129,7 @@ snapshots: opener: 1.5.2 picocolors: 1.1.1 sirv: 2.0.4 - ws: 7.5.9(bufferutil@4.0.9) + ws: 7.5.10(bufferutil@4.0.9) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -42368,10 +42278,6 @@ snapshots: optionalDependencies: bufferutil: 4.0.9 - ws@7.5.9(bufferutil@4.0.9): - optionalDependencies: - bufferutil: 4.0.9 - ws@8.11.0(bufferutil@4.0.9): optionalDependencies: bufferutil: 4.0.9 From c0338c2d6d09364b3a916d648f1c988ea36400b3 Mon Sep 17 00:00:00 2001 From: Dan <51248046+danton267@users.noreply.github.com> Date: Mon, 1 Jun 2026 17:11:18 +0100 Subject: [PATCH 2/4] chore(dependencies): upgrade vitest and coverage packages - Updated `@vitest/coverage-v8` and `vitest` to version `4.1.7` in multiple package.json files. - Refactored AI filter response schema in `aiRunFilterService.server.ts` to comply with OpenAI's JSON structure requirements. - Removed unused pool options from vitest configuration files across several internal packages. --- .../v3/services/aiRunFilterService.server.ts | 71 ++++++++++++------- internal-packages/clickhouse/vitest.config.ts | 5 -- .../llm-model-catalog/package.json | 2 +- .../llm-model-catalog/vitest.config.ts | 5 -- .../replication/vitest.config.ts | 5 -- .../src/engine/tests/utils/engineTest.ts | 6 +- internal-packages/run-engine/vitest.config.ts | 5 -- .../sdk-compat-tests/package.json | 2 +- internal-packages/testcontainers/src/index.ts | 18 ++--- internal-packages/testcontainers/src/logs.ts | 4 +- internal-packages/testcontainers/src/utils.ts | 6 +- internal-packages/tsql/vitest.config.ts | 5 -- package.json | 4 +- packages/redis-worker/vitest.config.ts | 5 -- references/ai-chat/package.json | 2 +- 15 files changed, 69 insertions(+), 76 deletions(-) diff --git a/apps/webapp/app/v3/services/aiRunFilterService.server.ts b/apps/webapp/app/v3/services/aiRunFilterService.server.ts index 989e5fe95ec..8f16d5cfc44 100644 --- a/apps/webapp/app/v3/services/aiRunFilterService.server.ts +++ b/apps/webapp/app/v3/services/aiRunFilterService.server.ts @@ -14,17 +14,25 @@ const AIFilters = TaskRunListSearchFilters.omit({ to: z.string().optional().describe("The ISO datetime to filter to"), }); +// The response is wrapped in an object with a single `response` field because +// OpenAI structured outputs (both the Chat and Responses APIs) require the root +// JSON Schema to be `type: "object"`. A bare `z.discriminatedUnion` compiles to +// a root-level `anyOf`, which OpenAI rejects ("schema must be of type object"). +// Nesting the union under a property keeps the discriminated-union ergonomics +// while satisfying the root-object constraint. const AIFilterResponseSchema = z - .discriminatedUnion("success", [ - z.object({ - success: z.literal(true), - filters: AIFilters, - }), - z.object({ - success: z.literal(false), - error: z.string().describe("A short human-readable error message"), - }), - ]) + .object({ + response: z.discriminatedUnion("success", [ + z.object({ + success: z.literal(true), + filters: AIFilters, + }), + z.object({ + success: z.literal(false), + error: z.string().describe("A short human-readable error message"), + }), + ]), + }) .describe("The response from the AI filter service"); export interface QueryQueues { @@ -88,6 +96,16 @@ export class AIRunFilterService { const result = await generateText({ model: this.model, experimental_output: Output.object({ schema: AIFilterResponseSchema }), + // Disable OpenAI strict JSON-schema mode. The filters schema has many + // optional fields, and strict mode requires every property to appear in + // `required` (it rejects bare optionals). Non-strict mode treats the + // schema as guidance; the `AIFilters.safeParse` below still validates + // the result, so correctness is preserved. + providerOptions: { + openai: { + strictJsonSchema: false, + }, + }, tools: { lookupTags: tool({ description: "Look up available tags in the environment", @@ -198,21 +216,24 @@ export class AIRunFilterService { The filters object should only contain the fields that are actually being filtered. Do not include fields with empty arrays or undefined values. - CRITICAL: The response must be a valid JSON object with exactly this structure: + CRITICAL: The response must be a valid JSON object with a single top-level "response" key wrapping this structure: { - "success": true, - "filters": { - // only include fields that have actual values - }, - "explanation": "string explaining what filters were applied" + "response": { + "success": true, + "filters": { + // only include fields that have actual values + } + } } - + or if you can't figure out the filters then return: { - "success": false, - "error": "" + "response": { + "success": false, + "error": "" + } } - + Make the error no more than 8 words. `, prompt: text, @@ -224,19 +245,21 @@ export class AIRunFilterService { }, }); - if (!result.experimental_output.success) { + const output = result.experimental_output.response; + + if (!output.success) { return { success: false, - error: result.experimental_output.error, + error: output.error, }; } // Validate the filters against the schema to catch any issues - const validationResult = AIFilters.safeParse(result.experimental_output.filters); + const validationResult = AIFilters.safeParse(output.filters); if (!validationResult.success) { logger.error("AI filter validation failed", { errors: validationResult.error.errors, - filters: result.experimental_output.filters, + filters: output.filters, }); return { diff --git a/internal-packages/clickhouse/vitest.config.ts b/internal-packages/clickhouse/vitest.config.ts index 1d779c09577..f3687eb4098 100644 --- a/internal-packages/clickhouse/vitest.config.ts +++ b/internal-packages/clickhouse/vitest.config.ts @@ -6,11 +6,6 @@ export default defineConfig({ globals: true, isolate: true, fileParallelism: false, - poolOptions: { - threads: { - singleThread: true, - }, - }, testTimeout: 60_000, coverage: { provider: "v8", diff --git a/internal-packages/llm-model-catalog/package.json b/internal-packages/llm-model-catalog/package.json index ac5cdafc0a6..b38454548b9 100644 --- a/internal-packages/llm-model-catalog/package.json +++ b/internal-packages/llm-model-catalog/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@internal/testcontainers": "workspace:*", - "vitest": "3.1.4" + "vitest": "4.1.7" }, "scripts": { "test": "vitest --sequence.concurrent=false --no-file-parallelism", diff --git a/internal-packages/llm-model-catalog/vitest.config.ts b/internal-packages/llm-model-catalog/vitest.config.ts index 474961216bf..9ba46467cad 100644 --- a/internal-packages/llm-model-catalog/vitest.config.ts +++ b/internal-packages/llm-model-catalog/vitest.config.ts @@ -6,11 +6,6 @@ export default defineConfig({ globals: true, isolate: true, fileParallelism: false, - poolOptions: { - threads: { - singleThread: true, - }, - }, testTimeout: 120_000, }, }); diff --git a/internal-packages/replication/vitest.config.ts b/internal-packages/replication/vitest.config.ts index 1d779c09577..f3687eb4098 100644 --- a/internal-packages/replication/vitest.config.ts +++ b/internal-packages/replication/vitest.config.ts @@ -6,11 +6,6 @@ export default defineConfig({ globals: true, isolate: true, fileParallelism: false, - poolOptions: { - threads: { - singleThread: true, - }, - }, testTimeout: 60_000, coverage: { provider: "v8", diff --git a/internal-packages/run-engine/src/engine/tests/utils/engineTest.ts b/internal-packages/run-engine/src/engine/tests/utils/engineTest.ts index 67fb5429219..431a2a22c97 100644 --- a/internal-packages/run-engine/src/engine/tests/utils/engineTest.ts +++ b/internal-packages/run-engine/src/engine/tests/utils/engineTest.ts @@ -1,4 +1,4 @@ -import { TaskContext, test, TestAPI } from "vitest"; +import { TestContext, test, TestAPI } from "vitest"; import { logCleanup, network, @@ -36,7 +36,7 @@ type EngineOptions = { }; }; -const engineOptions = async ({}: TaskContext, use: Use) => { +const engineOptions = async ({}: TestContext, use: Use) => { const options: EngineOptions = { worker: { workers: 1, @@ -74,7 +74,7 @@ const engine = async ( engineOptions: EngineOptions; redisOptions: RedisOptions; prisma: PrismaClient; - } & TaskContext, + } & TestContext, use: Use ) => { const engine = new RunEngine({ diff --git a/internal-packages/run-engine/vitest.config.ts b/internal-packages/run-engine/vitest.config.ts index c364293a434..c00c5438785 100644 --- a/internal-packages/run-engine/vitest.config.ts +++ b/internal-packages/run-engine/vitest.config.ts @@ -6,11 +6,6 @@ export default defineConfig({ globals: true, isolate: true, fileParallelism: false, - poolOptions: { - threads: { - singleThread: true, - }, - }, testTimeout: 120_000, coverage: { provider: "v8", diff --git a/internal-packages/sdk-compat-tests/package.json b/internal-packages/sdk-compat-tests/package.json index e903e69f3f1..445569c957e 100644 --- a/internal-packages/sdk-compat-tests/package.json +++ b/internal-packages/sdk-compat-tests/package.json @@ -15,6 +15,6 @@ "esbuild": "^0.24.0", "execa": "^9.3.0", "typescript": "^5.5.0", - "vitest": "3.1.4" + "vitest": "4.1.7" } } diff --git a/internal-packages/testcontainers/src/index.ts b/internal-packages/testcontainers/src/index.ts index f678fa01e7b..95b4ab48e8c 100644 --- a/internal-packages/testcontainers/src/index.ts +++ b/internal-packages/testcontainers/src/index.ts @@ -3,7 +3,7 @@ import { StartedRedisContainer } from "@testcontainers/redis"; import { PrismaClient } from "@trigger.dev/database"; import { RedisOptions } from "ioredis"; import { Network, type StartedNetwork } from "testcontainers"; -import { TaskContext, test } from "vitest"; +import { TestContext, test } from "vitest"; import { createClickHouseContainer, createElectricContainer, @@ -58,7 +58,7 @@ export type { type Use = (value: T) => Promise; -export const network = async ({ task }: TaskContext, use: Use) => { +export const network = async ({ task }: TestContext, use: Use) => { const testName = task.name; logSetup("network: starting", { testName }); @@ -85,7 +85,7 @@ export const network = async ({ task }: TaskContext, use: Use) = }; export const postgresContainer = async ( - { network, task }: { network: StartedNetwork } & TaskContext, + { network, task }: { network: StartedNetwork } & TestContext, use: Use ) => { const { container, metadata } = await withContainerSetup({ @@ -98,7 +98,7 @@ export const postgresContainer = async ( }; export const prisma = async ( - { postgresContainer, task }: { postgresContainer: StartedPostgreSqlContainer } & TaskContext, + { postgresContainer, task }: { postgresContainer: StartedPostgreSqlContainer } & TestContext, use: Use ) => { const testName = task.name; @@ -123,7 +123,7 @@ export const prisma = async ( export const postgresTest = test.extend({ network, postgresContainer, prisma }); export const redisContainer = async ( - { network, task }: { network: StartedNetwork } & TaskContext, + { network, task }: { network: StartedNetwork } & TestContext, use: Use ) => { const { container, metadata } = await withContainerSetup({ @@ -180,7 +180,7 @@ const electricOrigin = async ( postgresContainer, network, task, - }: { postgresContainer: StartedPostgreSqlContainer; network: StartedNetwork } & TaskContext, + }: { postgresContainer: StartedPostgreSqlContainer; network: StartedNetwork } & TestContext, use: Use ) => { const { origin, container, metadata } = await withContainerSetup({ @@ -193,7 +193,7 @@ const electricOrigin = async ( }; const clickhouseContainer = async ( - { network, task }: { network: StartedNetwork } & TaskContext, + { network, task }: { network: StartedNetwork } & TestContext, use: Use ) => { const { container, metadata } = await withContainerSetup({ @@ -206,7 +206,7 @@ const clickhouseContainer = async ( }; const clickhouseClient = async ( - { clickhouseContainer, task }: { clickhouseContainer: StartedClickHouseContainer } & TaskContext, + { clickhouseContainer, task }: { clickhouseContainer: StartedClickHouseContainer } & TestContext, use: Use ) => { const testName = task.name; @@ -268,7 +268,7 @@ export const containerWithElectricAndRedisTest = test.extend ) => { const { container, metadata } = await withContainerSetup({ diff --git a/internal-packages/testcontainers/src/logs.ts b/internal-packages/testcontainers/src/logs.ts index 1a844c3df94..865a6592bd5 100644 --- a/internal-packages/testcontainers/src/logs.ts +++ b/internal-packages/testcontainers/src/logs.ts @@ -1,5 +1,5 @@ import { env, isCI } from "std-env"; -import { TaskContext } from "vitest"; +import { TestContext } from "vitest"; import { DockerDiagnostics, getDockerDiagnostics } from "./docker"; import { StartedTestContainer } from "testcontainers"; @@ -31,7 +31,7 @@ export function getContainerMetadata(container: StartedTestContainer) { }; } -export function getTaskMetadata(task: TaskContext["task"]) { +export function getTaskMetadata(task: TestContext["task"]) { return { testName: task.name, }; diff --git a/internal-packages/testcontainers/src/utils.ts b/internal-packages/testcontainers/src/utils.ts index eca9b06d388..5f689bc5bfe 100644 --- a/internal-packages/testcontainers/src/utils.ts +++ b/internal-packages/testcontainers/src/utils.ts @@ -7,7 +7,7 @@ import path from "path"; import { isDebug } from "std-env"; import { GenericContainer, StartedNetwork, StartedTestContainer, Wait } from "testcontainers"; import { x } from "tinyexec"; -import type { TaskContext } from "vitest"; +import type { TestContext } from "vitest"; import { ClickHouseContainer, runClickhouseMigrations } from "./clickhouse"; import { MinIOContainer } from "./minio"; import { getContainerMetadata, getTaskMetadata, logCleanup, logSetup } from "./logs"; @@ -209,7 +209,7 @@ export async function withContainerSetup({ setup, }: { name: string; - task: TaskContext["task"]; + task: TestContext["task"]; setup: Promise; }): Promise }> { const testName = task.name; @@ -236,7 +236,7 @@ export async function useContainer( container, task, use, - }: { container: TContainer; task: TaskContext["task"]; use: () => Promise } + }: { container: TContainer; task: TestContext["task"]; use: () => Promise } ) { const metadata = { ...getTaskMetadata(task), diff --git a/internal-packages/tsql/vitest.config.ts b/internal-packages/tsql/vitest.config.ts index 1d779c09577..f3687eb4098 100644 --- a/internal-packages/tsql/vitest.config.ts +++ b/internal-packages/tsql/vitest.config.ts @@ -6,11 +6,6 @@ export default defineConfig({ globals: true, isolate: true, fileParallelism: false, - poolOptions: { - threads: { - singleThread: true, - }, - }, testTimeout: 60_000, coverage: { provider: "v8", diff --git a/package.json b/package.json index 5ba3179da15..e1e24f21a31 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@playwright/test": "^1.36.2", "@trigger.dev/database": "workspace:*", "@types/node": "20.14.14", - "@vitest/coverage-v8": "3.1.4", + "@vitest/coverage-v8": "4.1.7", "autoprefixer": "^10.4.12", "eslint-plugin-turbo": "^2.0.4", "lefthook": "^1.11.3", @@ -65,7 +65,7 @@ "turbo": "^1.10.3", "typescript": "5.5.4", "vite-tsconfig-paths": "^4.0.5", - "vitest": "3.1.4" + "vitest": "4.1.7" }, "packageManager": "pnpm@10.33.2", "dependencies": { diff --git a/packages/redis-worker/vitest.config.ts b/packages/redis-worker/vitest.config.ts index dfe0df27462..c4d431e10ff 100644 --- a/packages/redis-worker/vitest.config.ts +++ b/packages/redis-worker/vitest.config.ts @@ -5,10 +5,5 @@ export default defineConfig({ include: ["**/*.test.ts"], globals: true, fileParallelism: false, - poolOptions: { - threads: { - singleThread: true, - }, - }, }, }); diff --git a/references/ai-chat/package.json b/references/ai-chat/package.json index 45071838a68..ee2d62c0b61 100644 --- a/references/ai-chat/package.json +++ b/references/ai-chat/package.json @@ -43,6 +43,6 @@ "tailwindcss": "^4", "trigger.dev": "workspace:*", "typescript": "^5", - "vitest": "^3.1.4" + "vitest": "^4.1.7" } } From 318a17818da6ab4678998d9078c76f86ee947ebc Mon Sep 17 00:00:00 2001 From: Dan <51248046+danton267@users.noreply.github.com> Date: Tue, 2 Jun 2026 09:12:46 +0100 Subject: [PATCH 3/4] chore(tests): update test commands and vitest version across workflows - Added `--passWithNoTests` flag to internal, package, and webapp unit test commands to allow tests to pass even if no tests are found. - Upgraded `vitest` version from `3.1.4` to `4.1.7` in the report merging step for all workflows. - Updated TypeScript configuration in `sdk-compat-tests` to include `node` types alongside `vitest/globals`. --- .github/workflows/unit-tests-internal.yml | 4 ++-- .github/workflows/unit-tests-packages.yml | 4 ++-- .github/workflows/unit-tests-webapp.yml | 4 ++-- internal-packages/sdk-compat-tests/tsconfig.json | 2 +- packages/cli-v3/e2e/e2e.test.ts | 9 ++++++++- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/workflows/unit-tests-internal.yml b/.github/workflows/unit-tests-internal.yml index 97ba202fcb3..1f7c03a9f26 100644 --- a/.github/workflows/unit-tests-internal.yml +++ b/.github/workflows/unit-tests-internal.yml @@ -96,7 +96,7 @@ jobs: run: pnpm run generate - name: 🧪 Run Internal Unit Tests - run: pnpm run test:internal --reporter=default --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + run: pnpm run test:internal --reporter=default --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --passWithNoTests - name: Gather all reports if: ${{ !cancelled() }} @@ -145,4 +145,4 @@ jobs: merge-multiple: true - name: Merge reports - run: pnpm dlx vitest@3.1.4 run --merge-reports --pass-with-no-tests + run: pnpm dlx vitest@4.1.7 run --merge-reports --pass-with-no-tests diff --git a/.github/workflows/unit-tests-packages.yml b/.github/workflows/unit-tests-packages.yml index fb3d513aecb..86bb056c277 100644 --- a/.github/workflows/unit-tests-packages.yml +++ b/.github/workflows/unit-tests-packages.yml @@ -96,7 +96,7 @@ jobs: run: pnpm run generate - name: 🧪 Run Package Unit Tests - run: pnpm run test:packages --reporter=default --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + run: pnpm run test:packages --reporter=default --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --passWithNoTests - name: Gather all reports if: ${{ !cancelled() }} @@ -145,4 +145,4 @@ jobs: merge-multiple: true - name: Merge reports - run: pnpm dlx vitest@3.1.4 run --merge-reports --pass-with-no-tests + run: pnpm dlx vitest@4.1.7 run --merge-reports --pass-with-no-tests diff --git a/.github/workflows/unit-tests-webapp.yml b/.github/workflows/unit-tests-webapp.yml index 79445503669..f8cae37cb3d 100644 --- a/.github/workflows/unit-tests-webapp.yml +++ b/.github/workflows/unit-tests-webapp.yml @@ -96,7 +96,7 @@ jobs: run: pnpm run generate - name: 🧪 Run Webapp Unit Tests - run: pnpm run test:webapp --reporter=default --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + run: pnpm run test:webapp --reporter=default --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --passWithNoTests env: DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres DIRECT_URL: postgresql://postgres:postgres@localhost:5432/postgres @@ -153,4 +153,4 @@ jobs: merge-multiple: true - name: Merge reports - run: pnpm dlx vitest@3.1.4 run --merge-reports --pass-with-no-tests + run: pnpm dlx vitest@4.1.7 run --merge-reports --pass-with-no-tests diff --git a/internal-packages/sdk-compat-tests/tsconfig.json b/internal-packages/sdk-compat-tests/tsconfig.json index 05afb6f355a..1ae515e98f9 100644 --- a/internal-packages/sdk-compat-tests/tsconfig.json +++ b/internal-packages/sdk-compat-tests/tsconfig.json @@ -9,7 +9,7 @@ "declaration": false, "outDir": "dist", "rootDir": "src", - "types": ["vitest/globals"] + "types": ["vitest/globals", "node"] }, "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "src/fixtures"] diff --git a/packages/cli-v3/e2e/e2e.test.ts b/packages/cli-v3/e2e/e2e.test.ts index 3ddf7419623..1d1849f5fcd 100644 --- a/packages/cli-v3/e2e/e2e.test.ts +++ b/packages/cli-v3/e2e/e2e.test.ts @@ -104,10 +104,17 @@ describe.concurrent("buildWorker", async () => { for (let testCase of testCases) { test.extend({ + // Seed `workspaceRelativeDir` before the spread so the key always exists. + // vitest 4 resolves fixture-to-fixture dependencies strictly at + // `test.extend()` time: the `workspaceDir` fixture below destructures + // `workspaceRelativeDir`, so it must be a defined fixture even for test + // cases that don't set it (it's an optional `TestCase` field). The spread + // overrides this default when the case provides its own value. + workspaceRelativeDir: "", ...testCase, fixtureDir: async ({ id }, use) => await use(path.resolve(path.join(process.cwd(), "e2e/fixtures", id))), - workspaceDir: async ({ fixtureDir, workspaceRelativeDir = "" }, use) => + workspaceDir: async ({ fixtureDir, workspaceRelativeDir }, use) => await use(path.resolve(path.join(fixtureDir, workspaceRelativeDir))), packageManager: async ({ workspaceDir }, use) => await use(await parsePackageManager(options.packageManager, workspaceDir)), From 567b1ec464ce247ed1b98988c2ed01cdde8e1552 Mon Sep 17 00:00:00 2001 From: Dan <51248046+danton267@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:07:46 +0100 Subject: [PATCH 4/4] fix(aiRunFilterService): enhance date validation in AI filter response - Improved date handling in the AIRunFilterService to ensure that invalid date formats do not silently pass through. - Added error logging for invalid date inputs and updated the response structure to reflect success or failure based on date validation. - Adjusted the test timeout for runsReplicationService to improve reliability in long-running tests. --- .../v3/services/aiRunFilterService.server.ts | 29 ++++++++++++++++--- .../test/runsReplicationService.part2.test.ts | 4 +-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/apps/webapp/app/v3/services/aiRunFilterService.server.ts b/apps/webapp/app/v3/services/aiRunFilterService.server.ts index 8f16d5cfc44..96b74ab3314 100644 --- a/apps/webapp/app/v3/services/aiRunFilterService.server.ts +++ b/apps/webapp/app/v3/services/aiRunFilterService.server.ts @@ -268,14 +268,35 @@ export class AIRunFilterService { }; } + // `from`/`to` are validated as strings, so a malformed value (e.g. the + // model returning a non-ISO date) would survive safeParse and then + // produce NaN here. NaN serializes to `null` over JSON, silently dropping + // the date constraint while still reporting success — so reject it. + const from = validationResult.data.from + ? new Date(validationResult.data.from).getTime() + : undefined; + const to = validationResult.data.to + ? new Date(validationResult.data.to).getTime() + : undefined; + + if ((from !== undefined && Number.isNaN(from)) || (to !== undefined && Number.isNaN(to))) { + logger.error("AI filter returned an invalid datetime", { + from: validationResult.data.from, + to: validationResult.data.to, + }); + + return { + success: false, + error: "AI response contained an invalid date", + }; + } + return { success: true, filters: { ...validationResult.data, - from: validationResult.data.from - ? new Date(validationResult.data.from).getTime() - : undefined, - to: validationResult.data.to ? new Date(validationResult.data.to).getTime() : undefined, + from, + to, }, }; } catch (error) { diff --git a/apps/webapp/test/runsReplicationService.part2.test.ts b/apps/webapp/test/runsReplicationService.part2.test.ts index 32bfb5ba73d..bd7348186b3 100644 --- a/apps/webapp/test/runsReplicationService.part2.test.ts +++ b/apps/webapp/test/runsReplicationService.part2.test.ts @@ -513,6 +513,7 @@ describe("RunsReplicationService (part 2/2)", () => { containerTest( "should be able to handle processing transactions for a long period of time", + { timeout: 60_000 * 5 }, async ({ clickhouseContainer, redisOptions, postgresContainer, prisma }) => { await prisma.$executeRawUnsafe(`ALTER TABLE public."TaskRun" REPLICA IDENTITY FULL;`); @@ -614,8 +615,7 @@ describe("RunsReplicationService (part 2/2)", () => { expect(result?.length).toBeGreaterThanOrEqual(50); await runsReplicationService.stop(); - }, - { timeout: 60_000 * 5 } + } ); containerTest(