chore(studio): upgrade AI SDK to v7 (#49167)

## 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)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## 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.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Saxon Fletcher authored and GitHub committed 2026-08-18 17:04:36 +08:00
1 parent 81507e37bb
commit c80f8ad78d
16 files changed
+291 -266

No files matched your search

@@ -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,
@@ -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<string, unknown> = {
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)
+2 -1
View File
@@ -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)
}
+7 -1
View File
@@ -163,10 +163,16 @@ export function createPrivacyMessageTool(toolInstance: Tool<any, any>) {
"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<typeof toolDescription>) =>
`${toolDescription(...args)} (Note: ${condensedPrivacyMessage})`
: `${toolDescription ?? ''} (Note: ${condensedPrivacyMessage})`
return {
...toolInstance,
description: `${toolInstance.description} (Note: ${condensedPrivacyMessage})`,
description,
execute: async (_args: any, _context: any) => ({ status: privacyMessage }),
}
}
@@ -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)
+15 -15
View File
@@ -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',
+5 -5
View File
@@ -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<unknown>
) => ({
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<unknown>) => {
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<unknown>
) => {
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<unknown>
) => {
const notebook = store.get(id)
if (!notebook) throw new Error(`Notebook ${id} not found.`)
+16 -10
View File
@@ -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/)
})
@@ -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')
})
})
@@ -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(
+7 -7
View File
@@ -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",
+7 -7
View File
@@ -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
@@ -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' },
})
}
+9 -3
View File
@@ -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) {
+5 -5
View File
@@ -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,
+176 -192
View File
@@ -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)