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)