From cc2daf18747c6d5c5da1bcfcfb463a1dbae80e66 Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:22:36 +0530 Subject: [PATCH] chore(x): migrate to AI SDK 7 Bump apps/x from AI SDK v5 to v7 (single hop through the 6-0 and 7-0 migration guides). All deps upgraded via pnpm --filter: ai@7, @ai-sdk/{anthropic@4,google@4,openai@4,openai-compatible@3,provider@4}, @openrouter/ai-sdk-provider@3, ollama-ai-provider-v2@4. Changes (per the official migration guides): - Provider spec bumped V2->V4: ProviderV2 -> ProviderV4 (models.ts, gateway.ts) - streamText: result.fullStream -> result.stream (+ StreamTextInvoker seam, test fakes); stepCountIs -> isStepCount - system -> instructions on SDK generateText/streamText/generateObject calls (left our own generateObjectSafe.system param untouched) - allowSystemInMessages: true on calls passing stored messages (v7 rejects system-role messages in the array by default; convertFromMessages emits them) - image content part {type:'image'} -> {type:'file'} (message-encoding.ts) - tool() no longer accepts a `name` key (removed; tools keyed by ToolSet key) - usage token relocation: cachedInputTokens -> inputTokenDetails.cacheReadTokens, reasoningTokens -> outputTokenDetails.reasoningTokens (mapUsage rewrite); renderer decoupled from LanguageModelUsage to a local flat UsageSummary - providerMetadata relay cast to shared ProviderOptions (spec loosened) No persisted-data changes: @x/shared is AI-SDK-free, so old chats list/view/continue unchanged. Full typecheck clean; 637 tests pass (shared 107, core 447, renderer 83); main.cjs bundles ESM-only ai into CJS. Pending live check (needs creds): OpenAI strictJsonSchema now defaults true in v7 and may reject zod schemas for openai-family flavors at runtime. Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/x/apps/renderer/package.json | 2 +- apps/x/apps/renderer/src/App.tsx | 16 +- .../src/components/ai-elements/context.tsx | 13 +- apps/x/packages/core/package.json | 16 +- apps/x/packages/core/src/apps/host-api.ts | 4 +- .../core/src/knowledge/inline_tasks.ts | 2 +- .../core/src/knowledge/meeting_prep_brief.ts | 2 +- .../core/src/knowledge/summarize_meeting.ts | 2 +- apps/x/packages/core/src/models/gateway.ts | 4 +- apps/x/packages/core/src/models/models.ts | 8 +- apps/x/packages/core/src/models/structured.ts | 4 +- .../src/runtime/assembly/message-encoding.ts | 6 +- .../core/src/runtime/legacy/engine.ts | 34 +-- .../turns/bridges/real-model-registry.test.ts | 6 +- .../turns/bridges/real-model-registry.ts | 55 ++-- apps/x/pnpm-lock.yaml | 243 ++++++++---------- 16 files changed, 210 insertions(+), 207 deletions(-) diff --git a/apps/x/apps/renderer/package.json b/apps/x/apps/renderer/package.json index c0ad3480..15b53e2d 100644 --- a/apps/x/apps/renderer/package.json +++ b/apps/x/apps/renderer/package.json @@ -49,7 +49,7 @@ "@x/shared": "workspace:*", "@xterm/addon-fit": "^0.11.0", "@xterm/xterm": "^6.0.0", - "ai": "^5.0.117", + "ai": "^7.0.22", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index 89907284..b322d278 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { useCallback, useEffect, useLayoutEffect, useState, useRef } from 'react' import { workspace } from '@x/shared'; import { RunEvent } from '@x/shared/src/runs.js'; -import type { LanguageModelUsage, ToolUIPart } from 'ai'; +import type { ToolUIPart } from 'ai'; import './App.css' import z from 'zod'; import { CheckIcon, LoaderIcon, PanelLeftIcon, ArrowLeft, ArrowRight, MessageSquare, ChevronLeftIcon, ChevronRightIcon, Plus, HistoryIcon } from 'lucide-react'; @@ -458,7 +458,17 @@ const buildBgTaskSetupPrompt = (description: string) => const buildBgTaskEditPrompt = (slug: string) => `Let's tweak the background task \`${slug}\`. Please load the \`background-task\` skill first, read the task's current \`bg-tasks/${slug}/task.yaml\`, then ask me what I want to change.` -const normalizeUsage = (usage?: Partial | null): LanguageModelUsage | null => { +// The renderer displays our internal (flat) usage shape that arrives over IPC, +// not the AI SDK's restructured LanguageModelUsage (nested token details). +type UsageSummary = { + inputTokens?: number + outputTokens?: number + totalTokens?: number + reasoningTokens?: number + cachedInputTokens?: number +} + +const normalizeUsage = (usage?: UsageSummary | null): UsageSummary | null => { if (!usage) return null const hasNumbers = Object.values(usage).some((value) => typeof value === 'number') if (!hasNumbers) return null @@ -960,7 +970,7 @@ function App() { return } }, [conversation]) - const [, setModelUsage] = useState(null) + const [, setModelUsage] = useState(null) const [runId, setRunId] = useState(null) // New runtime: the active session's chat data + actions. All logic lives in // SessionChatStore (tested headlessly); the hook is a thin subscription. diff --git a/apps/x/apps/renderer/src/components/ai-elements/context.tsx b/apps/x/apps/renderer/src/components/ai-elements/context.tsx index f49d7cae..02cc4fa1 100644 --- a/apps/x/apps/renderer/src/components/ai-elements/context.tsx +++ b/apps/x/apps/renderer/src/components/ai-elements/context.tsx @@ -8,7 +8,6 @@ import { } from "@/components/ui/hover-card"; import { Progress } from "@/components/ui/progress"; import { cn } from "@/lib/utils"; -import type { LanguageModelUsage } from "ai"; import { type ComponentProps, createContext, useContext } from "react"; import { getUsage } from "tokenlens"; @@ -20,10 +19,20 @@ const ICON_STROKE_WIDTH = 2; type ModelId = string; +// Our internal (flat) usage shape received over IPC, not the AI SDK's +// restructured LanguageModelUsage (nested token details as of AI SDK 7). +type UsageSummary = { + inputTokens?: number; + outputTokens?: number; + totalTokens?: number; + reasoningTokens?: number; + cachedInputTokens?: number; +}; + type ContextSchema = { usedTokens: number; maxTokens: number; - usage?: LanguageModelUsage; + usage?: UsageSummary; modelId?: ModelId; }; diff --git a/apps/x/packages/core/package.json b/apps/x/packages/core/package.json index 80b5b54d..48233c91 100644 --- a/apps/x/packages/core/package.json +++ b/apps/x/packages/core/package.json @@ -17,19 +17,19 @@ "@agentclientprotocol/claude-agent-acp": "^0.55.0", "@agentclientprotocol/codex-acp": "^1.1.0", "@agentclientprotocol/sdk": "^1.1.0", - "@ai-sdk/anthropic": "^2.0.63", - "@ai-sdk/google": "^2.0.53", - "@ai-sdk/openai": "^2.0.91", - "@ai-sdk/openai-compatible": "^1.0.33", - "@ai-sdk/provider": "^2.0.1", + "@ai-sdk/anthropic": "^4.0.12", + "@ai-sdk/google": "^4.0.12", + "@ai-sdk/openai": "^4.0.11", + "@ai-sdk/openai-compatible": "^3.0.7", + "@ai-sdk/provider": "^4.0.3", "@composio/core": "^0.6.0", "@google-cloud/local-auth": "^3.0.1", "@modelcontextprotocol/sdk": "^1.25.1", - "@openrouter/ai-sdk-provider": "^1.2.6", + "@openrouter/ai-sdk-provider": "^3.0.0", "@react-pdf/renderer": "^4.3.2", "@types/react": "^19.2.7", "@x/shared": "workspace:*", - "ai": "^5.0.133", + "ai": "^7.0.22", "awilix": "^12.0.5", "baileys": "7.0.0-rc13", "chokidar": "^4.0.3", @@ -42,7 +42,7 @@ "isomorphic-git": "^1.29.0", "mammoth": "^1.11.0", "node-html-markdown": "^2.0.0", - "ollama-ai-provider-v2": "^1.5.4", + "ollama-ai-provider-v2": "^4.0.1", "openid-client": "^6.8.1", "papaparse": "^5.5.3", "pdf-parse": "^2.4.5", diff --git a/apps/x/packages/core/src/apps/host-api.ts b/apps/x/packages/core/src/apps/host-api.ts index ff664d63..9a9ae253 100644 --- a/apps/x/packages/core/src/apps/host-api.ts +++ b/apps/x/packages/core/src/apps/host-api.ts @@ -304,8 +304,8 @@ async function handleLlmGenerate( const model = createProvider(providerConfig).languageModel(resolved.model); const result = await withUseCase({ useCase: 'app_llm_generate', subUseCase: slug }, () => generateText({ model, - ...(system ? { system } : {}), - ...(rawMessages ? { messages: rawMessages as ModelMessage[] } : { prompt: prompt as string }), + ...(system ? { instructions: system } : {}), + ...(rawMessages ? { messages: rawMessages as ModelMessage[], allowSystemInMessages: true } : { prompt: prompt as string }), ...(temperature !== undefined ? { temperature } : {}), maxOutputTokens, })); diff --git a/apps/x/packages/core/src/knowledge/inline_tasks.ts b/apps/x/packages/core/src/knowledge/inline_tasks.ts index ec2657bf..c5ba742f 100644 --- a/apps/x/packages/core/src/knowledge/inline_tasks.ts +++ b/apps/x/packages/core/src/knowledge/inline_tasks.ts @@ -653,7 +653,7 @@ Respond with ONLY valid JSON: either a schedule object or null. No other text.`; try { const result = await withUseCase({ useCase: 'knowledge_sync', subUseCase: 'inline_task_classify' }, () => generateText({ model, - system: systemPrompt, + instructions: systemPrompt, prompt: instruction, })); diff --git a/apps/x/packages/core/src/knowledge/meeting_prep_brief.ts b/apps/x/packages/core/src/knowledge/meeting_prep_brief.ts index 275d1d14..f236b852 100644 --- a/apps/x/packages/core/src/knowledge/meeting_prep_brief.ts +++ b/apps/x/packages/core/src/knowledge/meeting_prep_brief.ts @@ -181,7 +181,7 @@ async function generateBrief(event: CalendarEvent, ctx: Awaited generateText({ model, - system: BRIEF_SYSTEM, + instructions: BRIEF_SYSTEM, prompt: parts.join('\n\n'), })); captureLlmUsage({ useCase: 'meeting_prep', model: modelId, provider: providerName, usage: result.usage }); diff --git a/apps/x/packages/core/src/knowledge/summarize_meeting.ts b/apps/x/packages/core/src/knowledge/summarize_meeting.ts index 29f3cf92..45102718 100644 --- a/apps/x/packages/core/src/knowledge/summarize_meeting.ts +++ b/apps/x/packages/core/src/knowledge/summarize_meeting.ts @@ -154,7 +154,7 @@ export async function summarizeMeeting(transcript: string, meetingStartTime?: st const result = await withUseCase({ useCase: 'meeting_note' }, () => generateText({ model, - system: SYSTEM_PROMPT, + instructions: SYSTEM_PROMPT, prompt, })); diff --git a/apps/x/packages/core/src/models/gateway.ts b/apps/x/packages/core/src/models/gateway.ts index bdaa7ab5..8b2f2bb3 100644 --- a/apps/x/packages/core/src/models/gateway.ts +++ b/apps/x/packages/core/src/models/gateway.ts @@ -1,4 +1,4 @@ -import { ProviderV2 } from '@ai-sdk/provider'; +import { ProviderV4 } from '@ai-sdk/provider'; import { createOpenRouter } from '@openrouter/ai-sdk-provider'; import { getAccessToken } from '../auth/tokens.js'; import { getCurrentUseCase } from '../analytics/use_case.js'; @@ -16,7 +16,7 @@ const authedFetch: typeof fetch = async (input, init) => { return fetch(input, { ...init, headers }); }; -export function getGatewayProvider(): ProviderV2 { +export function getGatewayProvider(): ProviderV4 { return createOpenRouter({ baseURL: `${API_URL}/v1/llm`, apiKey: 'managed-by-rowboat', diff --git a/apps/x/packages/core/src/models/models.ts b/apps/x/packages/core/src/models/models.ts index c14452aa..ad26ea71 100644 --- a/apps/x/packages/core/src/models/models.ts +++ b/apps/x/packages/core/src/models/models.ts @@ -1,4 +1,4 @@ -import { ProviderV2 } from "@ai-sdk/provider"; +import { ProviderV4 } from "@ai-sdk/provider"; import { createGateway, generateText, type LanguageModel } from "ai"; import { createOpenAI } from "@ai-sdk/openai"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; @@ -22,7 +22,7 @@ import { export const Provider = LlmProvider; export const ModelConfig = LlmModelConfig; -export function createProvider(config: z.infer): ProviderV2 { +export function createProvider(config: z.infer): ProviderV4 { const { apiKey, baseURL, headers } = config; switch (config.flavor) { case "openai": @@ -78,7 +78,7 @@ export function createProvider(config: z.infer): ProviderV2 { apiKey, baseURL, headers, - }) as unknown as ProviderV2; + }) as unknown as ProviderV4; case "rowboat": return getGatewayProvider(); default: @@ -342,7 +342,7 @@ export async function generateOneShot(opts: GenerateTextOptions): Promise generateText({ model: languageModel, - ...(opts.system ? { system: opts.system } : {}), + ...(opts.system ? { instructions: opts.system } : {}), prompt: opts.prompt, }), ); diff --git a/apps/x/packages/core/src/models/structured.ts b/apps/x/packages/core/src/models/structured.ts index 75097fbb..9ef8e9bb 100644 --- a/apps/x/packages/core/src/models/structured.ts +++ b/apps/x/packages/core/src/models/structured.ts @@ -44,7 +44,7 @@ export async function generateObjectSafe( try { const result = await generateObject({ model: options.model, - ...(options.system ? { system: options.system } : {}), + ...(options.system ? { instructions: options.system } : {}), prompt: options.prompt, schema: options.schema, }); @@ -68,7 +68,7 @@ export async function generateObjectSafe( ].join("\n\n").trim(); const result = await generateObject({ model: options.model, - system, + instructions: system, prompt: options.prompt, schema: options.schema, }); diff --git a/apps/x/packages/core/src/runtime/assembly/message-encoding.ts b/apps/x/packages/core/src/runtime/assembly/message-encoding.ts index 6c1e49aa..15f15312 100644 --- a/apps/x/packages/core/src/runtime/assembly/message-encoding.ts +++ b/apps/x/packages/core/src/runtime/assembly/message-encoding.ts @@ -101,7 +101,9 @@ export function convertFromMessages(messages: z.infer[]): ModelM // model knows which images show the user vs their screen. const textSegments: string[] = userMessageContextPrefix ? [userMessageContextPrefix] : []; const attachmentLines: string[] = []; - type EncodedImagePart = { type: "image"; image: string; mediaType: string }; + // AI SDK 7 collapsed the `image` content part into `file` + // (data + mediaType); image parts are deprecated. + type EncodedImagePart = { type: "file"; data: string; mediaType: string }; const cameraParts: EncodedImagePart[] = []; const screenParts: EncodedImagePart[] = []; const frameTimes: string[] = []; @@ -113,7 +115,7 @@ export function convertFromMessages(messages: z.infer[]): ModelM attachmentLines.push(`- ${part.filename} (${part.mimeType}${sizeStr}) at ${part.path}${lineStr}`); } else if (part.type === "image") { const target = part.source === "screen" ? screenParts : cameraParts; - target.push({ type: "image", image: part.data, mediaType: part.mediaType }); + target.push({ type: "file", data: part.data, mediaType: part.mediaType }); if (part.capturedAt) frameTimes.push(part.capturedAt); } else { textSegments.push(part.text); diff --git a/apps/x/packages/core/src/runtime/legacy/engine.ts b/apps/x/packages/core/src/runtime/legacy/engine.ts index 4f3c1d59..9174f670 100644 --- a/apps/x/packages/core/src/runtime/legacy/engine.ts +++ b/apps/x/packages/core/src/runtime/legacy/engine.ts @@ -1,7 +1,7 @@ import { jsonSchema } from "ai"; import { Agent, ToolAttachment } from "@x/shared/dist/agent.js"; import { AssistantContentPart, AssistantMessage, MessageList, ProviderOptions, ToolCallPart, ToolMessage, UserMessageContext } from "@x/shared/dist/message.js"; -import { LanguageModel, stepCountIs, streamText, tool, Tool, ToolSet } from "ai"; +import { LanguageModel, isStepCount, streamText, tool, Tool, ToolSet } from "ai"; import { z } from "zod"; import { LlmStepStreamEvent } from "@x/shared/dist/llm-step-events.js"; import { execTool } from "../tools/exec-tool.js"; @@ -255,7 +255,6 @@ async function mapAgentTool(t: z.infer): Promise { switch (t.type) { case "mcp": return tool({ - name: t.name, description: t.description, inputSchema: jsonSchema(t.inputSchema), }); @@ -265,7 +264,6 @@ async function mapAgentTool(t: z.infer): Promise { throw new Error(`Agent ${t.name} not found`); } return tool({ - name: t.name, description: agent.description, inputSchema: z.object({ message: z.string().describe("The message to send to the workflow"), @@ -1151,21 +1149,23 @@ async function* streamLlm( }, () => streamText({ model, messages: converted, - system: instructions, + instructions, + allowSystemInMessages: true, tools, - stopWhen: stepCountIs(1), + stopWhen: isStepCount(1), abortSignal: signal, })) : streamText({ model, messages: converted, - system: instructions, + instructions, + allowSystemInMessages: true, tools, - stopWhen: stepCountIs(1), + stopWhen: isStepCount(1), abortSignal: signal, }); - const { fullStream } = streamResult; - for await (const event of fullStream) { + const { stream } = streamResult; + for await (const event of stream) { // Check abort on every chunk for responsiveness signal?.throwIfAborted(); console.log("-> \t\tstream event", JSON.stringify(event)); @@ -1179,39 +1179,39 @@ async function* streamLlm( case "reasoning-start": yield { type: "reasoning-start", - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; case "reasoning-delta": yield { type: "reasoning-delta", delta: event.text, - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; case "reasoning-end": yield { type: "reasoning-end", - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; case "text-start": yield { type: "text-start", - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; case "text-end": yield { type: "text-end", - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; case "text-delta": yield { type: "text-delta", delta: event.text, - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; case "tool-call": @@ -1220,7 +1220,7 @@ async function* streamLlm( toolCallId: event.toolCallId, toolName: event.toolName, input: event.input, - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; case "finish-step": @@ -1238,7 +1238,7 @@ async function* streamLlm( type: "finish-step", usage: event.usage, finishReason: event.finishReason, - providerOptions: event.providerMetadata, + providerOptions: event.providerMetadata as z.infer | undefined, }; break; default: diff --git a/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.test.ts b/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.test.ts index 26de134c..a1170cf5 100644 --- a/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.test.ts +++ b/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.test.ts @@ -15,7 +15,7 @@ function makeRegistry(parts: Array>, capture: InvokerOpt invoke: (options) => { capture.push(options); return { - fullStream: (async function* () { + stream: (async function* () { yield* parts; })(), }; @@ -378,7 +378,7 @@ describe("RealModelRegistry", () => { invoke: (options) => { capture.push(options); return { - fullStream: (async function* () { + stream: (async function* () { yield { type: "finish-step", finishReason: "stop", usage: {} }; })(), }; @@ -528,7 +528,7 @@ describe("RealModelRegistry", () => { invoke: (options) => { capture.push(options); return { - fullStream: (async function* () { + stream: (async function* () { yield { type: "finish-step", finishReason: "stop", usage: {} }; })(), }; diff --git a/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.ts b/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.ts index 1d62e1fe..e8e3af57 100644 --- a/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.ts +++ b/apps/x/packages/core/src/runtime/turns/bridges/real-model-registry.ts @@ -1,6 +1,6 @@ import { jsonSchema, - stepCountIs, + isStepCount, streamText, tool, type LanguageModel, @@ -39,10 +39,18 @@ export type StreamTextInvoker = (options: { topP?: number; maxOutputTokens?: number; providerOptions?: Record>; -}) => { fullStream: AsyncIterable }; +}) => { stream: AsyncIterable }; -const defaultInvoker: StreamTextInvoker = (options) => - streamText({ ...options, stopWhen: stepCountIs(1) }); +const defaultInvoker: StreamTextInvoker = ({ system, ...options }) => + // Our seam keeps a `system` field; the SDK's top-level option is now + // `instructions`. `allowSystemInMessages` opts into system-role messages + // in the array (v7 rejects them by default) — persisted chats rely on it. + streamText({ + ...options, + instructions: system, + allowSystemInMessages: true, + stopWhen: isStepCount(1), + }); export interface RealModelRegistryDeps { resolveProvider?: (name: string) => Promise>; @@ -217,7 +225,7 @@ export class RealModelRegistry implements IModelRegistry { ...generationParams, }); - for await (const raw of result.fullStream) { + for await (const raw of result.stream) { request.signal.throwIfAborted(); const event = raw as { type: string; @@ -226,7 +234,13 @@ export class RealModelRegistry implements IModelRegistry { toolName?: string; input?: unknown; finishReason?: string; - usage?: Record; + usage?: { + inputTokens?: number; + outputTokens?: number; + totalTokens?: number; + inputTokenDetails?: { cacheReadTokens?: number | undefined }; + outputTokenDetails?: { reasoningTokens?: number | undefined }; + }; providerMetadata?: unknown; error?: unknown; }; @@ -390,24 +404,33 @@ function mergeProviderOptions( } function mapUsage( - usage: Record | undefined, + usage: + | { + inputTokens?: number; + outputTokens?: number; + totalTokens?: number; + inputTokenDetails?: { cacheReadTokens?: number | undefined }; + outputTokenDetails?: { reasoningTokens?: number | undefined }; + } + | undefined, ): z.infer { const mapped: z.infer = {}; if (!usage) { return mapped; } - for (const key of [ - "inputTokens", - "outputTokens", - "totalTokens", - "reasoningTokens", - "cachedInputTokens", - ] as const) { - const value = usage[key]; + // AI SDK 7 relocated cached/reasoning tokens into nested detail objects + // (usage.inputTokenDetails.cacheReadTokens, usage.outputTokenDetails.reasoningTokens); + // our persisted TurnUsage keeps the flat names. + const put = (key: keyof z.infer, value: number | undefined) => { if (typeof value === "number" && Number.isFinite(value)) { mapped[key] = value; } - } + }; + put("inputTokens", usage.inputTokens); + put("outputTokens", usage.outputTokens); + put("totalTokens", usage.totalTokens); + put("reasoningTokens", usage.outputTokenDetails?.reasoningTokens); + put("cachedInputTokens", usage.inputTokenDetails?.cacheReadTokens); return mapped; } diff --git a/apps/x/pnpm-lock.yaml b/apps/x/pnpm-lock.yaml index c717595e..53f589f1 100644 --- a/apps/x/pnpm-lock.yaml +++ b/apps/x/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: version: 6.43.1 '@eigenpal/docx-editor-react': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(ai@5.0.117(zod@4.2.1))(prosemirror-commands@1.7.1)(prosemirror-dropcursor@1.8.2)(prosemirror-history@1.5.0)(prosemirror-keymap@1.2.3)(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-tables@1.8.5)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(ai@7.0.22(zod@4.2.1))(prosemirror-commands@1.7.1)(prosemirror-dropcursor@1.8.2)(prosemirror-history@1.5.0)(prosemirror-keymap@1.2.3)(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-tables@1.8.5)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@lezer/highlight': specifier: ^1.2.3 version: 1.2.3 @@ -265,8 +265,8 @@ importers: specifier: ^6.0.0 version: 6.0.0 ai: - specifier: ^5.0.117 - version: 5.0.117(zod@4.2.1) + specifier: ^7.0.22 + version: 7.0.22(zod@4.2.1) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -434,20 +434,20 @@ importers: specifier: ^1.1.0 version: 1.1.0(zod@4.2.1) '@ai-sdk/anthropic': - specifier: ^2.0.63 - version: 2.0.70(zod@4.2.1) + specifier: ^4.0.12 + version: 4.0.12(zod@4.2.1) '@ai-sdk/google': - specifier: ^2.0.53 - version: 2.0.61(zod@4.2.1) + specifier: ^4.0.12 + version: 4.0.12(zod@4.2.1) '@ai-sdk/openai': - specifier: ^2.0.91 - version: 2.0.99(zod@4.2.1) + specifier: ^4.0.11 + version: 4.0.11(zod@4.2.1) '@ai-sdk/openai-compatible': - specifier: ^1.0.33 - version: 1.0.34(zod@4.2.1) + specifier: ^3.0.7 + version: 3.0.7(zod@4.2.1) '@ai-sdk/provider': - specifier: ^2.0.1 - version: 2.0.1 + specifier: ^4.0.3 + version: 4.0.3 '@composio/core': specifier: ^0.6.0 version: 0.6.2(ws@8.21.0)(zod@4.2.1) @@ -458,8 +458,8 @@ importers: specifier: ^1.25.1 version: 1.25.1(hono@4.11.3)(zod@4.2.1) '@openrouter/ai-sdk-provider': - specifier: ^1.2.6 - version: 1.5.4(ai@5.0.151(zod@4.2.1))(zod@4.2.1) + specifier: ^3.0.0 + version: 3.0.0(ai@7.0.22(zod@4.2.1))(zod@4.2.1) '@react-pdf/renderer': specifier: ^4.3.2 version: 4.3.2(react@19.2.3) @@ -470,8 +470,8 @@ importers: specifier: workspace:* version: link:../shared ai: - specifier: ^5.0.133 - version: 5.0.151(zod@4.2.1) + specifier: ^7.0.22 + version: 7.0.22(zod@4.2.1) awilix: specifier: ^12.0.5 version: 12.0.5 @@ -509,8 +509,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 ollama-ai-provider-v2: - specifier: ^1.5.4 - version: 1.5.5(zod@4.2.1) + specifier: ^4.0.1 + version: 4.0.1(ai@7.0.22(zod@4.2.1))(zod@4.2.1) openid-client: specifier: ^6.8.1 version: 6.8.1 @@ -602,57 +602,45 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@ai-sdk/anthropic@2.0.70': - resolution: {integrity: sha512-W3WjQlb0Ho+CVAQUvb8Rtk3hGS3Jlgy79ihY2H0yj2k4yU8XuxpQw0Oz+7JQsB47j+jlHhk7nUXtxhAeRg3S3Q==} - engines: {node: '>=18'} + '@ai-sdk/anthropic@4.0.12': + resolution: {integrity: sha512-IquWNkGRSF2ulYJ6YIIUqMsNAIDeZFB3/4W92aSOtCxH1TfuVoq3qw4M4TxTxIw4As9cnkeRLe7b9LDMzPDsnA==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.24': - resolution: {integrity: sha512-mflk80YF8hj8vrF9e1IHhovGKC1ubX+sY88pesSk3pUiXfH5VPO8dgzNnxjwsqsCZrnkHcztxS5cSl4TzSiEuA==} - engines: {node: '>=18'} + '@ai-sdk/gateway@4.0.16': + resolution: {integrity: sha512-9iYxdOLquoOFk5e+02P9qfBIA+EJU0FNJvyjGxi4iXJabt2+GlbaCg7TX0sTtxOsBVkdabkatqWM6+kvp53tBg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.56': - resolution: {integrity: sha512-omvb2Bwpgqg8PKqOpYdIaW+fdEIWcfm2B/j3dx37DxzOIt6fr57VVcfw7pu/EaACcY0O+wsg50iFCPGcsI2Cbg==} - engines: {node: '>=18'} + '@ai-sdk/google@4.0.12': + resolution: {integrity: sha512-4Rw4viFwH2Wprx6OssZzhV/KgNWaA7qYr5Kg28AlZ7r3sEvyXH0kDZtZok7onPjr0RuFTg2EjCjTIeoCesg0Ww==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@2.0.61': - resolution: {integrity: sha512-hIs7UvL8X5MBG3uxdciSotD4I27UcMa4/we9Qf98fM/RgMTwyk9zXcr7GM6k5yLBZ5S0QeZWkfqKwtdiDnUEEQ==} - engines: {node: '>=18'} + '@ai-sdk/openai-compatible@3.0.7': + resolution: {integrity: sha512-y8RVpm8BZKNHDxlbNVt/GYmoBBqLx10m4d7bOzOnRD8V2aP3Cr6/g/bfubR4EkbW1ySrnPr62svZIeND2fdp3Q==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@1.0.34': - resolution: {integrity: sha512-AnGoxVNZ/E3EU4lW12rrufI6riqL2cEv4jk3OrjJ/i54XwR0CJU1V26jXAwxb+Pc+uZmYG++HM+gzXxPQZkMNQ==} - engines: {node: '>=18'} + '@ai-sdk/openai@4.0.11': + resolution: {integrity: sha512-2PLnVPBsdJusgquPVYgPWd3ox4lbUFkp7DVUSmM0lQ4VISQoNxdgo6TvFAHgwQn9wJ/ckVYVRLU7+BvHc7T8ww==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.99': - resolution: {integrity: sha512-wwa1/DuO9XThaA+sAi0d3+xfkbEx9nRhZ1USV6kktndmEs8aQRR0DJK/Iec+mwNu06IhfDGd5vMscR1U1q155g==} - engines: {node: '>=18'} + '@ai-sdk/provider-utils@5.0.7': + resolution: {integrity: sha512-OSm5/5kdrHa11WIOo5LYgDKnxYWp5aB/wx5EXRHi0jpUGduMDeB6oht9U6p+UNNWIP3F/EqPpV8d7vdP/iRnqg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.20': - resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider-utils@3.0.22': - resolution: {integrity: sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider@2.0.1': - resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} - engines: {node: '>=18'} + '@ai-sdk/provider@4.0.3': + resolution: {integrity: sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==} + engines: {node: '>=22'} '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} @@ -2344,15 +2332,12 @@ packages: cpu: [x64] os: [win32] - '@openrouter/ai-sdk-provider@1.5.4': - resolution: {integrity: sha512-xrSQPUIH8n9zuyYZR0XK7Ba0h2KsjJcMkxnwaYfmv13pKs3sDkjPzVPPhlhzqBGddHb5cFEwJ9VFuFeDcxCDSw==} - engines: {node: '>=18'} + '@openrouter/ai-sdk-provider@3.0.0': + resolution: {integrity: sha512-m9XTSWoODH2RM5OsZpaGiN7QRR8cdP5paBWq699Tu3JVmGPBKT8xF8XwV0ZBVVsjikD/JgWfak4VSsTR4wAVbg==} + engines: {node: '>=22'} peerDependencies: - ai: ^5.0.0 - zod: ^3.24.1 || ^v4 - - '@openrouter/sdk@0.1.27': - resolution: {integrity: sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ==} + ai: ^7.0.0 + zod: ^3.25.76 || ^4.1.8 '@opentelemetry/api-logs@0.208.0': resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} @@ -4339,12 +4324,8 @@ packages: '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} - '@vercel/oidc@3.0.5': - resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==} - engines: {node: '>= 20'} - - '@vercel/oidc@3.1.0': - resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + '@vercel/oidc@3.2.0': + resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} engines: {node: '>= 20'} '@vitejs/plugin-react@5.1.2': @@ -4430,6 +4411,9 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + '@xmldom/xmldom@0.8.11': resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} @@ -4506,15 +4490,9 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@5.0.117: - resolution: {integrity: sha512-uE6HNkdSwxbeHGKP/YbvapwD8fMOpj87wyfT9Z00pbzOh2fpnw5acak/4kzU00SX2vtI9K0uuy+9Tf9ytw5RwA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - ai@5.0.151: - resolution: {integrity: sha512-tsLIv+QN9wJ/xl/fnYgjRYoGSThdnOfU4d6+7QEUKX3EcwviWMEaL1gOE+zfdkcay/Tbc02ZBtTRHoulS6DYvQ==} - engines: {node: '>=18'} + ai@7.0.22: + resolution: {integrity: sha512-iAXYwQtR18qN7GXwNmGVAQM4uSJOh2+nZ5RP9NtDXfH5d4tlYyYzAM133O3U+eVcyWrvNRzecN9yW58xpCdfMg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -5681,6 +5659,10 @@ packages: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + eventsource@3.0.7: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} @@ -7314,10 +7296,11 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - ollama-ai-provider-v2@1.5.5: - resolution: {integrity: sha512-1YwTFdPjhPNHny/DrOHO+s8oVGGIE5Jib61/KnnjPRNWQhVVimrJJdaAX3e6nNRRDXrY5zbb9cfm2+yVvgsrqw==} - engines: {node: '>=18'} + ollama-ai-provider-v2@4.0.1: + resolution: {integrity: sha512-JHw/Knt4kOTSwQ0oqorbdgzukK6iE73U3MPUyOuCEBpAQGAzm80CQDwyaXMwF80yFjY21RY9qfzkoLyPFFts/w==} + engines: {node: '>=22'} peerDependencies: + ai: ^7.0.0 zod: ^4.0.16 on-exit-leak-free@2.1.2: @@ -9238,59 +9221,46 @@ snapshots: dependencies: zod: 4.4.3 - '@ai-sdk/anthropic@2.0.70(zod@4.2.1)': + '@ai-sdk/anthropic@4.0.12(zod@4.2.1)': dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.22(zod@4.2.1) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.7(zod@4.2.1) zod: 4.2.1 - '@ai-sdk/gateway@2.0.24(zod@4.2.1)': + '@ai-sdk/gateway@4.0.16(zod@4.2.1)': dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@4.2.1) - '@vercel/oidc': 3.0.5 + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.7(zod@4.2.1) + '@vercel/oidc': 3.2.0 zod: 4.2.1 - '@ai-sdk/gateway@2.0.56(zod@4.2.1)': + '@ai-sdk/google@4.0.12(zod@4.2.1)': dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.22(zod@4.2.1) - '@vercel/oidc': 3.1.0 + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.7(zod@4.2.1) zod: 4.2.1 - '@ai-sdk/google@2.0.61(zod@4.2.1)': + '@ai-sdk/openai-compatible@3.0.7(zod@4.2.1)': dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.22(zod@4.2.1) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.7(zod@4.2.1) zod: 4.2.1 - '@ai-sdk/openai-compatible@1.0.34(zod@4.2.1)': + '@ai-sdk/openai@4.0.11(zod@4.2.1)': dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.22(zod@4.2.1) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.7(zod@4.2.1) zod: 4.2.1 - '@ai-sdk/openai@2.0.99(zod@4.2.1)': + '@ai-sdk/provider-utils@5.0.7(zod@4.2.1)': dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.22(zod@4.2.1) - zod: 4.2.1 - - '@ai-sdk/provider-utils@3.0.20(zod@4.2.1)': - dependencies: - '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider': 4.0.3 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.1.0 zod: 4.2.1 - '@ai-sdk/provider-utils@3.0.22(zod@4.2.1)': - dependencies: - '@ai-sdk/provider': 2.0.1 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 4.2.1 - - '@ai-sdk/provider@2.0.1': + '@ai-sdk/provider@4.0.3': dependencies: json-schema: 0.4.0 @@ -10319,14 +10289,14 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} - '@eigenpal/docx-editor-agents@1.0.3(ai@5.0.117(zod@4.2.1))(react@19.2.3)': + '@eigenpal/docx-editor-agents@1.0.3(ai@7.0.22(zod@4.2.1))(react@19.2.3)': dependencies: docxtemplater: 3.68.7 jszip: 3.10.1 pizzip: 3.2.0 xml-js: 1.6.11 optionalDependencies: - ai: 5.0.117(zod@4.2.1) + ai: 7.0.22(zod@4.2.1) react: 19.2.3 '@eigenpal/docx-editor-core@1.0.3(prosemirror-commands@1.7.1)(prosemirror-dropcursor@1.8.2)(prosemirror-history@1.5.0)(prosemirror-keymap@1.2.3)(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-tables@1.8.5)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8)': @@ -10347,9 +10317,9 @@ snapshots: '@eigenpal/docx-editor-i18n@1.0.3': {} - '@eigenpal/docx-editor-react@1.0.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(ai@5.0.117(zod@4.2.1))(prosemirror-commands@1.7.1)(prosemirror-dropcursor@1.8.2)(prosemirror-history@1.5.0)(prosemirror-keymap@1.2.3)(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-tables@1.8.5)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@eigenpal/docx-editor-react@1.0.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(ai@7.0.22(zod@4.2.1))(prosemirror-commands@1.7.1)(prosemirror-dropcursor@1.8.2)(prosemirror-history@1.5.0)(prosemirror-keymap@1.2.3)(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-tables@1.8.5)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@eigenpal/docx-editor-agents': 1.0.3(ai@5.0.117(zod@4.2.1))(react@19.2.3) + '@eigenpal/docx-editor-agents': 1.0.3(ai@7.0.22(zod@4.2.1))(react@19.2.3) '@eigenpal/docx-editor-core': 1.0.3(prosemirror-commands@1.7.1)(prosemirror-dropcursor@1.8.2)(prosemirror-history@1.5.0)(prosemirror-keymap@1.2.3)(prosemirror-model@1.25.7)(prosemirror-state@1.4.4)(prosemirror-tables@1.8.5)(prosemirror-transform@1.12.0)(prosemirror-view@1.41.8) '@eigenpal/docx-editor-i18n': 1.0.3 '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -11653,16 +11623,11 @@ snapshots: '@openai/codex@0.142.5-win32-x64': optional: true - '@openrouter/ai-sdk-provider@1.5.4(ai@5.0.151(zod@4.2.1))(zod@4.2.1)': + '@openrouter/ai-sdk-provider@3.0.0(ai@7.0.22(zod@4.2.1))(zod@4.2.1)': dependencies: - '@openrouter/sdk': 0.1.27 - ai: 5.0.151(zod@4.2.1) + ai: 7.0.22(zod@4.2.1) zod: 4.2.1 - '@openrouter/sdk@0.1.27': - dependencies: - zod: 4.4.3 - '@opentelemetry/api-logs@0.208.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -13932,9 +13897,7 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vercel/oidc@3.0.5': {} - - '@vercel/oidc@3.1.0': {} + '@vercel/oidc@3.2.0': {} '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(yaml@2.8.2))': dependencies: @@ -14075,6 +14038,8 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@workflow/serde@4.1.0': {} + '@xmldom/xmldom@0.8.11': {} '@xmldom/xmldom@0.9.10': {} @@ -14142,20 +14107,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@5.0.117(zod@4.2.1): + ai@7.0.22(zod@4.2.1): dependencies: - '@ai-sdk/gateway': 2.0.24(zod@4.2.1) - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@4.2.1) - '@opentelemetry/api': 1.9.0 - zod: 4.2.1 - - ai@5.0.151(zod@4.2.1): - dependencies: - '@ai-sdk/gateway': 2.0.56(zod@4.2.1) - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.22(zod@4.2.1) - '@opentelemetry/api': 1.9.0 + '@ai-sdk/gateway': 4.0.16(zod@4.2.1) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.7(zod@4.2.1) zod: 4.2.1 ajv-formats@2.1.1(ajv@8.17.1): @@ -15454,6 +15410,8 @@ snapshots: eventsource-parser@3.0.6: {} + eventsource-parser@3.1.0: {} + eventsource@3.0.7: dependencies: eventsource-parser: 3.0.6 @@ -17544,10 +17502,11 @@ snapshots: obug@2.1.1: {} - ollama-ai-provider-v2@1.5.5(zod@4.2.1): + ollama-ai-provider-v2@4.0.1(ai@7.0.22(zod@4.2.1))(zod@4.2.1): dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@4.2.1) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.7(zod@4.2.1) + ai: 7.0.22(zod@4.2.1) zod: 4.2.1 on-exit-leak-free@2.1.2: {}