diff --git a/.cursor/rules/convex_rules.mdc b/.cursor/rules/convex_rules.mdc index 58f1e3a53..7a25cfd27 100644 --- a/.cursor/rules/convex_rules.mdc +++ b/.cursor/rules/convex_rules.mdc @@ -12,7 +12,6 @@ import { query } from "./_generated/server"; import { v } from "convex/values"; export const f = query({ args: {}, - returns: v.null(), handler: async (ctx, args) => { // Function body }, @@ -71,20 +70,6 @@ export default defineSchema({ ) }); ``` -- Always use the `v.null()` validator when returning a null value. Below is an example query that returns a null value: -```typescript -import { query } from "./_generated/server"; -import { v } from "convex/values"; - -export const exampleQuery = query({ - args: {}, - returns: v.null(), - handler: async (ctx, args) => { - console.log("This query returns a null value"); - return null; - }, -}); -``` - Here are the valid Convex types along with their respective validators: Convex Type | TS/JS type | Example Usage | Validator for argument validation and schemas | Notes | | ----------- | ------------| -----------------------| -----------------------------------------------| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -103,7 +88,7 @@ Convex Type | TS/JS type | Example Usage | Validator for argument val - Use `internalQuery`, `internalMutation`, and `internalAction` to register internal functions. These functions are private and aren't part of an app's API. They can only be called by other Convex functions. These functions are always imported from `./_generated/server`. - Use `query`, `mutation`, and `action` to register public functions. These functions are part of the public API and are exposed to the public Internet. Do NOT use `query`, `mutation`, or `action` to register sensitive internal functions that should be kept private. - You CANNOT register a function through the `api` or `internal` objects. -- ALWAYS include argument and return validators for all Convex functions. This includes all of `query`, `internalQuery`, `mutation`, `internalMutation`, `action`, and `internalAction`. If a function doesn't return anything, include `returns: v.null()` as its output validator. +- ALWAYS include argument validators for all Convex functions. This includes all of `query`, `internalQuery`, `mutation`, `internalMutation`, `action`, and `internalAction`. - If the JavaScript implementation of a Convex function doesn't have a return value, it implicitly returns `null`. ### Function calling @@ -117,7 +102,6 @@ Convex Type | TS/JS type | Example Usage | Validator for argument val ``` export const f = query({ args: { name: v.string() }, - returns: v.string(), handler: async (ctx, args) => { return "Hello " + args.name; }, @@ -125,7 +109,6 @@ export const f = query({ export const g = query({ args: {}, - returns: v.null(), handler: async (ctx, args) => { const result: string = await ctx.runQuery(api.example.f, { name: "Bob" }); return null; @@ -159,7 +142,7 @@ export const listWithExtraArg = query({ handler: async (ctx, args) => { return await ctx.db .query("messages") - .filter((q) => q.eq(q.field("author"), args.author)) + .withIndex("by_author", (q) => q.eq("author", args.author)) .order("desc") .paginate(args.paginationOpts); }, @@ -169,9 +152,9 @@ Note: `paginationOpts` is an object with the following properties: - `numItems`: the maximum number of documents to return (the validator is `v.number()`) - `cursor`: the cursor to use to fetch the next page of documents (the validator is `v.union(v.string(), v.null())`) - A query that ends in `.paginate()` returns an object that has the following properties: - - page (contains an array of documents that you fetches) - - isDone (a boolean that represents whether or not this is the last page of documents) - - continueCursor (a string that represents the cursor to use to fetch the next page of documents) +- page (contains an array of documents that you fetches) +- isDone (a boolean that represents whether or not this is the last page of documents) +- continueCursor (a string that represents the cursor to use to fetch the next page of documents) ## Validator guidelines @@ -194,11 +177,10 @@ import { Doc, Id } from "./_generated/dataModel"; export const exampleQuery = query({ args: { userIds: v.array(v.id("users")) }, - returns: v.record(v.id("users"), v.string()), handler: async (ctx, args) => { const idToUsername: Record, string> = {}; for (const userId of args.userIds) { - const user = await ctx.db.get(userId); + const user = await ctx.db.get("users", userId); if (user) { idToUsername[user._id] = user.username; } @@ -212,7 +194,6 @@ export const exampleQuery = query({ - Always use `as const` for string literals in discriminated union types. - When using the `Array` type, make sure to always define your arrays as `const array: Array = [...];` - When using the `Record` type, make sure to always define your records as `const record: Record = {...};` -- Always add `@types/node` to your `package.json` when using any Node.js built-in modules. ## Full text search guidelines - A query for "10 messages in channel '#general' that best match the query 'hello hi' in their body" would look like: @@ -236,11 +217,13 @@ const messages = await ctx.db ## Mutation guidelines -- Use `ctx.db.replace` to fully replace an existing document. This method will throw an error if the document does not exist. -- Use `ctx.db.patch` to shallow merge updates into an existing document. This method will throw an error if the document does not exist. +- Use `ctx.db.replace` to fully replace an existing document. This method will throw an error if the document does not exist. Syntax: `await ctx.db.replace('tasks', taskId, { name: 'Buy milk', completed: false })` +- Use `ctx.db.patch` to shallow merge updates into an existing document. This method will throw an error if the document does not exist. Syntax: `await ctx.db.patch('tasks', taskId, { completed: true })` ## Action guidelines - Always add `"use node";` to the top of files containing actions that use Node.js built-in modules. +- Never add `"use node";` to a file that also exports queries or mutations. Only actions can run in the Node.js runtime; queries and mutations must stay in the default Convex runtime. If you need Node.js built-ins alongside queries or mutations, put the action in a separate file. +- `fetch()` is available in the default Convex runtime. You do NOT need `"use node";` just to use `fetch()`. - Never use `ctx.db` inside of an action. Actions don't have access to the database. - Below is an example of the syntax for an action: ```ts @@ -248,7 +231,6 @@ import { action } from "./_generated/server"; export const exampleAction = action({ args: {}, - returns: v.null(), handler: async (ctx, args) => { console.log("This action does not return anything"); return null; @@ -268,7 +250,6 @@ import { internalAction } from "./_generated/server"; const empty = internalAction({ args: {}, - returns: v.null(), handler: async (ctx, args) => { console.log("empty"); }, @@ -290,7 +271,7 @@ export default crons; - The `ctx.storage.getUrl()` method returns a signed URL for a given file. It returns `null` if the file doesn't exist. - Do NOT use the deprecated `ctx.storage.getMetadata` call for loading a file's metadata. - Instead, query the `_storage` system table. For example, you can use `ctx.db.system.get` to get an `Id<"_storage">`. +Instead, query the `_storage` system table. For example, you can use `ctx.db.system.get` to get an `Id<"_storage">`. ``` import { query } from "./_generated/server"; import { Id } from "./_generated/dataModel"; @@ -305,9 +286,8 @@ type FileMetadata = { export const exampleQuery = query({ args: { fileId: v.id("_storage") }, - returns: v.null(), handler: async (ctx, args) => { - const metadata: FileMetadata | null = await ctx.db.system.get(args.fileId); + const metadata: FileMetadata | null = await ctx.db.system.get("_storage", args.fileId); console.log(metadata); return null; }, @@ -434,8 +414,8 @@ Internal Functions: "description": "This example shows how to build a chat app without authentication.", "version": "1.0.0", "dependencies": { - "convex": "^1.17.4", - "openai": "^4.79.0" + "convex": "^1.31.2", + "openai": "^6.0.0" }, "devDependencies": { "typescript": "^5.7.3" @@ -480,47 +460,36 @@ import OpenAI from "openai"; import { internal } from "./_generated/api"; /** - * Create a user with a given name. - */ + * Create a user with a given name. + */ export const createUser = mutation({ args: { name: v.string(), }, - returns: v.id("users"), handler: async (ctx, args) => { return await ctx.db.insert("users", { name: args.name }); }, }); /** - * Create a channel with a given name. - */ + * Create a channel with a given name. + */ export const createChannel = mutation({ args: { name: v.string(), }, - returns: v.id("channels"), handler: async (ctx, args) => { return await ctx.db.insert("channels", { name: args.name }); }, }); /** - * List the 10 most recent messages from a channel in descending creation order. - */ + * List the 10 most recent messages from a channel in descending creation order. + */ export const listMessages = query({ args: { channelId: v.id("channels"), }, - returns: v.array( - v.object({ - _id: v.id("messages"), - _creationTime: v.number(), - channelId: v.id("channels"), - authorId: v.optional(v.id("users")), - content: v.string(), - }), - ), handler: async (ctx, args) => { const messages = await ctx.db .query("messages") @@ -532,15 +501,14 @@ export const listMessages = query({ }); /** - * Send a message to a channel and schedule a response from the AI. - */ + * Send a message to a channel and schedule a response from the AI. + */ export const sendMessage = mutation({ args: { channelId: v.id("channels"), authorId: v.id("users"), content: v.string(), }, - returns: v.null(), handler: async (ctx, args) => { const channel = await ctx.db.get(args.channelId); if (!channel) { @@ -568,7 +536,6 @@ export const generateResponse = internalAction({ args: { channelId: v.id("channels"), }, - returns: v.null(), handler: async (ctx, args) => { const context = await ctx.runQuery(internal.index.loadContext, { channelId: args.channelId, @@ -593,12 +560,6 @@ export const loadContext = internalQuery({ args: { channelId: v.id("channels"), }, - returns: v.array( - v.object({ - role: v.union(v.literal("user"), v.literal("assistant")), - content: v.string(), - }), - ), handler: async (ctx, args) => { const channel = await ctx.db.get(args.channelId); if (!channel) { @@ -634,7 +595,6 @@ export const writeAgentResponse = internalMutation({ channelId: v.id("channels"), content: v.string(), }, - returns: v.null(), handler: async (ctx, args) => { await ctx.db.insert("messages", { channelId: args.channelId, @@ -667,9 +627,38 @@ export default defineSchema({ }); ``` +#### convex/tsconfig.json +```typescript +{ + /* This TypeScript project config describes the environment that + * Convex functions run in and is used to typecheck them. + * You can modify it, but some settings required to use Convex. + */ + "compilerOptions": { + /* These settings are not required by Convex and can be modified. */ + "allowJs": true, + "strict": true, + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + + /* These compiler options are required by Convex */ + "target": "ESNext", + "lib": ["ES2021", "dom"], + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "isolatedModules": true, + "noEmit": true + }, + "include": ["./**/*"], + "exclude": ["./_generated"] +} +``` + #### src/App.tsx ```typescript export default function App() { return
Hello World
; } -``` \ No newline at end of file +``` diff --git a/.gitignore b/.gitignore index dba3e8c32..304356515 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ template/pnpm-lock.yaml .env*.local temp_envars +.hive-tmp diff --git a/app/components/DebugPromptView.tsx b/app/components/DebugPromptView.tsx index a7518f0b5..050e42583 100644 --- a/app/components/DebugPromptView.tsx +++ b/app/components/DebugPromptView.tsx @@ -2,7 +2,7 @@ import { useEffect, useCallback, useState } from 'react'; import { JsonView } from 'react-json-view-lite'; import 'react-json-view-lite/dist/index.css'; -import type { CoreMessage, FilePart, ToolCallPart, TextPart } from 'ai'; +import type { ModelMessage, FilePart, ToolCallPart, TextPart } from 'ai'; import { ChevronDownIcon, ChevronRightIcon } from '@heroicons/react/20/solid'; import { ClipboardIcon, ArrowTopRightOnSquareIcon } from '@heroicons/react/24/outline'; import { useDebugPrompt } from '~/lib/hooks/useDebugPrompt'; @@ -107,17 +107,17 @@ function isToolCallPart(part: unknown): part is ToolCallPart { return typeof part === 'object' && part !== null && 'type' in part && part.type === 'tool-call'; } -function getMessageCharCount(message: CoreMessage): number { +function getMessageCharCount(message: ModelMessage): number { if (typeof message.content === 'string') return message.content.length; if (Array.isArray(message.content)) { return message.content.reduce((sum, part) => { if (isTextPart(part)) return sum + part.text.length; if (isFilePart(part) && typeof part.data === 'string') return sum + part.data.length; if (isToolCallPart(part)) { - return sum + part.toolName.length + part.toolCallId.length + JSON.stringify(part.args).length; + return sum + part.toolName.length + part.toolCallId.length + JSON.stringify(part.input).length; } if (part.type === 'tool-result') { - return sum + part.toolName.length + part.toolCallId.length + JSON.stringify(part.result).length; + return sum + part.toolName.length + part.toolCallId.length + JSON.stringify(part.output).length; } return sum; }, 0); @@ -145,7 +145,7 @@ function getPreviewClass(text: string) { return `preview-${Math.abs(text.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0))}`; } -function findLastAssistantMessage(prompt: CoreMessage[]): string { +function findLastAssistantMessage(prompt: ModelMessage[]): string { // The last assistant message in a LLM of messages is the response. // It should generally just be the last message, full stop. for (let i = prompt.length - 1; i >= 0; i--) { @@ -186,7 +186,7 @@ function LlmPromptAndResponseView({ promptAndResponse }: { promptAndResponse: Ll const totalInputChars = (prompt || []).reduce((sum, msg) => sum + getMessageCharCount(msg), 0); const totalOutputChars = (completion || []).reduce((sum, msg) => sum + getMessageCharCount(msg), 0); - const getTokenEstimate = (message: CoreMessage) => { + const getTokenEstimate = (message: ModelMessage) => { const charCount = getMessageCharCount(message); return estimateTokenCount(charCount, totalInputChars, promptTokensTotal); }; @@ -262,12 +262,12 @@ function LlmPromptAndResponseView({ promptAndResponse }: { promptAndResponse: Ll } type CoreMessageViewProps = { - message: CoreMessage; - getTokenEstimate?: (message: CoreMessage) => number; + message: ModelMessage; + getTokenEstimate?: (message: ModelMessage) => number; totalCompletionTokens?: number; }; -function getMessagePreview(content: CoreMessage['content']): string { +function getMessagePreview(content: ModelMessage['content']): string { if (typeof content === 'string') { return content; } @@ -288,7 +288,7 @@ function getMessagePreview(content: CoreMessage['content']): string { } type MessageContentViewProps = { - content: CoreMessage['content']; + content: ModelMessage['content']; showRawJson?: boolean; }; @@ -320,7 +320,7 @@ function MessageContentView({ content, showRawJson = false }: MessageContentView const fileData = typeof part.data === 'string' ? part.data : '[Binary Data]'; return (
-
file: {part.filename || part.mimeType}
+
file: {part.filename || part.mediaType}
{fileData}
); @@ -410,7 +410,6 @@ function CoreMessageView({ message, getTokenEstimate, totalCompletionTokens }: C className={`flex-1 truncate text-sm text-gray-600 dark:text-gray-300 ${getPreviewClass(preview)} before:block before:truncate`} /> -
{isExpanded && (
diff --git a/app/components/ExistingChat.client.tsx b/app/components/ExistingChat.client.tsx index e989bda9a..9a84ab545 100644 --- a/app/components/ExistingChat.client.tsx +++ b/app/components/ExistingChat.client.tsx @@ -74,7 +74,7 @@ function ExistingChatWrapper({ chatId }: { chatId: string }) { const hadSuccessfulDeploy = initialMessages?.some( (message) => message.role === 'assistant' && - message.parts?.some((part) => part.type === 'tool-invocation' && part.toolInvocation.toolName === 'deploy'), + message.parts?.some((part) => 'toolCallId' in part && (part as any).toolName === 'deploy'), ); if (initialMessages === null) { diff --git a/app/components/Homepage.client.tsx b/app/components/Homepage.client.tsx index 062c9b167..5d21a0692 100644 --- a/app/components/Homepage.client.tsx +++ b/app/components/Homepage.client.tsx @@ -4,7 +4,7 @@ import { useRef } from 'react'; import { useConvexChatHomepage } from '~/lib/stores/startup'; import { Toaster } from '~/components/ui/Toaster'; import { setPageLoadChatId } from '~/lib/stores/chatId'; -import type { Message } from '@ai-sdk/react'; +import type { UIMessage } from '@ai-sdk/react'; import type { PartCache } from '~/lib/hooks/useMessageParser'; import { UserProvider } from '~/components/UserProvider'; @@ -43,4 +43,4 @@ const ChatWrapper = ({ initialId }: { initialId: string }) => { ); }; -const emptyList: Message[] = []; +const emptyList: UIMessage[] = []; diff --git a/app/components/chat/AssistantMessage.tsx b/app/components/chat/AssistantMessage.tsx index 92016a78b..d5bfea03a 100644 --- a/app/components/chat/AssistantMessage.tsx +++ b/app/components/chat/AssistantMessage.tsx @@ -1,6 +1,6 @@ import { memo, useMemo } from 'react'; import { Markdown } from './Markdown'; -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; import { ToolCall } from './ToolCall'; import { makePartId, type PartId } from 'chef-agent/partId.js'; import { ExclamationTriangleIcon, DotFilledIcon } from '@radix-ui/react-icons'; @@ -10,20 +10,12 @@ import { calculateChefTokens, usageFromGeneration, type ChefTokenBreakdown } fro import { captureMessage } from '@sentry/remix'; interface AssistantMessageProps { - message: Message; + message: UIMessage; } export const AssistantMessage = memo(function AssistantMessage({ message }: AssistantMessageProps) { const { showUsageAnnotations } = useLaunchDarkly(); - const parsedAnnotations = useMemo(() => parseAnnotations(message.annotations), [message.annotations]); - if (!message.parts) { - return ( -
- {message.content} -
- ); - } - + const parsedAnnotations = useMemo(() => parseAnnotations(message.metadata), [message.metadata]); return (
@@ -64,22 +56,22 @@ function AssistantMessagePart({ partId, parsedAnnotations, }: { - part: NonNullable[number]; + part: UIMessage['parts'][number]; showUsageAnnotations: boolean; partId: PartId; parsedAnnotations: ReturnType; }) { - if (part.type === 'tool-invocation') { + if ('toolCallId' in part) { return ( <> {showUsageAnnotations && displayModelAndUsage({ - model: parsedAnnotations.modelForToolCall[part.toolInvocation.toolCallId], - usageAnnotation: parsedAnnotations.usageForToolCall[part.toolInvocation.toolCallId] ?? undefined, + model: parsedAnnotations.modelForToolCall[part.toolCallId], + usageAnnotation: parsedAnnotations.usageForToolCall[part.toolCallId] ?? undefined, showUsageAnnotations, })} - + ); } @@ -137,8 +129,8 @@ function displayChefTokenNumber(num: number) { function displayUsage(usageAnnotation: UsageAnnotation, provider: ProviderType, showUsageAnnotations: boolean) { const usage: Usage = usageFromGeneration({ - usage: usageAnnotation, - providerMetadata: usageAnnotation.providerMetadata, + usage: usageAnnotation as any, + providerMetadata: usageAnnotation.providerMetadata as any, }); const { chefTokens, breakdown } = calculateChefTokens(usage, provider); return ( diff --git a/app/components/chat/BaseChat.client.tsx b/app/components/chat/BaseChat.client.tsx index b44eb0ba4..9c8a1ff8d 100644 --- a/app/components/chat/BaseChat.client.tsx +++ b/app/components/chat/BaseChat.client.tsx @@ -1,5 +1,5 @@ import { Sheet } from '@ui/Sheet'; -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; import React, { type ReactNode, type RefCallback, useCallback, useEffect, useMemo, useState } from 'react'; import Landing from '~/components/landing/Landing'; import { Workbench } from '~/components/workbench/Workbench.client'; @@ -48,7 +48,7 @@ interface BaseChatProps { streamStatus: 'streaming' | 'submitted' | 'ready' | 'error'; currentError: Error | undefined; toolStatus: ToolStatus; - messages: Message[]; + messages: UIMessage[]; terminalInitializationOptions: TerminalInitializationOptions | undefined; disableChatMessage: ReactNode | string | null; @@ -134,7 +134,12 @@ export const BaseChat = React.forwardRef( const lastUserMessage = messages.findLast((message) => message.role === 'user'); const resendMessage = useCallback(async () => { if (lastUserMessage) { - await onSend?.(lastUserMessage.content); + await onSend?.( + lastUserMessage.parts + .filter((p) => p.type === 'text') + .map((p) => p.text) + .join(''), + ); } }, [lastUserMessage, onSend]); const baseChat = ( diff --git a/app/components/chat/Chat.tsx b/app/components/chat/Chat.tsx index 8396a9d4a..6c097d460 100644 --- a/app/components/chat/Chat.tsx +++ b/app/components/chat/Chat.tsx @@ -1,5 +1,6 @@ import { useStore } from '@nanostores/react'; -import type { Message, UIMessage } from 'ai'; +import type { UIMessage } from 'ai'; +import { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls } from 'ai'; import { useChat } from '@ai-sdk/react'; import { useAnimate } from 'framer-motion'; import { memo, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'; @@ -54,12 +55,12 @@ const MAX_RETRIES = 4; const processSampledMessages = createSampler( (options: { - messages: Message[]; - initialMessages: Message[]; - parseMessages: (messages: Message[]) => void; + messages: UIMessage[]; + initialMessages: UIMessage[]; + parseMessages: (messages: UIMessage[]) => void; streamStatus: 'streaming' | 'submitted' | 'ready' | 'error'; storeMessageHistory: ( - messages: Message[], + messages: UIMessage[], streamStatus: 'streaming' | 'submitted' | 'ready' | 'error', ) => Promise; }) => { @@ -74,10 +75,10 @@ const processSampledMessages = createSampler( ); interface ChatProps { - initialMessages: Message[]; + initialMessages: UIMessage[]; partCache: PartCache; storeMessageHistory: ( - messages: Message[], + messages: UIMessage[], streamStatus: 'streaming' | 'submitted' | 'ready' | 'error', ) => Promise; initializeChat: () => Promise; @@ -278,110 +279,133 @@ export const Chat = memo( } }, [apiKey, convex, modelSelection, setDisableChatMessage, useGeminiAuto]); - const { messages, status, stop, append, setMessages, reload, error } = useChat({ - initialMessages, - api: '/api/chat', - sendExtraMessageFields: true, - experimental_prepareRequestBody: ({ messages }) => { - const chatInitialId = initialIdStore.get(); - const deploymentName = convexProjectStore.get()?.deploymentName; - const teamSlug = selectedTeamSlugStore.get(); - const token = getConvexAuthToken(convex); - if (!token) { - throw new Error('No token'); - } - if (!teamSlug) { - throw new Error('No team slug'); - } - let modelProvider: ProviderType; - const retries = retryState.get(); - let modelChoice: string | undefined = undefined; - if (modelSelection === 'auto') { - const providers: ProviderType[] = anthropicProviders; - modelProvider = providers[retries.numFailures % providers.length]; - modelChoice = 'claude-sonnet-4-6'; - } else if (modelSelection === 'claude-3-5-haiku') { - modelProvider = 'Anthropic'; - modelChoice = 'claude-3-5-haiku-latest'; - } else if (modelSelection === 'claude-4.6-sonnet') { - const providers: ProviderType[] = anthropicProviders; - modelProvider = providers[retries.numFailures % providers.length]; - modelChoice = 'claude-sonnet-4-6'; - } else if (modelSelection === 'claude-4.5-sonnet') { - const providers: ProviderType[] = anthropicProviders; - modelProvider = providers[retries.numFailures % providers.length]; - modelChoice = 'claude-sonnet-4-5'; - } else if (modelSelection === 'grok-3-mini') { - modelProvider = 'XAI'; - } else if (modelSelection === 'gemini-2.5-pro') { - modelProvider = 'Google'; - } else if (modelSelection === 'gpt-4.1-mini') { - modelProvider = 'OpenAI'; - modelChoice = 'gpt-4.1-mini'; - } else if (modelSelection === 'gpt-4.1') { - modelProvider = 'OpenAI'; - } else if (modelSelection === 'gpt-5') { - modelProvider = 'OpenAI'; - modelChoice = 'gpt-5'; - } else { - const _exhaustiveCheck: never = modelSelection; - throw new Error(`Unknown model: ${_exhaustiveCheck}`); - } - let shouldDisableTools = false; - if (messages.length > 0 && messages[messages.length - 1].role === 'assistant') { - const lastSystemMessage = messages[messages.length - 1]; - const toolCalls = lastSystemMessage.parts.filter( - (part) => part.type === 'tool-invocation' && part.toolInvocation.state === 'result', - ); - if (toolCalls.length >= MAX_CONSECUTIVE_DEPLOY_ERRORS) { - const lastToolCalls = toolCalls.slice(-MAX_CONSECUTIVE_DEPLOY_ERRORS); - const allFailed = lastToolCalls.every( - (t) => - t.type === 'tool-invocation' && - t.toolInvocation.state === 'result' && - t.toolInvocation.result.startsWith('Error:'), + const addToolOutputRef = useRef(null!); + + const { + messages, + status, + stop, + sendMessage: chatSendMessage, + setMessages, + regenerate, + addToolOutput, + error, + } = useChat({ + messages: initialMessages, + + transport: new DefaultChatTransport({ + api: '/api/chat', + prepareSendMessagesRequest: ({ messages }) => { + const chatInitialId = initialIdStore.get(); + const deploymentName = convexProjectStore.get()?.deploymentName; + const teamSlug = selectedTeamSlugStore.get(); + const token = getConvexAuthToken(convex); + if (!token) { + throw new Error('No token'); + } + if (!teamSlug) { + throw new Error('No team slug'); + } + let modelProvider: ProviderType; + const retries = retryState.get(); + let modelChoice: string | undefined = undefined; + if (modelSelection === 'auto') { + const providers: ProviderType[] = anthropicProviders; + modelProvider = providers[retries.numFailures % providers.length]; + modelChoice = 'claude-sonnet-4-6'; + } else if (modelSelection === 'claude-3-5-haiku') { + modelProvider = 'Anthropic'; + modelChoice = 'claude-3-5-haiku-latest'; + } else if (modelSelection === 'claude-4.6-sonnet') { + const providers: ProviderType[] = anthropicProviders; + modelProvider = providers[retries.numFailures % providers.length]; + modelChoice = 'claude-sonnet-4-6'; + } else if (modelSelection === 'claude-4.5-sonnet') { + const providers: ProviderType[] = anthropicProviders; + modelProvider = providers[retries.numFailures % providers.length]; + modelChoice = 'claude-sonnet-4-5'; + } else if (modelSelection === 'grok-3-mini') { + modelProvider = 'XAI'; + } else if (modelSelection === 'gemini-2.5-pro') { + modelProvider = 'Google'; + } else if (modelSelection === 'gpt-4.1-mini') { + modelProvider = 'OpenAI'; + modelChoice = 'gpt-4.1-mini'; + } else if (modelSelection === 'gpt-4.1') { + modelProvider = 'OpenAI'; + } else if (modelSelection === 'gpt-5') { + modelProvider = 'OpenAI'; + modelChoice = 'gpt-5'; + } else { + const _exhaustiveCheck: never = modelSelection; + throw new Error(`Unknown model: ${_exhaustiveCheck}`); + } + let shouldDisableTools = false; + if (messages.length > 0 && messages[messages.length - 1].role === 'assistant') { + const lastSystemMessage = messages[messages.length - 1]; + const toolCalls = lastSystemMessage.parts.filter( + (part) => 'toolCallId' in part && (part as any).state === 'output-available', ); - if (allFailed) { - shouldDisableTools = true; + if (toolCalls.length >= MAX_CONSECUTIVE_DEPLOY_ERRORS) { + const lastToolCalls = toolCalls.slice(-MAX_CONSECUTIVE_DEPLOY_ERRORS); + const allFailed = lastToolCalls.every( + (t) => + 'toolCallId' in t && + (t as any).state === 'output-available' && + typeof (t as any).output === 'string' && + (t as any).output.startsWith('Error:'), + ); + if (allFailed) { + shouldDisableTools = true; + } } } - } - const { messages: preparedMessages, collapsedMessages } = chatContextManager.current.prepareContext( - messages, - maxSizeForModel(modelSelection, maxCollapsedMessagesSize), - minCollapsedMessagesSize, - ); + const { messages: preparedMessages, collapsedMessages } = chatContextManager.current.prepareContext( + messages, + maxSizeForModel(modelSelection, maxCollapsedMessagesSize), + minCollapsedMessagesSize, + ); - const characterCounts = chatContextManager.current.calculatePromptCharacterCounts(preparedMessages); - - return { - messages: preparedMessages, - firstUserMessage: messages.filter((message) => message.role == 'user').length == 1, - chatInitialId, - token, - teamSlug, - deploymentName, - modelProvider, - // Fall back to the user's API key if the request has failed too many times - userApiKey: retries.numFailures < MAX_RETRIES ? apiKey : { ...apiKey, preference: 'always' }, - shouldDisableTools, - recordRawPromptsForDebugging, - modelChoice, - collapsedMessages, - promptCharacterCounts: characterCounts, - featureFlags: { - enableResend, - }, - }; - }, - maxSteps: 64, - async onToolCall({ toolCall }) { + const characterCounts = chatContextManager.current.calculatePromptCharacterCounts(preparedMessages); + + return { + body: { + messages: preparedMessages, + firstUserMessage: messages.filter((message) => message.role == 'user').length == 1, + chatInitialId, + token, + teamSlug, + deploymentName, + modelProvider, + // Fall back to the user's API key if the request has failed too many times + userApiKey: retries.numFailures < MAX_RETRIES ? apiKey : { ...apiKey, preference: 'always' }, + shouldDisableTools, + recordRawPromptsForDebugging, + modelChoice, + collapsedMessages, + promptCharacterCounts: characterCounts, + featureFlags: { + enableResend, + }, + }, + }; + }, + }), + + sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls, + + onToolCall: async ({ toolCall }) => { console.log('Starting tool call', toolCall); const { result } = await workbenchStore.waitOnToolCall(toolCall.toolCallId); console.log('Tool call finished', result); - return result; + addToolOutputRef.current({ + tool: (toolCall as any).toolName as any, + toolCallId: toolCall.toolCallId, + output: result, + } as any); }, - onError: async (e: Error) => { + + onError: (e: Error) => { captureMessage('Failed to process chat request: ' + e.message, { level: 'error', extra: { @@ -402,14 +426,11 @@ export const Chat = memo( }); workbenchStore.abortAllActions(); - await checkTokenUsage(); + void checkTokenUsage(); }, - onFinish: async (message, response) => { - const usage = response.usage; - if (usage) { - console.debug('Token usage in response:', usage); - } - if (response.finishReason == 'stop') { + + onFinish: async ({ finishReason }) => { + if (finishReason === 'stop') { retryState.set({ numFailures: 0, nextRetry: Date.now() }); } logger.debug('Finished streaming'); @@ -418,6 +439,8 @@ export const Chat = memo( }, }); + addToolOutputRef.current = addToolOutput; + // Reset chat messages when the loaded subchat index changes. We don't want to reset the // messages if `initialMessages` changes without a subchat index change. useEffect(() => { @@ -539,7 +562,6 @@ export const Chat = memo( ? chatContextManager.current.relevantFiles(messages, `${Date.now()}`, maxRelevantFilesSize) : { id: `${Date.now()}`, - content: '', role: 'user', parts: [], }; @@ -550,10 +572,9 @@ export const Chat = memo( type: 'text', text: messageInput, }); - newMessage.content = messageInput; if (!chatStarted) { setMessages([newMessage]); - reload(); + regenerate(); return; } @@ -567,12 +588,11 @@ export const Chat = memo( }); workbenchStore.resetAllFileModifications(); } - maybeRelevantFilesMessage.content = messageInput; maybeRelevantFilesMessage.parts.push({ type: 'text', text: messageInput, }); - append(maybeRelevantFilesMessage); + chatSendMessage({ parts: maybeRelevantFilesMessage.parts }); } finally { setSendMessageInProgress(false); } diff --git a/app/components/chat/Messages.client.tsx b/app/components/chat/Messages.client.tsx index 987fc56cf..867f1fd05 100644 --- a/app/components/chat/Messages.client.tsx +++ b/app/components/chat/Messages.client.tsx @@ -1,4 +1,4 @@ -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; import { Fragment, useCallback, useState } from 'react'; import { classNames } from '~/utils/classNames'; import { AssistantMessage } from './AssistantMessage'; @@ -20,7 +20,7 @@ interface MessagesProps { id?: string; className?: string; isStreaming?: boolean; - messages?: Message[]; + messages?: UIMessage[]; subchatsLength?: number; onRewindToMessage?: (subchatIndex?: number, messageIndex?: number) => void; } @@ -88,9 +88,9 @@ export const Messages = forwardRef(function Messa )} {messages.length > 0 ? ( messages.map((message, index) => { - const { role, content, annotations } = message; + const { role, parts, metadata } = message; const isUserMessage = role === 'user'; - const isHidden = annotations?.includes('hidden'); + const isHidden = (metadata as any)?.hidden; if (isHidden) { return ; @@ -121,7 +121,16 @@ export const Messages = forwardRef(function Messa )}
)} - {isUserMessage ? : } + {isUserMessage ? ( + p.type === 'text') + .map((p) => p.text) + .join('')} + /> + ) : ( + + )}
{earliestRewindableMessageRank !== undefined && earliestRewindableMessageRank !== null && diff --git a/app/components/chat/ToolCall.tsx b/app/components/chat/ToolCall.tsx index 656b3e3f5..b79e0aba1 100644 --- a/app/components/chat/ToolCall.tsx +++ b/app/components/chat/ToolCall.tsx @@ -98,7 +98,7 @@ export const ToolCall = memo(function ToolCall({ partId, toolCallId }: { partId: exit={{ width: 0 }} transition={{ duration: 0.15, ease: cubicEasingFn }} className="bg-bolt-elements-artifacts-background hover:bg-bolt-elements-artifacts-backgroundHover" - disabled={parsed.state === 'partial-call'} + disabled={parsed.state === 'input-streaming'} onClick={toggleAction} >
{showAction ? : }
@@ -176,7 +176,7 @@ function DeployTool({ artifact, invocation }: { artifact: ArtifactState; invocat throw new Error('Terminal can only be used for the deploy tool'); } - if (invocation.state === 'call' || invocation.state === 'result') { + if (invocation.state === 'input-available' || invocation.state === 'output-available') { return ; } @@ -187,8 +187,8 @@ const Terminal = memo( forwardRef(({ artifact, invocation }: { artifact: ArtifactState; invocation: ConvexToolInvocation }, ref) => { const theme = useStore(themeStore); let terminalOutput = useStore(artifact.runner.terminalOutput); - if (!terminalOutput && invocation.state === 'result' && invocation.result) { - terminalOutput = invocation.result; + if (!terminalOutput && invocation.state === 'output-available' && invocation.output) { + terminalOutput = invocation.output; } const terminalElementRef = useRef(null); const terminalRef = useRef(); @@ -261,7 +261,10 @@ function NpmInstallTool({ artifact, invocation }: { artifact: ArtifactState; inv throw new Error('Terminal can only be used for the npmInstall tool'); } - if (invocation.state === 'call' || (invocation.state === 'result' && invocation.result.startsWith('Error:'))) { + if ( + invocation.state === 'input-available' || + (invocation.state === 'output-available' && invocation.output.startsWith('Error:')) + ) { return ; } @@ -283,32 +286,36 @@ function parseToolInvocation( } catch { return {} as ConvexToolInvocation; } - if (status === 'complete' && parsedContent.state === 'result' && !parsedContent.result?.startsWith('Error:')) { + if ( + status === 'complete' && + parsedContent.state === 'output-available' && + !parsedContent.output?.startsWith('Error:') + ) { let zodError: ZodError | null = null; switch (parsedContent.toolName) { case 'deploy': { - const args = loggingSafeParse(deployToolParameters, parsedContent.args); + const args = loggingSafeParse(deployToolParameters, parsedContent.input); if (!args.success) { zodError = args.error; } break; } case 'edit': { - const args = loggingSafeParse(editToolParameters, parsedContent.args); + const args = loggingSafeParse(editToolParameters, parsedContent.input); if (!args.success) { zodError = args.error; } break; } case 'npmInstall': { - const args = loggingSafeParse(npmInstallToolParameters, parsedContent.args); + const args = loggingSafeParse(npmInstallToolParameters, parsedContent.input); if (!args.success) { zodError = args.error; } break; } case 'view': { - const args = loggingSafeParse(viewParameters, parsedContent.args); + const args = loggingSafeParse(viewParameters, parsedContent.input); if (!args.success) { zodError = args.error; } @@ -326,8 +333,8 @@ function parseToolInvocation( status: 'failed', error: errorMessage, }); - // Modify the result to indicate an error - parsedContent.result = errorMessage; + // Modify the output to indicate an error + (parsedContent as any).output = errorMessage; } } } @@ -338,9 +345,9 @@ function statusIcon(status: ActionState['status'], invocation: ConvexToolInvocat let inner: React.ReactNode; let color: string; if ( - invocation.state === 'result' && - typeof invocation.result === 'string' && - invocation.result.startsWith('Error:') + invocation.state === 'output-available' && + typeof invocation.output === 'string' && + invocation.output.startsWith('Error:') ) { inner = ; color = 'text-bolt-elements-icon-error'; @@ -376,11 +383,11 @@ function statusIcon(status: ActionState['status'], invocation: ConvexToolInvocat function toolTitle(invocation: ConvexToolInvocation): React.ReactNode { switch (invocation.toolName) { case 'view': { - const args = loggingSafeParse(viewParameters, invocation.args); + const args = loggingSafeParse(viewParameters, invocation.input); let verb = 'Read'; let icon = ; let renderedPath = 'a file'; - if (invocation.state === 'result' && invocation.result.startsWith('Directory:')) { + if (invocation.state === 'output-available' && invocation.output.startsWith('Directory:')) { verb = 'List'; icon = ; renderedPath = 'a directory'; @@ -405,12 +412,12 @@ function toolTitle(invocation: ConvexToolInvocation): React.ReactNode { ); } case 'npmInstall': { - if (invocation.state === 'partial-call' || invocation.state === 'call') { + if (invocation.state === 'input-streaming' || invocation.state === 'input-available') { return `Installing dependencies...`; - } else if (invocation.result?.startsWith('Error:')) { + } else if (invocation.output?.startsWith('Error:')) { return `Failed to install dependencies`; } else { - const args = loggingSafeParse(npmInstallToolParameters, invocation.args); + const args = loggingSafeParse(npmInstallToolParameters, invocation.input); if (!args.success) { return `Failed to install dependencies`; } @@ -418,17 +425,17 @@ function toolTitle(invocation: ConvexToolInvocation): React.ReactNode { } } case 'deploy': { - if (invocation.state === 'partial-call' || invocation.state === 'call') { + if (invocation.state === 'input-streaming' || invocation.state === 'input-available') { return (
TypeScript Running TypeScript checks...
); - } else if (invocation.result?.startsWith('Error:')) { + } else if (invocation.output?.startsWith('Error:')) { if ( - invocation.result.includes(`[${outputLabels.convexTypecheck}]`) || - invocation.result.includes(`[${outputLabels.frontendTypecheck}]`) + invocation.output.includes(`[${outputLabels.convexTypecheck}]`) || + invocation.output.includes(`[${outputLabels.frontendTypecheck}]`) ) { return (
@@ -453,7 +460,7 @@ function toolTitle(invocation: ConvexToolInvocation): React.ReactNode { ); } case 'edit': { - const args = loggingSafeParse(editToolParameters, invocation.args); + const args = loggingSafeParse(editToolParameters, invocation.input); let renderedPath = 'a file'; if (args.success) { renderedPath = args.data.path; @@ -466,7 +473,7 @@ function toolTitle(invocation: ConvexToolInvocation): React.ReactNode { ); } case 'lookupDocs': { - const args = loggingSafeParse(lookupDocsParameters, invocation.args); + const args = loggingSafeParse(lookupDocsParameters, invocation.input); if (!args.success) { return 'Looking up documentation...'; } @@ -478,7 +485,7 @@ function toolTitle(invocation: ConvexToolInvocation): React.ReactNode { ); } case 'addEnvironmentVariables': { - const args = loggingSafeParse(addEnvironmentVariablesParameters, invocation.args); + const args = loggingSafeParse(addEnvironmentVariablesParameters, invocation.input); if (!args.success) { return 'Adding environment variables...'; } @@ -490,15 +497,15 @@ function toolTitle(invocation: ConvexToolInvocation): React.ReactNode { ); } case 'getConvexDeploymentName': { - if (invocation.state === 'partial-call' || invocation.state === 'call') { + if (invocation.state === 'input-streaming' || invocation.state === 'input-available') { return 'Getting Convex deployment name...'; - } else if (invocation.result?.startsWith('Error:')) { + } else if (invocation.output?.startsWith('Error:')) { return 'Failed to get Convex deployment name'; } else { return (
Convex - Got Convex deployment name: {invocation.result} + Got Convex deployment name: {invocation.output}
); } @@ -513,20 +520,20 @@ function ViewTool({ invocation }: { invocation: ConvexToolInvocation }) { if (invocation.toolName !== 'view') { throw new Error('View tool can only be used for the view tool'); } - if (invocation.state === 'partial-call' || invocation.state === 'call') { + if (invocation.state === 'input-streaming' || invocation.state === 'input-available') { return null; } - if (invocation.result.startsWith('Error:')) { + if (invocation.output.startsWith('Error:')) { return (
-
{invocation.result}
+
{invocation.output}
); } // Directory listing - if (invocation.result.startsWith('Directory:')) { - const items = invocation.result.split('\n').slice(1); + if (invocation.output.startsWith('Directory:')) { + const items = invocation.output.split('\n').slice(1); return (
{items.map((item: string, i: number) => { @@ -544,11 +551,11 @@ function ViewTool({ invocation }: { invocation: ConvexToolInvocation }) { } // File contents with line numbers - const lines = invocation.result.split('\n').map((line: string) => { + const lines = invocation.output.split('\n').map((line: string) => { const [_, ...content] = line.split(':'); return content.join(':'); }); - const args = loggingSafeParse(viewParameters, invocation.args); + const args = loggingSafeParse(viewParameters, invocation.input); let startLine = 1; let language = 'typescript'; if (args.success) { @@ -638,10 +645,10 @@ function EditTool({ invocation }: { invocation: ConvexToolInvocation }) { if (invocation.toolName !== 'edit') { throw new Error('Edit tool can only be used for the edit tool'); } - if (invocation.state === 'partial-call') { + if (invocation.state === 'input-streaming') { return null; } - const args = loggingSafeParse(editToolParameters, invocation.args); + const args = loggingSafeParse(editToolParameters, invocation.input); if (!args.success) { return null; } @@ -665,13 +672,13 @@ function LookupDocsTool({ invocation }: { invocation: ConvexToolInvocation }) { if (invocation.toolName !== 'lookupDocs') { throw new Error('LookupDocs tool can only be used for the lookupDocs tool'); } - if (invocation.state === 'partial-call' || invocation.state === 'call') { + if (invocation.state === 'input-streaming' || invocation.state === 'input-available') { return null; } - if (invocation.result.startsWith('Error:')) { + if (invocation.output.startsWith('Error:')) { return (
-
{invocation.result}
+
{invocation.output}
); } @@ -679,7 +686,7 @@ function LookupDocsTool({ invocation }: { invocation: ConvexToolInvocation }) { return (
- {invocation.result} + {invocation.output}
); @@ -689,17 +696,17 @@ function AddEnvironmentVariablesTool({ invocation }: { invocation: ConvexToolInv if (invocation.toolName !== 'addEnvironmentVariables') { throw new Error('AddEnvironmentVariablesTool can only be used for the addEnvironmentVariables tool'); } - if (invocation.state === 'partial-call' || invocation.state === 'call') { + if (invocation.state === 'input-streaming' || invocation.state === 'input-available') { return null; } - const args = loggingSafeParse(addEnvironmentVariablesParameters, invocation.args); + const args = loggingSafeParse(addEnvironmentVariablesParameters, invocation.input); if (!args.success) { return null; } - if (invocation.result.startsWith('Error:') || !args.success) { + if (invocation.output.startsWith('Error:') || !args.success) { return (
-
{invocation.result}
+
{invocation.output}
); } @@ -733,13 +740,13 @@ function GetConvexDeploymentNameTool({ invocation }: { invocation: ConvexToolInv if (invocation.toolName !== 'getConvexDeploymentName') { throw new Error('GetConvexDeploymentNameTool can only be used for the getConvexDeploymentName tool'); } - if (invocation.state === 'partial-call' || invocation.state === 'call') { + if (invocation.state === 'input-streaming' || invocation.state === 'input-available') { return null; } - if (invocation.result.startsWith('Error:')) { + if (invocation.output.startsWith('Error:')) { return (
-
{invocation.result}
+
{invocation.output}
); } @@ -749,7 +756,7 @@ function GetConvexDeploymentNameTool({ invocation }: { invocation: ConvexToolInv
Convex Deployment Name: - {invocation.result} + {invocation.output}
diff --git a/app/components/debug/UsageBreakdownView.tsx b/app/components/debug/UsageBreakdownView.tsx index 42e1f903d..8e1924851 100644 --- a/app/components/debug/UsageBreakdownView.tsx +++ b/app/components/debug/UsageBreakdownView.tsx @@ -1,4 +1,4 @@ -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; import { useEffect } from 'react'; @@ -89,7 +89,7 @@ export function UsageBreakdownView({ fileContent: Blob | null; convexSiteUrl: string; }) { - const [messages, setMessages] = useState([]); + const [messages, setMessages] = useState([]); const [usageData, setUsageData] = useState(null); const convex = useConvex(); useEffect(() => { @@ -295,7 +295,7 @@ function BreakdownView({
); } -async function getUsageBreakdown(messages: Message[]) { +async function getUsageBreakdown(messages: UIMessage[]) { const chatTotalRawUsage = { completionTokens: 0, promptTokens: 0, @@ -373,7 +373,7 @@ async function getUsageBreakdown(messages: Message[]) { if (message.role !== 'assistant') { continue; } - const parsedAnnotations = parseAnnotations(message.annotations); + const parsedAnnotations = parseAnnotations(message.metadata); const failedToolCalls = getFailedToolCalls(message); const { totalRawUsage, totalUsageBilledFor } = await calculateTotalUsage({ startUsage: null, @@ -394,7 +394,7 @@ async function getUsageBreakdown(messages: Message[]) { chefBreakdown: breakdown, messageSummaryInfo: { numParts: message.parts?.length ?? 0, - numToolInvocations: message.parts?.filter((p) => p.type === 'tool-invocation').length ?? 0, + numToolInvocations: message.parts?.filter((p) => 'toolCallId' in p).length ?? 0, numFailedToolInvocations: failedToolCalls.size, }, }); @@ -417,7 +417,7 @@ function getPartInfos({ usageAnnotationsForToolCalls, providerAnnotationsForToolCalls, }: { - message: Message; + message: UIMessage; usageAnnotationsForToolCalls: Record; providerAnnotationsForToolCalls: Record; }) { @@ -440,12 +440,22 @@ function getPartInfos({ partText: part.text, usageInfo: null, }); - } else if (part.type === 'tool-invocation') { - const provider = providerAnnotationsForToolCalls[part.toolInvocation.toolCallId]?.provider ?? 'Anthropic'; - const rawUsageForPart = usageAnnotationsForToolCalls[part.toolInvocation.toolCallId] + } else if ('toolCallId' in part) { + const toolCallId = (part as any).toolCallId as string; + const toolName = (part as any).toolName as string; + const state = (part as any).state as string; + const provider = providerAnnotationsForToolCalls[toolCallId]?.provider ?? 'Anthropic'; + const usageAnnotation = usageAnnotationsForToolCalls[toolCallId]; + const rawUsageForPart = usageAnnotation ? usageFromGeneration({ - usage: usageAnnotationsForToolCalls[part.toolInvocation.toolCallId]!, - providerMetadata: usageAnnotationsForToolCalls[part.toolInvocation.toolCallId]?.providerMetadata, + usage: { + ...usageAnnotation, + inputTokens: usageAnnotation.promptTokens, + outputTokens: usageAnnotation.completionTokens, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, + }, + providerMetadata: usageAnnotation.providerMetadata, }) : initializeUsage(); const billedUsageForPart = rawUsageForPart; @@ -453,7 +463,7 @@ function getPartInfos({ partInfos.push({ partIdx: idx, partType: 'tool-invocation', - partText: `Tool invocation: ${part.toolInvocation.toolName} (${part.toolInvocation.toolCallId})\n\n${part.toolInvocation.state === 'result' ? part.toolInvocation.result : '(incomplete call)'}`, + partText: `Tool invocation: ${toolName} (${toolCallId})\n\n${state === 'result' || state === 'output-available' ? ((part as any).output ?? (part as any).result) : '(incomplete call)'}`, usageInfo: { rawUsage: rawUsageForPart, billedUsage: billedUsageForPart, @@ -463,9 +473,24 @@ function getPartInfos({ }); } } + const finalAnnotation = usageAnnotationsForToolCalls.final; const finalUsage = usageFromGeneration({ - usage: usageAnnotationsForToolCalls.final ?? initializeUsage(), - providerMetadata: usageAnnotationsForToolCalls.final?.providerMetadata ?? undefined, + usage: finalAnnotation + ? { + ...finalAnnotation, + inputTokens: finalAnnotation.promptTokens, + outputTokens: finalAnnotation.completionTokens, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, + } + : { + ...initializeUsage(), + inputTokens: 0, + outputTokens: 0, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, + }, + providerMetadata: finalAnnotation?.providerMetadata ?? undefined, }); const provider = providerAnnotationsForToolCalls.final?.provider ?? 'Anthropic'; const { chefTokens, breakdown } = calculateChefTokens(finalUsage, provider); diff --git a/app/lib/.server/chat.ts b/app/lib/.server/chat.ts index 1d312e209..e4985210a 100644 --- a/app/lib/.server/chat.ts +++ b/app/lib/.server/chat.ts @@ -3,14 +3,14 @@ import { createScopedLogger } from 'chef-agent/utils/logger'; import { convexAgent } from '~/lib/.server/llm/convex-agent'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'; -import type { LanguageModelUsage, Message, ProviderMetadata } from 'ai'; +import type { LanguageModelUsage, UIMessage, ProviderMetadata } from 'ai'; import { checkTokenUsage, recordUsage } from '~/lib/.server/usage'; import { disabledText, noTokensText } from '~/lib/convexUsage'; import type { ModelProvider } from '~/lib/.server/llm/provider'; import { getEnv } from '~/lib/.server/env'; import type { PromptCharacterCounts } from 'chef-agent/ChatContextManager'; -type Messages = Message[]; +type Messages = UIMessage[]; const logger = createScopedLogger('api.chat'); @@ -151,7 +151,7 @@ export async function chatAction({ request }: ActionFunctionArgs) { logger.info(`Using model provider: ${body.modelProvider} (user API key: ${useUserApiKey})`); const recordUsageCb = async ( - lastMessage: Message | undefined, + lastMessage: UIMessage | undefined, finalGeneration: { usage: LanguageModelUsage; providerMetadata?: ProviderMetadata }, ) => { if (!userApiKey && getEnv('DISABLE_USAGE_REPORTING') !== '1') { @@ -168,7 +168,15 @@ export async function chatAction({ request }: ActionFunctionArgs) { }; try { - const totalMessageContent = messages.reduce((acc, message) => acc + message.content, ''); + const totalMessageContent = messages.reduce( + (acc, message) => + acc + + message.parts + .filter((p): p is { type: 'text'; text: string } => p.type === 'text') + .map((p) => p.text) + .join(''), + '', + ); logger.debug(`Total message length: ${totalMessageContent.split(' ').length}, words`); const dataStream = await convexAgent({ chatInitialId, diff --git a/app/lib/.server/llm/convex-agent.ts b/app/lib/.server/llm/convex-agent.ts index 3384901be..411ab7a37 100644 --- a/app/lib/.server/llm/convex-agent.ts +++ b/app/lib/.server/llm/convex-agent.ts @@ -1,12 +1,12 @@ import { - createDataStream, + createUIMessageStream, streamText, - type CoreAssistantMessage, - type CoreMessage, - type CoreToolMessage, - type DataStreamWriter, + type AssistantModelMessage, + type ModelMessage, + type ToolModelMessage, + type UIMessageStreamWriter, type LanguageModelUsage, - type Message, + type UIMessage, type ProviderMetadata, type StepResult, } from 'ai'; @@ -37,7 +37,7 @@ import { addEnvironmentVariablesTool } from 'chef-agent/tools/addEnvironmentVari import { getConvexDeploymentNameTool } from 'chef-agent/tools/getConvexDeploymentName'; import type { PromptCharacterCounts } from 'chef-agent/ChatContextManager'; -type Messages = Message[]; +type Messages = UIMessage[]; export async function convexAgent(args: { chatInitialId: string; @@ -49,7 +49,7 @@ export async function convexAgent(args: { userApiKey: string | undefined; shouldDisableTools: boolean; recordUsageCb: ( - lastMessage: Message | undefined, + lastMessage: UIMessage | undefined, finalGeneration: { usage: LanguageModelUsage; providerMetadata?: ProviderMetadata }, ) => Promise; recordRawPromptsForDebugging: boolean; @@ -97,12 +97,12 @@ export async function convexAgent(args: { npmInstall: npmInstallTool, lookupDocs: lookupDocsTool(), getConvexDeploymentName: getConvexDeploymentNameTool, - }; - tools.addEnvironmentVariables = addEnvironmentVariablesTool(); - tools.view = viewTool; - tools.edit = editTool; + addEnvironmentVariables: addEnvironmentVariablesTool(), + view: viewTool, + edit: editTool, + } as any; - const messagesForDataStream: CoreMessage[] = [ + const messagesForStream: ModelMessage[] = [ { role: 'system' as const, content: ROLE_SYSTEM_PROMPT, @@ -111,11 +111,11 @@ export async function convexAgent(args: { role: 'system' as const, content: generalSystemPrompt(opts), }, - ...cleanupAssistantMessages(messages), + ...(await cleanupAssistantMessages(messages)), ]; if (modelProvider === 'Bedrock') { - messagesForDataStream[messagesForDataStream.length - 1].providerOptions = { + messagesForStream[messagesForStream.length - 1].providerOptions = { bedrock: { cachePoint: { type: 'default', @@ -125,7 +125,7 @@ export async function convexAgent(args: { } if (modelProvider === 'Anthropic') { - messagesForDataStream[messagesForDataStream.length - 1].providerOptions = { + messagesForStream[messagesForStream.length - 1].providerOptions = { anthropic: { cacheControl: { type: 'ephemeral', @@ -134,18 +134,18 @@ export async function convexAgent(args: { }; } - const dataStream = createDataStream({ - execute(dataStream) { + const stream = createUIMessageStream({ + execute: async ({ writer }) => { const result = streamText({ model: provider.model, - maxTokens: provider.maxTokens, + maxOutputTokens: provider.maxTokens, providerOptions: provider.options, - messages: messagesForDataStream, + messages: messagesForStream, tools, toolChoice: shouldDisableTools ? 'none' : 'auto', onFinish: (result) => { onFinishHandler({ - dataStream, + writer, messages, result, tracer, @@ -153,14 +153,14 @@ export async function convexAgent(args: { recordUsageCb, toolsDisabledFromRepeatedErrors: shouldDisableTools, recordRawPromptsForDebugging, - coreMessages: messagesForDataStream, + modelMessages: messagesForStream, modelProvider, modelChoice, collapsedMessages, promptCharacterCounts, _startTime: startTime, _firstResponseTime: firstResponseTime, - providerModel: provider.model.modelId, + providerModel: typeof provider.model === 'string' ? provider.model : provider.model.modelId, }); }, onError({ error }) { @@ -203,17 +203,17 @@ export async function convexAgent(args: { } })(); - result.mergeIntoDataStream(dataStream); + writer.merge(result.toUIMessageStream()); }, - onError(error: any) { - return error.message; + onError(error: unknown) { + return error instanceof Error ? error.message : String(error); }, }); - return dataStream; + return stream; } async function onFinishHandler({ - dataStream, + writer, messages, result, tracer, @@ -221,7 +221,7 @@ async function onFinishHandler({ recordUsageCb, toolsDisabledFromRepeatedErrors, recordRawPromptsForDebugging, - coreMessages, + modelMessages, modelProvider, modelChoice, collapsedMessages, @@ -230,18 +230,18 @@ async function onFinishHandler({ _firstResponseTime, providerModel, }: { - dataStream: DataStreamWriter; + writer: UIMessageStreamWriter; messages: Messages; - result: Omit, 'stepType' | 'isContinued'>; + result: StepResult; tracer: Tracer | null; chatInitialId: string; recordUsageCb: ( - lastMessage: Message | undefined, + lastMessage: UIMessage | undefined, finalGeneration: { usage: LanguageModelUsage; providerMetadata?: ProviderMetadata }, ) => Promise; recordRawPromptsForDebugging: boolean; toolsDisabledFromRepeatedErrors: boolean; - coreMessages: CoreMessage[]; + modelMessages: ModelMessage[]; modelProvider: ModelProvider; modelChoice: string | undefined; collapsedMessages: boolean; @@ -252,9 +252,11 @@ async function onFinishHandler({ }) { const { providerMetadata } = result; // This usage accumulates accross multiple /api/chat calls until finishReason of 'stop'. - const usage = { - completionTokens: normalizeUsage(result.usage.completionTokens), - promptTokens: normalizeUsage(result.usage.promptTokens), + const usage: LanguageModelUsage = { + inputTokens: normalizeUsage(result.usage.inputTokens), + inputTokenDetails: result.usage.inputTokenDetails, + outputTokens: normalizeUsage(result.usage.outputTokens), + outputTokenDetails: result.usage.outputTokenDetails, totalTokens: normalizeUsage(result.usage.totalTokens), }; console.log('Finished streaming', { @@ -267,9 +269,9 @@ async function onFinishHandler({ const span = tracer.startSpan('on-finish-handler'); span.setAttribute('chatInitialId', chatInitialId); span.setAttribute('finishReason', result.finishReason); - span.setAttribute('usage.completionTokens', usage.completionTokens); - span.setAttribute('usage.promptTokens', usage.promptTokens); - span.setAttribute('usage.totalTokens', usage.totalTokens); + span.setAttribute('usage.outputTokens', usage.outputTokens ?? 0); + span.setAttribute('usage.inputTokens', usage.inputTokens ?? 0); + span.setAttribute('usage.totalTokens', usage.totalTokens ?? 0); span.setAttribute('collapsedMessages', collapsedMessages); span.setAttribute('model', providerModel); @@ -284,8 +286,9 @@ async function onFinishHandler({ span.setAttribute('providerMetadata.anthropic.cacheCreationInputTokens', anthropic.cacheCreationInputTokens); span.setAttribute('providerMetadata.anthropic.cacheReadInputTokens', anthropic.cacheReadInputTokens); } - if (providerMetadata.google) { - const google: any = providerMetadata.google; + const vertexOrGoogle = providerMetadata.vertex ?? providerMetadata.google; + if (vertexOrGoogle) { + const google: any = vertexOrGoogle; span.setAttribute('providerMetadata.google.cachedContentTokenCount', google.cachedContentTokenCount ?? 0); } if (providerMetadata.openai) { @@ -301,28 +304,34 @@ async function onFinishHandler({ span.setAttribute('providerMetadata.bedrock.cacheReadInputTokens', bedrock.usage?.cacheReadInputTokens ?? 0); } } - if (result.finishReason === 'stop' || result.finishReason === 'unknown') { + if (result.finishReason === 'stop' || result.finishReason === 'other') { const lastMessage = messages[messages.length - 1]; if (lastMessage.role === 'assistant') { - // This field is deprecated, but for some reason, the new field "parts", does not contain all of the tool calls. This is likely a - // vercel bug. We do this at the end end the request because it's when we have the results from all of the tool calls. - const toolCalls = lastMessage.toolInvocations?.filter((t) => t.toolName === 'deploy' && t.state === 'result'); - const successfulDeploys = - toolCalls?.filter((t) => t.state === 'result' && !t.result.startsWith('Error:')).length ?? 0; + // Count deploy tool calls from parts + const toolCalls = lastMessage.parts.filter( + (p: any) => + 'toolCallId' in p && + (p.type === 'tool-deploy' || ('toolName' in p && p.toolName === 'deploy')) && + p.state === 'output-available', + ); + const successfulDeploys = toolCalls.filter( + (t: any) => t.state === 'output-available' && typeof t.output === 'string' && !t.output.startsWith('Error:'), + ).length; span.setAttribute('tools.successfulDeploys', successfulDeploys); - span.setAttribute('tools.failedDeploys', toolCalls ? toolCalls.length - successfulDeploys : 0); + span.setAttribute('tools.failedDeploys', toolCalls.length - successfulDeploys); } span.setAttribute('tools.disabledFromRepeatedErrors', toolsDisabledFromRepeatedErrors ? 'true' : 'false'); } span.end(); } + // Write metadata instead of annotations if (toolsDisabledFromRepeatedErrors) { - dataStream.writeMessageAnnotation({ type: 'failure', reason: REPEATED_ERROR_REASON }); + writer.write({ type: 'message-metadata', metadata: { failure: REPEATED_ERROR_REASON } } as any); } let toolCallId: { kind: 'tool-call'; toolCallId: string } | { kind: 'final' } | undefined; - // Always stash this part's usage as an annotation -- these are used for + // Always stash this part's usage as metadata -- these are used for // displaying usage info in the UI as well as calculating usage when the message // finishes. if (result.finishReason === 'tool-calls') { @@ -337,10 +346,11 @@ async function onFinishHandler({ toolCallId = { kind: 'final' }; } if (toolCallId) { + const id = toolCallId.kind === 'tool-call' ? toolCallId.toolCallId : 'final'; const annotation = encodeUsageAnnotation(toolCallId, usage, providerMetadata); - dataStream.writeMessageAnnotation({ type: 'usage', usage: annotation }); + writer.write({ type: 'message-metadata', metadata: { [`usage:${id}`]: annotation } } as any); const modelAnnotation = encodeModelAnnotation(toolCallId, providerMetadata, modelChoice); - dataStream.writeMessageAnnotation({ type: 'model', ...modelAnnotation }); + writer.write({ type: 'message-metadata', metadata: { [`model:${id}`]: modelAnnotation } } as any); } // Record usage once we've generated the final part. @@ -348,13 +358,13 @@ async function onFinishHandler({ await recordUsageCb(messages[messages.length - 1], { usage, providerMetadata }); } if (recordRawPromptsForDebugging) { - const responseCoreMessages = result.response.messages as (CoreAssistantMessage | CoreToolMessage)[]; + const responseModelMessages = result.response.messages as (AssistantModelMessage | ToolModelMessage)[]; // don't block the request but keep the request alive in Vercel Lambdas waitUntil( storeDebugPrompt( - coreMessages, + modelMessages, chatInitialId, - responseCoreMessages, + responseModelMessages, result, { usage, @@ -436,10 +446,10 @@ function buildUsageRecord(usage: Usage): UsageRecord { } async function storeDebugPrompt( - promptCoreMessages: CoreMessage[], + promptModelMessages: ModelMessage[], chatInitialId: string, - responseCoreMessages: CoreMessage[], - result: Omit, 'stepType' | 'isContinued'>, + responseModelMessages: ModelMessage[], + result: StepResult, generation: { usage: LanguageModelUsage; providerMetadata?: ProviderMetadata }, modelProvider: ModelProvider, ) { @@ -448,7 +458,7 @@ async function storeDebugPrompt( const modelId = result.response.modelId || ''; const usage = usageFromGeneration(generation); - const promptMessageData = new TextEncoder().encode(JSON.stringify(promptCoreMessages)); + const promptMessageData = new TextEncoder().encode(JSON.stringify(promptModelMessages)); const compressedData = compressWithLz4Server(promptMessageData); type Metadata = Omit<(typeof internal.debugPrompt.storeDebugPrompt)['_args'], 'promptCoreMessagesStorageId'>; @@ -456,7 +466,7 @@ async function storeDebugPrompt( const metadata = { chatInitialId, - responseCoreMessages, + responseCoreMessages: responseModelMessages, finishReason, modelId, usage: buildUsageRecord(usage), @@ -484,6 +494,6 @@ async function storeDebugPrompt( } } -function normalizeUsage(usage: number) { - return Number.isNaN(usage) ? 0 : usage; +function normalizeUsage(usage: number | undefined) { + return usage == null || Number.isNaN(usage) ? 0 : usage; } diff --git a/app/lib/.server/llm/provider.ts b/app/lib/.server/llm/provider.ts index c668c8ef5..9942a1b94 100644 --- a/app/lib/.server/llm/provider.ts +++ b/app/lib/.server/llm/provider.ts @@ -1,4 +1,4 @@ -import type { LanguageModelV1 } from 'ai'; +import type { LanguageModel } from 'ai'; import { createAmazonBedrock } from '@ai-sdk/amazon-bedrock'; import { createAnthropic } from '@ai-sdk/anthropic'; import { createXai } from '@ai-sdk/xai'; @@ -19,7 +19,7 @@ const ALLOWED_AWS_REGIONS = ['us-east-1', 'us-west-2']; export type ModelProvider = Exclude; type Provider = { maxTokens: number; - model: LanguageModelV1; + model: LanguageModel; options?: { xai?: { stream_options: { include_usage: true }; @@ -134,7 +134,6 @@ export function getProvider( const openai = createOpenAI({ apiKey: userApiKey || getEnv('OPENAI_API_KEY'), fetch: userApiKey ? userKeyApiFetch('OpenAI') : fetch, - compatibility: 'strict', }); provider = { model: openai(model), diff --git a/app/lib/.server/usage.test.ts b/app/lib/.server/usage.test.ts index ddf568409..303b1db9c 100644 --- a/app/lib/.server/usage.test.ts +++ b/app/lib/.server/usage.test.ts @@ -4,10 +4,12 @@ import { annotationValidator, usageAnnotationValidator } from '~/lib/common/anno test('encodeUsageAnnotationAnthropic', async () => { const usage = { - completionTokens: 100, - promptTokens: 200, + inputTokens: 200, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokens: 100, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, totalTokens: 300, - }; + } as const; const providerMetadata = { anthropic: { cacheCreationInputTokens: 10, @@ -37,10 +39,12 @@ test('encodeUsageAnnotationAnthropic', async () => { test('encodeUsageAnnotationOpenAI', async () => { const usage = { - completionTokens: 100, - promptTokens: 200, + inputTokens: 200, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokens: 100, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, totalTokens: 300, - }; + } as const; const providerMetadata = { openai: { cachedPromptTokens: 10, @@ -67,10 +71,12 @@ test('encodeUsageAnnotationOpenAI', async () => { test('encodeUsageAnnotationXAI', async () => { const usage = { - completionTokens: 100, - promptTokens: 200, + inputTokens: 200, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokens: 100, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, totalTokens: 300, - }; + } as const; const providerMetadata = { xai: { cachedPromptTokens: 10, @@ -97,10 +103,12 @@ test('encodeUsageAnnotationXAI', async () => { test('encodeUsageAnnotationGoogle', async () => { const usage = { - completionTokens: 100, - promptTokens: 200, + inputTokens: 200, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokens: 100, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, totalTokens: 300, - }; + } as const; const providerMetadata = { google: { cachedContentTokenCount: 10, @@ -127,10 +135,12 @@ test('encodeUsageAnnotationGoogle', async () => { test('encodeUsageAnnotationBedrock', async () => { const usage = { - completionTokens: 100, - promptTokens: 200, + inputTokens: 200, + inputTokenDetails: { noCacheTokens: undefined, cacheReadTokens: undefined, cacheWriteTokens: undefined }, + outputTokens: 100, + outputTokenDetails: { textTokens: undefined, reasoningTokens: undefined }, totalTokens: 300, - }; + } as const; const providerMetadata = { bedrock: { usage: { diff --git a/app/lib/.server/usage.ts b/app/lib/.server/usage.ts index 5eb848bf3..d45a6ad1d 100644 --- a/app/lib/.server/usage.ts +++ b/app/lib/.server/usage.ts @@ -1,4 +1,4 @@ -import type { LanguageModelUsage, Message, ProviderMetadata } from 'ai'; +import type { LanguageModelUsage, UIMessage, ProviderMetadata } from 'ai'; import { createScopedLogger } from 'chef-agent/utils/logger'; import { getTokenUsage } from '~/lib/convexUsage'; import type { ProviderType, UsageAnnotation } from '~/lib/common/annotations'; @@ -33,9 +33,9 @@ export function encodeUsageAnnotation( ) { const payload: UsageAnnotation = { toolCallId: toolCallId.kind === 'tool-call' ? toolCallId.toolCallId : 'final', - completionTokens: usage.completionTokens, - promptTokens: usage.promptTokens, - totalTokens: usage.totalTokens, + completionTokens: usage.outputTokens ?? 0, + promptTokens: usage.inputTokens ?? 0, + totalTokens: usage.totalTokens ?? 0, providerMetadata, }; const serialized = JSON.stringify(payload); @@ -58,7 +58,7 @@ export function encodeModelAnnotation( } else if (providerMetadata?.xai) { provider = 'XAI'; model = modelForProvider('XAI', modelChoice); - } else if (providerMetadata?.google) { + } else if (providerMetadata?.vertex || providerMetadata?.google) { provider = 'Google'; model = modelForProvider('Google', modelChoice); } else if (providerMetadata?.bedrock) { @@ -74,7 +74,7 @@ export async function recordUsage( modelProvider: ModelProvider, teamSlug: string, deploymentName: string | undefined, - lastMessage: Message | undefined, + lastMessage: UIMessage | undefined, finalGeneration: { usage: LanguageModelUsage; providerMetadata?: ProviderMetadata }, ) { const totalUsageBilledFor = await calculateTotalBilledUsageForMessage(lastMessage, finalGeneration); diff --git a/app/lib/common/annotations.ts b/app/lib/common/annotations.ts index a48feb66d..fca061e60 100644 --- a/app/lib/common/annotations.ts +++ b/app/lib/common/annotations.ts @@ -1,7 +1,7 @@ -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; import { z } from 'zod'; -// This is added as a message annotation by the server when the agent has +// This is added as message metadata by the server when the agent has // stopped due to repeated errors. // // The client uses this to conditionally display UI. @@ -35,6 +35,11 @@ export const usageAnnotationValidator = z.object({ cachedContentTokenCount: z.number(), }) .optional(), + vertex: z + .object({ + cachedContentTokenCount: z.number(), + }) + .optional(), bedrock: z .object({ usage: z.object({ @@ -82,55 +87,93 @@ export const annotationValidator = z.discriminatedUnion('type', [ }), ]); -export const failedDueToRepeatedErrors = (annotations: Message['annotations']) => { - if (!annotations) { +type MessageMetadata = UIMessage['metadata']; + +export const failedDueToRepeatedErrors = (metadata: MessageMetadata) => { + if (!metadata) { return false; } - return annotations.some((annotation) => { - const parsed = annotationValidator.safeParse(annotation); - return parsed.success && parsed.data.type === 'failure' && parsed.data.reason === REPEATED_ERROR_REASON; - }); + const md = metadata as Record; + // Check metadata-based format (v6) + if (md.failure === REPEATED_ERROR_REASON) { + return true; + } + // Check legacy annotations format (stored in Convex) + const annotations = md.annotations as unknown[] | undefined; + if (annotations) { + return annotations.some((annotation) => { + const parsed = annotationValidator.safeParse(annotation); + return parsed.success && parsed.data.type === 'failure' && parsed.data.reason === REPEATED_ERROR_REASON; + }); + } + return false; }; export const parseAnnotations = ( - annotations: Message['annotations'], + metadata: MessageMetadata, ): { failedDueToRepeatedErrors: boolean; usageForToolCall: Record; modelForToolCall: Record; } => { - if (!annotations) { + if (!metadata) { return { failedDueToRepeatedErrors: false, usageForToolCall: {}, modelForToolCall: {}, }; } - let failedDueToRepeatedErrors = false; + let failed = false; const usageForToolCall: Record = {}; const modelForToolCall: Record = {}; - for (const annotation of annotations) { - const parsed = annotationValidator.safeParse(annotation); - if (!parsed.success) { - continue; + const md = metadata as Record; + + // Parse v6 metadata format (keyed entries) + if (md.failure === REPEATED_ERROR_REASON) { + failed = true; + } + for (const [key, value] of Object.entries(md)) { + if (key.startsWith('usage:')) { + const usage = usageAnnotationValidator.safeParse(JSON.parse((value as { payload: string }).payload)); + if (usage.success) { + const id = key.slice('usage:'.length); + usageForToolCall[id] = usage.data; + } } - if (parsed.data.type === 'failure' && parsed.data.reason === REPEATED_ERROR_REASON) { - failedDueToRepeatedErrors = true; + if (key.startsWith('model:')) { + const model = value as { provider: ProviderType; model: string | undefined; toolCallId: string }; + const id = key.slice('model:'.length); + modelForToolCall[id] = { provider: model.provider, model: model.model }; } - if (parsed.data.type === 'usage') { - const usage = usageAnnotationValidator.safeParse(JSON.parse(parsed.data.usage.payload)); - if (usage.success) { - if (usage.data.toolCallId) { - usageForToolCall[usage.data.toolCallId] = usage.data; + } + + // Also parse legacy annotations format (for messages loaded from Convex) + const annotations = md.annotations as unknown[] | undefined; + if (annotations) { + for (const annotation of annotations) { + const parsed = annotationValidator.safeParse(annotation); + if (!parsed.success) { + continue; + } + if (parsed.data.type === 'failure' && parsed.data.reason === REPEATED_ERROR_REASON) { + failed = true; + } + if (parsed.data.type === 'usage') { + const usage = usageAnnotationValidator.safeParse(JSON.parse(parsed.data.usage.payload)); + if (usage.success) { + if (usage.data.toolCallId) { + usageForToolCall[usage.data.toolCallId] = usage.data; + } } } - } - if (parsed.data.type === 'model') { - modelForToolCall[parsed.data.toolCallId] = { provider: parsed.data.provider, model: parsed.data.model }; + if (parsed.data.type === 'model') { + modelForToolCall[parsed.data.toolCallId] = { provider: parsed.data.provider, model: parsed.data.model }; + } } } + return { - failedDueToRepeatedErrors, + failedDueToRepeatedErrors: failed, usageForToolCall, modelForToolCall, }; diff --git a/app/lib/common/types.ts b/app/lib/common/types.ts index 813fdfa10..c780ff362 100644 --- a/app/lib/common/types.ts +++ b/app/lib/common/types.ts @@ -1,4 +1,4 @@ -import type { ToolCallUnion } from 'ai'; +import type { TypedToolCall } from 'ai'; import type { npmInstallToolParameters } from 'chef-agent/tools/npmInstall'; import type { editToolParameters } from 'chef-agent/tools/edit'; import type { addEnvironmentVariablesParameters } from 'chef-agent/tools/addEnvironmentVariables'; @@ -8,58 +8,58 @@ import type { lookupDocsParameters } from 'chef-agent/tools/lookupDocs'; import type { ConvexToolSet, EmptyArgs } from 'chef-agent/types'; import type { getConvexDeploymentNameParameters } from 'chef-agent/tools/getConvexDeploymentName'; -type ConvexToolCall = ToolCallUnion; +type ConvexToolCall = TypedToolCall; export type ConvexToolName = keyof ConvexToolSet; type ConvexToolResult = | { toolName: 'deploy'; - args?: EmptyArgs; - result?: string; + input?: EmptyArgs; + output?: string; } | { toolName: 'view'; - args: typeof viewParameters; - result: string; + input: typeof viewParameters; + output: string; } | { toolName: 'npmInstall'; - args: typeof npmInstallToolParameters; - result: string; + input: typeof npmInstallToolParameters; + output: string; } | { toolName: 'edit'; - args: typeof editToolParameters; - result: string; + input: typeof editToolParameters; + output: string; } | { toolName: 'lookupDocs'; - args: typeof lookupDocsParameters; - result: string; + input: typeof lookupDocsParameters; + output: string; } | { toolName: 'addEnvironmentVariables'; - args: typeof addEnvironmentVariablesParameters; - result: string; + input: typeof addEnvironmentVariablesParameters; + output: string; } | { toolName: 'getConvexDeploymentName'; - args: typeof getConvexDeploymentNameParameters; - result: string; + input: typeof getConvexDeploymentNameParameters; + output: string; }; export type ConvexToolInvocation = | ({ - state: 'partial-call'; + state: 'input-streaming'; step?: number; } & ConvexToolCall) | ({ - state: 'call'; + state: 'input-available'; step?: number; } & ConvexToolCall) | ({ - state: 'result'; + state: 'output-available'; step?: number; } & ConvexToolResult); diff --git a/app/lib/common/usage.ts b/app/lib/common/usage.ts index 270a944e4..04ccf82aa 100644 --- a/app/lib/common/usage.ts +++ b/app/lib/common/usage.ts @@ -1,4 +1,4 @@ -import type { LanguageModelUsage, Message, ProviderMetadata } from 'ai'; +import type { LanguageModelUsage, UIMessage, ProviderMetadata } from 'ai'; import { type ProviderType, type Usage, type UsageAnnotation, parseAnnotations } from '~/lib/common/annotations'; import { captureMessage } from '@sentry/remix'; @@ -7,17 +7,18 @@ export function usageFromGeneration(generation: { providerMetadata?: ProviderMetadata; }): Usage { const bedrockUsage = generation.providerMetadata?.bedrock?.usage as any; + const vertexMeta = generation.providerMetadata?.vertex ?? generation.providerMetadata?.google; return { - completionTokens: generation.usage.completionTokens, - promptTokens: generation.usage.promptTokens, - totalTokens: generation.usage.totalTokens, + completionTokens: generation.usage.outputTokens ?? 0, + promptTokens: generation.usage.inputTokens ?? 0, + totalTokens: generation.usage.totalTokens ?? 0, providerMetadata: generation.providerMetadata, anthropicCacheCreationInputTokens: Number(generation.providerMetadata?.anthropic?.cacheCreationInputTokens ?? 0), anthropicCacheReadInputTokens: Number(generation.providerMetadata?.anthropic?.cacheReadInputTokens ?? 0), openaiCachedPromptTokens: Number(generation.providerMetadata?.openai?.cachedPromptTokens ?? 0), xaiCachedPromptTokens: Number(generation.providerMetadata?.xai?.cachedPromptTokens ?? 0), - googleCachedContentTokenCount: Number(generation.providerMetadata?.google?.cachedContentTokenCount ?? 0), - googleThoughtsTokenCount: Number(generation.providerMetadata?.google?.thoughtsTokenCount ?? 0), + googleCachedContentTokenCount: Number((vertexMeta as any)?.cachedContentTokenCount ?? 0), + googleThoughtsTokenCount: Number((vertexMeta as any)?.thoughtsTokenCount ?? 0), bedrockCacheWriteInputTokens: Number(bedrockUsage?.cacheWriteInputTokens ?? 0), bedrockCacheReadInputTokens: Number(bedrockUsage?.cacheReadInputTokens ?? 0), }; @@ -39,14 +40,14 @@ export function initializeUsage(): Usage { }; } -export function getFailedToolCalls(message: Message): Set { +export function getFailedToolCalls(message: UIMessage): Set { const failedToolCalls: Set = new Set(); for (const part of message.parts ?? []) { - if (part.type !== 'tool-invocation') { + if (!('toolCallId' in part)) { continue; } - if (part.toolInvocation.state === 'result' && part.toolInvocation.result.startsWith('Error:')) { - failedToolCalls.add(part.toolInvocation.toolCallId); + if (part.state === 'output-available' && typeof part.output === 'string' && part.output.startsWith('Error:')) { + failedToolCalls.add(part.toolCallId); } } return failedToolCalls; @@ -73,10 +74,10 @@ export function calculateTotalUsage(args: { } export async function calculateTotalBilledUsageForMessage( - lastMessage: Message | undefined, + lastMessage: UIMessage | undefined, finalGeneration: { usage: LanguageModelUsage; providerMetadata?: ProviderMetadata }, ): Promise { - const { usageForToolCall } = parseAnnotations(lastMessage?.annotations ?? []); + const { usageForToolCall } = parseAnnotations(lastMessage?.metadata); // If there's an annotation for the final part, start with an empty usage, otherwise, create a // usage object from the passed in final generation. const startUsage = usageForToolCall.final ? initializeUsage() : usageFromGeneration(finalGeneration); @@ -95,7 +96,8 @@ function addUsage(totalUsage: Usage, payload: UsageAnnotation) { totalUsage.anthropicCacheReadInputTokens += payload.providerMetadata?.anthropic?.cacheReadInputTokens ?? 0; totalUsage.openaiCachedPromptTokens += payload.providerMetadata?.openai?.cachedPromptTokens ?? 0; totalUsage.xaiCachedPromptTokens += payload.providerMetadata?.xai?.cachedPromptTokens ?? 0; - totalUsage.googleCachedContentTokenCount += payload.providerMetadata?.google?.cachedContentTokenCount ?? 0; + const googleMeta = payload.providerMetadata?.vertex ?? payload.providerMetadata?.google; + totalUsage.googleCachedContentTokenCount += (googleMeta as any)?.cachedContentTokenCount ?? 0; totalUsage.bedrockCacheWriteInputTokens += payload.providerMetadata?.bedrock?.usage?.cacheWriteInputTokens ?? 0; totalUsage.bedrockCacheReadInputTokens += payload.providerMetadata?.bedrock?.usage?.cacheReadInputTokens ?? 0; } diff --git a/app/lib/hooks/useDebugPrompt.ts b/app/lib/hooks/useDebugPrompt.ts index e5398daa1..b28cc4762 100644 --- a/app/lib/hooks/useDebugPrompt.ts +++ b/app/lib/hooks/useDebugPrompt.ts @@ -1,13 +1,13 @@ import { useConvex, useMutation, useQuery } from 'convex/react'; import { useQueries as useReactQueries } from '@tanstack/react-query'; import { api } from '@convex/_generated/api'; -import type { CoreMessage } from 'ai'; +import type { ModelMessage } from 'ai'; import { decompressWithLz4 } from '~/lib/compression.client'; import { queryClientStore } from '~/lib/stores/reactQueryClient'; import { useEffect, useState } from 'react'; import { getConvexAuthToken } from '~/lib/stores/sessionId'; -async function fetchPromptData(url: string): Promise { +async function fetchPromptData(url: string): Promise { const response = await fetch(url); if (!response.ok) { throw new Error(`Failed to fetch prompt data: ${response.statusText}`); @@ -17,7 +17,7 @@ async function fetchPromptData(url: string): Promise { const decompressedData = decompressWithLz4(new Uint8Array(compressedData)); const textDecoder = new TextDecoder(); const jsonString = textDecoder.decode(decompressedData); - return JSON.parse(jsonString) as CoreMessage[]; + return JSON.parse(jsonString) as ModelMessage[]; } export function useAuthToken() { diff --git a/app/lib/hooks/useMessageParser.ts b/app/lib/hooks/useMessageParser.ts index c12abd2f0..309968742 100644 --- a/app/lib/hooks/useMessageParser.ts +++ b/app/lib/hooks/useMessageParser.ts @@ -1,4 +1,4 @@ -import type { Message, UIMessage } from 'ai'; +import type { UIMessage } from 'ai'; import { useCallback, useRef, useState } from 'react'; import { StreamingMessageParser } from 'chef-agent/message-parser'; import { workbenchStore } from '~/lib/stores/workbench.client'; @@ -43,18 +43,18 @@ function isPartMaybeEqual(a: Part, b: Part): boolean { if (a.type === 'text' && b.type === 'text') { return a.text === b.text; } - if (a.type === 'tool-invocation' && b.type === 'tool-invocation') { - if (a.toolInvocation.state === 'result' && b.toolInvocation.state === 'result') { - return a.toolInvocation.toolCallId === b.toolInvocation.toolCallId; + if ('toolCallId' in a && 'toolCallId' in b) { + if ((a as any).state === 'output-available' && (b as any).state === 'output-available') { + return (a as any).toolCallId === (b as any).toolCallId; } } return false; } export function processMessage( - message: Message, + message: UIMessage, previousParts: PartCache, -): { message: Message; hitRate: [number, number] } { +): { message: UIMessage; hitRate: [number, number] } { if (message.role === 'user') { return { message, hitRate: [0, 0] }; } @@ -86,35 +86,34 @@ export function processMessage( }; break; } - case 'tool-invocation': { - const { toolInvocation } = part; - workbenchStore.addArtifact({ - id: partId, - partId, - title: 'Editing files...', - }); - const data = { - artifactId: partId, - partId, - actionId: toolInvocation.toolCallId, - action: { - type: 'toolUse' as const, - toolName: toolInvocation.toolName, - parsedContent: toolInvocation, - content: JSON.stringify(toolInvocation), - }, - }; - workbenchStore.addAction(data); - if (toolInvocation.state === 'call' || toolInvocation.state === 'result') { - workbenchStore.runAction(data); - } - newPart = { - type: 'tool-invocation' as const, - toolInvocation, - }; - } default: { - newPart = part; + // Handle tool invocation parts (tool-* types) + if ('toolCallId' in part) { + const toolPart = part as any; + workbenchStore.addArtifact({ + id: partId, + partId, + title: 'Editing files...', + }); + const data = { + artifactId: partId, + partId, + actionId: toolPart.toolCallId, + action: { + type: 'toolUse' as const, + toolName: toolPart.toolName ?? part.type.replace('tool-', ''), + parsedContent: toolPart, + content: JSON.stringify(toolPart), + }, + }; + workbenchStore.addAction(data); + if (toolPart.state === 'input-available' || toolPart.state === 'output-available') { + workbenchStore.runAction(data); + } + newPart = part; + } else { + newPart = part; + } } } parsedParts.push(newPart); @@ -124,7 +123,7 @@ export function processMessage( message: { ...message, parts: parsedParts, - }, + } as UIMessage, hitRate: [hits, message.parts.length], }; } @@ -132,13 +131,13 @@ export function processMessage( type Part = UIMessage['parts'][number]; export function useMessageParser(partCache: PartCache) { - const [parsedMessages, setParsedMessages] = useState([]); + const [parsedMessages, setParsedMessages] = useState([]); - const previousMessages = useRef<{ original: Message; parsed: Message }[]>([]); + const previousMessages = useRef<{ original: UIMessage; parsed: UIMessage }[]>([]); const previousParts = useRef(partCache); - const parseMessages = useCallback((messages: Message[]) => { - const nextPrevMessages: { original: Message; parsed: Message }[] = []; + const parseMessages = useCallback((messages: UIMessage[]) => { + const nextPrevMessages: { original: UIMessage; parsed: UIMessage }[] = []; for (let i = 0; i < messages.length; i++) { const prev = previousMessages.current[i]; diff --git a/app/lib/runtime/action-runner.ts b/app/lib/runtime/action-runner.ts index 4031cc95b..aedd2ff65 100644 --- a/app/lib/runtime/action-runner.ts +++ b/app/lib/runtime/action-runner.ts @@ -5,7 +5,6 @@ import type { ActionAlert, FileHistory } from '~/types/actions'; import { createScopedLogger } from 'chef-agent/utils/logger'; import { unreachable } from 'chef-agent/utils/unreachable'; import type { ActionCallbackData } from 'chef-agent/message-parser'; -import type { ToolInvocation } from 'ai'; import { viewParameters } from 'chef-agent/tools/view'; import { renderDirectory } from 'chef-agent/utils/renderDirectory'; import { renderFile } from 'chef-agent/utils/renderFile'; @@ -176,8 +175,8 @@ export class ActionRunner { // Check for duplicate tool calls if (action.type === 'toolUse') { const parsed = action.parsedContent; - if (parsed.state === 'call') { - const key = `${parsed.toolName}:${JSON.stringify(parsed.args)}`; + if (parsed.state === 'input-available') { + const key = `${parsed.toolName}:${JSON.stringify(parsed.input)}`; const previousCall = this.#previousToolCalls.get(key); if (previousCall) { this.onToolCallComplete({ @@ -188,7 +187,7 @@ export class ActionRunner { }); return; } - this.#previousToolCalls.set(key, { toolName: parsed.toolName, args: parsed.args }); + this.#previousToolCalls.set(key, { toolName: parsed.toolName, args: parsed.input }); } } @@ -324,12 +323,12 @@ export class ActionRunner { unreachable('Expected tool use action'); } - const parsed: ToolInvocation = action.parsedContent; + const parsed = action.parsedContent; - if (parsed.state === 'result') { + if (parsed.state === 'output-available') { return; } - if (parsed.state === 'partial-call') { + if (parsed.state === 'input-streaming') { throw new Error('Tool call is still in progress'); } @@ -337,7 +336,7 @@ export class ActionRunner { try { switch (parsed.toolName) { case 'view': { - const args = viewParameters.parse(parsed.args); + const args = viewParameters.parse(parsed.input); const container = await this.#webcontainer; const relPath = workDirRelative(args.path); const file = await readPath(container, relPath); @@ -352,7 +351,7 @@ export class ActionRunner { break; } case 'edit': { - const args = editToolParameters.parse(parsed.args); + const args = editToolParameters.parse(parsed.input); const container = await this.#webcontainer; const relPath = workDirRelative(args.path); const file = await readPath(container, relPath); @@ -381,7 +380,7 @@ export class ActionRunner { } case 'npmInstall': { try { - const args = npmInstallToolParameters.parse(parsed.args); + const args = npmInstallToolParameters.parse(parsed.input); const container = await this.#webcontainer; await waitForContainerBootState(ContainerBootState.READY); const npmInstallProc = await container.spawn('npm', ['install', ...args.packages.split(' ')]); @@ -411,7 +410,7 @@ export class ActionRunner { break; } case 'lookupDocs': { - const args = lookupDocsParameters.parse(parsed.args); + const args = lookupDocsParameters.parse(parsed.input); const docsToLookup = args.docs; const results: string[] = []; @@ -507,7 +506,7 @@ export class ActionRunner { break; } case 'addEnvironmentVariables': { - const args = addEnvironmentVariablesParameters.parse(parsed.args); + const args = addEnvironmentVariablesParameters.parse(parsed.input); const envVarNames = args.envVarNames; if (envVarNames.length === 0) { result = 'Error: No environment variables to add. Please provide a list of environment variable names.'; diff --git a/app/lib/stores/startup/history.ts b/app/lib/stores/startup/history.ts index d67922adc..1203b04af 100644 --- a/app/lib/stores/startup/history.ts +++ b/app/lib/stores/startup/history.ts @@ -1,4 +1,4 @@ -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; import { useConvex, useQuery, type ConvexReactClient } from 'convex/react'; import { useConvexSessionIdOrNullOrLoading, waitForConvexSessionId } from '~/lib/stores/sessionId'; import { getFileUpdateCounter, waitForFileUpdateCounterChanged } from '~/lib/stores/fileUpdateCounter'; @@ -25,7 +25,7 @@ const logger = createScopedLogger('history'); const BACKUP_DEBOUNCE_MS = 1000; -export function useBackupSyncState(chatId: string, loadedSubchatIndex?: number, initialMessages?: Message[]) { +export function useBackupSyncState(chatId: string, loadedSubchatIndex?: number, initialMessages?: UIMessage[]) { const convex = useConvex(); const subchatIndex = useStore(subchatIndexStore); const sessionId = useConvexSessionIdOrNullOrLoading(); diff --git a/app/lib/stores/startup/messages.test.ts b/app/lib/stores/startup/messages.test.ts index 86835af1b..2c8725ac6 100644 --- a/app/lib/stores/startup/messages.test.ts +++ b/app/lib/stores/startup/messages.test.ts @@ -1,5 +1,5 @@ import { expect, test, describe, vi } from 'vitest'; -import type { Message } from '@ai-sdk/react'; +import type { UIMessage } from '@ai-sdk/react'; import { serializeMessageForConvex } from './messages'; vi.mock('lz4-wasm', () => ({ @@ -9,17 +9,15 @@ vi.mock('lz4-wasm', () => ({ describe('serializeMessageForConvex', () => { test('preserves non-text parts', () => { - const message: Message = { + const message: UIMessage = { id: 'test', role: 'user', - content: '', parts: [ { type: 'text', text: 'some content', }, ], - createdAt: new Date(), }; const serialized = serializeMessageForConvex(message); diff --git a/app/lib/stores/startup/messages.ts b/app/lib/stores/startup/messages.ts index c4d7e8653..3da3074c2 100644 --- a/app/lib/stores/startup/messages.ts +++ b/app/lib/stores/startup/messages.ts @@ -1,4 +1,4 @@ -import type { Message } from '@ai-sdk/react'; +import type { UIMessage } from '@ai-sdk/react'; import { atom } from 'nanostores'; import { getConvexSiteUrl } from '~/lib/convexSiteUrl'; import { getKnownUrlId, setKnownInitialId, setKnownUrlId } from '~/lib/stores/chatId'; @@ -13,7 +13,7 @@ type CompleteMessageInfo = { messageIndex: number; partIndex: number; hasNextPart: boolean; - allMessages: Message[]; + allMessages: UIMessage[]; }; export const lastCompleteMessageInfoStore = atom(null); @@ -44,7 +44,14 @@ export async function prepareMessageHistory(args: { url.searchParams.set('lastMessageRank', messageIndex.toString()); url.searchParams.set('partIndex', partIndex.toString()); url.searchParams.set('lastSubchatIndex', args.subchatIndex.toString()); - const firstMessage = allMessages.length > 0 ? stripMetadata(allMessages[0].content) : undefined; + const firstMessageText = + allMessages.length > 0 + ? allMessages[0].parts + .filter((p): p is { type: 'text'; text: string } => p.type === 'text') + .map((p) => p.text) + .join('') + : undefined; + const firstMessage = firstMessageText ? stripMetadata(firstMessageText) : undefined; if (messageIndex === persistedMessageInfo.messageIndex && partIndex === persistedMessageInfo.partIndex) { // No changes return { url, update: null }; @@ -98,7 +105,7 @@ export async function waitForNewMessages(messageIndex: number, partIndex: number }); } -function extractUrlHintAndDescription(messages: Message[]) { +function extractUrlHintAndDescription(messages: UIMessage[]) { /* * This replicates the original bolt.diy behavior of client-side assigning a URL + description * based on the first artifact registered. @@ -122,19 +129,20 @@ function extractUrlHintAndDescription(messages: Message[]) { return null; } -export function serializeMessageForConvex(message: Message) { - // `content` + `toolInvocations` are legacy fields that are duplicated in `parts`. - // We should avoid storing them since we already store `parts`. - const { content: _content, toolInvocations: _toolInvocations, ...rest } = message; - +export function serializeMessageForConvex(message: UIMessage) { return { - ...rest, + id: message.id, + role: message.role, parts: message.parts, - createdAt: message.createdAt?.getTime() ?? undefined, + metadata: message.metadata, }; } -async function compressMessages(messages: Message[], lastMessageRank: number, partIndex: number): Promise { +async function compressMessages( + messages: UIMessage[], + lastMessageRank: number, + partIndex: number, +): Promise { const slicedMessages = messages.slice(0, lastMessageRank + 1); slicedMessages[lastMessageRank].parts = slicedMessages[lastMessageRank].parts?.slice(0, partIndex + 1); const serialized = slicedMessages.map(serializeMessageForConvex); diff --git a/app/lib/stores/startup/reloadMessages.ts b/app/lib/stores/startup/reloadMessages.ts index 77c48c6c8..afa958302 100644 --- a/app/lib/stores/startup/reloadMessages.ts +++ b/app/lib/stores/startup/reloadMessages.ts @@ -1,4 +1,4 @@ -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; import { useEffect, useState } from 'react'; import { makePartId } from 'chef-agent/partId'; import { toast } from 'sonner'; @@ -11,7 +11,7 @@ export type ReloadedMessages = { partCache: PartCache; }; -export function useReloadMessages(initialMessages: Message[] | undefined): ReloadedMessages | undefined { +export function useReloadMessages(initialMessages: UIMessage[] | undefined): ReloadedMessages | undefined { const [reloadState, setReloadState] = useState(undefined); const subchatIndex = useStore(subchatIndexStore); useEffect(() => { diff --git a/app/lib/stores/startup/useInitialMessages.ts b/app/lib/stores/startup/useInitialMessages.ts index 1c0e5a249..8daefe9ed 100644 --- a/app/lib/stores/startup/useInitialMessages.ts +++ b/app/lib/stores/startup/useInitialMessages.ts @@ -3,7 +3,7 @@ import { useConvex } from 'convex/react'; import { waitForConvexSessionId } from '~/lib/stores/sessionId'; import { api } from '@convex/_generated/api'; import type { SerializedMessage } from '@convex/messages'; -import type { Message } from '@ai-sdk/react'; +import type { UIMessage } from '@ai-sdk/react'; import { setKnownUrlId } from '~/lib/stores/chatId'; import { setKnownInitialId } from '~/lib/stores/chatId'; import { description } from '~/lib/stores/description'; @@ -16,7 +16,7 @@ import { useStore } from '@nanostores/react'; export interface InitialMessages { loadedChatId: string; serialized: SerializedMessage[]; - deserialized: Message[]; + deserialized: UIMessage[]; loadedSubchatIndex: number; } @@ -80,24 +80,61 @@ export function useInitialMessages(chatId: string | undefined): const content = await initialMessagesResponse.arrayBuffer(); const initialMessages = await decompressMessages(new Uint8Array(content)); - // Transform messages to convert partial-call states to failed states + // Transform messages to handle legacy tool invocation states and convert + // interrupted calls to error states const transformedMessages = initialMessages.map((message) => { if (!message.parts) { return message; } - const updatedParts = message.parts.map((part) => { + const updatedParts = message.parts.map((part: any) => { + // Handle legacy tool-invocation format (v4) and convert to v6 format if (part.type === 'tool-invocation') { - // We could potentially handle these better by making the action runner - // handle the interrupted calls, but treat these as failed states for now. - if (part.toolInvocation.state === 'partial-call' || part.toolInvocation.state === 'call') { + const inv = part.toolInvocation; + const toolType = `tool-${inv.toolName}` as const; + if ( + inv.state === 'partial-call' || + inv.state === 'call' || + inv.state === 'input-streaming' || + inv.state === 'input-available' + ) { + // Interrupted tool calls become output-available with error + return { + type: toolType, + toolCallId: inv.toolCallId, + toolName: inv.toolName, + state: 'output-available' as const, + input: inv.args ?? inv.input ?? {}, + output: 'Error: Tool call was interrupted', + }; + } + if (inv.state === 'result' || inv.state === 'output-available') { + return { + type: toolType, + toolCallId: inv.toolCallId, + toolName: inv.toolName, + state: 'output-available' as const, + input: inv.args ?? inv.input ?? {}, + output: inv.result ?? inv.output ?? '', + }; + } + // Fallback + return { + type: toolType, + toolCallId: inv.toolCallId, + toolName: inv.toolName, + state: 'output-available' as const, + input: inv.args ?? inv.input ?? {}, + output: 'Error: Unknown tool state', + }; + } + // Handle v6 tool parts that may have been interrupted + if ('toolCallId' in part && part.state) { + if (part.state === 'input-streaming' || part.state === 'input-available') { return { ...part, - toolInvocation: { - ...part.toolInvocation, - state: 'result' as const, - result: 'Error: Tool call was interrupted', - }, + state: 'output-available' as const, + output: 'Error: Tool call was interrupted', }; } } @@ -129,19 +166,15 @@ export function useInitialMessages(chatId: string | undefined): return initialMessages; } -function deserializeMessageForConvex(message: SerializedMessage): Message { - const content = - message.content ?? - message.parts - ?.filter((part): part is { type: 'text'; text: string } => part.type === 'text') - .map((part) => part.text) - .join('') ?? - ''; - +function deserializeMessageForConvex(message: SerializedMessage): UIMessage { return { - ...message, - createdAt: message.createdAt ? new Date(message.createdAt) : undefined, - content, + id: message.id, + role: message.role as UIMessage['role'], + parts: (message.parts ?? []) as UIMessage['parts'], + metadata: + ((message as any).metadata ?? (message as any).annotations) + ? { annotations: (message as any).annotations } + : undefined, }; } diff --git a/app/lib/stores/startup/useStoreMessageHistory.test.ts b/app/lib/stores/startup/useStoreMessageHistory.test.ts index f3d6bd12e..7bc6c1580 100644 --- a/app/lib/stores/startup/useStoreMessageHistory.test.ts +++ b/app/lib/stores/startup/useStoreMessageHistory.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test, vi } from 'vitest'; -import type { Message } from '@ai-sdk/react'; +import type { UIMessage } from '@ai-sdk/react'; import { getLastCompletePart } from './useStoreMessageHistory'; vi.mock('lz4-wasm', () => ({ @@ -7,34 +7,34 @@ vi.mock('lz4-wasm', () => ({ decompress: (data: Uint8Array) => data, })); -function createMessage(overrides: Partial = {}): Message { +function createMessage(overrides: Partial = {}): UIMessage { return { id: `test-${Math.random()}`, role: 'user', - content: 'test', parts: [ { type: 'text', text: 'test', }, ], - createdAt: new Date(), ...overrides, }; } function createToolInvocationPart( - invocation: { state: 'result'; result: string } | { state: 'partial-call' } | { state: 'call' }, + invocation: + | { state: 'output-available'; output: string } + | { state: 'input-streaming' } + | { state: 'input-available' }, ) { + const toolCallId = `test-${Math.random()}`; return { - type: 'tool-invocation' as const, - toolInvocation: { - ...invocation, - toolCallId: `test-${Math.random()}`, - args: null, - toolName: 'test', - }, - }; + type: `tool-test` as const, + toolCallId, + toolName: 'test', + input: null, + ...invocation, + } as any; } describe('getLastCompletePart', () => { @@ -85,7 +85,10 @@ describe('getLastCompletePart', () => { }); const assistantMessage = createMessage({ role: 'assistant', - parts: [createToolInvocationPart({ state: 'result', result: 'something' }), { type: 'text', text: 'test' }], + parts: [ + createToolInvocationPart({ state: 'output-available', output: 'something' }), + { type: 'text', text: 'test' }, + ], }); const lastCompletePart = getLastCompletePart([userMessage, assistantMessage], 'streaming'); @@ -99,7 +102,7 @@ describe('getLastCompletePart', () => { test('returns previous part if the last part is incomplete tool invocation part', () => { const messageA = createMessage({ role: 'assistant', - parts: [{ type: 'text', text: 'test' }, createToolInvocationPart({ state: 'partial-call' })], + parts: [{ type: 'text', text: 'test' }, createToolInvocationPart({ state: 'input-streaming' })], }); const lastCompletePart = getLastCompletePart([messageA], 'streaming'); @@ -113,7 +116,10 @@ describe('getLastCompletePart', () => { test('returns previous part if there are empty messages', () => { const message1 = createMessage({ role: 'assistant', - parts: [{ type: 'text', text: 'test' }, createToolInvocationPart({ state: 'result', result: 'something' })], + parts: [ + { type: 'text', text: 'test' }, + createToolInvocationPart({ state: 'output-available', output: 'something' }), + ], }); const message2 = createMessage({ role: 'assistant', diff --git a/app/lib/stores/startup/useStoreMessageHistory.ts b/app/lib/stores/startup/useStoreMessageHistory.ts index 602be7b8f..c4d2c1e21 100644 --- a/app/lib/stores/startup/useStoreMessageHistory.ts +++ b/app/lib/stores/startup/useStoreMessageHistory.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import type { Message } from '@ai-sdk/react'; +import type { UIMessage } from '@ai-sdk/react'; import { lastCompleteMessageInfoStore } from '~/lib/stores/startup/messages'; /** @@ -13,7 +13,7 @@ import { lastCompleteMessageInfoStore } from '~/lib/stores/startup/messages'; * state to prevent the user from closing the tab too early. */ export function useStoreMessageHistory() { - return useCallback(async (messages: Message[], streamStatus: 'streaming' | 'submitted' | 'ready' | 'error') => { + return useCallback(async (messages: UIMessage[], streamStatus: 'streaming' | 'submitted' | 'ready' | 'error') => { if (messages.length === 0) { return; } @@ -40,7 +40,7 @@ export function useStoreMessageHistory() { } function getPreceedingPart( - messages: Message[], + messages: UIMessage[], args: { messageIndex: number; partIndex: number }, ): { messageIndex: number; partIndex: number } | null { if (messages.length === 0) { @@ -78,7 +78,7 @@ function getPreceedingPart( // Exported for testing export function getLastCompletePart( - messages: Message[], + messages: UIMessage[], streamStatus: 'streaming' | 'submitted' | 'ready' | 'error', ): { messageIndex: number; partIndex: number; hasNextPart: boolean } | null { if (messages.length === 0) { @@ -95,7 +95,9 @@ export function getLastCompletePart( } const isLastPartComplete = - lastPart.type === 'tool-invocation' ? lastPart.toolInvocation.state === 'result' : streamStatus !== 'streaming'; + 'toolCallId' in lastPart + ? (lastPart as any).state === 'output-available' || (lastPart as any).state === 'output-error' + : streamStatus !== 'streaming'; if (isLastPartComplete) { return { messageIndex: lastPartIndices.messageIndex, diff --git a/chef-agent/ChatContextManager.ts b/chef-agent/ChatContextManager.ts index ab46e7bfc..794d63117 100644 --- a/chef-agent/ChatContextManager.ts +++ b/chef-agent/ChatContextManager.ts @@ -1,4 +1,4 @@ -import { type ToolInvocation, type UIMessage } from 'ai'; +import type { UIMessage } from 'ai'; import { type AbsolutePath, getAbsolutePath } from './utils/workDir.js'; import { type Dirent, type EditorDocument, type FileMap } from './types.js'; import { PREWARM_PATHS, WORK_DIR } from './constants.js'; @@ -131,7 +131,7 @@ export class ChatContextManager { return cached; } - let size = message.content.length; + let size = 0; for (const part of message.parts) { size += this.partSize(part); } @@ -157,7 +157,6 @@ export class ChatContextManager { let partCounter = 0; for (const message of messages) { - const createdAt = message.createdAt?.getTime(); const parsed = this.parsedAssistantMessage(message); if (!parsed) { continue; @@ -167,7 +166,7 @@ export class ChatContextManager { if (!entry || entry.type !== 'file') { continue; } - const lastUsedTime = (createdAt ?? partCounter) + partIndex; + const lastUsedTime = partCounter + partIndex; lastUsed.set(absPath, lastUsedTime); } partCounter += message.parts.length; @@ -219,7 +218,6 @@ export class ChatContextManager { if (fileActions.length === 0) { return { id, - content: '', role: 'user', parts: [], }; @@ -235,15 +233,21 @@ export class ChatContextManager { continue; } else if (i === this.messageIndex) { const filteredParts = message.parts.filter((p, j) => { - if (p.type !== 'tool-invocation' || p.toolInvocation.state !== 'result') { + if (!('toolCallId' in p) || (p as any).state !== 'output-available') { return true; } return j > this.partIndex; }); + // Strip artifacts from any text parts in the collapsed message + const strippedParts = filteredParts.map((p) => { + if (p.type === 'text') { + return { ...p, text: StreamingMessageParser.stripArtifacts(p.text) }; + } + return p; + }); const remainingMessage = { ...message, - content: StreamingMessageParser.stripArtifacts(message.content), - parts: filteredParts, + parts: strippedParts, }; fullMessages.push(remainingMessage); } else { @@ -293,7 +297,7 @@ export class ChatContextManager { const message = messages[messageIndex]; for (let partIndex = message.parts.length - 1; partIndex >= 0; partIndex--) { const part = message.parts[partIndex]; - if (part.type === 'tool-invocation' && part.toolInvocation.state !== 'result') { + if ('toolCallId' in part && (part as any).state !== 'output-available') { continue; } const size = this.partSize(part); @@ -316,9 +320,6 @@ export class ChatContextManager { } const filesTouched = new Map(); - for (const file of extractFileArtifacts(makePartId(message.id, 0), message.content)) { - filesTouched.set(getAbsolutePath(file), 0); - } for (let j = 0; j < message.parts.length; j++) { const part = message.parts[j]; if (part.type === 'text') { @@ -327,24 +328,19 @@ export class ChatContextManager { filesTouched.set(getAbsolutePath(file), j); } } - if ( - part.type == 'tool-invocation' && - part.toolInvocation.toolName == 'view' && - part.toolInvocation.state !== 'partial-call' - ) { - const args = loggingSafeParse(viewParameters, part.toolInvocation.args); - if (args.success) { - filesTouched.set(getAbsolutePath(args.data.path), j); + if ('toolCallId' in part) { + const toolPart = part as any; + if (toolPart.toolName == 'view' && toolPart.state !== 'input-streaming') { + const args = loggingSafeParse(viewParameters, toolPart.input); + if (args.success) { + filesTouched.set(getAbsolutePath(args.data.path), j); + } } - } - if ( - part.type == 'tool-invocation' && - part.toolInvocation.toolName == 'edit' && - part.toolInvocation.state !== 'partial-call' - ) { - const args = loggingSafeParse(editToolParameters, part.toolInvocation.args); - if (args.success) { - filesTouched.set(getAbsolutePath(args.data.path), j); + if (toolPart.toolName == 'edit' && toolPart.state !== 'input-streaming') { + const args = loggingSafeParse(editToolParameters, toolPart.input); + if (args.success) { + filesTouched.set(getAbsolutePath(args.data.path), j); + } } } } @@ -366,26 +362,29 @@ export class ChatContextManager { result = part.text.length; break; case 'file': - result += part.data.length; - result += part.mimeType.length; + result += part.url.length; + result += part.mediaType.length; break; case 'reasoning': - result += part.reasoning.length; - break; - case 'tool-invocation': - result += JSON.stringify(part.toolInvocation.args).length; - if (part.toolInvocation.state === 'result') { - result += JSON.stringify(part.toolInvocation.result).length; - } - break; - case 'source': - result += (part.source.title ?? '').length; - result += part.source.url.length; + result += part.text.length; break; case 'step-start': break; default: - throw new Error(`Unknown part type: ${JSON.stringify(part)}`); + // Handle tool parts (type starts with 'tool-' or has toolCallId) + if ('toolCallId' in part) { + const toolPart = part as any; + result += JSON.stringify(toolPart.input ?? {}).length; + if (toolPart.state === 'output-available') { + result += JSON.stringify(toolPart.output ?? '').length; + } + } else if (part.type === 'source-url') { + result += ((part as any).title ?? '').length; + result += ((part as any).url ?? '').length; + } else { + // Unknown part type, estimate with JSON serialization + result += JSON.stringify(part).length; + } } this.partSizeCache.set(part, result); return result; @@ -402,7 +401,6 @@ ${c} })); return { id, - content: '', role: 'user', parts, }; @@ -416,17 +414,18 @@ function estimateSize(entry: Dirent): number { } } -function abbreviateToolInvocation(toolInvocation: ToolInvocation): string { - if (toolInvocation.state !== 'result') { - throw new Error(`Invalid tool invocation state: ${toolInvocation.state}`); +function abbreviateToolInvocation(toolPart: { toolName: string; state: string; input?: any; output?: any }): string { + if (toolPart.state !== 'output-available') { + throw new Error(`Invalid tool invocation state: ${toolPart.state}`); } - const wasError = toolInvocation.result.startsWith('Error:'); + const output = typeof toolPart.output === 'string' ? toolPart.output : ''; + const wasError = output.startsWith('Error:'); let toolCall: string; - switch (toolInvocation.toolName) { + switch (toolPart.toolName) { case 'view': { - const args = loggingSafeParse(viewParameters, toolInvocation.args); + const args = loggingSafeParse(viewParameters, toolPart.input); let verb = 'viewed'; - if (toolInvocation.result.startsWith('Directory:')) { + if (output.startsWith('Directory:')) { verb = 'listed'; } toolCall = `${verb} ${args?.data?.path || 'unknown file'}`; @@ -437,7 +436,7 @@ function abbreviateToolInvocation(toolInvocation: ToolInvocation): string { break; } case 'npmInstall': { - const args = loggingSafeParse(npmInstallToolParameters, toolInvocation.args); + const args = loggingSafeParse(npmInstallToolParameters, toolPart.input); if (args.success) { toolCall = `installed the dependencies ${args.data.packages}`; } else { @@ -446,7 +445,7 @@ function abbreviateToolInvocation(toolInvocation: ToolInvocation): string { break; } case 'edit': { - const args = loggingSafeParse(editToolParameters, toolInvocation.args); + const args = loggingSafeParse(editToolParameters, toolPart.input); if (args.success) { toolCall = `edited the file ${args.data.path}`; } else { @@ -459,7 +458,7 @@ function abbreviateToolInvocation(toolInvocation: ToolInvocation): string { break; } default: - throw new Error(`Unknown tool name: ${toolInvocation.toolName}`); + throw new Error(`Unknown tool name: ${toolPart.toolName}`); } return `The assistant ${toolCall} ${wasError ? 'and got an error' : 'successfully'}.`; } diff --git a/chef-agent/cleanupAssistantMessages.ts b/chef-agent/cleanupAssistantMessages.ts index f5f7379a8..a68b6a8ee 100644 --- a/chef-agent/cleanupAssistantMessages.ts +++ b/chef-agent/cleanupAssistantMessages.ts @@ -1,18 +1,17 @@ -import { convertToCoreMessages } from 'ai'; -import type { Message } from 'ai'; +import { convertToModelMessages } from 'ai'; +import type { UIMessage } from 'ai'; import { EXCLUDED_FILE_PATHS } from './constants.js'; -export function cleanupAssistantMessages(messages: Message[]) { +export async function cleanupAssistantMessages(messages: UIMessage[]) { let processedMessages = messages.map((message) => { if (message.role == 'assistant') { - let content = cleanMessage(message.content); let parts = message.parts?.map((part) => { if (part.type === 'text') { - part.text = cleanMessage(part.text); + return { ...part, text: cleanMessage(part.text) }; } return part; }); - return { ...message, content, parts }; + return { ...message, parts: parts ?? [] }; } else { return message; } @@ -20,11 +19,10 @@ export function cleanupAssistantMessages(messages: Message[]) { // Filter out empty messages and messages with empty parts processedMessages = processedMessages.filter( (message) => - message.content.trim() !== '' || - (message.parts && - message.parts.filter((part) => part.type === 'text' || part.type === 'tool-invocation').length > 0), + message.parts.some((part) => part.type === 'text' && part.text.trim() !== '') || + message.parts.some((part) => 'toolCallId' in part), ); - return convertToCoreMessages(processedMessages).filter((message) => message.content.length > 0); + return (await convertToModelMessages(processedMessages)).filter((message) => message.content.length > 0); } function cleanMessage(message: string) { diff --git a/chef-agent/package.json b/chef-agent/package.json index 8f0df1455..cca613bfc 100644 --- a/chef-agent/package.json +++ b/chef-agent/package.json @@ -8,11 +8,11 @@ "typecheck": "tsc" }, "dependencies": { - "ai": "^4.3.2", + "ai": "^6.0.0", "jose": "^5.9.6", "path-browserify": "^1.0.1", "typescript": "^5.4.2", - "zod": "^3.24.1" + "zod": "^3.25.76" }, "devDependencies": { "@types/node": "^20.17.30", diff --git a/chef-agent/tools/addEnvironmentVariables.ts b/chef-agent/tools/addEnvironmentVariables.ts index c746f377e..b82bbc653 100644 --- a/chef-agent/tools/addEnvironmentVariables.ts +++ b/chef-agent/tools/addEnvironmentVariables.ts @@ -8,6 +8,6 @@ export const addEnvironmentVariablesParameters = z.object({ export function addEnvironmentVariablesTool(): Tool { return { description: `Add environment variables to the Convex deployment. The user still needs to manually add the values in the Convex dashboard page this tool opens.`, - parameters: addEnvironmentVariablesParameters, + inputSchema: addEnvironmentVariablesParameters, }; } diff --git a/chef-agent/tools/deploy.ts b/chef-agent/tools/deploy.ts index dca1e4d00..88ebcb177 100644 --- a/chef-agent/tools/deploy.ts +++ b/chef-agent/tools/deploy.ts @@ -18,7 +18,7 @@ top can only contain actions. They can NEVER contains queries or mutations. export const deployTool: Tool = { description: deployToolDescription, - parameters: z.object({}), + inputSchema: z.object({}), }; export const deployToolParameters = z.object({}); diff --git a/chef-agent/tools/edit.ts b/chef-agent/tools/edit.ts index d6beb0e82..6fbf92ab7 100644 --- a/chef-agent/tools/edit.ts +++ b/chef-agent/tools/edit.ts @@ -20,5 +20,5 @@ export const editToolParameters = z.object({ export const editTool: Tool = { description: editToolDescription, - parameters: editToolParameters, + inputSchema: editToolParameters, }; diff --git a/chef-agent/tools/getConvexDeploymentName.ts b/chef-agent/tools/getConvexDeploymentName.ts index 96a8b0ffa..76973f569 100644 --- a/chef-agent/tools/getConvexDeploymentName.ts +++ b/chef-agent/tools/getConvexDeploymentName.ts @@ -13,5 +13,5 @@ export const getConvexDeploymentNameParameters = z.object({}); export const getConvexDeploymentNameTool: Tool = { description: getConvexDeploymentNameDescription, - parameters: getConvexDeploymentNameParameters, + inputSchema: getConvexDeploymentNameParameters, }; diff --git a/chef-agent/tools/lookupDocs.ts b/chef-agent/tools/lookupDocs.ts index be4ca6425..6ef97b8fc 100644 --- a/chef-agent/tools/lookupDocs.ts +++ b/chef-agent/tools/lookupDocs.ts @@ -15,7 +15,7 @@ export const lookupDocsParameters = z.object({ export function lookupDocsTool(): Tool { return { description: `Lookup documentation for a list of features. Valid features to lookup are: \`proseMirror\` and \`presence\``, - parameters: lookupDocsParameters, + inputSchema: lookupDocsParameters, }; } diff --git a/chef-agent/tools/npmInstall.ts b/chef-agent/tools/npmInstall.ts index bea5a289e..42cf165cd 100644 --- a/chef-agent/tools/npmInstall.ts +++ b/chef-agent/tools/npmInstall.ts @@ -23,5 +23,5 @@ export const npmInstallToolParameters = z.object({ export const npmInstallTool: Tool = { description: npmInstallToolDescription, - parameters: npmInstallToolParameters, + inputSchema: npmInstallToolParameters, }; diff --git a/chef-agent/tools/view.ts b/chef-agent/tools/view.ts index 110382ce4..09b36249d 100644 --- a/chef-agent/tools/view.ts +++ b/chef-agent/tools/view.ts @@ -21,5 +21,5 @@ export const viewParameters = z.object({ export const viewTool: Tool = { description: viewDescription, - parameters: viewParameters, + inputSchema: viewParameters, }; diff --git a/chef-agent/types.ts b/chef-agent/types.ts index 488377227..e67683474 100644 --- a/chef-agent/types.ts +++ b/chef-agent/types.ts @@ -1,4 +1,4 @@ -import type { ToolInvocation } from 'ai'; +import type { UIToolInvocation } from 'ai'; import type { AbsolutePath, RelativePath } from './utils/workDir.js'; import type { Tool } from 'ai'; import type { npmInstallToolParameters } from './tools/npmInstall.js'; @@ -45,7 +45,7 @@ export interface FileAction { export interface ToolUseAction { type: 'toolUse'; toolName: string; - parsedContent: ToolInvocation; + parsedContent: UIToolInvocation & { toolName: string; type?: string }; // Serialized content to use for de-duping content: string; } diff --git a/chef-agent/utils/chefDebug.ts b/chef-agent/utils/chefDebug.ts index e02d35906..9f6e12fce 100644 --- a/chef-agent/utils/chefDebug.ts +++ b/chef-agent/utils/chefDebug.ts @@ -1,9 +1,9 @@ import type { WebContainer } from '@webcontainer/api'; -import type { Message } from 'ai'; +import type { UIMessage } from 'ai'; type ChefDebug = { - messages?: Message[]; - parsedMessages?: Message[]; + messages?: UIMessage[]; + parsedMessages?: UIMessage[]; webcontainer?: WebContainer; setLogLevel?: (level: any) => void; chatInitialId?: string; diff --git a/convex/README.md b/convex/README.md index dbaf22194..3c938735b 100644 --- a/convex/README.md +++ b/convex/README.md @@ -6,7 +6,7 @@ See https://docs.convex.dev/functions for more. A query function that takes two arguments looks like: ```ts -// functions.js +// convex/myFunctions.ts import { query } from "./_generated/server"; import { v } from "convex/values"; @@ -36,7 +36,7 @@ export const myQueryFunction = query({ Using this query function in a React component looks like: ```ts -const data = useQuery(api.functions.myQueryFunction, { +const data = useQuery(api.myFunctions.myQueryFunction, { first: 10, second: "hello", }); @@ -45,7 +45,7 @@ const data = useQuery(api.functions.myQueryFunction, { A mutation function looks like: ```ts -// functions.js +// convex/myFunctions.ts import { mutation } from "./_generated/server"; import { v } from "convex/values"; @@ -65,7 +65,7 @@ export const myMutationFunction = mutation({ const id = await ctx.db.insert("messages", message); // Optionally, return a value from your mutation. - return await ctx.db.get(id); + return await ctx.db.get("messages", id); }, }); ``` @@ -73,7 +73,7 @@ export const myMutationFunction = mutation({ Using this mutation function in a React component looks like: ```ts -const mutation = useMutation(api.functions.myMutationFunction); +const mutation = useMutation(api.myFunctions.myMutationFunction); function handleButtonPress() { // fire and forget, the most common way to use mutations mutation({ first: "Hello!", second: "me" }); diff --git a/convex/_generated/api.d.ts b/convex/_generated/api.d.ts index 91f4cf2a1..f4df58243 100644 --- a/convex/_generated/api.d.ts +++ b/convex/_generated/api.d.ts @@ -38,14 +38,6 @@ import type { FunctionReference, } from "convex/server"; -/** - * A utility for referencing Convex functions in your app's API. - * - * Usage: - * ```js - * const myFunctionReference = api.myModule.myFunction; - * ``` - */ declare const fullApi: ApiFromModules<{ admin: typeof admin; apiKeys: typeof apiKeys; @@ -71,14 +63,30 @@ declare const fullApi: ApiFromModules<{ subchats: typeof subchats; summarize: typeof summarize; }>; -declare const fullApiWithMounts: typeof fullApi; +/** + * A utility for referencing Convex functions in your app's public API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ export declare const api: FilterApi< - typeof fullApiWithMounts, + typeof fullApi, FunctionReference >; + +/** + * A utility for referencing Convex functions in your app's internal API. + * + * Usage: + * ```js + * const myFunctionReference = internal.myModule.myFunction; + * ``` + */ export declare const internal: FilterApi< - typeof fullApiWithMounts, + typeof fullApi, FunctionReference >; diff --git a/convex/_generated/dataModel.d.ts b/convex/_generated/dataModel.d.ts index 8541f319e..f97fd1942 100644 --- a/convex/_generated/dataModel.d.ts +++ b/convex/_generated/dataModel.d.ts @@ -38,7 +38,7 @@ export type Doc = DocumentByName< * Convex documents are uniquely identified by their `Id`, which is accessible * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids). * - * Documents can be loaded using `db.get(id)` in query and mutation functions. + * Documents can be loaded using `db.get(tableName, id)` in query and mutation functions. * * IDs are just strings at runtime, but this type can be used to distinguish them from other * strings when type checking. diff --git a/convex/_generated/server.d.ts b/convex/_generated/server.d.ts index b5c682886..bec05e681 100644 --- a/convex/_generated/server.d.ts +++ b/convex/_generated/server.d.ts @@ -10,7 +10,6 @@ import { ActionBuilder, - AnyComponents, HttpActionBuilder, MutationBuilder, QueryBuilder, @@ -19,15 +18,9 @@ import { GenericQueryCtx, GenericDatabaseReader, GenericDatabaseWriter, - FunctionReference, } from "convex/server"; import type { DataModel } from "./dataModel.js"; -type GenericCtx = - | GenericActionCtx - | GenericMutationCtx - | GenericQueryCtx; - /** * Define a query in this Convex app's public API. * @@ -92,11 +85,12 @@ export declare const internalAction: ActionBuilder; /** * Define an HTTP action. * - * This function will be used to respond to HTTP requests received by a Convex - * deployment if the requests matches the path and method where this action - * is routed. Be sure to route your action in `convex/http.js`. + * The wrapped function will be used to respond to HTTP requests received + * by a Convex deployment if the requests matches the path and method where + * this action is routed. Be sure to route your httpAction in `convex/http.js`. * - * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @param func - The function. It receives an {@link ActionCtx} as its first argument + * and a Fetch API `Request` object as its second. * @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up. */ export declare const httpAction: HttpActionBuilder; diff --git a/convex/_generated/server.js b/convex/_generated/server.js index 4a21df4f7..bf3d25ad3 100644 --- a/convex/_generated/server.js +++ b/convex/_generated/server.js @@ -16,7 +16,6 @@ import { internalActionGeneric, internalMutationGeneric, internalQueryGeneric, - componentsGeneric, } from "convex/server"; /** @@ -81,10 +80,14 @@ export const action = actionGeneric; export const internalAction = internalActionGeneric; /** - * Define a Convex HTTP action. + * Define an HTTP action. * - * @param func - The function. It receives an {@link ActionCtx} as its first argument, and a `Request` object - * as its second. - * @returns The wrapped endpoint function. Route a URL path to this function in `convex/http.js`. + * The wrapped function will be used to respond to HTTP requests received + * by a Convex deployment if the requests matches the path and method where + * this action is routed. Be sure to route your httpAction in `convex/http.js`. + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument + * and a Fetch API `Request` object as its second. + * @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up. */ export const httpAction = httpActionGeneric; diff --git a/convex/messages.ts b/convex/messages.ts index ce7584c1e..ddee84c79 100644 --- a/convex/messages.ts +++ b/convex/messages.ts @@ -7,7 +7,7 @@ import { type MutationCtx, type QueryCtx, } from "./_generated/server"; -import type { Message as AIMessage } from "ai"; + import { ConvexError, v } from "convex/values"; import type { Infer } from "convex/values"; import { isValidSession } from "./sessions"; @@ -16,9 +16,16 @@ import { ensureEnvVar, startProvisionConvexProjectHelper } from "./convexProject import { internal } from "./_generated/api"; import { assertIsConvexAdmin } from "./admin"; -export type SerializedMessage = Omit & { - createdAt: number | undefined; +export type SerializedMessage = { + id: string; + role: string; + parts?: any[]; + createdAt?: number; content?: string; + metadata?: Record; + // Legacy v4 fields that may exist in stored messages + annotations?: unknown[]; + toolInvocations?: unknown[]; }; export const CHAT_NOT_FOUND_ERROR = new ConvexError({ code: "NotFound", message: "Chat not found" }); diff --git a/convex/schema.ts b/convex/schema.ts index a7e593fb5..19651646d 100644 --- a/convex/schema.ts +++ b/convex/schema.ts @@ -1,7 +1,7 @@ import { defineSchema, defineTable } from "convex/server"; import { v } from "convex/values"; import type { Infer, Validator } from "convex/values"; -import type { CoreMessage } from "ai"; +import type { ModelMessage } from "ai"; export const apiKeyValidator = v.object({ preference: v.union(v.literal("always"), v.literal("quotaExhausted")), @@ -212,7 +212,7 @@ export default defineSchema({ // Such a loose type doesn't feel so bad since this is debugging data, but if we try // to display older versions of this we need to make any fields added to CoreMessage in // later versions of the Vercel AI SDK optional on the read path. - responseCoreMessages: v.array(v.any() as Validator), + responseCoreMessages: v.array(v.any() as Validator), promptCoreMessagesStorageId: v.id("_storage"), finishReason: v.string(), modelId: v.string(), diff --git a/convex/tsconfig.json b/convex/tsconfig.json index ad35ed5bb..7e0ea97e1 100644 --- a/convex/tsconfig.json +++ b/convex/tsconfig.json @@ -1,4 +1,8 @@ { + /* This TypeScript project config describes the environment that + * Convex functions run in and is used to typecheck them. + * You can modify it, but some settings are required to use Convex. + */ "compilerOptions": { /* These settings are not required by Convex and can be modified. */ "allowJs": true, diff --git a/package.json b/package.json index 0dfbe1e9e..b195c5505 100644 --- a/package.json +++ b/package.json @@ -32,13 +32,13 @@ "node": ">=18.18.0" }, "dependencies": { - "@ai-sdk/amazon-bedrock": "^2.2.9", - "@ai-sdk/anthropic": "^1.2.12", - "@ai-sdk/google": "^1.2.11", - "@ai-sdk/google-vertex": "^2.2.24", - "@ai-sdk/openai": "^1.3.6", - "@ai-sdk/react": "^1.2.5", - "@ai-sdk/xai": "^1.2.13", + "@ai-sdk/amazon-bedrock": "^3.0.0", + "@ai-sdk/anthropic": "^3.0.0", + "@ai-sdk/google": "^3.0.0", + "@ai-sdk/google-vertex": "^3.0.0", + "@ai-sdk/openai": "^3.0.0", + "@ai-sdk/react": "^3.0.0", + "@ai-sdk/xai": "^3.0.0", "@aws-sdk/credential-providers": "^3.782.0", "@aws-sdk/rds-signer": "^3.782.0", "@codemirror/autocomplete": "^6.18.3", @@ -57,7 +57,6 @@ "@codemirror/search": "^6.5.8", "@codemirror/state": "^6.4.1", "@codemirror/view": "^6.35.0", - "@convex-dev/ai-sdk-google": "1.2.17", "@convex-dev/design-system": "0.1.11", "@convex-dev/migrations": "^0.2.8", "@convex-dev/rate-limiter": "^0.2.9", @@ -91,7 +90,7 @@ "@xterm/addon-fit": "^0.10.0", "@xterm/addon-web-links": "^0.11.0", "@xterm/xterm": "^5.5.0", - "ai": "^4.3.2", + "ai": "^6.0.0", "allotment": "^1.20.3", "chart.js": "^4.4.9", "chef-agent": "workspace:*", @@ -184,24 +183,20 @@ "typescript": "~5.7.3", "unified": "^11.0.5", "util": "^0.12.5", - "vercel": "^41.5.0", + "vercel": "^50.25.4", "vite": "^5.4.17", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-optimize-css-modules": "^1.1.0", "vite-tsconfig-paths": "^4.3.2", "vitest": "^2.1.9", - "zod": "^3.24.1" + "zod": "^3.25.76" }, "resolutions": { "@typescript-eslint/utils": "^8.0.0-alpha.30" }, "pnpm": { "overrides": { - "@remix-run/cloudflare": "npm:@remix-run/node@2.15.3", - "@ai-sdk/google": "npm:@convex-dev/ai-sdk-google@1.2.17" - }, - "patchedDependencies": { - "@ai-sdk/openai@1.3.6": "patches/@ai-sdk__openai@1.3.6.patch" + "@remix-run/cloudflare": "npm:@remix-run/node@2.15.3" } }, "packageManager": "pnpm@9.5.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f4391738..d27495991 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,38 +7,32 @@ settings: overrides: '@typescript-eslint/utils': ^8.0.0-alpha.30 '@remix-run/cloudflare': npm:@remix-run/node@2.15.3 - '@ai-sdk/google': npm:@convex-dev/ai-sdk-google@1.2.17 - -patchedDependencies: - '@ai-sdk/openai@1.3.6': - hash: czsd76p7yavx4uccq5pd3xgsfu - path: patches/@ai-sdk__openai@1.3.6.patch importers: .: dependencies: '@ai-sdk/amazon-bedrock': - specifier: ^2.2.9 - version: 2.2.9(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.84(zod@3.25.76) '@ai-sdk/anthropic': - specifier: ^1.2.12 - version: 1.2.12(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.50(zod@3.25.76) '@ai-sdk/google': - specifier: npm:@convex-dev/ai-sdk-google@1.2.17 - version: '@convex-dev/ai-sdk-google@1.2.17(zod@3.24.1)' + specifier: ^3.0.0 + version: 3.0.34(zod@3.25.76) '@ai-sdk/google-vertex': - specifier: ^2.2.24 - version: 2.2.24(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.110(zod@3.25.76) '@ai-sdk/openai': - specifier: ^1.3.6 - version: 1.3.6(patch_hash=czsd76p7yavx4uccq5pd3xgsfu)(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.37(zod@3.25.76) '@ai-sdk/react': - specifier: ^1.2.5 - version: 1.2.6(react@18.3.1)(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.107(react@18.3.1)(zod@3.25.76) '@ai-sdk/xai': - specifier: ^1.2.13 - version: 1.2.13(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.60(zod@3.25.76) '@aws-sdk/credential-providers': specifier: ^3.782.0 version: 3.782.0 @@ -93,9 +87,6 @@ importers: '@codemirror/view': specifier: ^6.35.0 version: 6.36.2 - '@convex-dev/ai-sdk-google': - specifier: 1.2.17 - version: 1.2.17(zod@3.24.1) '@convex-dev/design-system': specifier: 0.1.11 version: 0.1.11(@popperjs/core@2.11.8)(@radix-ui/react-icons@1.3.2(react@18.3.1))(@tailwindcss/forms@0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.7.3))))(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(react@18.3.1)(tailwind-scrollbar@3.0.3(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.7.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.7.3))) @@ -196,8 +187,8 @@ importers: specifier: ^5.5.0 version: 5.5.0 ai: - specifier: ^4.3.2 - version: 4.3.2(react@18.3.1)(zod@3.24.1) + specifier: ^6.0.0 + version: 6.0.105(zod@3.25.76) allotment: specifier: ^1.20.3 version: 1.20.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -221,7 +212,7 @@ importers: version: 1.31.2(@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) convex-helpers: specifier: ^0.1.108 - version: 0.1.108(convex@1.31.2(@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(zod@3.24.1) + version: 0.1.108(@standard-schema/spec@1.1.0)(convex@1.31.2(@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(zod@3.25.76) date-fns: specifier: ^3.6.0 version: 3.6.0 @@ -281,7 +272,7 @@ importers: version: link:@vercel/functions/oidc openai: specifier: ^4.93.0 - version: 4.93.0(ws@8.18.0)(zod@3.24.1) + version: 4.93.0(ws@8.18.0)(zod@3.25.76) posthog-js: specifier: ^1.235.4 version: 1.235.4 @@ -326,7 +317,7 @@ importers: version: 0.2.0(@remix-run/react@2.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@remix-run/server-runtime@2.15.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) remix-utils: specifier: ^7.7.0 - version: 7.7.0(@remix-run/node@2.15.3(typescript@5.7.3))(@remix-run/react@2.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@remix-run/router@1.22.0)(react@18.3.1)(zod@3.24.1) + version: 7.7.0(@remix-run/node@2.15.3(typescript@5.7.3))(@remix-run/react@2.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@remix-run/router@1.22.0)(react@18.3.1)(zod@3.25.76) shiki: specifier: ^1.24.0 version: 1.29.2 @@ -470,8 +461,8 @@ importers: specifier: ^0.12.5 version: 0.12.5 vercel: - specifier: ^41.5.0 - version: 41.5.0(rollup@3.29.5) + specifier: ^50.25.4 + version: 50.25.4(rollup@3.29.5)(typescript@5.7.3) vite: specifier: ^5.4.17 version: 5.4.17(@types/node@22.14.0)(sass-embedded@1.83.4)(sugarss@4.0.1(postcss@8.5.3)) @@ -488,14 +479,14 @@ importers: specifier: ^2.1.9 version: 2.1.9(@edge-runtime/vm@5.0.0)(@types/node@22.14.0)(jsdom@26.0.0)(sass-embedded@1.83.4)(sugarss@4.0.1(postcss@8.5.3)) zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.25.76 + version: 3.25.76 chef-agent: dependencies: ai: - specifier: ^4.3.2 - version: 4.3.2(react@18.3.1)(zod@3.24.1) + specifier: ^6.0.0 + version: 6.0.105(zod@3.25.76) jose: specifier: ^5.9.6 version: 5.9.6 @@ -506,8 +497,8 @@ importers: specifier: ^5.4.2 version: 5.8.3 zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.25.76 + version: 3.25.76 devDependencies: '@types/node': specifier: ^20.17.30 @@ -550,23 +541,23 @@ importers: test-kitchen: dependencies: '@ai-sdk/anthropic': - specifier: ^1.2.4 - version: 1.2.4(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.50(zod@3.25.76) '@ai-sdk/google': - specifier: npm:@convex-dev/ai-sdk-google@1.2.17 - version: '@convex-dev/ai-sdk-google@1.2.17(zod@3.24.1)' + specifier: ^3.0.0 + version: 3.0.34(zod@3.25.76) '@ai-sdk/openai': - specifier: ^1.3.6 - version: 1.3.6(patch_hash=czsd76p7yavx4uccq5pd3xgsfu)(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.37(zod@3.25.76) '@ai-sdk/xai': - specifier: ^1.2.13 - version: 1.2.13(zod@3.24.1) + specifier: ^3.0.0 + version: 3.0.60(zod@3.25.76) async-mutex: specifier: ^0.5.0 version: 0.5.0 braintrust: specifier: ^0.0.199 - version: 0.0.199(@aws-sdk/credential-provider-web-identity@3.782.0)(openai@4.93.0(ws@8.18.0)(zod@3.24.1))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.24.1) + version: 0.0.199(@aws-sdk/credential-provider-web-identity@3.782.0)(openai@4.93.0(ws@8.18.0)(zod@3.25.76))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.25.76) chef-agent: specifier: workspace:* version: link:../chef-agent @@ -586,87 +577,97 @@ importers: packages: - '@ai-sdk/amazon-bedrock@2.2.9': - resolution: {integrity: sha512-c4IWCheWLJq7HhRhr0crlB6wqy8KuVj7hsO7pxl7KaYgCiRFkJA3q8Fv9rUJK4XjtOeFxDs6j2z3hVG62jMxDQ==} + '@ai-sdk/amazon-bedrock@3.0.84': + resolution: {integrity: sha512-D8ChXSfm2gu2R7dJ19c473jK5MDVrkp1f+D5TJEWv1ipv7Fb94x82M1qFAKgRWnS5/jGBO1IbhM+tBF+51qbCQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@1.2.12': - resolution: {integrity: sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ==} + '@ai-sdk/anthropic@2.0.67': + resolution: {integrity: sha512-hGtsfU1Dh1r9oBfctZy9+Wb8nSPiD8hBYIVYLGbFSPRrfliyBysJFaenHOGYR0Rd2R8O9ow2dxi05Qk5awerBw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@1.2.4': - resolution: {integrity: sha512-dAN6MXvLffeFVAr2gz3RGvOTgX1KL/Yn5q1l4/Dt0TUeDjQgCt4AbbYxZZB2qIAYzQvoyAFPhlw0sB3nNizG/g==} + '@ai-sdk/anthropic@3.0.50': + resolution: {integrity: sha512-BkCUgGTp/iZJuuFBF1wv7GGnrEJg7X7hqbaa+/t4HTBt9dZn3e6NFn5NhPUvo2p5SreUeHEl0As0r2uaVn3K9Q==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google-vertex@2.2.24': - resolution: {integrity: sha512-zi1ZN6jQEBRke/WMbZv0YkeqQ3nOs8ihxjVh/8z1tUn+S1xgRaYXf4+r6+Izh2YqVHIMNwjhUYryQRBGq20cgQ==} + '@ai-sdk/gateway@3.0.59': + resolution: {integrity: sha512-MbtheWHgEFV/8HL1Z6E3hOAsmP73zZlNFg0F0nJAD0Adnjp4J/plqNK00Y896d+dWTw+r0OXzyov9/2wCFjH0Q==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@0.2.11': - resolution: {integrity: sha512-56U0uNCcFTygA4h6R/uREv8r5sKA3/pGkpIAnMOpRzs5wiARlTYakWW3LZgxg6D4Gpeswo4gwNJczB7nM0K1Qg==} + '@ai-sdk/google-vertex@3.0.110': + resolution: {integrity: sha512-dmeRz+M1Fgn8wlAhplShHVNPF9SU4ir8AYcNGMzGmXvMDw0jviLVCfPiYuof+nm32h+j01qVFWFHEVIayf9e1w==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@1.3.6': - resolution: {integrity: sha512-Lyp6W6dg+ERMJru3DI8/pWAjXLB0GbMMlXh4jxA3mVny8CJHlCAjlEJRuAdLg1/CFz4J1UDN2/4qBnIWtLFIqw==} + '@ai-sdk/google@2.0.56': + resolution: {integrity: sha512-YPCpnrVF6gGrBemZTaKRTDccnByt8i9HVWwiC2gTzgxj0IkTpy9anw/gh3eFe8LaaNNdYzY1Op5Z8uadIqOYFA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@1.0.22': - resolution: {integrity: sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==} + '@ai-sdk/google@3.0.34': + resolution: {integrity: sha512-1tXUr1W5YACXPgtHYWIU3raqMsayp6cMI8NUT4EEzzZSpvHzkkiNWHEr+bGxEGurSUukfo+pE1RKpLwBFOZtJg==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@2.2.3': - resolution: {integrity: sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==} + '@ai-sdk/openai-compatible@2.0.31': + resolution: {integrity: sha512-e78xiImcTe2aCMQoFbVJluQmUV4XgahOmmehAuRPlcwzRv2KtkvuLCXPC9Xcy2u83e8SimVva9k9G8SvZcnaBA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@2.2.4': - resolution: {integrity: sha512-13sEGBxB6kgaMPGOgCLYibF6r8iv8mgjhuToFrOTU09bBxbFQd8ZoARarCfJN6VomCUbUvMKwjTBLb1vQnN+WA==} + '@ai-sdk/openai@3.0.37': + resolution: {integrity: sha512-bcYjT3/58i/C0DN3AnrjiGsAb0kYivZLWWUtgTjsBurHSht/LTEy+w3dw5XQe3FmZwX7Z/mUQCiA3wB/5Kf7ow==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@1.0.22': + resolution: {integrity: sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true - '@ai-sdk/provider-utils@2.2.7': - resolution: {integrity: sha512-kM0xS3GWg3aMChh9zfeM+80vEZfXzR3JEUBdycZLtbRZ2TRT8xOj3WodGHPb06sUK5yD7pAXC/P7ctsi2fvUGQ==} + '@ai-sdk/provider-utils@3.0.21': + resolution: {integrity: sha512-veuMwTLxsgh31Jjn0SnBABnM1f7ebHhRWcV2ZuY3hP3iJDCZ8VXBaYqcHXoOQDqUXTCas08sKQcHyWK+zl882Q==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@2.2.8': - resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + '@ai-sdk/provider-utils@4.0.16': + resolution: {integrity: sha512-kBvDqNkt5EwlzF9FujmNhhtl8FYg3e8FO8P5uneKliqfRThWemzBj+wfYr7ZCymAQhTRnwSSz1/SOqhOAwmx9g==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4.1.8 '@ai-sdk/provider@0.0.26': resolution: {integrity: sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==} engines: {node: '>=18'} - '@ai-sdk/provider@1.1.0': - 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.1': + resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} + engines: {node: '>=18'} + + '@ai-sdk/provider@3.0.8': + resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} + engines: {node: '>=18'} + '@ai-sdk/react@0.0.70': resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} engines: {node: '>=18'} @@ -679,15 +680,11 @@ packages: zod: optional: true - '@ai-sdk/react@1.2.6': - resolution: {integrity: sha512-5BFChNbcYtcY9MBStcDev7WZRHf0NpTrk8yfSoedWctB3jfWkFd1HECBvdc8w3mUQshF2MumLHtAhRO7IFtGGQ==} + '@ai-sdk/react@3.0.107': + resolution: {integrity: sha512-IBuSTOFm3xNVH7rNv/IGPy4mUgM0y7PWw58hTPwL2Iat6gjIi9DquS3efHPbLSbgkvCmLuEgM2OjERzCT/3V2w==} engines: {node: '>=18'} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true + react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 '@ai-sdk/solid@0.0.54': resolution: {integrity: sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ==} @@ -716,12 +713,6 @@ packages: zod: optional: true - '@ai-sdk/ui-utils@1.2.5': - resolution: {integrity: sha512-XDgqnJcaCkDez7qolvk+PDbs/ceJvgkNkxkOlc9uDWqxfDJxtvCZ+14MP/1qr4IBwGIgKVHzMDYDXvqVhSWLzg==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - '@ai-sdk/vue@0.0.59': resolution: {integrity: sha512-+ofYlnqdc8c4F6tM0IKF0+7NagZRAiqBJpGDJ+6EYhDW8FHLUP/JFBgu32SjxSxC6IKFZxEnl68ZoP/Z38EMlw==} engines: {node: '>=18'} @@ -731,11 +722,11 @@ packages: vue: optional: true - '@ai-sdk/xai@1.2.13': - resolution: {integrity: sha512-vJnzpnRVIVuGgDHrHgfIc3ImjVp6YN+salVX99r+HWd2itiGQy+vAmQKen0Ml8BK/avnLyQneeYRfdlgDBkhgQ==} + '@ai-sdk/xai@3.0.60': + resolution: {integrity: sha512-nDOUyzeepmyyoL5+9LxmwXy3BoX9mZy7cv3BjHPN4Xc+SVFVqL7uj/9m1oLRCNmpwfA/9QBq9kuD+J31EfdhMw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} @@ -1061,6 +1052,9 @@ packages: '@bufbuild/protobuf@2.2.5': resolution: {integrity: sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==} + '@bytecodealliance/preview2-shim@0.17.6': + resolution: {integrity: sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==} + '@cloudflare/kv-asset-handler@0.3.4': resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} @@ -1146,12 +1140,6 @@ packages: '@codemirror/view@6.36.2': resolution: {integrity: sha512-DZ6ONbs8qdJK0fdN7AB82CgI6tYXf4HWk1wSVa0+9bhVznCuuvhQtX8bFBoy3dv8rZSQqUd8GvhVAcielcidrA==} - '@convex-dev/ai-sdk-google@1.2.17': - resolution: {integrity: sha512-ldWn1Xiy0BGYcpZrUAfG1MJ/tE2LYI4RYX8ilosqQgqza+6B4MLf88CyPL+wB9Mi/y9V9Z357ikL6xevTkYlYA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - '@convex-dev/design-system@0.1.11': resolution: {integrity: sha512-+8AUrHv57ZnVXGwQ0ppeduqI+rK3wipa1nkr+cp6jxXvshmSCzKzMEtG7j6nALtY0Ey0eKNdqzwuy7uTzJQNBQ==} peerDependencies: @@ -1261,12 +1249,21 @@ packages: '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -1310,6 +1307,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -1352,6 +1355,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -1394,6 +1403,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -1436,6 +1451,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -1478,6 +1499,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -1520,6 +1547,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -1562,6 +1595,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -1604,6 +1643,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -1646,6 +1691,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -1688,6 +1739,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -1730,6 +1787,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -1772,6 +1835,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -1814,6 +1883,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -1856,6 +1931,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -1898,6 +1979,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -1940,6 +2027,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -1982,6 +2075,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.2': resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} @@ -2000,6 +2099,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -2042,6 +2147,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} @@ -2066,6 +2177,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -2108,6 +2225,18 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -2150,6 +2279,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -2192,6 +2327,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -2234,6 +2375,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -2276,6 +2423,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2370,6 +2523,9 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} + '@iarna/toml@2.2.5': + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@iconify-json/svg-spinners@1.2.2': resolution: {integrity: sha512-DIErwfBWWzLfmAG2oQnbUOSqZhDxlXvr8941itMCrxQoMB0Hiv8Ww6Bln/zIgxwjDvSem2dKJtap+yKKwsB/2A==} @@ -2481,6 +2637,14 @@ packages: cpu: [x64] os: [win32] + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2592,6 +2756,9 @@ packages: '@napi-rs/wasm-runtime@1.0.3': resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@next/env@14.2.28': resolution: {integrity: sha512-PAmWhJfJQlP+kxZwCjrVd9QnR5x0R3u0mTXTiZDgSd4h5LdXmjxCCWbN9kq6hkZBOax8Rm3xDW5HagWyJuT37g==} @@ -2901,9 +3068,131 @@ packages: resolution: {integrity: sha512-zm/LDVOq9FEmHiuM8zO4DWirv0VP2Tv2VsgaiHby9nvpq+FVrcqNYgv+TysLKOITQXWZj/roluTxFvpkHP0Iuw==} engines: {node: '>=6.9.0'} + '@oxc-project/types@0.110.0': + resolution: {integrity: sha512-6Ct21OIlrEnFEJk5LT4e63pk3btsI6/TusD/GStLi7wYlGJNOl1GI9qvXAnRAxQU9zqA2Oz+UwhfTOU2rPZVow==} + '@oxc-project/types@0.81.0': resolution: {integrity: sha512-CnOqkybZK8z6Gx7Wb1qF7AEnSzbol1WwcIzxYOr8e91LytGOjo0wCpgoYWZo8sdbpqX+X+TJayIzo4Pv0R/KjA==} + '@oxc-transform/binding-android-arm-eabi@0.111.0': + resolution: {integrity: sha512-NdFLicvorfHYu0g2ftjVJaH7+Dz27AQUNJOq8t/ofRUoWmczOodgUCHx8C1M1htCN4ZmhS/FzfSy6yd/UngJGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-transform/binding-android-arm64@0.111.0': + resolution: {integrity: sha512-J2v9ajarD2FYlhHtjbgZUFsS2Kvi27pPxDWLGCy7i8tO60xBoozX9/ktSgbiE/QsxKaUhfv4zVKppKWUo71PmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-transform/binding-darwin-arm64@0.111.0': + resolution: {integrity: sha512-2UYmExxpXzmiHTldhNlosWqG9Nc4US51K0GB9RLcGlTE23WO33vVo1NVAKwxPE+KYuhffwDnRYTovTMUjzwvZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-transform/binding-darwin-x64@0.111.0': + resolution: {integrity: sha512-c4YRwfLV8Pj/ToiTCbndZaHxM2BD4W3bltr/fjXZcGypEK+U2RZFDL7tIZYT/tyneAC9hCORZKDaKhLLNuzPtA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-transform/binding-freebsd-x64@0.111.0': + resolution: {integrity: sha512-prvf32IcEuLnLZbNVomFosBu0CaZpyj3YsZ6epbOgJy8iJjfLsXBb+PrkO/NBKzjuJoJa2+u7jFKRE0KT7gSOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-transform/binding-linux-arm-gnueabihf@0.111.0': + resolution: {integrity: sha512-+se3579Wp7VOk8TnTZCpT+obTAyzOw2b/UuoM0+51LtbzCSfjKxd4A+o7zRl7GyPrPZvx57KdbMOC9rWB1xNrw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm-musleabihf@0.111.0': + resolution: {integrity: sha512-8faC99pStqaSDPK/vBgaagAHUeL0LcIzfeSjSiDTtvPGc3AwZIeqC1tx3CP15a6tWXjdgS/IUw4IjfD5HweBlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm64-gnu@0.111.0': + resolution: {integrity: sha512-HtfQv8j796gzI5WR/RaP6IMwFpiL0vYeDrUA1hYhlPzTHKYan/B+NlhJkKOI1v24yAl/yEnFmb0pxIxLNqBqBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-arm64-musl@0.111.0': + resolution: {integrity: sha512-ARyfcMCIxVLDgLf6FQ8Oo1/TFySpnquV+vuSb4SFQZfYDqgMklzwv0NYXxWD0aB6enElyMDs6pQJBzusEKCkOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-ppc64-gnu@0.111.0': + resolution: {integrity: sha512-PKpVRrSvBNK3tv9vwxn7Fay+QWZmprPGlEqJcseBJllQc5mFMD4Q/w44chu5iR9ZLsDeSHzmNWrgMLo4J0sP2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-transform/binding-linux-riscv64-gnu@0.111.0': + resolution: {integrity: sha512-9bUml6rMgk+8GF5rvNMweFspkzSiCjqpV6HduwiUyexqfGKrmjq9IZOxxvnzkE2RGdQzP507NNDoVNYIoGQYuA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-transform/binding-linux-riscv64-musl@0.111.0': + resolution: {integrity: sha512-tzGCohGxaeH6KRJjfYZd4mHCoGjCai6N+zZi1Oj+tSDMAAdyvs1dRzYb8PNUGnybCg3Te4M0jLPzWZaSmnKraQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-transform/binding-linux-s390x-gnu@0.111.0': + resolution: {integrity: sha512-sRG1KIfZ0ML9ToEygm5aM/5GJeBA05uHlgW3M0Rx/DNWMJhuahLmqWuB02aWSmijndLfEKXLLXIWhvWupRG8lg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-transform/binding-linux-x64-gnu@0.111.0': + resolution: {integrity: sha512-T0Kmvk+OdlUdABdXlDIf3MQReMzFfC75NEI9x8jxy5pKooACEFg0k0V8gyR3gq4DzbDCfucqFQDWNvSgIopAbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-linux-x64-musl@0.111.0': + resolution: {integrity: sha512-EgoutsP3YfqzN8a9vpc9+XLr0bmBl0dA3uOMiP77+exATCPxJBkJErGmQkqk6RtTp5XqX6q6mB45qWQyKk6+pA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-openharmony-arm64@0.111.0': + resolution: {integrity: sha512-d8J+ejc0j5WODbVwR/QxFaI65YMwvG0W53vcVCHwa6ja1QI5lpe7sislrefG2EFYgnY47voMRzlXab5d4gEcDw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-transform/binding-wasm32-wasi@0.111.0': + resolution: {integrity: sha512-HtyIZO8IwuZgXkyb56rysLz1OLbfLhEu8A3BeuyJXzUseAj96yuxgGt3cu3QYX9AXb9pfRfA3c/fvlhsDugyTQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-transform/binding-win32-arm64-msvc@0.111.0': + resolution: {integrity: sha512-YeP80Riptc0MkVVBnzbmoFuHVLUq278+MbwNo9sTLALmzTIJxJqN029xRZbG+Bun7aLsoZhmRnm3J5JZ1NcP5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-ia32-msvc@0.111.0': + resolution: {integrity: sha512-A6ztCXpoSHt6PbvGAFqB0MLOcGG7ZJrrPXY1iB0zfOB1atLgI8oNePGxPl03XSbwpiTsFJ1oo8rj9DXcBzgT9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.111.0': + resolution: {integrity: sha512-QddKW4kBH0Wof6Y65eYCNHM4iOGmCTWLLcNYY1FGswhzmTYOUVXajNROR+iCXAOFnOF0ldtsR79SyqgyHH1Bgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3574,66 +3863,141 @@ packages: '@remix-run/web-stream@1.1.0': resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + '@renovatebot/pep440@4.2.1': + resolution: {integrity: sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==} + engines: {node: ^20.9.0 || ^22.11.0 || ^24, pnpm: ^10.0.0} + '@rolldown/binding-android-arm64@1.0.0-beta.32': resolution: {integrity: sha512-Gs+313LfR4Ka3hvifdag9r44WrdKQaohya7ZXUXzARF7yx0atzFlVZjsvxtKAw1Vmtr4hB/RjUD1jf73SW7zDw==} cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-rc.1': + resolution: {integrity: sha512-He6ZoCfv5D7dlRbrhNBkuMVIHd0GDnjJwbICE1OWpG7G3S2gmJ+eXkcNLJjzjNDpeI2aRy56ou39AJM9AD8YFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.32': resolution: {integrity: sha512-W8oMqzGcI7wKPXUtS3WJNXzbghHfNiuM1UBAGpVb+XlUCgYRQJd2PRGP7D3WGql3rR3QEhUvSyAuCBAftPQw6Q==} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-rc.1': + resolution: {integrity: sha512-YzJdn08kSOXnj85ghHauH2iHpOJ6eSmstdRTLyaziDcUxe9SyQJgGyx/5jDIhDvtOcNvMm2Ju7m19+S/Rm1jFg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.32': resolution: {integrity: sha512-pM4c4sKUk37noJrnnDkJknLhCsfZu7aWyfe67bD0GQHfzAPjV16wPeD9CmQg4/0vv+5IfHYaa4VE536xbA+W0Q==} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.1': + resolution: {integrity: sha512-cIvAbqM+ZVV6lBSKSBtlNqH5iCiW933t1q8j0H66B3sjbe8AxIRetVqfGgcHcJtMzBIkIALlL9fcDrElWLJQcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.32': resolution: {integrity: sha512-M8SUgFlYb5kJJWcFC8gUMRiX4WLFxPKMed3SJ2YrxontgIrEcpizPU8nLNVsRYEStoSfKHKExpQw3OP6fm+5bw==} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-rc.1': + resolution: {integrity: sha512-rVt+B1B/qmKwCl1XD02wKfgh3vQPXRXdB/TicV2w6g7RVAM1+cZcpigwhLarqiVCxDObFZ7UgXCxPC7tpDoRog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': resolution: {integrity: sha512-FuQpbNC/hE//bvv29PFnk0AtpJzdPdYl5CMhlWPovd9g3Kc3lw9TrEPIbL7gRPUdhKAiq6rVaaGvOnXxsa0eww==} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1': + resolution: {integrity: sha512-69YKwJJBOFprQa1GktPgbuBOfnn+EGxu8sBJ1TjPER+zhSpYeaU4N07uqmyBiksOLGXsMegymuecLobfz03h8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': resolution: {integrity: sha512-hRZygRlaGCjcNTNY9GV7dDI18sG1dK3cc7ujHq72LoDad23zFDUGMQjiSxHWK+/r92iMV+j2MiHbvzayxqynsg==} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1': + resolution: {integrity: sha512-9JDhHUf3WcLfnViFWm+TyorqUtnSAHaCzlSNmMOq824prVuuzDOK91K0Hl8DUcEb9M5x2O+d2/jmBMsetRIn3g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': resolution: {integrity: sha512-HzgT6h+CXLs+GKAU0Wvkt3rvcv0CmDBsDjlPhh4GHysOKbG9NjpKYX2zvjx671E9pGbTvcPpwy7gGsy7xpu+8g==} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1': + resolution: {integrity: sha512-UvApLEGholmxw/HIwmUnLq3CwdydbhaHHllvWiCTNbyGom7wTwOtz5OAQbAKZYyiEOeIXZNPkM7nA4Dtng7CLw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': resolution: {integrity: sha512-Ab/wbf6gdzphDbsg51UaxsC93foQ7wxhtg0SVCXd25BrV4MAJ1HoDtKN/f4h0maFmJobkqYub2DlmoasUzkvBg==} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1': + resolution: {integrity: sha512-uVctNgZHiGnJx5Fij7wHLhgw4uyZBVi6mykeWKOqE7bVy9Hcxn0fM/IuqdMwk6hXlaf9fFShDTFz2+YejP+x0A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': resolution: {integrity: sha512-VoxqGEfh5A1Yx+zBp/FR5QwAbtzbuvky2SVc+ii4g1gLD4zww6mt/hPi5zG+b88zYPFBKHpxMtsz9cWqXU5V5Q==} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.1': + resolution: {integrity: sha512-T6Eg0xWwcxd/MzBcuv4Z37YVbUbJxy5cMNnbIt/Yr99wFwli30O4BPlY8hKeGyn6lWNtU0QioBS46lVzDN38bg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': resolution: {integrity: sha512-qZ1ViyOUDGbiZrSAJ/FIAhYUElDfVxxFW6DLT/w4KeoZN3HsF4jmRP95mXtl51/oGrqzU9l9Q2f7/P4O/o2ZZA==} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.1': + resolution: {integrity: sha512-PuGZVS2xNJyLADeh2F04b+Cz4NwvpglbtWACgrDOa5YDTEHKwmiTDjoD5eZ9/ptXtcpeFrMqD2H4Zn33KAh1Eg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': resolution: {integrity: sha512-hEkG3wD+f3wytV0lqwb/uCrXc4r4Ny/DWJFJPfQR3VeMWplhWGgSHNwZc2Q7k86Yi36f9NNzzWmrIuvHI9lCVw==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.1': + resolution: {integrity: sha512-2mOxY562ihHlz9lEXuaGEIDCZ1vI+zyFdtsoa3M62xsEunDXQE+DVPO4S4x5MPK9tKulG/aFcA/IH5eVN257Cw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': resolution: {integrity: sha512-k3MvDf8SiA7uP2ikP0unNouJ2YCrnwi7xcVW+RDgMp5YXVr3Xu6svmT3HGn0tkCKUuPmf+uy8I5uiHt5qWQbew==} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.1': + resolution: {integrity: sha512-oQVOP5cfAWZwRD0Q3nGn/cA9FW3KhMMuQ0NIndALAe6obqjLhqYVYDiGGRGrxvnjJsVbpLwR14gIUYnpIcHR1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': resolution: {integrity: sha512-wAi/FxGh7arDOUG45UmnXE1sZUa0hY4cXAO2qWAjFa3f7bTgz/BqwJ7XN5SUezvAJPNkME4fEpInfnBvM25a0w==} cpu: [ia32] @@ -3644,9 +4008,18 @@ packages: cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1': + resolution: {integrity: sha512-Ydsxxx++FNOuov3wCBPaYjZrEvKOOGq3k+BF4BPridhg2pENfitSRD2TEuQ8i33bp5VptuNdC9IzxRKU031z5A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.32': resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} + '@rolldown/pluginutils@1.0.0-rc.1': + resolution: {integrity: sha512-UTBjtTxVOhodhzFVp/ayITaTETRHPUPYZPXQe0WU0wOgxghMojXxYjOiPOauKIYNWJAWS2fd7gJgGQK8GU8vDA==} + '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} @@ -4125,6 +4498,9 @@ packages: engines: {node: '>=8.10'} hasBin: true + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stylistic/eslint-plugin-ts@2.13.0': resolution: {integrity: sha512-nooe1oTwz60T4wQhZ+5u0/GAu3ygkKF9vPPZeRn/meG71ntQ0EZXVOKEonluAYl/+CV2T+nN0dknHa4evAW13Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4162,6 +4538,9 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@ts-morph/common@0.11.1': resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} @@ -4180,6 +4559,9 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -4264,12 +4646,12 @@ packages: '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - '@types/node@16.18.11': - resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} - '@types/node@18.19.86': resolution: {integrity: sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ==} + '@types/node@20.11.0': + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} + '@types/node@20.17.30': resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} @@ -4418,14 +4800,42 @@ packages: '@vanilla-extract/private@1.0.6': resolution: {integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==} - '@vercel/build-utils@10.5.1': - resolution: {integrity: sha512-BtqwEmU1AoITpd0KxYrdQOwyKZL8RKba+bWxI8mr3gXPQZWRAE9ok1zF0AXfvMGCstYPHBPNolZGDSfWmY2jqg==} + '@vercel/backends@0.0.39': + resolution: {integrity: sha512-Jq6gEGs06Y4mjJQjen9qkPBdEXXBxGiH7bUvumqy0/+8XTx7IF84taGB6WoVL/r7xHpjQN3X+ewzYXhfu9eNxg==} + peerDependencies: + typescript: ^4.0.0 || ^5.0.0 + + '@vercel/blob@2.3.0': + resolution: {integrity: sha512-oYWiJbWRQ7gz9Mj0X/NHFJ3OcLMOBzq/2b3j6zeNrQmtFo6dHwU8FAwNpxVIYddVMd+g8eqEi7iRueYx8FtM0Q==} + engines: {node: '>=20.0.0'} + + '@vercel/build-utils@13.6.1': + resolution: {integrity: sha512-/qRDC8swTUDrdQLkKBnyY8TSk+DeI8RTOIhAba2BwCVCHaZoLF8+sdOCeHud1QJk/3a8R5rAmMQOvEI4P2FRZQ==} + + '@vercel/cervel@0.0.26': + resolution: {integrity: sha512-Y7bzTBJpGdqpBaB1oAe9U7IwILJEQHLLVkoJ6uKPeQPGVoSVec1RacS4/XBxqp5i6l+gqhZNF7kCU8TBWLmqFA==} + hasBin: true + peerDependencies: + typescript: ^4.0.0 || ^5.0.0 + + '@vercel/detect-agent@1.1.0': + resolution: {integrity: sha512-Zfq6FbIcYl9gaAmVu6ROsqUiCNwpEj3Ljz/tMX5fl12Z95OFOxzf7vlO03WE5JBU/ri1tBDFHnW41dihMINOPQ==} + engines: {node: '>=14'} + + '@vercel/elysia@0.1.42': + resolution: {integrity: sha512-X+ellLiJ3oC8t2L92JhC4PXO922bVOJpk7/XAAXK+llJflanenKQj1fv7K0g3bp2acbnxLdQmyK/oi8tkDAqIQ==} '@vercel/error-utils@2.0.3': resolution: {integrity: sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==} - '@vercel/fun@1.1.5': - resolution: {integrity: sha512-vRuR7qlsl8CgdeQIhfgLDtbMEuxqltx6JWFahB7Q5VOKMo/sFZV1rCxIHsHsJP4yYY2hoZqlT/EUkfG1tfPicg==} + '@vercel/express@0.1.51': + resolution: {integrity: sha512-2xpyDstOWLUkunZ8FOEawHkPgwCjWiT8HMoyLGGYPsWid9BtzHngQD2Rx7tB6O/v/dt1ofo0MszEemC3z1+MHg==} + + '@vercel/fastify@0.1.45': + resolution: {integrity: sha512-dhWvmDr3owa7ah/ihhqtccvG9sAIf2c3mnRkuPQozcwXXbrp2Tk+a5HAUxShja7qB0kryijuIxK6N1OQJP9twg==} + + '@vercel/fun@1.3.0': + resolution: {integrity: sha512-8erw9uPe0dFg45THkNxmjtvMX143SkZebmjgSVbcM3XCkXu3RIiBaJMcMNG8aaS+rnTuw8+d4De9HVT0M/r3wg==} engines: {node: '>= 18'} '@vercel/functions@1.6.0': @@ -4449,34 +4859,58 @@ packages: '@vercel/gatsby-plugin-vercel-analytics@1.0.11': resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} - '@vercel/gatsby-plugin-vercel-builder@2.0.80': - resolution: {integrity: sha512-MC1Gx6eRfmqaARL1DczldYzA3NdMlnC5vY/AXBSZuiHCoENS4++duEjhDjMtRSiidwSCrjuaz5Y9yxKTocRmzA==} + '@vercel/gatsby-plugin-vercel-builder@2.0.141': + resolution: {integrity: sha512-esJcrTXNobTe9bpiHeUVyDNtCDjG2TNQxtkw0yMq1RyLApJuRfpw47r9x6wGYKeS/Coy6FvCroVyeTo5pgWchw==} - '@vercel/go@3.2.1': - resolution: {integrity: sha512-ezjmuUvLigH9V4egEaX0SZ+phILx8lb+Zkp1iTqKI+yl/ibPAtVo5o+dLSRAXU9U01LBmaLu3O8Oxd/JpWYCOw==} + '@vercel/go@3.4.3': + resolution: {integrity: sha512-LDT4wpx7SW2UJHd3rOL4+2m2V4w7a5zjyuU0pu0yDBiuxp9bEh7QuAH5qZC7pINGLC3vGftiFVzynd5N454sVA==} - '@vercel/hydrogen@1.2.0': - resolution: {integrity: sha512-kdZp8cTVLoNmnu24wtoQPu9ZO+uB00zvDMTOXlQmNdq/V3k0mQa/Q5k2B8nliBQ3BMiBasoXxMKv59+F8rYvDw==} + '@vercel/h3@0.1.51': + resolution: {integrity: sha512-4OrHj0f47N1O9ShUFNFIZQYtbr/cUq8TcUU4Q8yfYlVKooqXme0Ql79G7LohDivcoHL7RmnQ14o2/C6/JWTzLg==} - '@vercel/next@4.7.6': - resolution: {integrity: sha512-rrujYVMzt1j43n6CSLyVgmt7wdi7Z/h8baup3XsrL74T99LWWj1UdMmZKUC79UXsDRZVom6t90Clhrrn+fB7AQ==} + '@vercel/hono@0.2.45': + resolution: {integrity: sha512-j5HNFtEU8NpV82bqPGG0v4VUxaJ/35RxW9ZQTrb2tKBQqGp0okBOnGr+zb3eJsUygs7VbnpEQ4Nb3qDtZ+DD+w==} - '@vercel/nft@0.27.10': - resolution: {integrity: sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==} - engines: {node: '>=16'} + '@vercel/hydrogen@1.3.5': + resolution: {integrity: sha512-7EE6yVKcCnjMb1io9y069GkLyGyIzRbW3Krm3Q7EEfJ3P46h9xe9v/O5UhBoPrwtqDUHxmDngZp9YyfgY8IITA==} + + '@vercel/koa@0.1.25': + resolution: {integrity: sha512-uDUe7FXsrhVGR6sX8Q5ynMTtQVagLJ4PnS1yuBLZSTg3k/3LrUrtNIenBQGEBOTTL9JmqUJ+AZdbwuBaUtU7Mg==} + + '@vercel/nestjs@0.2.46': + resolution: {integrity: sha512-0QTgF5P03BEir2apHgwh3cRkkOQTXgFz/2SPs+B1Aab64NnFvM7peFIuAjGnfFNvO1DwSLOyKEXTepihdifsYQ==} + + '@vercel/next@4.15.36': + resolution: {integrity: sha512-wlrxO/qj9IjO0SO5qM1kG5MVOks8LCEysGotbgtrL9EuGS2EEF6zK5/Ww8BLVqUzukcan7lv0Fxd2/oLh0R4Jg==} + + '@vercel/nft@1.1.1': + resolution: {integrity: sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==} + engines: {node: '>=20'} hasBin: true - '@vercel/node@5.1.14': - resolution: {integrity: sha512-kLXAR4ZtNSXJw5ffIzKPDAVHD4/Dwxw/287ZCnQlqtOQzY3IH1E5QM3nxn0LGfTkYxXpQFFOOcXL7fZW7MjC6A==} + '@vercel/nft@1.3.0': + resolution: {integrity: sha512-i4EYGkCsIjzu4vorDUbqglZc5eFtQI2syHb++9ZUDm6TU4edVywGpVnYDein35x9sevONOn9/UabfQXuNXtuzQ==} + engines: {node: '>=20'} + hasBin: true + + '@vercel/node@5.6.9': + resolution: {integrity: sha512-SiLToxNIGNSaELFhMorNAWIW1LkBCOEIw7+P3MxDxeaY9RAn5nqymT4uLg95L94JvI4dAFZbdfS7ntgmEfB64A==} + + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + + '@vercel/python-analysis@0.8.1': + resolution: {integrity: sha512-gW1pZDqJaTcjZYPvNhXXLOPgLu6vJW9PKweJoX2f8EKAoW+JIiYncl8AddcSlngNhQRG7SqUl2u3qosZM4kUBA==} - '@vercel/python@4.7.2': - resolution: {integrity: sha512-i2QBNMvNxUZQ2e5vLIL7mUkLg5Qkl9nqxUNXCYezdyvk2Ql6xYKjg7tMhpK/uiy094KfZSOECpDbDxkIN0jUSw==} + '@vercel/python@6.19.0': + resolution: {integrity: sha512-As/ukwv6wBMpM37V5HEfuTX8TTixVjtuec4cD5RBCj1CJPDC6Lmbt/SMSNAlKOiiewww5TpniKelOV23EMMBrQ==} - '@vercel/redwood@2.3.0': - resolution: {integrity: sha512-MybbGdMZY0/CrpgEGafJZ+8HlqubWnEpl/KX3WClCZPrT2qcyZyJEh9AVN7/KIpQUdB2MQLIRVMQFQ+kKcRdsA==} + '@vercel/redwood@2.4.9': + resolution: {integrity: sha512-U7bYIuWfMEFMIcKKbX7lTT8pFNjig9Q3vLeCYRYQUrKVP8xLoUBXSEfW3ijtWJBUV8GmbZCDI30A16uUfNhN+g==} - '@vercel/remix-builder@5.4.3': - resolution: {integrity: sha512-i+uPSIOBygkXLc6unOkfrJ0jNdqzRRZ8Esu+8kt/OPm4VCOHro3hyiMxFDtdvPWDQfulVOeDNkXnqlgLRDVdlw==} + '@vercel/remix-builder@5.6.0': + resolution: {integrity: sha512-neTpO4aGksYcPJjTbAEUhWmsOdFqgx02H47RUsXBKHdMTW4ZKrL9oAKT3pD+Bv9kUgj7uRzqAr8JeiPILPWybg==} '@vercel/remix@2.15.3': resolution: {integrity: sha512-t6dh8j93CnlE/sd/hnutsMKYoogGmYbm+pkykJ/i6mWmEs2dqJMOhaV5axS3bVD1N+5ltyTR1vgk+D0y9tp9Og==} @@ -4488,15 +4922,21 @@ packages: react: '*' react-dom: '*' - '@vercel/ruby@2.2.0': - resolution: {integrity: sha512-FJF9gKVNHAljGOgV6zS5ou2N7ZgjOqMMtcPA5lsJEUI5/AZzVDWCmtcowTP80wEtHuupkd7d7M399FA082kXYQ==} + '@vercel/ruby@2.3.2': + resolution: {integrity: sha512-okIgMmPEePyDR9TZYaKM4oftcxVHM5Dbdl7V/tIdh3lq8MGLi7HR5vvQglmZUwZOeovE6MVtezxl960EOzeIiQ==} - '@vercel/static-build@2.7.6': - resolution: {integrity: sha512-ezyZScIZgZIfzhNBBZroHIkcI6kP7WvBWKeLP1a8Vh2vipI+uuH6F52fDcjSH+uDpUxhfeml7HTMx2LVNTIXWw==} + '@vercel/rust@1.0.5': + resolution: {integrity: sha512-Y03g59nv1uT6Da+PvB/50WqJSHlaFZ9MSkG00R82dUcTySslMbQdOeaXymZtabrmU8zQYhWDb1/CwBki8sWnaQ==} + + '@vercel/static-build@2.8.43': + resolution: {integrity: sha512-9zVgVA7sIvikRdmQFsSM/40NQ6kxaucpUpOW/+BBrEe9BAx9JcHsO6wkhkJ4rdeVQ5eSzZMzPS9NR4ifqv5Low==} '@vercel/static-config@3.0.0': resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + '@vercel/static-config@3.1.2': + resolution: {integrity: sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==} + '@vitest/expect@2.1.9': resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} @@ -4698,15 +5138,11 @@ packages: zod: optional: true - ai@4.3.2: - resolution: {integrity: sha512-h643SfhKil0Pnxk2tVIazFDL1JevutUghvc3mOpWqJFMcudmgtwQYlvxCkwSfljrrq+qIfne8d6jCihMMhM7pw==} + ai@6.0.105: + resolution: {integrity: sha512-rp+exWtZS3J0DDvZIfetpKCIg7D3cCsvBPoFN3I67IDTs9aoBZDbpecoIkmNLT+U9RBkoEial3OGHRvme23HCw==} engines: {node: '>=18'} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - react: - optional: true + zod: ^3.25.76 || ^4.1.8 ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4815,6 +5251,10 @@ packages: resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} engines: {node: '>=20.18.0'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -4837,6 +5277,9 @@ packages: async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -4870,6 +5313,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4877,6 +5324,10 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} + basic-ftp@5.2.0: + resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} + engines: {node: '>=10.0.0'} + bignumber.js@9.3.0: resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} @@ -4919,6 +5370,10 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -5268,6 +5723,9 @@ packages: react: optional: true + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -5349,6 +5807,14 @@ packages: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -5445,6 +5911,10 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -5468,10 +5938,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -5669,137 +6135,12 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild-android-64@0.14.47: - resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - esbuild-android-arm64@0.14.47: - resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - esbuild-darwin-64@0.14.47: - resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - esbuild-darwin-arm64@0.14.47: - resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - esbuild-freebsd-64@0.14.47: - resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - esbuild-freebsd-arm64@0.14.47: - resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - esbuild-linux-32@0.14.47: - resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - esbuild-linux-64@0.14.47: - resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - esbuild-linux-arm64@0.14.47: - resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - esbuild-linux-arm@0.14.47: - resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - esbuild-linux-mips64le@0.14.47: - resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - esbuild-linux-ppc64le@0.14.47: - resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - esbuild-linux-riscv64@0.14.47: - resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - esbuild-linux-s390x@0.14.47: - resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - esbuild-netbsd-64@0.14.47: - resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - esbuild-openbsd-64@0.14.47: - resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - esbuild-plugins-node-modules-polyfill@1.6.8: resolution: {integrity: sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==} engines: {node: '>=14.0.0'} peerDependencies: esbuild: '>=0.14.0 <=0.24.x' - esbuild-sunos-64@0.14.47: - resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - esbuild-windows-32@0.14.47: - resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - esbuild-windows-64@0.14.47: - resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - esbuild-windows-arm64@0.14.47: - resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - esbuild@0.14.47: - resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -5835,6 +6176,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5850,6 +6196,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-compat-utils@0.6.4: resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==} engines: {node: '>=12'} @@ -5944,6 +6295,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -6026,9 +6382,17 @@ packages: resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} engines: {node: '>=14.18'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -6111,6 +6475,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -6175,6 +6543,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} @@ -6214,6 +6586,10 @@ packages: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} engines: {node: '>=14.14'} + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -6249,13 +6625,13 @@ packages: resolution: {integrity: sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==} engines: {node: '>= 0.6.0'} - gaxios@6.7.1: - resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} - engines: {node: '>=14'} + gaxios@7.1.3: + resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + engines: {node: '>=18'} - gcp-metadata@6.1.1: - resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} - engines: {node: '>=14'} + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} generic-names@4.0.0: resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} @@ -6295,6 +6671,10 @@ packages: get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -6309,6 +6689,10 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -6322,15 +6706,17 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -6351,12 +6737,12 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - google-auth-library@9.15.1: - resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} - engines: {node: '>=14'} + google-auth-library@10.6.1: + resolution: {integrity: sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==} + engines: {node: '>=18'} - google-logging-utils@0.0.2: - resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} engines: {node: '>=14'} gopd@1.2.0: @@ -6369,10 +6755,6 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gtoken@7.1.0: - resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} - engines: {node: '>=14.0.0'} - gunzip-maybe@1.4.2: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true @@ -6470,10 +6852,6 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-errors@1.4.0: - resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} - engines: {node: '>= 0.6'} - http-errors@1.7.3: resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} engines: {node: '>= 0.6'} @@ -6501,6 +6879,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -6553,13 +6935,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.1: - resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -6576,6 +6951,10 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -6678,6 +7057,9 @@ packages: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -6744,9 +7126,6 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -6810,6 +7189,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsdom@26.0.0: resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==} engines: {node: '>=18'} @@ -6980,6 +7363,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -6991,6 +7378,10 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + lz4-wasm-nodejs@0.9.2: resolution: {integrity: sha512-hSwgJPS98q/Oe/89Y1OxzeA/UdnASG8GvldRyKa7aZyoAFCC8VPRtViBSava7wWC66WocjUwBpWau2rEmyFPsw==} @@ -7347,6 +7738,14 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7389,6 +7788,10 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -7397,6 +7800,10 @@ packages: resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} engines: {node: '>= 18'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -7482,6 +7889,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -7514,6 +7925,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -7604,6 +8019,10 @@ packages: ohash@1.1.6: resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} + ohm-js@17.5.0: + resolution: {integrity: sha512-l4Sa7026+6jsvYbt0PXKmL+f+ML32fD++IznLgxDhx2t9Cx6NC7zwRqblCujPHGGmkQerHoeBzRutdxaw/S72g==} + engines: {node: '>=0.12.1'} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -7671,6 +8090,14 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxc-transform@0.111.0: + resolution: {integrity: sha512-oa5KKSDNLHZGaiqIGAbCWXeN9IJUAz9MElWcQX90epDxdKc9Hrt/BsLj3K4gDqfAYa5dwdH+ZCFJG9hR74fiGg==} + engines: {node: ^20.19.0 || >=22.12.0} + + p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -7683,6 +8110,14 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -7725,17 +8160,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-match@1.2.4: - resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -7743,18 +8171,26 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@1.9.0: - resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} - path-to-regexp@6.1.0: resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -7815,6 +8251,9 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pip-requirements-js@1.0.2: + resolution: {integrity: sha512-awqoNOSOl4Blu4E4Hzp7jL0g8WKEhCwO+s7C2ibtIW3CAJMwspgoTXd4vnHd21UmhdrsI44Pn8FFSuA8QKrzvg==} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -8054,6 +8493,10 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -8407,10 +8850,18 @@ packages: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} @@ -8434,6 +8885,11 @@ packages: resolution: {integrity: sha512-vxI2sPN07MMaoYKlFrVva5qZ1Y7DAZkgp7MQwTnyHt4FUMz9Sh+YeCzNFV9JYHI6ZNwoGWLCfCViE3XVsRC1cg==} hasBin: true + rolldown@1.0.0-rc.1: + resolution: {integrity: sha512-M3AeZjYE6UclblEf531Hch0WfVC/NOL43Cc+WdF3J50kk5/fvouHhDumSGTh0oRjbZ8C4faaVr5r6Nx1xMqDGg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-dts@5.3.1: resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==} engines: {node: '>=v14.21.3'} @@ -8754,10 +9210,26 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smol-toml@1.3.1: resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==} engines: {node: '>= 18'} + smol-toml@1.5.2: + resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} + engines: {node: '>= 18'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonner@2.0.3: resolution: {integrity: sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==} peerDependencies: @@ -8802,6 +9274,11 @@ packages: spdx-license-ids@3.0.21: resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + srvx@0.8.9: + resolution: {integrity: sha512-wYc3VLZHRzwYrWJhkEqkhLb31TI0SOkfYZDkUhXdp3NoCnNS0FqajiQszZZjfow/VYEuc6Q5sZh9nM6kPy2NBQ==} + engines: {node: '>=20.16.0'} + hasBin: true + ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -8979,11 +9456,6 @@ packages: resolution: {integrity: sha512-iOa9WmfNG95lSOSJdMhdjJ4Afok7IRAQYXpbnxhd5EINnXseG0GVa9j6WPght4eX78XfFez45Fi+uRglGKPV/Q==} engines: {node: '>=18'} - swr@2.3.2: - resolution: {integrity: sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - swr@2.3.4: resolution: {integrity: sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==} peerDependencies: @@ -9053,10 +9525,17 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me textextensions@6.11.0: resolution: {integrity: sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==} @@ -9190,20 +9669,6 @@ packages: ts-morph@12.0.0: resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -9265,6 +9730,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} @@ -9306,11 +9776,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} @@ -9321,8 +9786,13 @@ packages: engines: {node: '>=14.17'} hasBin: true - ua-parser-js@1.0.40: - resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.40: + resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} hasBin: true ufo@1.5.4: @@ -9362,6 +9832,10 @@ packages: resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} engines: {node: '>=18.17'} + undici@6.23.0: + resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + engines: {node: '>=18.17'} + undici@7.7.0: resolution: {integrity: sha512-tZ6+5NBq4KH35rr46XJ2JPFKxfcBlYNaqLF/wyWIO9RMHqqU/gx/CLB1Y2qMcgB8lWw/bKHa7qzspqCN7mUHvA==} engines: {node: '>=20.18.1'} @@ -9487,11 +9961,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@3.3.2: - resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -9530,8 +9999,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vercel@41.5.0: - resolution: {integrity: sha512-FWewxxoNcKhDOVlBQO+h8CA0xOvMDgTcbx3z59jZmqH3GUaaAxHCwiyy4NAmXiNeHViVeaOqMs4TBDoPi/KTPw==} + vercel@50.25.4: + resolution: {integrity: sha512-fe8JlltG4ZQUssOWXMRGjj0GVr44TqW0PrUGSalIT4oYM/KdEU2hMY8gcuEOy5q1FxMmIn2IO2AzEduimxbF+A==} engines: {node: '>= 18'} hasBin: true @@ -9741,6 +10210,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} @@ -9924,178 +10394,183 @@ packages: zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ai-sdk/amazon-bedrock@2.2.9(zod@3.24.1)': + '@ai-sdk/amazon-bedrock@3.0.84(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.1) + '@ai-sdk/anthropic': 2.0.67(zod@3.25.76) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.21(zod@3.25.76) '@smithy/eventstream-codec': 4.0.2 '@smithy/util-utf8': 4.0.0 aws4fetch: 1.0.20 - zod: 3.24.1 + zod: 3.25.76 - '@ai-sdk/anthropic@1.2.12(zod@3.24.1)': + '@ai-sdk/anthropic@2.0.67(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.1) - zod: 3.24.1 + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.21(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/anthropic@1.2.4(zod@3.24.1)': + '@ai-sdk/anthropic@3.0.50(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.3(zod@3.24.1) - zod: 3.24.1 + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/google-vertex@2.2.24(zod@3.24.1)': + '@ai-sdk/gateway@3.0.59(zod@3.25.76)': dependencies: - '@ai-sdk/anthropic': 1.2.12(zod@3.24.1) - '@ai-sdk/google': '@convex-dev/ai-sdk-google@1.2.17(zod@3.24.1)' - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.1) - google-auth-library: 9.15.1 - zod: 3.24.1 + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) + '@vercel/oidc': 3.1.0 + zod: 3.25.76 + + '@ai-sdk/google-vertex@3.0.110(zod@3.25.76)': + dependencies: + '@ai-sdk/anthropic': 2.0.67(zod@3.25.76) + '@ai-sdk/google': 2.0.56(zod@3.25.76) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.21(zod@3.25.76) + google-auth-library: 10.6.1 + zod: 3.25.76 transitivePeerDependencies: - - encoding - supports-color - '@ai-sdk/openai-compatible@0.2.11(zod@3.24.1)': + '@ai-sdk/google@2.0.56(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.7(zod@3.24.1) - zod: 3.24.1 + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.21(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/openai@1.3.6(patch_hash=czsd76p7yavx4uccq5pd3xgsfu)(zod@3.24.1)': + '@ai-sdk/google@3.0.34(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.3(zod@3.24.1) - zod: 3.24.1 + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/provider-utils@1.0.22(zod@3.24.1)': + '@ai-sdk/openai-compatible@2.0.31(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 0.0.26 - eventsource-parser: 1.1.2 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - optionalDependencies: - zod: 3.24.1 + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/provider-utils@2.2.3(zod@3.24.1)': + '@ai-sdk/openai@3.0.37(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.0 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - zod: 3.24.1 + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/provider-utils@2.2.4(zod@3.24.1)': + '@ai-sdk/provider-utils@1.0.22(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider': 0.0.26 + eventsource-parser: 1.1.2 nanoid: 3.3.8 secure-json-parse: 2.7.0 - zod: 3.24.1 + optionalDependencies: + zod: 3.25.76 - '@ai-sdk/provider-utils@2.2.7(zod@3.24.1)': + '@ai-sdk/provider-utils@3.0.21(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - zod: 3.24.1 + '@ai-sdk/provider': 2.0.1 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 - '@ai-sdk/provider-utils@2.2.8(zod@3.24.1)': + '@ai-sdk/provider-utils@4.0.16(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - zod: 3.24.1 + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 '@ai-sdk/provider@0.0.26': dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@1.1.0': + '@ai-sdk/provider@1.1.3': dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@1.1.3': + '@ai-sdk/provider@2.0.1': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@3.0.8': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@0.0.70(react@18.3.1)(zod@3.24.1)': + '@ai-sdk/react@0.0.70(react@18.3.1)(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.24.1) - '@ai-sdk/ui-utils': 0.0.50(zod@3.24.1) - swr: 2.3.2(react@18.3.1) + '@ai-sdk/provider-utils': 1.0.22(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.50(zod@3.25.76) + swr: 2.3.4(react@18.3.1) throttleit: 2.1.0 optionalDependencies: react: 18.3.1 - zod: 3.24.1 + zod: 3.25.76 - '@ai-sdk/react@1.2.6(react@18.3.1)(zod@3.24.1)': + '@ai-sdk/react@3.0.107(react@18.3.1)(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 2.2.4(zod@3.24.1) - '@ai-sdk/ui-utils': 1.2.5(zod@3.24.1) + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) + ai: 6.0.105(zod@3.25.76) react: 18.3.1 swr: 2.3.4(react@18.3.1) throttleit: 2.1.0 - optionalDependencies: - zod: 3.24.1 + transitivePeerDependencies: + - zod - '@ai-sdk/solid@0.0.54(zod@3.24.1)': + '@ai-sdk/solid@0.0.54(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.24.1) - '@ai-sdk/ui-utils': 0.0.50(zod@3.24.1) + '@ai-sdk/provider-utils': 1.0.22(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.50(zod@3.25.76) transitivePeerDependencies: - zod - '@ai-sdk/svelte@0.0.57(svelte@5.28.1)(zod@3.24.1)': + '@ai-sdk/svelte@0.0.57(svelte@5.28.1)(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.24.1) - '@ai-sdk/ui-utils': 0.0.50(zod@3.24.1) + '@ai-sdk/provider-utils': 1.0.22(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.50(zod@3.25.76) sswr: 2.2.0(svelte@5.28.1) optionalDependencies: svelte: 5.28.1 transitivePeerDependencies: - zod - '@ai-sdk/ui-utils@0.0.50(zod@3.24.1)': + '@ai-sdk/ui-utils@0.0.50(zod@3.25.76)': dependencies: '@ai-sdk/provider': 0.0.26 - '@ai-sdk/provider-utils': 1.0.22(zod@3.24.1) + '@ai-sdk/provider-utils': 1.0.22(zod@3.25.76) json-schema: 0.4.0 secure-json-parse: 2.7.0 - zod-to-json-schema: 3.24.1(zod@3.24.1) + zod-to-json-schema: 3.24.1(zod@3.25.76) optionalDependencies: - zod: 3.24.1 - - '@ai-sdk/ui-utils@1.2.5(zod@3.24.1)': - dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.4(zod@3.24.1) - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) + zod: 3.25.76 - '@ai-sdk/vue@0.0.59(vue@3.5.13(typescript@5.8.3))(zod@3.24.1)': + '@ai-sdk/vue@0.0.59(vue@3.5.13(typescript@5.8.3))(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 1.0.22(zod@3.24.1) - '@ai-sdk/ui-utils': 0.0.50(zod@3.24.1) + '@ai-sdk/provider-utils': 1.0.22(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.50(zod@3.25.76) swrv: 1.1.0(vue@3.5.13(typescript@5.8.3)) optionalDependencies: vue: 3.5.13(typescript@5.8.3) transitivePeerDependencies: - zod - '@ai-sdk/xai@1.2.13(zod@3.24.1)': + '@ai-sdk/xai@3.0.60(zod@3.25.76)': dependencies: - '@ai-sdk/openai-compatible': 0.2.11(zod@3.24.1) - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.7(zod@3.24.1) - zod: 3.24.1 + '@ai-sdk/openai-compatible': 2.0.31(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) + zod: 3.25.76 '@alloc/quick-lru@5.2.0': {} @@ -10112,10 +10587,10 @@ snapshots: '@csstools/css-tokenizer': 3.0.3 lru-cache: 10.4.3 - '@asteasolutions/zod-to-openapi@6.4.0(zod@3.24.1)': + '@asteasolutions/zod-to-openapi@6.4.0(zod@3.25.76)': dependencies: openapi3-ts: 4.4.0 - zod: 3.24.1 + zod: 3.25.76 '@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -10776,13 +11251,15 @@ snapshots: '@braintrust/core@0.0.84': dependencies: - '@asteasolutions/zod-to-openapi': 6.4.0(zod@3.24.1) + '@asteasolutions/zod-to-openapi': 6.4.0(zod@3.25.76) uuid: 9.0.1 - zod: 3.24.1 + zod: 3.25.76 '@bufbuild/protobuf@2.2.5': optional: true + '@bytecodealliance/preview2-shim@0.17.6': {} + '@cloudflare/kv-asset-handler@0.3.4': dependencies: mime: 3.0.0 @@ -10930,12 +11407,6 @@ snapshots: style-mod: 4.1.2 w3c-keyname: 2.2.8 - '@convex-dev/ai-sdk-google@1.2.17(zod@3.24.1)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.1) - zod: 3.24.1 - '@convex-dev/design-system@0.1.11(@popperjs/core@2.11.8)(@radix-ui/react-icons@1.3.2(react@18.3.1))(@tailwindcss/forms@0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.7.3))))(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(react@18.3.1)(tailwind-scrollbar@3.0.3(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.7.3))))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.7.3)))': dependencies: '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11014,6 +11485,7 @@ snapshots: '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + optional: true '@csstools/color-helpers@5.0.2': {} @@ -11067,16 +11539,32 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emotion/hash@0.9.2': {} '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': @@ -11106,6 +11594,9 @@ snapshots: '@esbuild/aix-ppc64@0.25.4': optional: true + '@esbuild/aix-ppc64@0.27.0': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true @@ -11127,6 +11618,9 @@ snapshots: '@esbuild/android-arm64@0.25.4': optional: true + '@esbuild/android-arm64@0.27.0': + optional: true + '@esbuild/android-arm@0.17.19': optional: true @@ -11148,6 +11642,9 @@ snapshots: '@esbuild/android-arm@0.25.4': optional: true + '@esbuild/android-arm@0.27.0': + optional: true + '@esbuild/android-x64@0.17.19': optional: true @@ -11169,6 +11666,9 @@ snapshots: '@esbuild/android-x64@0.25.4': optional: true + '@esbuild/android-x64@0.27.0': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true @@ -11190,6 +11690,9 @@ snapshots: '@esbuild/darwin-arm64@0.25.4': optional: true + '@esbuild/darwin-arm64@0.27.0': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true @@ -11211,6 +11714,9 @@ snapshots: '@esbuild/darwin-x64@0.25.4': optional: true + '@esbuild/darwin-x64@0.27.0': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true @@ -11232,6 +11738,9 @@ snapshots: '@esbuild/freebsd-arm64@0.25.4': optional: true + '@esbuild/freebsd-arm64@0.27.0': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true @@ -11253,6 +11762,9 @@ snapshots: '@esbuild/freebsd-x64@0.25.4': optional: true + '@esbuild/freebsd-x64@0.27.0': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true @@ -11274,6 +11786,9 @@ snapshots: '@esbuild/linux-arm64@0.25.4': optional: true + '@esbuild/linux-arm64@0.27.0': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true @@ -11295,6 +11810,9 @@ snapshots: '@esbuild/linux-arm@0.25.4': optional: true + '@esbuild/linux-arm@0.27.0': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true @@ -11316,6 +11834,9 @@ snapshots: '@esbuild/linux-ia32@0.25.4': optional: true + '@esbuild/linux-ia32@0.27.0': + optional: true + '@esbuild/linux-loong64@0.17.19': optional: true @@ -11337,6 +11858,9 @@ snapshots: '@esbuild/linux-loong64@0.25.4': optional: true + '@esbuild/linux-loong64@0.27.0': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true @@ -11358,6 +11882,9 @@ snapshots: '@esbuild/linux-mips64el@0.25.4': optional: true + '@esbuild/linux-mips64el@0.27.0': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true @@ -11379,6 +11906,9 @@ snapshots: '@esbuild/linux-ppc64@0.25.4': optional: true + '@esbuild/linux-ppc64@0.27.0': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true @@ -11400,6 +11930,9 @@ snapshots: '@esbuild/linux-riscv64@0.25.4': optional: true + '@esbuild/linux-riscv64@0.27.0': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true @@ -11421,6 +11954,9 @@ snapshots: '@esbuild/linux-s390x@0.25.4': optional: true + '@esbuild/linux-s390x@0.27.0': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true @@ -11442,6 +11978,9 @@ snapshots: '@esbuild/linux-x64@0.25.4': optional: true + '@esbuild/linux-x64@0.27.0': + optional: true + '@esbuild/netbsd-arm64@0.25.2': optional: true @@ -11451,6 +11990,9 @@ snapshots: '@esbuild/netbsd-arm64@0.25.4': optional: true + '@esbuild/netbsd-arm64@0.27.0': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true @@ -11472,6 +12014,9 @@ snapshots: '@esbuild/netbsd-x64@0.25.4': optional: true + '@esbuild/netbsd-x64@0.27.0': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true @@ -11484,6 +12029,9 @@ snapshots: '@esbuild/openbsd-arm64@0.25.4': optional: true + '@esbuild/openbsd-arm64@0.27.0': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true @@ -11505,6 +12053,12 @@ snapshots: '@esbuild/openbsd-x64@0.25.4': optional: true + '@esbuild/openbsd-x64@0.27.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.0': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true @@ -11526,6 +12080,9 @@ snapshots: '@esbuild/sunos-x64@0.25.4': optional: true + '@esbuild/sunos-x64@0.27.0': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true @@ -11547,6 +12104,9 @@ snapshots: '@esbuild/win32-arm64@0.25.4': optional: true + '@esbuild/win32-arm64@0.27.0': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true @@ -11568,6 +12128,9 @@ snapshots: '@esbuild/win32-ia32@0.25.4': optional: true + '@esbuild/win32-ia32@0.27.0': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true @@ -11589,6 +12152,9 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true + '@esbuild/win32-x64@0.27.0': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(jiti@2.4.2))': dependencies: eslint: 9.20.1(jiti@2.4.2) @@ -11683,6 +12249,8 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} + '@iarna/toml@2.2.5': {} + '@iconify-json/svg-spinners@1.2.2': dependencies: '@iconify/types': 2.0.0 @@ -11764,6 +12332,12 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.1': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11808,6 +12382,7 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + optional: true '@jspm/core@2.0.1': {} @@ -11817,7 +12392,7 @@ snapshots: '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -11884,11 +12459,11 @@ snapshots: '@mapbox/node-pre-gyp@2.0.0': dependencies: consola: 3.4.0 - detect-libc: 2.0.3 + detect-libc: 2.0.4 https-proxy-agent: 7.0.6 node-fetch: 2.7.0 nopt: 8.1.0 - semver: 7.7.1 + semver: 7.7.2 tar: 7.4.3 transitivePeerDependencies: - encoding @@ -11941,6 +12516,13 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@next/env@14.2.28': {} '@nodelib/fs.scandir@2.1.5': @@ -11969,7 +12551,7 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: - semver: 7.7.1 + semver: 7.7.2 '@npmcli/git@4.1.0': dependencies: @@ -11979,7 +12561,7 @@ snapshots: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.1 + semver: 7.7.2 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -12119,7 +12701,7 @@ snapshots: '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 forwarded-parse: 2.1.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -12244,7 +12826,7 @@ snapshots: '@types/shimmer': 1.2.0 import-in-the-middle: 1.13.1 require-in-the-middle: 7.5.2 - semver: 7.7.1 + semver: 7.7.2 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -12256,7 +12838,7 @@ snapshots: '@types/shimmer': 1.2.0 import-in-the-middle: 1.13.1 require-in-the-middle: 7.5.2 - semver: 7.7.1 + semver: 7.7.2 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -12337,8 +12919,72 @@ snapshots: '@oxc-project/runtime@0.81.0': {} + '@oxc-project/types@0.110.0': {} + '@oxc-project/types@0.81.0': {} + '@oxc-transform/binding-android-arm-eabi@0.111.0': + optional: true + + '@oxc-transform/binding-android-arm64@0.111.0': + optional: true + + '@oxc-transform/binding-darwin-arm64@0.111.0': + optional: true + + '@oxc-transform/binding-darwin-x64@0.111.0': + optional: true + + '@oxc-transform/binding-freebsd-x64@0.111.0': + optional: true + + '@oxc-transform/binding-linux-arm-gnueabihf@0.111.0': + optional: true + + '@oxc-transform/binding-linux-arm-musleabihf@0.111.0': + optional: true + + '@oxc-transform/binding-linux-arm64-gnu@0.111.0': + optional: true + + '@oxc-transform/binding-linux-arm64-musl@0.111.0': + optional: true + + '@oxc-transform/binding-linux-ppc64-gnu@0.111.0': + optional: true + + '@oxc-transform/binding-linux-riscv64-gnu@0.111.0': + optional: true + + '@oxc-transform/binding-linux-riscv64-musl@0.111.0': + optional: true + + '@oxc-transform/binding-linux-s390x-gnu@0.111.0': + optional: true + + '@oxc-transform/binding-linux-x64-gnu@0.111.0': + optional: true + + '@oxc-transform/binding-linux-x64-musl@0.111.0': + optional: true + + '@oxc-transform/binding-openharmony-arm64@0.111.0': + optional: true + + '@oxc-transform/binding-wasm32-wasi@0.111.0': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@oxc-transform/binding-win32-arm64-msvc@0.111.0': + optional: true + + '@oxc-transform/binding-win32-ia32-msvc@0.111.0': + optional: true + + '@oxc-transform/binding-win32-x64-msvc@0.111.0': + optional: true + '@pkgjs/parseargs@0.11.0': optional: true @@ -13036,52 +13682,97 @@ snapshots: dependencies: web-streams-polyfill: 3.3.3 + '@renovatebot/pep440@4.2.1': {} + '@rolldown/binding-android-arm64@1.0.0-beta.32': optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.1': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.32': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.1': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.32': optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.1': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.32': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.1': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.1': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.1': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': dependencies: '@napi-rs/wasm-runtime': 1.0.3 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.1': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.1': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1': + optional: true + '@rolldown/pluginutils@1.0.0-beta.32': {} + '@rolldown/pluginutils@1.0.0-rc.1': {} + '@rollup/plugin-inject@5.0.5(rollup@3.29.5)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@3.29.5) @@ -13688,6 +14379,8 @@ snapshots: ignore: 5.3.2 p-map: 4.0.0 + '@standard-schema/spec@1.1.0': {} + '@stylistic/eslint-plugin-ts@2.13.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@typescript-eslint/utils': 8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) @@ -13724,6 +14417,8 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@ts-morph/common@0.11.1': dependencies: fast-glob: 3.3.3 @@ -13731,19 +14426,28 @@ snapshots: mkdirp: 1.0.4 path-browserify: 1.0.1 - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.11': + optional: true - '@tsconfig/node12@1.0.11': {} + '@tsconfig/node12@1.0.11': + optional: true - '@tsconfig/node14@1.0.3': {} + '@tsconfig/node14@1.0.3': + optional: true - '@tsconfig/node16@1.0.4': {} + '@tsconfig/node16@1.0.4': + optional: true '@tybys/wasm-util@0.10.0': dependencies: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.6 @@ -13827,12 +14531,14 @@ snapshots: '@types/node': 22.14.0 form-data: 4.0.2 - '@types/node@16.18.11': {} - '@types/node@18.19.86': dependencies: undici-types: 5.26.5 + '@types/node@20.11.0': + dependencies: + undici-types: 5.26.5 + '@types/node@20.17.30': dependencies: undici-types: 6.19.8 @@ -13920,7 +14626,7 @@ snapshots: '@typescript-eslint/types': 8.24.0 '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.24.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 9.20.1(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: @@ -13952,7 +14658,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) '@typescript-eslint/utils': 8.24.0(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - debug: 4.4.0 + debug: 4.4.1 eslint: 9.20.1(jiti@2.4.2) ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 @@ -13967,11 +14673,11 @@ snapshots: dependencies: '@typescript-eslint/types': 8.24.0 '@typescript-eslint/visitor-keys': 8.24.0 - debug: 4.4.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -14085,11 +14791,85 @@ snapshots: '@vanilla-extract/private@1.0.6': {} - '@vercel/build-utils@10.5.1': {} + '@vercel/backends@0.0.39(rollup@3.29.5)(typescript@5.7.3)': + dependencies: + '@vercel/build-utils': 13.6.1 + '@vercel/nft': 1.3.0(rollup@3.29.5) + execa: 3.2.0 + fs-extra: 11.1.0 + oxc-transform: 0.111.0 + path-to-regexp: 8.3.0 + resolve.exports: 2.0.3 + rolldown: 1.0.0-rc.1 + srvx: 0.8.9 + tsx: 4.21.0 + typescript: 5.7.3 + zod: 3.22.4 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/blob@2.3.0': + dependencies: + async-retry: 1.3.3 + is-buffer: 2.0.5 + is-node-process: 1.2.0 + throttleit: 2.1.0 + undici: 6.23.0 + + '@vercel/build-utils@13.6.1': + dependencies: + '@vercel/python-analysis': 0.8.1 + + '@vercel/cervel@0.0.26(rollup@3.29.5)(typescript@5.7.3)': + dependencies: + '@vercel/backends': 0.0.39(rollup@3.29.5)(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/detect-agent@1.1.0': {} + + '@vercel/elysia@0.1.42(rollup@3.29.5)': + dependencies: + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color '@vercel/error-utils@2.0.3': {} - '@vercel/fun@1.1.5': + '@vercel/express@0.1.51(rollup@3.29.5)(typescript@5.7.3)': + dependencies: + '@vercel/cervel': 0.0.26(rollup@3.29.5)(typescript@5.7.3) + '@vercel/nft': 1.1.1(rollup@3.29.5) + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/static-config': 3.1.2 + fs-extra: 11.1.0 + path-to-regexp: 8.3.0 + ts-morph: 12.0.0 + zod: 3.22.4 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + - typescript + + '@vercel/fastify@0.1.45(rollup@3.29.5)': + dependencies: + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/fun@1.3.0': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 @@ -14098,16 +14878,15 @@ snapshots: micro: 9.3.5-canary.3 ms: 2.1.1 node-fetch: 2.6.7 - path-match: 1.2.4 + path-to-regexp: 8.2.0 promisepipe: 3.0.0 semver: 7.5.4 stat-mode: 0.3.0 stream-to-promise: 2.2.0 - tar: 6.2.1 + tar: 7.5.7 tinyexec: 0.3.2 tree-kill: 1.2.2 uid-promise: 1.0.0 - uuid: 3.3.2 xdg-app-paths: 5.1.0 yauzl-promise: 2.1.3 transitivePeerDependencies: @@ -14126,39 +14905,99 @@ snapshots: dependencies: web-vitals: 0.2.4 - '@vercel/gatsby-plugin-vercel-builder@2.0.80': + '@vercel/gatsby-plugin-vercel-builder@2.0.141': dependencies: '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 10.5.1 - esbuild: 0.14.47 + '@vercel/build-utils': 13.6.1 + esbuild: 0.27.0 etag: 1.8.1 fs-extra: 11.1.0 - '@vercel/go@3.2.1': {} + '@vercel/go@3.4.3': {} - '@vercel/hydrogen@1.2.0': + '@vercel/h3@0.1.51(rollup@3.29.5)': dependencies: - '@vercel/static-config': 3.0.0 + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/hono@0.2.45(rollup@3.29.5)': + dependencies: + '@vercel/nft': 1.1.1(rollup@3.29.5) + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/static-config': 3.1.2 + fs-extra: 11.1.0 + path-to-regexp: 8.3.0 + ts-morph: 12.0.0 + zod: 3.22.4 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/hydrogen@1.3.5': + dependencies: + '@vercel/static-config': 3.1.2 ts-morph: 12.0.0 - '@vercel/next@4.7.6(rollup@3.29.5)': + '@vercel/koa@0.1.25(rollup@3.29.5)': + dependencies: + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/nestjs@0.2.46(rollup@3.29.5)': + dependencies: + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/next@4.15.36(rollup@3.29.5)': dependencies: - '@vercel/nft': 0.27.10(rollup@3.29.5) + '@vercel/nft': 1.1.1(rollup@3.29.5) transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/nft@0.27.10(rollup@3.29.5)': + '@vercel/nft@1.1.1(rollup@3.29.5)': dependencies: '@mapbox/node-pre-gyp': 2.0.0 '@rollup/pluginutils': 5.1.4(rollup@3.29.5) - acorn: 8.14.0 - acorn-import-attributes: 1.9.5(acorn@8.14.0) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.2 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/nft@1.3.0(rollup@3.29.5)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0 + '@rollup/pluginutils': 5.1.4(rollup@3.29.5) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 - glob: 7.2.3 + glob: 13.0.6 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 picomatch: 4.0.2 @@ -14168,42 +15007,56 @@ snapshots: - rollup - supports-color - '@vercel/node@5.1.14(rollup@3.29.5)': + '@vercel/node@5.6.9(rollup@3.29.5)': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 '@edge-runtime/vm': 3.2.0 - '@types/node': 16.18.11 - '@vercel/build-utils': 10.5.1 + '@types/node': 20.11.0 + '@vercel/build-utils': 13.6.1 '@vercel/error-utils': 2.0.3 - '@vercel/nft': 0.27.10(rollup@3.29.5) - '@vercel/static-config': 3.0.0 + '@vercel/nft': 1.1.1(rollup@3.29.5) + '@vercel/static-config': 3.1.2 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 edge-runtime: 2.5.9 es-module-lexer: 1.4.1 - esbuild: 0.14.47 + esbuild: 0.27.0 etag: 1.8.1 + mime-types: 2.1.35 node-fetch: 2.6.9 path-to-regexp: 6.1.0 path-to-regexp-updated: path-to-regexp@6.3.0 ts-morph: 12.0.0 - ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) - typescript: 4.9.5 + tsx: 4.21.0 + typescript: 5.9.3 undici: 5.28.4 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color - '@vercel/python@4.7.2': {} + '@vercel/oidc@3.1.0': {} - '@vercel/redwood@2.3.0(rollup@3.29.5)': + '@vercel/python-analysis@0.8.1': dependencies: - '@vercel/nft': 0.27.10(rollup@3.29.5) - '@vercel/static-config': 3.0.0 + '@bytecodealliance/preview2-shim': 0.17.6 + '@renovatebot/pep440': 4.2.1 + fs-extra: 11.1.1 + js-yaml: 4.1.1 + minimatch: 10.1.1 + pip-requirements-js: 1.0.2 + smol-toml: 1.5.2 + zod: 3.22.4 + + '@vercel/python@6.19.0': + dependencies: + '@vercel/python-analysis': 0.8.1 + + '@vercel/redwood@2.4.9(rollup@3.29.5)': + dependencies: + '@vercel/nft': 1.1.1(rollup@3.29.5) + '@vercel/static-config': 3.1.2 semver: 6.3.1 ts-morph: 12.0.0 transitivePeerDependencies: @@ -14211,11 +15064,11 @@ snapshots: - rollup - supports-color - '@vercel/remix-builder@5.4.3(rollup@3.29.5)': + '@vercel/remix-builder@5.6.0(rollup@3.29.5)': dependencies: '@vercel/error-utils': 2.0.3 - '@vercel/nft': 0.27.10(rollup@3.29.5) - '@vercel/static-config': 3.0.0 + '@vercel/nft': 1.1.1(rollup@3.29.5) + '@vercel/static-config': 3.1.2 path-to-regexp: 6.1.0 path-to-regexp-updated: path-to-regexp@6.3.0 ts-morph: 12.0.0 @@ -14235,13 +15088,18 @@ snapshots: react-dom: 18.3.1(react@18.3.1) ts-morph: 12.0.0 - '@vercel/ruby@2.2.0': {} + '@vercel/ruby@2.3.2': {} + + '@vercel/rust@1.0.5': + dependencies: + '@iarna/toml': 2.2.5 + execa: 5.1.1 - '@vercel/static-build@2.7.6': + '@vercel/static-build@2.8.43': dependencies: '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 - '@vercel/gatsby-plugin-vercel-builder': 2.0.80 - '@vercel/static-config': 3.0.0 + '@vercel/gatsby-plugin-vercel-builder': 2.0.141 + '@vercel/static-config': 3.1.2 ts-morph: 12.0.0 '@vercel/static-config@3.0.0': @@ -14250,6 +15108,12 @@ snapshots: json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 + '@vercel/static-config@3.1.2': + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + '@vitest/expect@2.1.9': dependencies: '@vitest/spy': 2.1.9 @@ -14435,20 +15299,24 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.14.0): + acorn-import-attributes@1.9.5(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + acorn-walk@8.3.2: optional: true acorn-walk@8.3.4: dependencies: - acorn: 8.14.0 + acorn: 8.14.1 acorn@8.14.0: {} @@ -14456,7 +15324,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -14471,42 +15339,38 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@3.4.33(openai@4.93.0(ws@8.18.0)(zod@3.24.1))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.24.1): + ai@3.4.33(openai@4.93.0(ws@8.18.0)(zod@3.25.76))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.25.76): dependencies: '@ai-sdk/provider': 0.0.26 - '@ai-sdk/provider-utils': 1.0.22(zod@3.24.1) - '@ai-sdk/react': 0.0.70(react@18.3.1)(zod@3.24.1) - '@ai-sdk/solid': 0.0.54(zod@3.24.1) - '@ai-sdk/svelte': 0.0.57(svelte@5.28.1)(zod@3.24.1) - '@ai-sdk/ui-utils': 0.0.50(zod@3.24.1) - '@ai-sdk/vue': 0.0.59(vue@3.5.13(typescript@5.8.3))(zod@3.24.1) + '@ai-sdk/provider-utils': 1.0.22(zod@3.25.76) + '@ai-sdk/react': 0.0.70(react@18.3.1)(zod@3.25.76) + '@ai-sdk/solid': 0.0.54(zod@3.25.76) + '@ai-sdk/svelte': 0.0.57(svelte@5.28.1)(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.50(zod@3.25.76) + '@ai-sdk/vue': 0.0.59(vue@3.5.13(typescript@5.8.3))(zod@3.25.76) '@opentelemetry/api': 1.9.0 eventsource-parser: 1.1.2 json-schema: 0.4.0 jsondiffpatch: 0.6.0 secure-json-parse: 2.7.0 - zod-to-json-schema: 3.24.1(zod@3.24.1) + zod-to-json-schema: 3.24.1(zod@3.25.76) optionalDependencies: - openai: 4.93.0(ws@8.18.0)(zod@3.24.1) + openai: 4.93.0(ws@8.18.0)(zod@3.25.76) react: 18.3.1 sswr: 2.2.0(svelte@5.28.1) svelte: 5.28.1 - zod: 3.24.1 + zod: 3.25.76 transitivePeerDependencies: - solid-js - vue - ai@4.3.2(react@18.3.1)(zod@3.24.1): + ai@6.0.105(zod@3.25.76): dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.4(zod@3.24.1) - '@ai-sdk/react': 1.2.6(react@18.3.1)(zod@3.24.1) - '@ai-sdk/ui-utils': 1.2.5(zod@3.24.1) + '@ai-sdk/gateway': 3.0.59(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.16(zod@3.25.76) '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.24.1 - optionalDependencies: - react: 18.3.1 + zod: 3.25.76 ajv@6.12.6: dependencies: @@ -14554,7 +15418,8 @@ snapshots: arg@4.1.0: {} - arg@4.1.3: {} + arg@4.1.3: + optional: true arg@5.0.2: {} @@ -14620,7 +15485,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 as-table@1.0.55: @@ -14649,6 +15514,10 @@ snapshots: '@babel/parser': 7.28.3 pathe: 2.0.3 + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + astring@1.9.0: {} async-function@1.0.0: {} @@ -14663,6 +15532,10 @@ snapshots: dependencies: tslib: 2.8.1 + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + async-sema@3.1.1: {} async@3.2.6: {} @@ -14691,12 +15564,16 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 + basic-ftp@5.2.0: {} + bignumber.js@9.3.0: {} binary-extensions@2.3.0: {} @@ -14752,17 +15629,21 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.4: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 - braintrust@0.0.199(@aws-sdk/credential-provider-web-identity@3.782.0)(openai@4.93.0(ws@8.18.0)(zod@3.24.1))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.24.1): + braintrust@0.0.199(@aws-sdk/credential-provider-web-identity@3.782.0)(openai@4.93.0(ws@8.18.0)(zod@3.25.76))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.25.76): dependencies: '@ai-sdk/provider': 1.1.3 '@braintrust/core': 0.0.84 '@next/env': 14.2.28 '@vercel/functions': 1.6.0(@aws-sdk/credential-provider-web-identity@3.782.0) - ai: 3.4.33(openai@4.93.0(ws@8.18.0)(zod@3.24.1))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.24.1) + ai: 3.4.33(openai@4.93.0(ws@8.18.0)(zod@3.25.76))(react@18.3.1)(sswr@2.2.0(svelte@5.28.1))(svelte@5.28.1)(vue@3.5.13(typescript@5.8.3))(zod@3.25.76) argparse: 2.0.1 chalk: 4.1.2 cli-progress: 3.12.0 @@ -14777,8 +15658,8 @@ snapshots: slugify: 1.6.6 source-map: 0.7.4 uuid: 9.0.1 - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) + zod: 3.25.76 + zod-to-json-schema: 3.24.1(zod@3.25.76) transitivePeerDependencies: - '@aws-sdk/credential-provider-web-identity' - openai @@ -15113,13 +15994,14 @@ snapshots: convert-source-map@2.0.0: {} - convex-helpers@0.1.108(convex@1.31.2(@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(zod@3.24.1): + convex-helpers@0.1.108(@standard-schema/spec@1.1.0)(convex@1.31.2(@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(zod@3.25.76): dependencies: convex: 1.31.2(@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) optionalDependencies: + '@standard-schema/spec': 1.1.0 react: 18.3.1 typescript: 5.7.3 - zod: 3.24.1 + zod: 3.25.76 convex-test@0.0.41(convex@1.31.2(@auth0/auth0-react@2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)): dependencies: @@ -15133,6 +16015,8 @@ snapshots: '@auth0/auth0-react': 2.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 + cookie-es@2.0.0: {} + cookie-signature@1.0.6: {} cookie-signature@1.2.2: {} @@ -15224,6 +16108,10 @@ snapshots: data-uri-to-buffer@3.0.1: {} + data-uri-to-buffer@4.0.1: {} + + data-uri-to-buffer@6.0.2: {} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -15299,6 +16187,12 @@ snapshots: defu@6.1.4: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} depd@1.1.2: {} @@ -15314,10 +16208,7 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.0.3: {} - - detect-libc@2.0.4: - optional: true + detect-libc@2.0.4: {} detect-node-es@1.1.0: {} @@ -15329,7 +16220,8 @@ snapshots: diff-match-patch@1.0.5: {} - diff@4.0.2: {} + diff@4.0.2: + optional: true diff@5.2.0: {} @@ -15548,76 +16440,28 @@ snapshots: es-module-lexer@1.6.0: {} - es-module-lexer@1.7.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - esbuild-android-64@0.14.47: - optional: true - - esbuild-android-arm64@0.14.47: - optional: true - - esbuild-darwin-64@0.14.47: - optional: true - - esbuild-darwin-arm64@0.14.47: - optional: true - - esbuild-freebsd-64@0.14.47: - optional: true - - esbuild-freebsd-arm64@0.14.47: - optional: true - - esbuild-linux-32@0.14.47: - optional: true - - esbuild-linux-64@0.14.47: - optional: true - - esbuild-linux-arm64@0.14.47: - optional: true - - esbuild-linux-arm@0.14.47: - optional: true - - esbuild-linux-mips64le@0.14.47: - optional: true - - esbuild-linux-ppc64le@0.14.47: - optional: true + es-module-lexer@1.7.0: {} - esbuild-linux-riscv64@0.14.47: - optional: true + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 - esbuild-linux-s390x@0.14.47: - optional: true + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 - esbuild-netbsd-64@0.14.47: - optional: true + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 - esbuild-openbsd-64@0.14.47: - optional: true + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esbuild-plugins-node-modules-polyfill@1.6.8(esbuild@0.17.6): dependencies: @@ -15626,41 +16470,6 @@ snapshots: local-pkg: 0.5.1 resolve.exports: 2.0.3 - esbuild-sunos-64@0.14.47: - optional: true - - esbuild-windows-32@0.14.47: - optional: true - - esbuild-windows-64@0.14.47: - optional: true - - esbuild-windows-arm64@0.14.47: - optional: true - - esbuild@0.14.47: - optionalDependencies: - esbuild-android-64: 0.14.47 - esbuild-android-arm64: 0.14.47 - esbuild-darwin-64: 0.14.47 - esbuild-darwin-arm64: 0.14.47 - esbuild-freebsd-64: 0.14.47 - esbuild-freebsd-arm64: 0.14.47 - esbuild-linux-32: 0.14.47 - esbuild-linux-64: 0.14.47 - esbuild-linux-arm: 0.14.47 - esbuild-linux-arm64: 0.14.47 - esbuild-linux-mips64le: 0.14.47 - esbuild-linux-ppc64le: 0.14.47 - esbuild-linux-riscv64: 0.14.47 - esbuild-linux-s390x: 0.14.47 - esbuild-netbsd-64: 0.14.47 - esbuild-openbsd-64: 0.14.47 - esbuild-sunos-64: 0.14.47 - esbuild-windows-32: 0.14.47 - esbuild-windows-64: 0.14.47 - esbuild-windows-arm64: 0.14.47 - esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -15848,6 +16657,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -15856,10 +16694,18 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-compat-utils@0.6.4(eslint@9.20.1(jiti@2.4.2)): dependencies: eslint: 9.20.1(jiti@2.4.2) - semver: 7.7.1 + semver: 7.7.2 eslint-config-prettier@9.1.0(eslint@9.20.1(jiti@2.4.2)): dependencies: @@ -15990,6 +16836,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -16065,11 +16913,26 @@ snapshots: eventsource-parser@1.1.2: {} + eventsource-parser@3.0.6: {} + evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 + execa@3.2.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -16176,6 +17039,11 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fflate@0.4.8: {} file-entry-cache@8.0.0: @@ -16241,6 +17109,10 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} @@ -16272,6 +17144,12 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.1.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -16303,24 +17181,21 @@ snapshots: fuzzy@0.1.3: {} - gaxios@6.7.1: + gaxios@7.1.3: dependencies: extend: 3.0.2 https-proxy-agent: 7.0.6 - is-stream: 2.0.1 - node-fetch: 2.7.0 - uuid: 9.0.1 + node-fetch: 3.3.2 + rimraf: 5.0.10 transitivePeerDependencies: - - encoding - supports-color - gcp-metadata@6.1.1: + gcp-metadata@8.1.2: dependencies: - gaxios: 6.7.1 - google-logging-utils: 0.0.2 + gaxios: 7.1.3 + google-logging-utils: 1.1.3 json-bigint: 1.0.0 transitivePeerDependencies: - - encoding - supports-color generic-names@4.0.0: @@ -16374,13 +17249,17 @@ snapshots: source-map: 0.6.1 optional: true + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + get-stream@6.0.1: {} get-symbol-description@1.1.0: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-tsconfig@4.10.0: dependencies: @@ -16390,6 +17269,14 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: + dependencies: + basic-ftp: 5.2.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -16410,14 +17297,11 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: + glob@13.0.6: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + minimatch: 10.2.4 + minipass: 7.1.3 + path-scurry: 2.0.2 glob@9.3.5: dependencies: @@ -16439,19 +17323,18 @@ snapshots: globrex@0.1.2: {} - google-auth-library@9.15.1: + google-auth-library@10.6.1: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.7.1 - gcp-metadata: 6.1.1 - gtoken: 7.1.0 + gaxios: 7.1.3 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 jws: 4.0.0 transitivePeerDependencies: - - encoding - supports-color - google-logging-utils@0.0.2: {} + google-logging-utils@1.1.3: {} gopd@1.2.0: {} @@ -16459,14 +17342,6 @@ snapshots: graphemer@1.4.0: {} - gtoken@7.1.0: - dependencies: - gaxios: 6.7.1 - jws: 4.0.0 - transitivePeerDependencies: - - encoding - - supports-color - gunzip-maybe@1.4.2: dependencies: browserify-zlib: 0.1.4 @@ -16649,11 +17524,6 @@ snapshots: html-void-elements@3.0.0: {} - http-errors@1.4.0: - dependencies: - inherits: 2.0.1 - statuses: 1.5.0 - http-errors@1.7.3: dependencies: depd: 1.1.2 @@ -16690,7 +17560,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -16701,6 +17571,8 @@ snapshots: transitivePeerDependencies: - supports-color + human-signals@1.1.1: {} + human-signals@2.1.0: {} humanize-ms@1.2.1: @@ -16737,8 +17609,8 @@ snapshots: import-in-the-middle@1.13.1: dependencies: - acorn: 8.14.0 - acorn-import-attributes: 1.9.5(acorn@8.14.0) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.3 @@ -16746,13 +17618,6 @@ snapshots: indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.1: {} - inherits@2.0.4: {} inline-style-parser@0.1.1: {} @@ -16769,6 +17634,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} is-alphabetical@2.0.1: {} @@ -16787,7 +17654,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.3.2: optional: true @@ -16824,7 +17691,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -16868,6 +17735,8 @@ snapshots: call-bind: 1.0.8 define-properties: 1.2.1 + is-node-process@1.2.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -16926,9 +17795,7 @@ snapshots: is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 - - isarray@0.0.1: {} + get-intrinsic: 1.3.0 isarray@1.0.0: {} @@ -16983,6 +17850,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsdom@26.0.0: dependencies: cssstyle: 4.2.1 @@ -17041,7 +17912,7 @@ snapshots: acorn: 8.14.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.7.1 + semver: 7.7.2 jsondiffpatch@0.6.0: dependencies: @@ -17104,8 +17975,8 @@ snapshots: strip-json-comments: 5.0.1 summary: 2.1.0 typescript: 5.7.3 - zod: 3.24.1 - zod-validation-error: 3.4.0(zod@3.24.1) + zod: 3.25.76 + zod-validation-error: 3.4.0(zod@3.25.76) launchdarkly-js-client-sdk@3.5.0: dependencies: @@ -17185,6 +18056,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.6: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -17195,6 +18068,8 @@ snapshots: lru-cache@7.18.3: {} + luxon@3.7.2: {} + lz4-wasm-nodejs@0.9.2: {} lz4-wasm@0.9.2: {} @@ -17212,7 +18087,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-error@1.3.6: {} + make-error@1.3.6: + optional: true markdown-extensions@1.1.1: {} @@ -17653,8 +18529,8 @@ snapshots: micromark-extension-mdxjs@1.0.1: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -17871,7 +18747,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.1 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -17893,7 +18769,7 @@ snapshots: micromark@4.0.1: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.1 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.2 @@ -17959,6 +18835,14 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.1 + + minimatch@10.2.4: + dependencies: + brace-expansion: 5.0.4 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -17995,6 +18879,8 @@ snapshots: minipass@7.1.2: {} + minipass@7.1.3: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -18004,6 +18890,10 @@ snapshots: dependencies: minipass: 7.1.2 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mkdirp-classic@0.5.3: {} mkdirp@1.0.4: {} @@ -18080,6 +18970,8 @@ snapshots: negotiator@0.6.4: {} + netmask@2.0.2: {} + node-domexception@1.0.0: {} node-fetch@2.6.7: @@ -18094,6 +18986,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: {} node-releases@2.0.19: {} @@ -18136,7 +19034,7 @@ snapshots: dependencies: hosted-git-info: 6.1.3 is-core-module: 2.16.1 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -18145,7 +19043,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 npm-normalize-package-bin@3.0.1: {} @@ -18153,7 +19051,7 @@ snapshots: dependencies: hosted-git-info: 6.1.3 proc-log: 3.0.0 - semver: 7.7.1 + semver: 7.7.2 validate-npm-package-name: 5.0.1 npm-pick-manifest@8.0.2: @@ -18161,7 +19059,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.7.1 + semver: 7.7.2 npm-run-path@4.0.1: dependencies: @@ -18215,6 +19113,8 @@ snapshots: ohash@1.1.6: optional: true + ohm-js@17.5.0: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -18243,7 +19143,7 @@ snapshots: regex: 5.1.1 regex-recursion: 5.1.1 - openai@4.93.0(ws@8.18.0)(zod@3.24.1): + openai@4.93.0(ws@8.18.0)(zod@3.25.76): dependencies: '@types/node': 18.19.86 '@types/node-fetch': 2.6.12 @@ -18254,7 +19154,7 @@ snapshots: node-fetch: 2.7.0 optionalDependencies: ws: 8.18.0 - zod: 3.24.1 + zod: 3.25.76 transitivePeerDependencies: - encoding @@ -18299,10 +19199,35 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-transform@0.111.0: + optionalDependencies: + '@oxc-transform/binding-android-arm-eabi': 0.111.0 + '@oxc-transform/binding-android-arm64': 0.111.0 + '@oxc-transform/binding-darwin-arm64': 0.111.0 + '@oxc-transform/binding-darwin-x64': 0.111.0 + '@oxc-transform/binding-freebsd-x64': 0.111.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.111.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.111.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.111.0 + '@oxc-transform/binding-linux-arm64-musl': 0.111.0 + '@oxc-transform/binding-linux-ppc64-gnu': 0.111.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.111.0 + '@oxc-transform/binding-linux-riscv64-musl': 0.111.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.111.0 + '@oxc-transform/binding-linux-x64-gnu': 0.111.0 + '@oxc-transform/binding-linux-x64-musl': 0.111.0 + '@oxc-transform/binding-openharmony-arm64': 0.111.0 + '@oxc-transform/binding-wasm32-wasi': 0.111.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.111.0 + '@oxc-transform/binding-win32-ia32-msvc': 0.111.0 + '@oxc-transform/binding-win32-x64-msvc': 0.111.0 + + p-finally@2.0.1: {} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -18315,6 +19240,24 @@ snapshots: dependencies: aggregate-error: 3.1.0 + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.4.1 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + package-json-from-dist@1.0.1: {} pako@0.2.9: {} @@ -18358,15 +19301,8 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - path-match@1.2.4: - dependencies: - http-errors: 1.4.0 - path-to-regexp: 1.9.0 - path-parse@1.0.7: {} path-scurry@1.11.1: @@ -18374,16 +19310,21 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.12: {} - - path-to-regexp@1.9.0: + path-scurry@2.0.2: dependencies: - isarray: 0.0.1 + lru-cache: 11.2.6 + minipass: 7.1.3 + + path-to-regexp@0.1.12: {} path-to-regexp@6.1.0: {} path-to-regexp@6.3.0: {} + path-to-regexp@8.2.0: {} + + path-to-regexp@8.3.0: {} + pathe@1.1.2: {} pathe@2.0.2: {} @@ -18438,6 +19379,10 @@ snapshots: pify@2.3.0: {} + pip-requirements-js@1.0.2: + dependencies: + ohm-js: 17.5.0 + pirates@4.0.7: {} pkg-dir@5.0.0: @@ -18655,6 +19600,19 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent@6.4.0: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + proxy-from-env@1.1.0: {} public-encrypt@4.0.3: @@ -18899,7 +19857,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -19013,7 +19971,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - remix-utils@7.7.0(@remix-run/node@2.15.3(typescript@5.7.3))(@remix-run/react@2.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@remix-run/router@1.22.0)(react@18.3.1)(zod@3.24.1): + remix-utils@7.7.0(@remix-run/node@2.15.3(typescript@5.7.3))(@remix-run/react@2.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@remix-run/router@1.22.0)(react@18.3.1)(zod@3.25.76): dependencies: type-fest: 4.34.1 optionalDependencies: @@ -19021,7 +19979,7 @@ snapshots: '@remix-run/react': 2.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3) '@remix-run/router': 1.22.0 react: 18.3.1 - zod: 3.24.1 + zod: 3.25.76 require-directory@2.1.1: {} @@ -19029,7 +19987,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 module-details-from-path: 1.0.3 resolve: 1.22.10 transitivePeerDependencies: @@ -19068,8 +20026,14 @@ snapshots: retry@0.12.0: {} + retry@0.13.1: {} + reusify@1.0.4: {} + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + ripemd160@2.0.2: dependencies: hash-base: 3.0.5 @@ -19114,6 +20078,25 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.32 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.32 + rolldown@1.0.0-rc.1: + dependencies: + '@oxc-project/types': 0.110.0 + '@rolldown/pluginutils': 1.0.0-rc.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.1 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.1 + '@rolldown/binding-darwin-x64': 1.0.0-rc.1 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.1 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.1 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.1 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.1 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.1 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.1 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.1 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.1 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.1 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.1 + rollup-plugin-dts@5.3.1(rollup@3.29.5)(typescript@5.7.3): dependencies: magic-string: 0.30.17 @@ -19361,7 +20344,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -19446,14 +20429,14 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -19477,7 +20460,7 @@ snapshots: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -19488,8 +20471,25 @@ snapshots: slugify@1.6.6: {} + smart-buffer@4.2.0: {} + smol-toml@1.3.1: {} + smol-toml@1.5.2: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + sonner@2.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -19527,6 +20527,10 @@ snapshots: spdx-license-ids@3.0.21: {} + srvx@0.8.9: + dependencies: + cookie-es: 2.0.0 + ssri@10.0.6: dependencies: minipass: 7.1.2 @@ -19749,12 +20753,6 @@ snapshots: magic-string: 0.30.17 zimmerframe: 1.1.2 - swr@2.3.2(react@18.3.1): - dependencies: - dequal: 2.0.3 - react: 18.3.1 - use-sync-external-store: 1.4.0(react@18.3.1) - swr@2.3.4(react@18.3.1): dependencies: dequal: 2.0.3 @@ -19861,6 +20859,14 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + textextensions@6.11.0: dependencies: editions: 6.21.0 @@ -19965,24 +20971,6 @@ snapshots: '@ts-morph/common': 0.11.1 code-block-writer: 10.1.1 - ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.5): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 16.18.11 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - ts-node@10.9.2(@types/node@22.14.0)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -20046,6 +21034,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsx@4.21.0: + dependencies: + esbuild: 0.27.0 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + tty-browserify@0.0.1: {} turbo-stream@2.4.0: {} @@ -20104,12 +21099,12 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@4.9.5: {} - typescript@5.7.3: {} typescript@5.8.3: {} + typescript@5.9.3: {} + ua-parser-js@1.0.40: {} ufo@1.5.4: {} @@ -20150,6 +21145,8 @@ snapshots: undici@6.21.1: {} + undici@6.23.0: {} + undici@7.7.0: {} unenv@2.0.0-rc.1: @@ -20309,8 +21306,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@3.3.2: {} - uuid@8.3.2: {} uuid@9.0.1: {} @@ -20322,7 +21317,8 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 - v8-compile-cache-lib@3.0.1: {} + v8-compile-cache-lib@3.0.1: + optional: true valibot@0.41.0(typescript@5.7.3): optionalDependencies: @@ -20340,27 +21336,41 @@ snapshots: vary@1.1.2: {} - vercel@41.5.0(rollup@3.29.5): - dependencies: - '@vercel/build-utils': 10.5.1 - '@vercel/fun': 1.1.5 - '@vercel/go': 3.2.1 - '@vercel/hydrogen': 1.2.0 - '@vercel/next': 4.7.6(rollup@3.29.5) - '@vercel/node': 5.1.14(rollup@3.29.5) - '@vercel/python': 4.7.2 - '@vercel/redwood': 2.3.0(rollup@3.29.5) - '@vercel/remix-builder': 5.4.3(rollup@3.29.5) - '@vercel/ruby': 2.2.0 - '@vercel/static-build': 2.7.6 + vercel@50.25.4(rollup@3.29.5)(typescript@5.7.3): + dependencies: + '@vercel/backends': 0.0.39(rollup@3.29.5)(typescript@5.7.3) + '@vercel/blob': 2.3.0 + '@vercel/build-utils': 13.6.1 + '@vercel/detect-agent': 1.1.0 + '@vercel/elysia': 0.1.42(rollup@3.29.5) + '@vercel/express': 0.1.51(rollup@3.29.5)(typescript@5.7.3) + '@vercel/fastify': 0.1.45(rollup@3.29.5) + '@vercel/fun': 1.3.0 + '@vercel/go': 3.4.3 + '@vercel/h3': 0.1.51(rollup@3.29.5) + '@vercel/hono': 0.2.45(rollup@3.29.5) + '@vercel/hydrogen': 1.3.5 + '@vercel/koa': 0.1.25(rollup@3.29.5) + '@vercel/nestjs': 0.2.46(rollup@3.29.5) + '@vercel/next': 4.15.36(rollup@3.29.5) + '@vercel/node': 5.6.9(rollup@3.29.5) + '@vercel/python': 6.19.0 + '@vercel/redwood': 2.4.9(rollup@3.29.5) + '@vercel/remix-builder': 5.6.0(rollup@3.29.5) + '@vercel/ruby': 2.3.2 + '@vercel/rust': 1.0.5 + '@vercel/static-build': 2.8.43 chokidar: 4.0.0 + esbuild: 0.27.0 + form-data: 4.0.2 jose: 5.9.6 + luxon: 3.7.2 + proxy-agent: 6.4.0 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - encoding - rollup - supports-color + - typescript version-range@4.14.0: {} @@ -20846,7 +21856,8 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - yn@3.1.1: {} + yn@3.1.1: + optional: true yocto-queue@0.1.0: {} @@ -20859,17 +21870,19 @@ snapshots: zimmerframe@1.1.2: {} - zod-to-json-schema@3.24.1(zod@3.24.1): + zod-to-json-schema@3.24.1(zod@3.25.76): dependencies: - zod: 3.24.1 + zod: 3.25.76 - zod-validation-error@3.4.0(zod@3.24.1): + zod-validation-error@3.4.0(zod@3.25.76): dependencies: - zod: 3.24.1 + zod: 3.25.76 zod@3.22.3: optional: true - zod@3.24.1: {} + zod@3.22.4: {} + + zod@3.25.76: {} zwitch@2.0.4: {} diff --git a/test-kitchen/chefTask.ts b/test-kitchen/chefTask.ts index 340bb66be..f7f382e8f 100644 --- a/test-kitchen/chefTask.ts +++ b/test-kitchen/chefTask.ts @@ -1,4 +1,4 @@ -import { CoreMessage, generateText, LanguageModelUsage } from 'ai'; +import { ModelMessage, generateText, LanguageModelUsage, stepCountIs } from 'ai'; import * as walkdir from 'walkdir'; import { path } from 'chef-agent/utils/path'; import { ChefResult, ChefModel } from './types'; @@ -390,7 +390,7 @@ const installDependencies = wrapTraced(async function installDependencies(repoDi async function invokeGenerateText(model: ChefModel, opts: SystemPromptOptions, context: UIMessage[]) { return traced( async (span) => { - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: 'system', content: ROLE_SYSTEM_PROMPT, @@ -412,10 +412,10 @@ async function invokeGenerateText(model: ChefModel, opts: SystemPromptOptions, c tools.edit = editTool; const result = await generateText({ model: model.ai, - maxTokens: model.maxTokens, + maxOutputTokens: model.maxOutputTokens, messages, tools, - maxSteps: 64, + stopWhen: stepCountIs(64), }); span.log({ input: messages, diff --git a/test-kitchen/initialGeneration.eval.ts b/test-kitchen/initialGeneration.eval.ts index fffe88a2a..03acfb441 100644 --- a/test-kitchen/initialGeneration.eval.ts +++ b/test-kitchen/initialGeneration.eval.ts @@ -47,13 +47,13 @@ if (process.env.ANTHROPIC_API_KEY) { name: 'claude-4.6-sonnet', model_slug: 'claude-sonnet-4-6', ai: anthropic('claude-sonnet-4-6'), - maxTokens: 16384, + maxOutputTokens: 16384, }); chefEval({ name: 'claude-4.5-sonnet', model_slug: 'claude-sonnet-4-5', ai: anthropic('claude-sonnet-4-5'), - maxTokens: 16384, + maxOutputTokens: 16384, }); } @@ -64,13 +64,13 @@ if (process.env.OPENAI_API_KEY && process.env.USE_OPENAI === 'true') { name: 'gpt-4.1', model_slug: 'gpt-4.1', ai: openai('gpt-4.1'), - maxTokens: 8192, + maxOutputTokens: 8192, }); chefEval({ name: 'gpt-5', model_slug: 'gpt-5', ai: openai('gpt-5'), - maxTokens: 8192, + maxOutputTokens: 8192, }); } @@ -79,7 +79,7 @@ if (process.env.GOOGLE_GENERATIVE_AI_API_KEY) { name: 'gemini-2.5-pro', model_slug: 'gemini-2.5-pro', ai: google('gemini-2.5-pro'), - maxTokens: 20000, + maxOutputTokens: 20000, }); } @@ -88,6 +88,6 @@ if (process.env.XAI_API_KEY) { name: 'grok-3-mini', model_slug: 'grok-3-mini', ai: xai('grok-3-mini'), - maxTokens: 8192, + maxOutputTokens: 8192, }); } diff --git a/test-kitchen/main.ts b/test-kitchen/main.ts index e109670a5..feaafb90e 100644 --- a/test-kitchen/main.ts +++ b/test-kitchen/main.ts @@ -7,10 +7,10 @@ import { chefSetLogLevel } from 'chef-agent/utils/logger.js'; chefSetLogLevel('info'); const model: ChefModel = { - name: 'claude-4-sonnet', - model_slug: 'claude-sonnet-4-20250514', - ai: anthropic('claude-sonnet-4-20250514'), - maxTokens: 16384, + name: 'claude-4.6-sonnet', + model_slug: 'claude-sonnet-4-6', + ai: anthropic('claude-sonnet-4-6'), + maxOutputTokens: 16384, }; mkdirSync('/tmp/backend', { recursive: true }); const result = await chefTask(model, '/tmp/backend', 'Make me a chat app'); diff --git a/test-kitchen/package.json b/test-kitchen/package.json index 348730083..5e06afeb5 100644 --- a/test-kitchen/package.json +++ b/test-kitchen/package.json @@ -3,10 +3,10 @@ "version": "1.0.0", "type": "module", "dependencies": { - "@ai-sdk/anthropic": "^1.2.4", - "@ai-sdk/google": "^1.2.11", - "@ai-sdk/openai": "^1.3.6", - "@ai-sdk/xai": "^1.2.13", + "@ai-sdk/anthropic": "^3.0.0", + "@ai-sdk/google": "^3.0.0", + "@ai-sdk/openai": "^3.0.0", + "@ai-sdk/xai": "^3.0.0", "async-mutex": "^0.5.0", "braintrust": "^0.0.199", "chef-agent": "workspace:*", diff --git a/test-kitchen/types.ts b/test-kitchen/types.ts index 0f86c0850..dcec48042 100644 --- a/test-kitchen/types.ts +++ b/test-kitchen/types.ts @@ -1,10 +1,12 @@ -import { LanguageModelUsage, LanguageModelV1 } from 'ai'; +import { LanguageModelV2 } from '@ai-sdk/provider'; + +import { LanguageModelUsage } from 'ai'; export type ChefModel = { name: string; model_slug: string; ai: LanguageModelV1; - maxTokens: number; + maxOutputTokens: number; }; export type ChefResult = {