From c80f8ad78d0fb2e09aff5463a1d3a0728b5ab816 Mon Sep 17 00:00:00 2001 From: Saxon Fletcher Date: Tue, 18 Aug 2026 19:04:36 +1000 Subject: [PATCH] chore(studio): upgrade AI SDK to v7 (#49167) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Chore / dependency upgrade. ## What is the current behavior? Studio is on AI SDK 6 (`ai` ^6.0.174, `@ai-sdk/react` ^3). Tool approvals still use the v6 `needsApproval` flag on individual tools. ## What is the new behavior? Upgrades Studio to AI SDK 7 (`ai` 7.0.59) and the matching `@ai-sdk/*` packages. Aligns call sites with v7 names (`instructions`, `isStepCount`, `onEnd`, `ToolExecutionOptions`). This is the bottom of stack #49171. Later layers add a shared Confirm card and AssistantQueryCell. ## Additional context - Stack: #49167 → #49168 → #49169 → #49170 - `needsApproval` on tools is left as-is in this PR so the upgrade can land independently. A follow-up can move those gates to `streamText({ toolApproval })` and `experimental_toolApprovalSecret`. - Independent of the notebook preview stack ([#49112](https://github.com/supabase/supabase/pull/49112), [#49159](https://github.com/supabase/supabase/pull/49159)), which should merge first before we wrap notebook proposals in Confirm. ## Test plan - [ ] `pnpm --filter studio test` for `lib/ai/tools/*` and assistant generate path - [ ] Assistant chat still streams and tool-approval SQL / Edge Function still pause for confirm - [ ] Evals still run with mock tools (`needsApproval: false` overrides) ## Summary by CodeRabbit * **Improvements** * Updated AI-powered chat, onboarding, SQL, code completion, and recipe generation workflows for more reliable responses. * Streaming responses now better preserve reasoning and source information where available. * Improved tool privacy notices while preserving dynamically generated tool descriptions. * Refined AI response handling, including step limits and structured policy results. * **Bug Fixes** * Improved compatibility across AI-powered tool interactions and execution scenarios. --- .../Functions/Functions.templates.ts | 16 +- .../lib/ai/generate-assistant-response.ts | 10 +- apps/studio/lib/ai/tool-filter.test.ts | 3 +- apps/studio/lib/ai/tool-filter.ts | 8 +- .../lib/ai/tools/incident-tools.test.ts | 10 +- apps/studio/lib/ai/tools/mock-tools.test.ts | 30 +- apps/studio/lib/ai/tools/mock-tools.ts | 10 +- .../lib/ai/tools/notebook-tools.test.ts | 26 +- apps/studio/lib/ai/tools/report-tools.test.ts | 9 +- apps/studio/lib/ai/tools/studio-tools.test.ts | 6 +- apps/studio/package.json | 14 +- apps/studio/pages/api/ai/code/complete.ts | 14 +- apps/studio/pages/api/ai/onboarding/design.ts | 11 +- apps/studio/pages/api/ai/sql/generate-v4.ts | 12 +- apps/studio/pages/api/ai/sql/policy.ts | 10 +- pnpm-lock.yaml | 368 +++++++++--------- 16 files changed, 291 insertions(+), 266 deletions(-) diff --git a/apps/studio/components/interfaces/Functions/Functions.templates.ts b/apps/studio/components/interfaces/Functions/Functions.templates.ts index cbc555527cb..35783543062 100644 --- a/apps/studio/components/interfaces/Functions/Functions.templates.ts +++ b/apps/studio/components/interfaces/Functions/Functions.templates.ts @@ -146,7 +146,12 @@ app.listen(8000);`, import "jsr:@supabase/functions-js/edge-runtime.d.ts"; import { withSupabase } from "jsr:@supabase/server@^1"; import { createOpenAI } from "npm:@ai-sdk/openai"; -import { convertToModelMessages, streamText } from "npm:ai"; +import { + convertToModelMessages, + createUIMessageStreamResponse, + streamText, + toUIMessageStream, +} from "npm:ai"; const cors = { "Access-Control-Allow-Origin": "*", @@ -186,13 +191,16 @@ export default { const result = streamText({ model, messages: normalizedMessages, - system: SYSTEM_PROMPT, + instructions: SYSTEM_PROMPT, }); - return result.toUIMessageStreamResponse({ + const stream = toUIMessageStream({ + stream: result.stream, sendReasoning: true, sendSources: true, }); + + return createUIMessageStreamResponse({ stream }); } catch (err) { if (err instanceof ClientError) { return Response.json({ error: err.message }, { status: 400 }); @@ -268,7 +276,7 @@ export default { const result = await generateText({ model, - system: SYSTEM_PROMPT, + instructions: SYSTEM_PROMPT, prompt, output: Output.object({ schema: RecipeSchema, diff --git a/apps/studio/lib/ai/generate-assistant-response.ts b/apps/studio/lib/ai/generate-assistant-response.ts index 7d949003a22..9f457df4bc5 100644 --- a/apps/studio/lib/ai/generate-assistant-response.ts +++ b/apps/studio/lib/ai/generate-assistant-response.ts @@ -1,8 +1,8 @@ import * as ai from 'ai' import { convertToModelMessages, + isStepCount, isToolUIPart, - stepCountIs, type LanguageModel, type ModelMessage, type SystemModelMessage, @@ -153,14 +153,14 @@ export async function generateAssistantResponse({ return streamTextFn({ model, - system: systemMessage, - stopWhen: stepCountIs(10), + instructions: systemMessage, + stopWhen: isStepCount(10), messages: coreMessages, ...(providerOptions && { providerOptions }), tools, ...(abortSignal && { abortSignal }), ...(span && { - onFinish: ({ steps, finishReason }) => { + onEnd: ({ steps, finishReason }) => { const metadata: Record = { isFinalStep: finishReason === 'stop', } @@ -180,7 +180,7 @@ export async function generateAssistantResponse({ } if (shouldTrace) { - // startSpan instead of traced() so we control when the span closes via onFinish. + // startSpan instead of traced() so we control when the span closes via onEnd. // Scorers read from child spans (LLM + tool) in the trace rather than a root span output field. const span = startSpan({ name: 'generateAssistantResponse', type: 'function' }) onSpanCreated?.(span.id) diff --git a/apps/studio/lib/ai/tool-filter.test.ts b/apps/studio/lib/ai/tool-filter.test.ts index dfd026ed96f..c681d754493 100644 --- a/apps/studio/lib/ai/tool-filter.test.ts +++ b/apps/studio/lib/ai/tool-filter.test.ts @@ -42,7 +42,8 @@ describe('tool allowance by opt-in level', () => { Object.entries(filtered).forEach(([toolName, tool]) => { // Check if tool is actually allowed (not stubbed) - const isStubbed = tool.description?.includes('Requires opting in') + const isStubbed = + typeof tool.description === 'string' && tool.description.includes('Requires opting in') if (!isStubbed) { allowedTools.push(toolName) } diff --git a/apps/studio/lib/ai/tool-filter.ts b/apps/studio/lib/ai/tool-filter.ts index a2256aa5e24..9b296d0c0da 100644 --- a/apps/studio/lib/ai/tool-filter.ts +++ b/apps/studio/lib/ai/tool-filter.ts @@ -163,10 +163,16 @@ export function createPrivacyMessageTool(toolInstance: Tool) { "You don't have permission to use this tool. This is an organization-wide setting requiring you to opt-in. Please choose your preferred data sharing level in your organization's settings. Supabase Assistant uses Amazon Bedrock, which does not store or log your prompts and completions, use them to train AWS models, or distribute them to third parties. By default, no data is shared. Granting permission allows Supabase to send information (like schema, logs, or data, depending on your chosen level) to Bedrock solely to generate responses." const condensedPrivacyMessage = 'Requires opting in to sending data to Bedrock which does not store, train on, or distribute it. You can opt in via organization settings.' + const toolDescription = toolInstance.description + const description = + typeof toolDescription === 'function' + ? (...args: Parameters) => + `${toolDescription(...args)} (Note: ${condensedPrivacyMessage})` + : `${toolDescription ?? ''} (Note: ${condensedPrivacyMessage})` return { ...toolInstance, - description: `${toolInstance.description} (Note: ${condensedPrivacyMessage})`, + description, execute: async (_args: any, _context: any) => ({ status: privacyMessage }), } } diff --git a/apps/studio/lib/ai/tools/incident-tools.test.ts b/apps/studio/lib/ai/tools/incident-tools.test.ts index dee4afe52c9..056b57c0bac 100644 --- a/apps/studio/lib/ai/tools/incident-tools.test.ts +++ b/apps/studio/lib/ai/tools/incident-tools.test.ts @@ -73,7 +73,10 @@ describe('ai/tools/incident-tools', () => { const tools = getIncidentTools({ baseUrl: 'https://example.com/dashboard' }) if (!tools.get_active_incidents.execute) throw new Error('execute is undefined') - await tools.get_active_incidents.execute({}, { toolCallId: 'test', messages: [] }) + await tools.get_active_incidents.execute( + {}, + { toolCallId: 'test', messages: [], context: {} } + ) expect(mockFetch).toHaveBeenCalledWith( 'https://example.com/dashboard/api/incident-status', @@ -210,7 +213,10 @@ describe('ai/tools/incident-tools', () => { const tools = getIncidentTools({ baseUrl: 'https://supabase.com/dashboard' }) if (!tools.get_active_incidents.execute) throw new Error('execute is undefined') - await tools.get_active_incidents.execute({}, { toolCallId: 'test', messages: [] }) + await tools.get_active_incidents.execute( + {}, + { toolCallId: 'test', messages: [], context: {} } + ) const callArgs = mockFetch.mock.calls[0] expect(callArgs[1].signal).toBeInstanceOf(AbortSignal) diff --git a/apps/studio/lib/ai/tools/mock-tools.test.ts b/apps/studio/lib/ai/tools/mock-tools.test.ts index bbd437a5add..1cd7f5ee101 100644 --- a/apps/studio/lib/ai/tools/mock-tools.test.ts +++ b/apps/studio/lib/ai/tools/mock-tools.test.ts @@ -74,7 +74,7 @@ describe('ai/tools/mock-tools getMockTools', () => { const result = await mockTools.list_notebooks.execute( { limit: 20 }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(result.notebooks.map((notebook) => notebook.name)).toEqual([ @@ -92,7 +92,7 @@ describe('ai/tools/mock-tools getMockTools', () => { const result = await mockTools.get_notebook.execute( { id: AUTH_HEALTH_NOTEBOOK_ID }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(result.cells.map((cell) => cell._tag)).toEqual([ @@ -112,7 +112,7 @@ describe('ai/tools/mock-tools getMockTools', () => { await expect( mockTools.get_notebook.execute( { id: 'unknown-notebook-id' }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) ).rejects.toThrow(/not found/i) }) @@ -140,20 +140,20 @@ describe('ai/tools/mock-tools getMockTools', () => { const created = await mockTools.create_notebook.execute( { name: 'New notebook', content }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(created).toEqual({ id: expect.any(String), name: 'New notebook' }) const fetched = await mockTools.get_notebook.execute( { id: created.id }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(fetched.cells).toHaveLength(2) expect(fetched.cells.every((cell) => typeof cell.id === 'string')).toBe(true) const listed = await mockTools.list_notebooks.execute( { limit: 20 }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(listed.notebooks).toHaveLength(3) const newEntry = listed.notebooks.find((notebook) => notebook.id === created.id) @@ -175,7 +175,7 @@ describe('ai/tools/mock-tools getMockTools', () => { const before = await mockTools.get_notebook.execute( { id: AUTH_HEALTH_NOTEBOOK_ID }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) const [markdownCell, , logCell] = before.cells @@ -192,13 +192,13 @@ describe('ai/tools/mock-tools getMockTools', () => { { _tag: 'delete_cell', cell_id: logCell.id }, ], }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(result).toEqual({ id: AUTH_HEALTH_NOTEBOOK_ID, name: 'Auth health check' }) const after = await mockTools.get_notebook.execute( { id: AUTH_HEALTH_NOTEBOOK_ID }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(after.cells.map((cell) => cell._tag)).toEqual([ 'markdown_cell', @@ -208,7 +208,7 @@ describe('ai/tools/mock-tools getMockTools', () => { const listed = await mockTools.list_notebooks.execute( { limit: 20 }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) const entry = listed.notebooks.find((notebook) => notebook.id === AUTH_HEALTH_NOTEBOOK_ID) expect(entry?.cell_count).toBe(3) @@ -221,7 +221,7 @@ describe('ai/tools/mock-tools getMockTools', () => { const before = await mockTools.get_notebook.execute( { id: EDGE_FUNCTION_NOTEBOOK_ID }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) await expect( @@ -231,13 +231,13 @@ describe('ai/tools/mock-tools getMockTools', () => { expected_updated_at: before.updated_at, operations: [{ _tag: 'delete_cell', cell_id: 'does-not-exist' }], }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) ).rejects.toThrow(/does-not-exist/) const after = await mockTools.get_notebook.execute( { id: EDGE_FUNCTION_NOTEBOOK_ID }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(after.cells.map((cell) => cell._tag)).toEqual(['markdown_cell', 'log_cell']) }) @@ -251,7 +251,7 @@ describe('ai/tools/mock-tools getMockTools', () => { name: 'Ephemeral notebook', content: { schema_version: 1, cells: [{ _tag: 'markdown_cell', text: 'hi' }] }, }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) const secondCall = await getMockTools(undefined, new AbortController().signal) @@ -259,7 +259,7 @@ describe('ai/tools/mock-tools getMockTools', () => { const result = await secondCall.list_notebooks.execute( { limit: 20 }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(result.notebooks.map((notebook) => notebook.name)).toEqual([ 'Auth health check', diff --git a/apps/studio/lib/ai/tools/mock-tools.ts b/apps/studio/lib/ai/tools/mock-tools.ts index 0c06860d0f7..69b959e0337 100644 --- a/apps/studio/lib/ai/tools/mock-tools.ts +++ b/apps/studio/lib/ai/tools/mock-tools.ts @@ -1,5 +1,5 @@ import assert from 'node:assert' -import { tool, type ToolCallOptions, type ToolSet } from 'ai' +import { tool, type ToolExecutionOptions, type ToolSet } from 'ai' import { z } from 'zod' import { getStudioTools } from '../tools/studio-tools' @@ -423,7 +423,7 @@ function createMockNotebookTools(store: MockNotebookStore) { ...list_notebooks, execute: async ( { limit = 20 }: { cursor?: string; limit?: number }, - _options: ToolCallOptions + _options: ToolExecutionOptions ) => ({ notebooks: store .list() @@ -442,7 +442,7 @@ function createMockNotebookTools(store: MockNotebookStore) { }, get_notebook: { ...get_notebook, - execute: async ({ id }: { id: string }, _options: ToolCallOptions) => { + execute: async ({ id }: { id: string }, _options: ToolExecutionOptions) => { const notebook = store.get(id) if (!notebook) throw new Error(`Notebook ${id} not found.`) @@ -475,7 +475,7 @@ function createMockNotebookTools(store: MockNotebookStore) { description?: string content: AgentNotebook }, - _options: ToolCallOptions + _options: ToolExecutionOptions ) => { const created = store.create({ name, description, content }) return { id: created.id, name: created.name } @@ -493,7 +493,7 @@ function createMockNotebookTools(store: MockNotebookStore) { id, operations, }: { id: string; expected_updated_at: string; operations: NotebookOperation[] }, - _options: ToolCallOptions + _options: ToolExecutionOptions ) => { const notebook = store.get(id) if (!notebook) throw new Error(`Notebook ${id} not found.`) diff --git a/apps/studio/lib/ai/tools/notebook-tools.test.ts b/apps/studio/lib/ai/tools/notebook-tools.test.ts index 3185c8315a9..81f080b4c89 100644 --- a/apps/studio/lib/ai/tools/notebook-tools.test.ts +++ b/apps/studio/lib/ai/tools/notebook-tools.test.ts @@ -114,7 +114,7 @@ describe('ai/tools/notebook-tools', () => { const result = await tools.list_notebooks.execute( { limit: 20, cursor: 'prev-page' }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(capturedRequest?.headers.get('authorization')).toBe('Bearer token') @@ -159,7 +159,7 @@ describe('ai/tools/notebook-tools', () => { await tools.list_notebooks.execute( { limit: 1, sort_by: 'inserted_at' }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) const url = new URL(capturedRequest!.url) @@ -194,7 +194,7 @@ describe('ai/tools/notebook-tools', () => { const result = await tools.get_notebook.execute( { id: 'notebook-1' }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(result).toEqual({ @@ -248,7 +248,10 @@ describe('ai/tools/notebook-tools', () => { if (!tools.get_notebook.execute) throw new Error('execute is undefined') await expect( - tools.get_notebook.execute({ id: 'snippet-1' }, { toolCallId: 'test', messages: [] }) + tools.get_notebook.execute( + { id: 'snippet-1' }, + { toolCallId: 'test', messages: [], context: {} } + ) ).rejects.toThrow('is not a notebook') }) @@ -263,7 +266,10 @@ describe('ai/tools/notebook-tools', () => { if (!tools.get_notebook.execute) throw new Error('execute is undefined') await expect( - tools.get_notebook.execute({ id: 'missing' }, { toolCallId: 'test', messages: [] }) + tools.get_notebook.execute( + { id: 'missing' }, + { toolCallId: 'test', messages: [], context: {} } + ) ).rejects.toThrow() }) }) @@ -317,7 +323,7 @@ describe('ai/tools/notebook-tools', () => { await tools.create_notebook.execute( { name: 'Signup funnel', content: VALID_AGENT_CONTENT }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(sentBody?.type).toBe('notebook') @@ -351,7 +357,7 @@ describe('ai/tools/notebook-tools', () => { const result = await tools.create_notebook.execute( { name: 'Signup funnel', content: VALID_AGENT_CONTENT }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(typeof sentBody?.id).toBe('string') @@ -410,7 +416,7 @@ describe('ai/tools/notebook-tools', () => { }, ], }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(sentBody?.id).toBe('notebook-1') @@ -439,7 +445,7 @@ describe('ai/tools/notebook-tools', () => { expected_updated_at: '2026-01-01T00:00:00.000Z', operations: [{ _tag: 'delete_cell', cell_id: 'missing-cell' }], }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) ).rejects.toThrow('No cell with id "missing-cell"') }) @@ -457,7 +463,7 @@ describe('ai/tools/notebook-tools', () => { expected_updated_at: '2025-12-31T00:00:00.000Z', operations: [{ _tag: 'delete_cell', cell_id: 'cell-3' }], }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) ).rejects.toThrow(/changed since expected_updated_at/) }) diff --git a/apps/studio/lib/ai/tools/report-tools.test.ts b/apps/studio/lib/ai/tools/report-tools.test.ts index 33cd0a6d202..8dd6dea1524 100644 --- a/apps/studio/lib/ai/tools/report-tools.test.ts +++ b/apps/studio/lib/ai/tools/report-tools.test.ts @@ -66,7 +66,7 @@ describe('ai/tools/report-tools', () => { const result = await tools.list_reports.execute( { limit: 20 }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(capturedRequest?.headers.get('authorization')).toBe('Bearer token') @@ -169,7 +169,7 @@ describe('ai/tools/report-tools', () => { const result = (await tools.get_report.execute( { id: 'report-1' }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } )) as { layout: Array<{ id: string; attribute: string; sql?: string }> } expect(result.layout).toEqual([ @@ -208,7 +208,10 @@ describe('ai/tools/report-tools', () => { if (!tools.get_report.execute) throw new Error('execute is undefined') await expect( - tools.get_report.execute({ id: 'snippet-1' }, { toolCallId: 'test', messages: [] }) + tools.get_report.execute( + { id: 'snippet-1' }, + { toolCallId: 'test', messages: [], context: {} } + ) ).rejects.toThrow('is not a report') }) }) diff --git a/apps/studio/lib/ai/tools/studio-tools.test.ts b/apps/studio/lib/ai/tools/studio-tools.test.ts index 4a090a884c1..24a3c644284 100644 --- a/apps/studio/lib/ai/tools/studio-tools.test.ts +++ b/apps/studio/lib/ai/tools/studio-tools.test.ts @@ -89,7 +89,7 @@ describe('ai/tools/studio-tools', () => { if (!renameTool.execute) throw new Error('execute is undefined') const result = await renameTool.execute( { newName: 'Test Chat' }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(result).toEqual({ status: 'Chat request sent to client' }) }) @@ -154,7 +154,7 @@ describe('ai/tools/studio-tools', () => { chartConfig: { view: 'table' }, isWriteQuery: false, }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(executeSql).toHaveBeenCalledWith( @@ -191,7 +191,7 @@ describe('ai/tools/studio-tools', () => { chartConfig: { view: 'table' }, isWriteQuery: false, }, - { toolCallId: 'test', messages: [] } + { toolCallId: 'test', messages: [], context: {} } ) expect(executeSql).toHaveBeenCalledWith( diff --git a/apps/studio/package.json b/apps/studio/package.json index f574d56d9ff..c420cf881fb 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -39,12 +39,12 @@ "scorers:deploy": "IS_BRAINTRUST_PUSH=true braintrust push evals/scorer-online.ts" }, "dependencies": { - "@ai-sdk/amazon-bedrock": "^4.0.81", - "@ai-sdk/mcp": "^1.0.25", - "@ai-sdk/openai": "^3.0.41", - "@ai-sdk/provider": "^3.0.8", - "@ai-sdk/provider-utils": "^4.0.19", - "@ai-sdk/react": "^3.0.118", + "@ai-sdk/amazon-bedrock": "5.0.55", + "@ai-sdk/mcp": "2.0.31", + "@ai-sdk/openai": "4.0.41", + "@ai-sdk/provider": "4.0.7", + "@ai-sdk/provider-utils": "5.0.26", + "@ai-sdk/react": "4.0.62", "@aws-sdk/credential-providers": "^3.1041.0", "@configcat/sdk": "^1.1.0", "@dagrejs/dagre": "^1.0.4", @@ -92,7 +92,7 @@ "@vercel/functions": "^2.1.0", "@xyflow/react": "^12.10.1", "@zip.js/zip.js": "^2.7.29", - "ai": "^6.0.174", + "ai": "7.0.59", "ai-commands": "workspace:*", "awesome-debounce-promise": "^2.1.0", "braintrust": "^3.9.0", diff --git a/apps/studio/pages/api/ai/code/complete.ts b/apps/studio/pages/api/ai/code/complete.ts index a4b9ff7f20c..1565b7b53ec 100644 --- a/apps/studio/pages/api/ai/code/complete.ts +++ b/apps/studio/pages/api/ai/code/complete.ts @@ -1,5 +1,5 @@ import pgMeta, { getEntityDefinitionsSql } from '@supabase/pg-meta' -import { generateText, ModelMessage, stepCountIs, tool } from 'ai' +import { generateText, isStepCount, ModelMessage, tool } from 'ai' import { IS_PLATFORM } from 'common' import { source } from 'common-tags' import { NextApiRequest, NextApiResponse } from 'next' @@ -288,11 +288,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { // Note: these must be of type `CoreMessage` to prevent AI SDK from stripping `providerOptions` // https://github.com/vercel/ai/blob/81ef2511311e8af34d75e37fc8204a82e775e8c3/packages/ai/core/prompt/standardize-prompt.ts#L83-L88 const coreMessages: ModelMessage[] = [ - { - role: 'system', - content: system, - ...(systemProviderOptions && { providerOptions: systemProviderOptions }), - }, { role: 'user', content: userMessage, @@ -301,7 +296,12 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const { text } = await generateText({ ...modelParams, - stopWhen: stepCountIs(5), + instructions: { + role: 'system', + content: system, + ...(systemProviderOptions && { providerOptions: systemProviderOptions }), + }, + stopWhen: isStepCount(5), messages: coreMessages, tools: includeSchema && !schemaListResult.error diff --git a/apps/studio/pages/api/ai/onboarding/design.ts b/apps/studio/pages/api/ai/onboarding/design.ts index b2714c20e27..0438a47d513 100644 --- a/apps/studio/pages/api/ai/onboarding/design.ts +++ b/apps/studio/pages/api/ai/onboarding/design.ts @@ -1,4 +1,4 @@ -import { streamText, tool } from 'ai' +import { pipeUIMessageStreamToResponse, streamText, tool, toUIMessageStream } from 'ai' import { source } from 'common-tags' import { NextApiRequest, NextApiResponse } from 'next' import { z } from 'zod' @@ -78,7 +78,7 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse) { const result = streamText({ ...modelParams, - system: source` + instructions: source` You are a Supabase expert who helps people set up their Supabase project. You specializes in database schema design. You are to help the user design a database schema for their application but also suggest Supabase services they should use. When designing database schemas, follow these rules: @@ -103,5 +103,10 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse) { tools: getTools(), }) - result.pipeUIMessageStreamToResponse(res, { headers: { 'Content-Encoding': 'none' } }) + const stream = toUIMessageStream({ stream: result.stream }) + pipeUIMessageStreamToResponse({ + response: res, + stream, + headers: { 'Content-Encoding': 'none' }, + }) } diff --git a/apps/studio/pages/api/ai/sql/generate-v4.ts b/apps/studio/pages/api/ai/sql/generate-v4.ts index b4a3a9dc5c2..d8900ab88db 100644 --- a/apps/studio/pages/api/ai/sql/generate-v4.ts +++ b/apps/studio/pages/api/ai/sql/generate-v4.ts @@ -1,6 +1,6 @@ import pgMeta from '@supabase/pg-meta' import type { JwtPayload } from '@supabase/supabase-js' -import { safeValidateUIMessages } from 'ai' +import { pipeUIMessageStreamToResponse, safeValidateUIMessages, toUIMessageStream } from 'ai' import { IS_PLATFORM } from 'common' import type { NextApiRequest, NextApiResponse } from 'next' import z from 'zod' @@ -244,9 +244,9 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse, claims?: Jw }, }) - result.pipeUIMessageStreamToResponse(res, { + const stream = toUIMessageStream({ + stream: result.stream, sendReasoning: true, - headers: { 'Content-Encoding': 'none' }, onError: (error) => { console.error('Assistant stream error:', error) @@ -265,6 +265,12 @@ async function handlePost(req: NextApiRequest, res: NextApiResponse, claims?: Jw return JSON.stringify(error) }, }) + + pipeUIMessageStreamToResponse({ + response: res, + stream, + headers: { 'Content-Encoding': 'none' }, + }) } catch (error) { console.error('Error in handlePost:', error) if (error instanceof Error) { diff --git a/apps/studio/pages/api/ai/sql/policy.ts b/apps/studio/pages/api/ai/sql/policy.ts index 998a0a2b7a4..6edc896bd37 100644 --- a/apps/studio/pages/api/ai/sql/policy.ts +++ b/apps/studio/pages/api/ai/sql/policy.ts @@ -1,5 +1,5 @@ import type { JwtPayload } from '@supabase/supabase-js' -import { generateText, Output, stepCountIs } from 'ai' +import { generateText, isStepCount, Output } from 'ai' import { IS_PLATFORM } from 'common' import { source } from 'common-tags' import { NextApiRequest, NextApiResponse } from 'next' @@ -122,9 +122,9 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse, clai signal: toolsAbortController.signal, }) - const { experimental_output } = await generateText({ + const { output } = await generateText({ ...modelParams, - stopWhen: stepCountIs(5), + stopWhen: isStepCount(5), prompt: source` You are a Postgres RLS (Row Level Security) expert. Determine the most appropriate policies for the "${schema}"."${tableName}" table within a Supabase project. @@ -146,7 +146,7 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse, clai - Prefer PERMISSIVE policies unless a RESTRICTIVE policy is explicitly required `, tools, - experimental_output: Output.object({ + output: Output.object({ schema: z.object({ policies: z.array(policySchema), }), @@ -154,7 +154,7 @@ export async function handlePost(req: NextApiRequest, res: NextApiResponse, clai }) // Add table and schema to each policy from the request - const policies = (experimental_output?.policies ?? []).map((policy) => ({ + const policies = (output?.policies ?? []).map((policy) => ({ ...policy, table: tableName, schema, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 064cd702be1..4f261aae084 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -594,7 +594,7 @@ importers: version: 7.29.7(supports-color@8.1.1) '@graphiql/toolkit': specifier: ^0.9.1 - version: 0.9.1(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0) + version: 0.9.1(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0) '@graphql-codegen/cli': specifier: 5.0.5 version: 5.0.5(@parcel/watcher@2.5.6)(@types/node@22.13.14)(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0)(supports-color@8.1.1)(typescript@6.0.2) @@ -675,7 +675,7 @@ importers: version: 13.2.2 graphiql: specifier: ^4.0.2 - version: 4.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 4.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -886,23 +886,23 @@ importers: apps/studio: dependencies: '@ai-sdk/amazon-bedrock': - specifier: ^4.0.81 - version: 4.0.81(zod@3.25.76) + specifier: 5.0.55 + version: 5.0.55(zod@3.25.76) '@ai-sdk/mcp': - specifier: ^1.0.25 - version: 1.0.25(zod@3.25.76) + specifier: 2.0.31 + version: 2.0.31(zod@3.25.76) '@ai-sdk/openai': - specifier: ^3.0.41 - version: 3.0.41(zod@3.25.76) + specifier: 4.0.41 + version: 4.0.41(zod@3.25.76) '@ai-sdk/provider': - specifier: ^3.0.8 - version: 3.0.8 + specifier: 4.0.7 + version: 4.0.7 '@ai-sdk/provider-utils': - specifier: ^4.0.19 - version: 4.0.19(zod@3.25.76) + specifier: 5.0.26 + version: 5.0.26(zod@3.25.76) '@ai-sdk/react': - specifier: ^3.0.118 - version: 3.0.118(react@19.2.6)(zod@3.25.76) + specifier: 4.0.62 + version: 4.0.62(react@19.2.6)(zod@3.25.76) '@aws-sdk/credential-providers': specifier: ^3.1041.0 version: 3.1041.0 @@ -1045,8 +1045,8 @@ importers: specifier: ^2.7.29 version: 2.7.30 ai: - specifier: ^6.0.174 - version: 6.0.174(zod@3.25.76) + specifier: 7.0.59 + version: 7.0.59(zod@3.25.76) ai-commands: specifier: workspace:* version: link:../../packages/ai-commands @@ -2898,15 +2898,15 @@ packages: '@adobe/css-tools@4.4.0': resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} - '@ai-sdk/amazon-bedrock@4.0.81': - resolution: {integrity: sha512-SP3LIpFt/JlK0sGs6E5jvjySvQqu/nqA942PehIGk3PZPJ5SMPsUNg+PYTs84PTUYEg8rr4XqkQOTNFq12zo2w==} - engines: {node: '>=18'} + '@ai-sdk/amazon-bedrock@5.0.55': + resolution: {integrity: sha512-p064NNPJeXNzkAaagxQKU1Ns9fq7H7iqhv9nfnX89ZHu+3mnBJDf+W6p/lcDCxJfG/naOFJOiafvHRSO40cZoA==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@3.0.62': - resolution: {integrity: sha512-CkShXR8tmNO7QQnvpKbSMe2Vr1zUUcpqlp69iR+DYrbHm+tDJO9u6zZsjEHjcoRU9/e9z++p0W6NiuLC3aZ4Bg==} - engines: {node: '>=18'} + '@ai-sdk/anthropic@4.0.38': + resolution: {integrity: sha512-esbTb5jq/37dloBJzld3CpYCZskiDWGcI4O8kzst9J/0Km4by7cgQXLTB/gGdjXxBsyjPQUeotVqqRRIrx2zew==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2916,21 +2916,21 @@ packages: peerDependencies: zod: ^3.25.76 || ^4 - '@ai-sdk/gateway@3.0.109': - resolution: {integrity: sha512-r6dOqThjODp1vOhGRJg2OCmyB/ZOQtGx1esZ2SDvwDX5XoX8dBqYaYjLg8MPXTzMGJSgOkJyCxWgUcZtAl16pw==} - engines: {node: '>=18'} + '@ai-sdk/gateway@4.0.47': + resolution: {integrity: sha512-BuWWlA8atWEnEJzN4eamCpGZWkoK9V3TCyNaMwgRIazhqkgWkA1Wp36si3j2JeVYzlvlEAOWrJ92dr92j/Vkqg==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.66': - resolution: {integrity: sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A==} - engines: {node: '>=18'} + '@ai-sdk/mcp@2.0.30': + resolution: {integrity: sha512-blXjM1TVI6sYER6PuMd8ZM+nTq57LUHq4Cc5gmFw1ub9204rALpew0iiusYKjgyaEtCuUcFr/ybBr6RavqV/2A==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/mcp@1.0.25': - resolution: {integrity: sha512-vMlXUPGHGDE2vzLcPR8sw7Dhz2OBjtPU5lB+lIuC1hNQo4REuUC08P0e96/hzBKf4oQYJ8Zo6uP8AG2qThyFbg==} - engines: {node: '>=18'} + '@ai-sdk/mcp@2.0.31': + resolution: {integrity: sha512-vBxkIg4CB9wQjWYo5uu1G/Vv3Xhbi3JZ47HoT5ywLNTycxKlY2RGGynTyGqcXLcvWBErRyMygDYVFn8VPc1N+w==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2940,9 +2940,9 @@ packages: peerDependencies: zod: ^3.25.76 || ^4 - '@ai-sdk/openai@3.0.41': - resolution: {integrity: sha512-IZ42A+FO+vuEQCVNqlnAPYQnnUpUfdJIwn1BEDOBywiEHa23fw7PahxVtlX9zm3/zMvTW4JKPzWyvAgDu+SQ2A==} - engines: {node: '>=18'} + '@ai-sdk/openai@4.0.41': + resolution: {integrity: sha512-+WoY0JyF/uV2z+rye7I+hYaVg+hTanG4rYIgsWKvJFDXaAdu9yg07x+BRa2vTgUqzLIBXEBp5d1T7DwMI9ZGlw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2958,21 +2958,15 @@ packages: peerDependencies: zod: ^3.25.76 || ^4 - '@ai-sdk/provider-utils@4.0.19': - resolution: {integrity: sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg==} - engines: {node: '>=18'} + '@ai-sdk/provider-utils@5.0.26': + resolution: {integrity: sha512-0mqhqx+Dcv+msI84+zkbLXmnCHb/mpkYJ9DU3HBvB1px+UjFQss4lLZqRCSzJ0w3NxwQk4Ishk7cP0r8wEQD5w==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.20': - resolution: {integrity: sha512-gpUIj9uDhIGbuo9afKEgQ074BWmhvK4THJAAeBjRnroTy2yQYo6rbtGD7pQDMZM8ouXPYmT/SCdkWVJ0KcpX8A==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider-utils@4.0.26': - resolution: {integrity: sha512-CsKNLKsOpvPujRlIYvoz+Ybw+kGn7J4/fIZa/58+R7iWLLfwn6ifE2G6Yq8K9XvH/I/3bzaDAJ3NhRwEMsLBKQ==} - engines: {node: '>=18'} + '@ai-sdk/provider-utils@5.0.27': + resolution: {integrity: sha512-EzAn4pdgG5g0xXtH6lE2zyNmfjDQIDjATkfqzuidEI35g++hh4+07vnjzkT/RmGmIClPZiRj/Q2GMPV2V7mkHw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2984,17 +2978,13 @@ packages: resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/provider@3.0.10': - resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} - engines: {node: '>=18'} + '@ai-sdk/provider@4.0.7': + resolution: {integrity: sha512-6or44XprPzKbr8zkmzosowSE0pxkvJcoojBL+mCZvPUt3kvXp3XSNqeVun9golb1acEfSo6yaEBRT18h2VU+1Q==} + engines: {node: '>=22'} - '@ai-sdk/provider@3.0.8': - resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} - engines: {node: '>=18'} - - '@ai-sdk/react@3.0.118': - resolution: {integrity: sha512-fBAix8Jftxse6/2YJnOFkwW1/O6EQK4DK68M9DlFmZGAzBmsaHXEPVS77sVIlkaOWCy11bE7434NAVXRY+3OsQ==} - engines: {node: '>=18'} + '@ai-sdk/react@4.0.62': + resolution: {integrity: sha512-Fe3PZmbSzBBmVDE4+HqHJ3x6mYhZ8riUR+3fyjSY+xiRuAntkVkH/MTh0kylvteeRlpgNA4tDDFOTiZfcLPbgg==} + engines: {node: '>=22'} peerDependencies: react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 @@ -3042,10 +3032,6 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} @@ -7227,12 +7213,16 @@ packages: resolution: {integrity: sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ==} engines: {node: '>=18.0.0'} + '@smithy/core@3.31.1': + resolution: {integrity: sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.14': resolution: {integrity: sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.4': - resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} + '@smithy/eventstream-codec@4.4.16': + resolution: {integrity: sha512-u6l4XW99ESjEikMOGENsZxJblxWNvkTLRbCWcC1c2VwNdmd4QgviN2RRlZxliVWEzG3kyU/m0y3iuVFtLL/6jA==} engines: {node: '>=18.0.0'} '@smithy/fetch-http-handler@5.3.17': @@ -7323,6 +7313,10 @@ packages: resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==} engines: {node: '>=18.0.0'} + '@smithy/types@4.16.1': + resolution: {integrity: sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.3.1': resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} engines: {node: '>=18.0.0'} @@ -7367,10 +7361,6 @@ packages: resolution: {integrity: sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} - engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.2.2': resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} engines: {node: '>=18.0.0'} @@ -7395,14 +7385,14 @@ packages: resolution: {integrity: sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} - engines: {node: '>=18.0.0'} - '@smithy/util-utf8@4.2.2': resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} + '@smithy/util-utf8@4.4.16': + resolution: {integrity: sha512-/gSbVMQlLRcneJ8D/JGbB1DNf0w4I7OpY2ldNUJ+myDmakPXEm9fy/X4swDlNYTOwBwsCKVJsogCfe7Txjnolg==} + engines: {node: '>=18.0.0'} + '@smithy/uuid@1.1.2': resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} @@ -8787,10 +8777,6 @@ packages: resolution: {integrity: sha512-OTe0KE37F5Y2eTys6eMnfopC+P4qr2ooXUTFyFPTplYSPwowmFk/HLD1FXtbKLjqsIH0SgekcJWad+C5uX4nkg==} engines: {node: '>=16'} - '@vercel/oidc@3.1.0': - resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} - engines: {node: '>= 20'} - '@vercel/oidc@3.2.0': resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} engines: {node: '>= 20'} @@ -9043,6 +9029,9 @@ packages: resolution: {integrity: sha512-D+OwTEunoQhVHVToD80dPhfz9xgPLqJyEA3F5jCRM14A2u8tBBQVdZekqfqx6ZAfZ+POT4Hb0dn601UKMsvADw==} engines: {node: '>=16.0.0'} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + '@xobotyi/scrollbar-width@1.9.5': resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} @@ -9160,15 +9149,9 @@ packages: peerDependencies: zod: ^3.25.76 || ^4 - ai@6.0.116: - resolution: {integrity: sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - ai@6.0.174: - resolution: {integrity: sha512-bTrfLUWHWtkjzWyCY4bmyuk4Qvmj4S4NSNsXyNSVVqkmftQNtxRj7dzUoMeQDBBwlJO6fC7m2Q/lNOPqQQfAGA==} - engines: {node: '>=18'} + ai@7.0.59: + resolution: {integrity: sha512-p10cqg8KvLIZi7Gk+XsQjoYoLENoDdEYvehP0rSo6Wg15nbCmP+nwIy1rOIX+WGIDWGdI+jmhjVx5fXShBVC3w==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -14765,6 +14748,10 @@ packages: resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -16481,10 +16468,10 @@ packages: resolution: {integrity: sha512-4gILrI3vXZqoZh71I1PALqukCFgk+gpOwe1tOvz5uE9kHtl2gTDzmYflYCwWvR4LOvCrJi6UEEU+gnuW5BtkgQ==} engines: {node: '>= 4.7.0'} - swr@2.2.5: - resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} + swr@2.5.0: + resolution: {integrity: sha512-W0GomadRJe9OfzIoRX0kZHhDSaRRfdiOUeH6uazgR05SibBhDNwfdTbhAxmFtObvkf59fFymo22mooKukosvNA==} peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -18006,20 +17993,21 @@ snapshots: '@adobe/css-tools@4.4.0': {} - '@ai-sdk/amazon-bedrock@4.0.81(zod@3.25.76)': + '@ai-sdk/amazon-bedrock@5.0.55(zod@3.25.76)': dependencies: - '@ai-sdk/anthropic': 3.0.62(zod@3.25.76) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.20(zod@3.25.76) - '@smithy/eventstream-codec': 4.0.4 - '@smithy/util-utf8': 4.0.0 + '@ai-sdk/anthropic': 4.0.38(zod@3.25.76) + '@ai-sdk/openai': 4.0.41(zod@3.25.76) + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.27(zod@3.25.76) + '@smithy/eventstream-codec': 4.4.16 + '@smithy/util-utf8': 4.4.16 aws4fetch: 1.0.20 zod: 3.25.76 - '@ai-sdk/anthropic@3.0.62(zod@3.25.76)': + '@ai-sdk/anthropic@4.0.38(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.20(zod@3.25.76) + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.27(zod@3.25.76) zod: 3.25.76 '@ai-sdk/gateway@1.0.29(zod@3.25.76)': @@ -18028,25 +18016,25 @@ snapshots: '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/gateway@3.0.109(zod@3.25.76)': + '@ai-sdk/gateway@4.0.47(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.26(zod@3.25.76) '@vercel/oidc': 3.2.0 zod: 3.25.76 - '@ai-sdk/gateway@3.0.66(zod@3.25.76)': + '@ai-sdk/mcp@2.0.30(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) - '@vercel/oidc': 3.1.0 + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.26(zod@3.25.76) + pkce-challenge: 5.0.1 zod: 3.25.76 - '@ai-sdk/mcp@1.0.25(zod@3.25.76)': + '@ai-sdk/mcp@2.0.31(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) - pkce-challenge: 5.0.0 + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.27(zod@3.25.76) + pkce-challenge: 5.0.1 zod: 3.25.76 '@ai-sdk/openai@2.0.2(zod@3.25.76)': @@ -18055,17 +18043,17 @@ snapshots: '@ai-sdk/provider-utils': 3.0.0(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai@3.0.41(zod@3.25.76)': + '@ai-sdk/openai@4.0.41(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.27(zod@3.25.76) zod: 3.25.76 '@ai-sdk/provider-utils@3.0.0(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.0.8 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) @@ -18073,30 +18061,27 @@ snapshots: dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 3.25.76 - - '@ai-sdk/provider-utils@4.0.19(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 3.25.76 - - '@ai-sdk/provider-utils@4.0.20(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 3.25.76 - - '@ai-sdk/provider-utils@4.0.26(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 3.0.10 - '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.8 zod: 3.25.76 + '@ai-sdk/provider-utils@5.0.26(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 4.0.7 + '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.0.8 + undici: 7.29.0 + zod: 3.25.76 + + '@ai-sdk/provider-utils@5.0.27(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 4.0.7 + '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.0.8 + undici: 7.29.0 + zod: 3.25.76 + '@ai-sdk/provider@1.1.3': dependencies: json-schema: 0.4.0 @@ -18105,20 +18090,18 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.10': + '@ai-sdk/provider@4.0.7': dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.8': + '@ai-sdk/react@4.0.62(react@19.2.6)(zod@3.25.76)': dependencies: - json-schema: 0.4.0 - - '@ai-sdk/react@3.0.118(react@19.2.6)(zod@3.25.76)': - dependencies: - '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) - ai: 6.0.116(zod@3.25.76) + '@ai-sdk/mcp': 2.0.30(zod@3.25.76) + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.26(zod@3.25.76) + ai: 7.0.59(zod@3.25.76) react: 19.2.6 - swr: 2.2.5(react@19.2.6) + swr: 2.5.0(react@19.2.6) throttleit: 2.1.0 transitivePeerDependencies: - zod @@ -18206,12 +18189,6 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.8 - tslib: 2.8.1 - '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 @@ -19637,9 +19614,9 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@graphiql/plugin-doc-explorer@0.0.1(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@graphiql/plugin-doc-explorer@0.0.1(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@graphiql/react': 0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@graphiql/react': 0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@headlessui/react': 2.2.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) graphql: 16.11.0 react: 19.2.6 @@ -19667,10 +19644,10 @@ snapshots: - immer - use-sync-external-store - '@graphiql/plugin-history@0.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@graphiql/plugin-history@0.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@graphiql/react': 0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@graphiql/toolkit': 0.11.3(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0) + '@graphiql/react': 0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@graphiql/toolkit': 0.11.3(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0) react: 19.2.6 react-compiler-runtime: 19.1.0-rc.1(react@19.2.6) react-dom: 19.2.6(react@19.2.6) @@ -19699,9 +19676,9 @@ snapshots: - immer - use-sync-external-store - '@graphiql/react@0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@graphiql/react@0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@graphiql/toolkit': 0.11.3(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0) + '@graphiql/toolkit': 0.11.3(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -19769,23 +19746,23 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@graphiql/toolkit@0.11.3(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)': + '@graphiql/toolkit@0.11.3(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)': dependencies: '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 graphql: 16.11.0 meros: 1.3.0(@types/node@22.13.14) optionalDependencies: - graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.21.0) + graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.21.3) transitivePeerDependencies: - '@types/node' - '@graphiql/toolkit@0.9.1(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)': + '@graphiql/toolkit@0.9.1(@types/node@22.13.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)': dependencies: '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 graphql: 16.11.0 meros: 1.3.0(@types/node@22.13.14) optionalDependencies: - graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.21.0) + graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.21.3) transitivePeerDependencies: - '@types/node' @@ -23495,6 +23472,11 @@ snapshots: '@smithy/uuid': 1.1.2 tslib: 2.8.1 + '@smithy/core@3.31.1': + dependencies: + '@smithy/types': 4.16.1 + tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.14': dependencies: '@smithy/node-config-provider': 4.3.14 @@ -23503,11 +23485,9 @@ snapshots: '@smithy/url-parser': 4.2.14 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.4': + '@smithy/eventstream-codec@4.4.16': dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.1 - '@smithy/util-hex-encoding': 4.0.0 + '@smithy/core': 3.31.1 tslib: 2.8.1 '@smithy/fetch-http-handler@5.3.17': @@ -23654,6 +23634,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/types@4.16.1': + dependencies: + tslib: 2.8.1 + '@smithy/types@4.3.1': dependencies: tslib: 2.8.1 @@ -23715,10 +23699,6 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.0.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-hex-encoding@4.2.2': dependencies: tslib: 2.8.1 @@ -23754,14 +23734,14 @@ snapshots: '@smithy/util-buffer-from': 2.0.0 tslib: 2.8.1 - '@smithy/util-utf8@4.0.0': + '@smithy/util-utf8@4.2.2': dependencies: '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 - '@smithy/util-utf8@4.2.2': + '@smithy/util-utf8@4.4.16': dependencies: - '@smithy/util-buffer-from': 4.2.2 + '@smithy/core': 3.31.1 tslib: 2.8.1 '@smithy/uuid@1.1.2': @@ -25281,8 +25261,6 @@ snapshots: satori: 0.10.9 yoga-wasm-web: 0.3.3 - '@vercel/oidc@3.1.0': {} - '@vercel/oidc@3.2.0': {} '@vercel/routing-utils@6.1.1': @@ -25671,6 +25649,8 @@ snapshots: dependencies: tslib: 2.8.1 + '@workflow/serde@4.1.0': {} + '@xobotyi/scrollbar-width@1.9.5': {} '@xtuc/ieee754@1.2.0': {} @@ -25746,6 +25726,10 @@ snapshots: dependencies: acorn: 8.16.0 + acorn-jsx@5.3.2(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + acorn-typescript@1.4.13(acorn@8.11.3): dependencies: acorn: 8.11.3 @@ -25789,20 +25773,11 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.76 - ai@6.0.116(zod@3.25.76): + ai@7.0.59(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 3.0.66(zod@3.25.76) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - zod: 3.25.76 - - ai@6.0.174(zod@3.25.76): - dependencies: - '@ai-sdk/gateway': 3.0.109(zod@3.25.76) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) - '@opentelemetry/api': 1.9.0 + '@ai-sdk/gateway': 4.0.47(zod@3.25.76) + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.26(zod@3.25.76) zod: 3.25.76 ajv-formats@2.1.1(ajv@8.18.0): @@ -28046,8 +28021,8 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -28135,7 +28110,7 @@ snapshots: eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.6 + eventsource-parser: 3.0.8 execa@1.0.0: dependencies: @@ -28803,11 +28778,11 @@ snapshots: graceful-fs@4.2.11: {} - graphiql@4.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + graphiql@4.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - '@graphiql/plugin-doc-explorer': 0.0.1(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@graphiql/plugin-history': 0.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@graphiql/react': 0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.0))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@graphiql/plugin-doc-explorer': 0.0.1(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@graphiql/plugin-history': 0.0.2(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@graphiql/react': 0.32.0(@codemirror/language@6.11.0)(@emotion/is-prop-valid@1.4.0)(@types/node@22.13.14)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3))(graphql@16.11.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) graphql: 16.11.0 react: 19.2.6 react-compiler-runtime: 19.1.0-rc.1(react@19.2.6) @@ -28906,6 +28881,13 @@ snapshots: optionalDependencies: ws: 8.21.0 + graphql-ws@6.0.4(graphql@16.11.0)(ws@8.21.3): + dependencies: + graphql: 16.11.0 + optionalDependencies: + ws: 8.21.3 + optional: true + graphql@16.11.0: {} gray-matter@2.1.1: @@ -32627,6 +32609,8 @@ snapshots: pkce-challenge@5.0.0: {} + pkce-challenge@5.0.1: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -34766,9 +34750,9 @@ snapshots: swiper@12.1.2: {} - swr@2.2.5(react@19.2.6): + swr@2.5.0(react@19.2.6): dependencies: - client-only: 0.0.1 + dequal: 2.0.3 react: 19.2.6 use-sync-external-store: 1.6.0(react@19.2.6)