diff --git a/app/api/harness/route.ts b/app/api/harness/route.ts deleted file mode 100644 index ab756db8..00000000 --- a/app/api/harness/route.ts +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Harness API Route - Multi-mode agent orchestration control layer - * - * The Harness provides thread management, state persistence, tool approvals, - * and event streaming for multi-mode agent workflows. - * - * @see https://mastra.ai/reference/harness/harness-class - */ -import { generateId } from 'ai' -import { mainHarness } from '../../../src/mastra/harness' - -// Track if harness is initialized -let harnessInitialized = false - -/** - * Initialize harness if not already done - */ -async function ensureInitialized() { - if (!harnessInitialized) { - await mainHarness.init() - harnessInitialized = true - } -} - -/** - * GET /api/harness - * Get harness information: modes, current state, available threads - */ -export async function GET(req: Request) { - await ensureInitialized() - - const url = new URL(req.url) - const action = url.searchParams.get('action') - - try { - switch (action) { - case 'modes': - return Response.json({ - modes: mainHarness.listModes(), - currentMode: mainHarness.getCurrentMode(), - currentModeId: mainHarness.getCurrentModeId(), - }) - - case 'threads': - const threads = await mainHarness.listThreads() - return Response.json({ threads }) - - case 'state': - const state = mainHarness.getState() - return Response.json({ state }) - - case 'workspace': - const workspace = mainHarness.getWorkspace() - return Response.json({ - hasWorkspace: mainHarness.hasWorkspace(), - workspace: workspace - ? { - id: workspace.id, - name: workspace.name, - } - : null, - }) - - case 'messages': - const threadId = mainHarness.getCurrentThreadId() - if (!threadId) { - return Response.json({ messages: [] }) - } - const messages = - await mainHarness.listMessagesForThread(threadId) - return Response.json({ messages }) - - case 'session': - const session = await mainHarness.getSession() - return Response.json({ session }) - - default: - // Default: return harness overview - return Response.json({ - id: mainHarness.id, - modes: mainHarness.listModes(), - currentMode: mainHarness.getCurrentMode(), - currentModeId: mainHarness.getCurrentModeId(), - currentThreadId: mainHarness.getCurrentThreadId(), - state: mainHarness.getState(), - hasWorkspace: mainHarness.hasWorkspace(), - }) - } - } catch (error) { - console.error('Harness GET error:', error) - return Response.json( - { error: error instanceof Error ? error.message : 'Unknown error' }, - { status: 500 } - ) - } -} - -/** - * POST /api/harness - * Execute harness actions: send message, switch mode, create thread, steer - */ -export async function POST(req: Request) { - await ensureInitialized() - - const body = await req.json() - const { action, data } = body - - try { - switch (action) { - case 'thread': { - // Create or select a thread - const threadId = data?.threadId - let thread - - if (threadId) { - await mainHarness.switchThread(threadId) - thread = { id: threadId } - } else { - thread = await mainHarness.selectOrCreateThread() - } - - return Response.json({ thread }) - } - - case 'createThread': { - const title = data?.title - const thread = await mainHarness.createThread(title) - return Response.json({ thread }) - } - - case 'switchMode': { - const { modeId } = data - if (!modeId) { - return Response.json( - { error: 'modeId is required' }, - { status: 400 } - ) - } - - await mainHarness.switchMode(modeId) - return Response.json({ - success: true, - currentMode: mainHarness.getCurrentMode(), - currentModeId: mainHarness.getCurrentModeId(), - }) - } - - case 'setState': { - const { updates } = data - if (!updates) { - return Response.json( - { error: 'updates is required' }, - { status: 400 } - ) - } - - await mainHarness.setState(updates) - return Response.json({ - success: true, - state: mainHarness.getState(), - }) - } - - case 'steer': { - const { content } = data - if (!content) { - return Response.json( - { error: 'content is required' }, - { status: 400 } - ) - } - - await mainHarness.steer(content) - return Response.json({ success: true }) - } - - case 'followUp': { - const { content } = data - if (!content) { - return Response.json( - { error: 'content is required' }, - { status: 400 } - ) - } - - await mainHarness.followUp(content) - return Response.json({ success: true }) - } - - case 'abort': { - mainHarness.abort() - return Response.json({ success: true }) - } - - case 'resolvePlanApproval': { - const { planId, response } = data - if (!planId || !response) { - return Response.json( - { error: 'planId and response are required' }, - { status: 400 } - ) - } - - await mainHarness.respondToPlanApproval(planId, response) - return Response.json({ success: true }) - } - - case 'respondToQuestion': { - const { questionId, answer } = data - if (!questionId || !answer) { - return Response.json( - { error: 'questionId and answer are required' }, - { status: 400 } - ) - } - - await mainHarness.respondToQuestion(questionId, answer) - return Response.json({ success: true }) - } - - case 'grantSessionCategory': { - const { category } = data - if (!category) { - return Response.json( - { error: 'category is required' }, - { status: 400 } - ) - } - - mainHarness.grantSessionCategory(category) - return Response.json({ success: true }) - } - - case 'grantSessionTool': { - const { toolName } = data - if (!toolName) { - return Response.json( - { error: 'toolName is required' }, - { status: 400 } - ) - } - - mainHarness.grantSessionTool(toolName) - return Response.json({ success: true }) - } - - case 'sendMessage': - case 'stream': - default: { - // Send a message through the harness - const { content } = data - - if (!content) { - return Response.json( - { error: 'content is required' }, - { status: 400 } - ) - } - - // Ensure thread exists - await mainHarness.selectOrCreateThread() - - // Send the message - harness handles streaming via subscribe() - await mainHarness.sendMessage(content) - - // Return the messages after sending - const currentThreadId = mainHarness.getCurrentThreadId() - const threadIdString = currentThreadId || generateId() - const messages = - await mainHarness.listMessagesForThread(threadIdString) - - return Response.json({ - success: true, - messages, - currentThreadId: mainHarness.getCurrentThreadId(), - }) - } - } - } catch (error) { - console.error('Harness POST error:', error) - return Response.json( - { error: error instanceof Error ? error.message : 'Unknown error' }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/agents/[agentId]/route.ts b/app/api/mastra/agents/[agentId]/route.ts deleted file mode 100644 index 18e6a94b..00000000 --- a/app/api/mastra/agents/[agentId]/route.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -interface AgentDetailResponse { - id: string - name: string - description: string - modelId: string - model: string - tools: string[] -} - -export async function GET( - _request: Request, - { params }: { params: Promise<{ agentId: string }> } -): Promise { - try { - const { agentId } = await params - - if (!agentId) { - return Response.json( - { error: 'Agent ID is required' }, - { status: 400 } - ) - } - - const agents = await mastraClient.listAgents() - const agent = agents[agentId] - - if (!agent) { - return Response.json( - { error: `Agent not found: ${agentId}` }, - { status: 404 } - ) - } - - const agentDetail: AgentDetailResponse = { - id: agentId, - name: agent.name ?? agentId, - description: agent.description ?? '', - modelId: agent.modelId ?? '', - model: agent.modelId ?? '', - tools: agent.tools ? Object.keys(agent.tools) : [], - } - - return Response.json(agentDetail) - } catch (error) { - console.error('Error fetching agent:', error) - return Response.json( - { error: 'Failed to fetch agent', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/agents/route.ts b/app/api/mastra/agents/route.ts deleted file mode 100644 index 53df8e02..00000000 --- a/app/api/mastra/agents/route.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -interface AgentResponse { - id: string - name: string - description: string - modelId: string - model: string - tools: string[] -} - -export async function GET(): Promise { - try { - const agents = await mastraClient.listAgents() - - const agentList: AgentResponse[] = Object.entries(agents).map( - ([id, agent]) => ({ - id, - name: agent.name ?? id, - description: agent.description ?? '', - modelId: agent.modelId ?? '', - model: agent.modelId ?? '', - tools: agent.tools ? Object.keys(agent.tools) : [], - }) - ) - - return Response.json(agentList) - } catch (error) { - console.error('Error fetching agents:', error) - return Response.json( - { error: 'Failed to fetch agents', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/logs/[runId]/route.ts b/app/api/mastra/logs/[runId]/route.ts deleted file mode 100644 index 32cf7e99..00000000 --- a/app/api/mastra/logs/[runId]/route.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET( - request: Request, - { params }: { params: Promise<{ runId: string }> } -): Promise { - const { runId } = await params - const { searchParams } = new URL(request.url) - const transportId = searchParams.get('transportId') || '' - - try { - const logs = await mastraClient.getLogForRun({ - runId, - transportId, - }) - return Response.json(logs) - } catch (error) { - console.error('Error fetching run logs:', error) - return Response.json( - { error: 'Failed to fetch run logs', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/logs/route.ts b/app/api/mastra/logs/route.ts deleted file mode 100644 index 3ded8846..00000000 --- a/app/api/mastra/logs/route.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET(request: Request): Promise { - const { searchParams } = new URL(request.url) - const action = searchParams.get('action') - - try { - if (action === 'transports') { - const transports = await mastraClient.listLogTransports() - return Response.json({ transports }) - } - - const transportId = searchParams.get('transportId') || undefined - const logs = await mastraClient.listLogs({ - transportId: transportId ?? '', - }) - - return Response.json({ logs }) - } catch (error) { - console.error('Error fetching logs:', error) - return Response.json( - { error: 'Failed to fetch logs', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/memory/status/route.ts b/app/api/mastra/memory/status/route.ts deleted file mode 100644 index 91f55f28..00000000 --- a/app/api/mastra/memory/status/route.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET(request: Request): Promise { - const { searchParams } = new URL(request.url) - const agentId = searchParams.get('agentId') - - if (!agentId) { - return Response.json( - { error: 'agentId query parameter is required' }, - { status: 400 } - ) - } - - try { - const status = await mastraClient.getMemoryStatus(agentId) - return Response.json(status) - } catch (error) { - console.error('Error fetching memory status:', error) - return Response.json( - { error: 'Failed to fetch memory status', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/memory/working-memory/route.ts b/app/api/mastra/memory/working-memory/route.ts deleted file mode 100644 index 95849aea..00000000 --- a/app/api/mastra/memory/working-memory/route.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET(request: Request): Promise { - const { searchParams } = new URL(request.url) - const agentId = searchParams.get('agentId') - const threadId = searchParams.get('threadId') - const resourceId = searchParams.get('resourceId') || undefined - - if (!agentId || !threadId) { - return Response.json( - { error: 'agentId and threadId query parameters are required' }, - { status: 400 } - ) - } - - try { - const workingMemory = await mastraClient.getWorkingMemory({ - agentId, - threadId, - resourceId, - }) - return Response.json(workingMemory) - } catch (error) { - console.error('Error fetching working memory:', error) - return Response.json( - { - error: 'Failed to fetch working memory', - details: String(error), - }, - { status: 500 } - ) - } -} - -export async function PUT(request: Request): Promise { - const body = await request.json() - const { agentId, threadId, workingMemory, resourceId } = body as { - agentId: string - threadId: string - workingMemory: string - resourceId?: string - } - - if (!agentId || !threadId || workingMemory === undefined) { - return Response.json( - { - error: 'agentId, threadId, and workingMemory are required in the request body', - }, - { status: 400 } - ) - } - - try { - const result = await mastraClient.updateWorkingMemory({ - agentId, - threadId, - workingMemory, - resourceId, - }) - return Response.json(result) - } catch (error) { - console.error('Error updating working memory:', error) - return Response.json( - { - error: 'Failed to update working memory', - details: String(error), - }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/observability/scores/route.ts b/app/api/mastra/observability/scores/route.ts deleted file mode 100644 index c756aeee..00000000 --- a/app/api/mastra/observability/scores/route.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -// GET - List scores for a trace/span -export async function GET(request: Request) { - const { searchParams } = new URL(request.url) - const traceId = searchParams.get('traceId') - const spanId = searchParams.get('spanId') - const page = parseInt(searchParams.get('page') || '1') - const perPage = parseInt(searchParams.get('perPage') || '20') - - if (!traceId) { - return Response.json({ error: 'traceId required' }, { status: 400 }) - } - - try { - const scores = await mastraClient.listScoresBySpan({ - traceId, - spanId: spanId || undefined, - page, - perPage, - }) - return Response.json(scores) - } catch (error) { - return Response.json({ error: String(error) }, { status: 500 }) - } -} - -// POST - Score a trace -export async function POST(request: Request) { - const { scorerName, traceId, spanId } = await request.json() - - if (!scorerName || !traceId) { - return Response.json( - { error: 'scorerName and traceId required' }, - { status: 400 } - ) - } - - try { - const result = await mastraClient.score({ - scorerName, - targets: [{ traceId, spanId }], - }) - return Response.json(result) - } catch (error) { - return Response.json({ error: String(error) }, { status: 500 }) - } -} diff --git a/app/api/mastra/threads/[threadId]/clone/route.ts b/app/api/mastra/threads/[threadId]/clone/route.ts deleted file mode 100644 index 50ef8c8d..00000000 --- a/app/api/mastra/threads/[threadId]/clone/route.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function POST( - request: Request, - { params }: { params: Promise<{ threadId: string }> } -): Promise { - const { threadId } = await params - const body = await request.json() - const { newThreadId, title, metadata, options } = body as { - newThreadId?: string - title?: string - metadata?: Record - options?: { - messageLimit?: number - messageFilter?: { - startDate?: string - endDate?: string - } - } - } - - try { - const thread = mastraClient.getMemoryThread({ threadId }) - - const cloneOptions: Record = {} - if (newThreadId) {cloneOptions.newThreadId = newThreadId} - if (title) {cloneOptions.title = title} - if (metadata) {cloneOptions.metadata = metadata} - if (options) { - const opts: Record = {} - if (options.messageLimit) {opts.messageLimit = options.messageLimit} - if (options.messageFilter) { - opts.messageFilter = { - startDate: options.messageFilter.startDate - ? new Date(options.messageFilter.startDate) - : undefined, - endDate: options.messageFilter.endDate - ? new Date(options.messageFilter.endDate) - : undefined, - } - } - cloneOptions.options = opts - } - - const result = await thread.clone(cloneOptions) - return Response.json(result) - } catch (error) { - console.error('Error cloning thread:', error) - return Response.json( - { error: 'Failed to clone thread', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/threads/[threadId]/messages/route.ts b/app/api/mastra/threads/[threadId]/messages/route.ts deleted file mode 100644 index 72b50a39..00000000 --- a/app/api/mastra/threads/[threadId]/messages/route.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MastraClient } from '@mastra/client-js' -import type { StorageListMessagesOutput } from '@mastra/core/storage' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET( - request: Request, - { params }: { params: Promise<{ threadId: string }> } -) { - const { threadId } = await params - - const { searchParams } = new URL(request.url) - const page = parseInt(searchParams.get('page') || '0') - const perPage = parseInt(searchParams.get('perPage') || '20') - const orderByField = searchParams.get('orderBy') - const orderByDir = searchParams.get('direction') || 'DESC' - - try { - const thread = mastraClient.getMemoryThread({ threadId }) - const orderBy = - orderByField === 'createdAt' - ? { field: 'createdAt' as const, direction: orderByDir as 'ASC' | 'DESC' } - : undefined - - // client-js types ListMemoryThreadMessagesResponse as { messages }, but the server - // actually returns StorageListMessagesOutput (PaginationInfo & { messages }) at runtime - const result = (await thread.listMessages({ - page, - perPage, - ...(orderBy ? { orderBy } : {}), - })) as StorageListMessagesOutput - - return Response.json({ - messages: result.messages, - total: result.total, - page: result.page, - perPage: result.perPage, - hasMore: result.hasMore, - }) - } catch (error) { - console.error('Error fetching messages:', error) - return Response.json( - { error: 'Failed to fetch messages', details: String(error) }, - { status: 500 } - ) - } -} - diff --git a/app/api/mastra/threads/[threadId]/route.ts b/app/api/mastra/threads/[threadId]/route.ts deleted file mode 100644 index f7069514..00000000 --- a/app/api/mastra/threads/[threadId]/route.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET( - _request: Request, - { params }: { params: Promise<{ threadId: string }> } -): Promise { - const { threadId } = await params - - try { - const thread = mastraClient.getMemoryThread({ threadId }) - const details = await thread.get() - return Response.json(details) - } catch (error) { - console.error('Error fetching thread:', error) - return Response.json( - { error: 'Failed to fetch thread', details: String(error) }, - { status: 500 } - ) - } -} - -export async function PATCH( - request: Request, - { params }: { params: Promise<{ threadId: string }> } -): Promise { - const { threadId } = await params - const body = await request.json() - const { title, metadata, resourceId } = body as { - title?: string - metadata?: Record - resourceId?: string - } - - try { - const thread = mastraClient.getMemoryThread({ threadId }) - const updated = await thread.update({ - title: title ?? '', - metadata: metadata ?? {}, - resourceId: resourceId ?? '', - }) - return Response.json(updated) - } catch (error) { - console.error('Error updating thread:', error) - return Response.json( - { error: 'Failed to update thread', details: String(error) }, - { status: 500 } - ) - } -} - -export async function DELETE( - _request: Request, - { params }: { params: Promise<{ threadId: string }> } -): Promise { - const { threadId } = await params - - try { - const thread = mastraClient.getMemoryThread({ threadId }) - await thread.delete() - return Response.json({ success: true, message: 'Thread deleted' }) - } catch (error) { - console.error('Error deleting thread:', error) - return Response.json( - { error: 'Failed to delete thread', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/threads/route.ts b/app/api/mastra/threads/route.ts deleted file mode 100644 index f03281cc..00000000 --- a/app/api/mastra/threads/route.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { MastraClient } from '@mastra/client-js' -import type { RequestContext } from '@mastra/core/request-context' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET(request: Request) { - try { - const { searchParams } = new URL(request.url) - const resourceId = searchParams.get('resourceId') || undefined - const agentId = searchParams.get('agentId') || undefined - const requestContext: RequestContext | Record | undefined = undefined - const page = parseInt(searchParams.get('page') || '0') - const perPage = parseInt(searchParams.get('perPage') || '20') - - - const threads = await mastraClient.listMemoryThreads({ - resourceId, - agentId, - requestContext, - page, - perPage, - }) - - const threadList = threads.threads.map((thread) => ({ - id: thread.id, - resourceId: thread.resourceId, - title: thread.title, - createdAt: thread.createdAt, - updatedAt: thread.updatedAt, - metadata: thread.metadata - })) - - return Response.json(threadList) - } catch (error) { - console.error('Error fetching threads:', error) - return Response.json( - { error: 'Failed to fetch threads', details: String(error) }, - { status: 500 } - ) - } -} - -export async function POST(request: Request) { - try { - const body = await request.json() - const { resourceId, agentId, title, metadata, threadId, requestContext } = body - - const thread = await mastraClient.createMemoryThread({ - resourceId, - agentId, - title, - metadata, - threadId, - requestContext, - }) - - return Response.json(thread) - } catch (error) { - console.error('Error creating thread:', error) - return Response.json( - { error: 'Failed to create thread', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/tools/[toolId]/route.ts b/app/api/mastra/tools/[toolId]/route.ts deleted file mode 100644 index 30bcec24..00000000 --- a/app/api/mastra/tools/[toolId]/route.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { MastraClient } from '@mastra/client-js' -import type { RequestContext } from '@mastra/core/request-context' -type UnknownRecord = Record - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET( - _request: Request, - { params }: { params: Promise<{ toolId: string }> } -) { - try { - const { toolId } = await params - const tool = mastraClient.getTool(toolId) - const details = await tool.details() - - return Response.json(details) - } catch (error) { - console.error('Error fetching tool details:', error) - return Response.json( - { error: 'Failed to fetch tool details', details: String(error) }, - { status: 500 } - ) - } -} - -export async function POST( - request: Request, - { params }: { params: Promise<{ toolId: string }> } -) { - try { - const { toolId } = await params - const body = await request.json() - const { args, runId, requestContext } = body as { - args?: UnknownRecord - runId?: string | undefined - requestContext?: RequestContext | UnknownRecord | undefined - } - - const tool = mastraClient.getTool(toolId) - const result = await tool.execute({ - data: args ?? {}, - runId: runId ?? "", - requestContext: requestContext ?? {}, - }) - - return Response.json(result) - } catch (error) { - console.error('Error executing tool:', error) - return Response.json( - { error: 'Failed to execute tool', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/tools/route.ts b/app/api/mastra/tools/route.ts deleted file mode 100644 index d0cdb392..00000000 --- a/app/api/mastra/tools/route.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET() { - try { - const tools = await mastraClient.listTools() - - const toolList = Object.entries(tools).map(([id, tool]) => ({ - id, - name: id, - description: tool.description, - })) - - return Response.json(toolList) - } catch (error) { - console.error('Error fetching tools:', error) - return Response.json( - { error: 'Failed to fetch tools', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/traces/[traceId]/route.ts b/app/api/mastra/traces/[traceId]/route.ts deleted file mode 100644 index 73e3dcff..00000000 --- a/app/api/mastra/traces/[traceId]/route.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET( - request: Request, - { params }: { params: Promise<{ traceId: string }> } -) { - const { traceId } = await params - - try { - const trace = await mastraClient.getTrace(traceId) - return Response.json(trace) - } catch (error) { - return Response.json({ error: 'Trace not found' }, { status: 404 }) - } -} diff --git a/app/api/mastra/traces/route.ts b/app/api/mastra/traces/route.ts deleted file mode 100644 index 475bb922..00000000 --- a/app/api/mastra/traces/route.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET(request: Request) { - try { - const { searchParams } = new URL(request.url) - const page = parseInt(searchParams.get('page') || '1') - const perPage = parseInt(searchParams.get('perPage') || '20') - - const traces = await mastraClient.getTraces({ - pagination: { page, perPage }, - }) - - const traceList = traces.spans.map((span) => ({ - id: span.spanId, - traceId: span.traceId, - name: span.name, - startTime: span.startTime, - endTime: span.endTime, - status: span.status, - })) - - return Response.json({ - traces: traceList, - pagination: traces.pagination, - }) - } catch (error) { - console.error('Error fetching traces:', error) - return Response.json( - { error: 'Failed to fetch traces', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/vectors/[vectorName]/query/route.ts b/app/api/mastra/vectors/[vectorName]/query/route.ts deleted file mode 100644 index 32cc0638..00000000 --- a/app/api/mastra/vectors/[vectorName]/query/route.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function POST( - request: Request, - { params }: { params: Promise<{ vectorName: string }> } -): Promise { - const { vectorName } = await params - const body = await request.json() - const { indexName, queryVector, topK, filter, includeVector } = body as { - indexName: string - queryVector: number[] - topK?: number - filter?: Record - includeVector?: boolean - } - - if (!indexName || !queryVector) { - return Response.json( - { error: 'indexName and queryVector are required' }, - { status: 400 } - ) - } - - try { - const vector = mastraClient.getVector(vectorName) - const results = await vector.query({ - indexName, - queryVector, - topK, - filter, - includeVector, - }) - return Response.json(results) - } catch (error) { - console.error('Error querying vectors:', error) - return Response.json( - { error: 'Failed to query vectors', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/vectors/[vectorName]/route.ts b/app/api/mastra/vectors/[vectorName]/route.ts deleted file mode 100644 index a84a4590..00000000 --- a/app/api/mastra/vectors/[vectorName]/route.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET( - request: Request, - { params }: { params: Promise<{ vectorName: string }> } -): Promise { - const { vectorName } = await params - const { searchParams } = new URL(request.url) - const indexName = searchParams.get('indexName') - - try { - const vector = mastraClient.getVector(vectorName) - - if (indexName) { - const details = await vector.details(indexName) - return Response.json(details) - } - - const result = await vector.getIndexes() - return Response.json(result) - } catch (error) { - console.error('Error fetching vector indexes:', error) - return Response.json( - { - error: 'Failed to fetch vector indexes', - details: String(error), - }, - { status: 500 } - ) - } -} - -export async function POST( - request: Request, - { params }: { params: Promise<{ vectorName: string }> } -): Promise { - const { vectorName } = await params - const body = await request.json() - const { indexName, dimension, metric } = body as { - indexName: string - dimension: number - metric?: 'cosine' | 'euclidean' | 'dotproduct' - } - - if (!indexName || !dimension) { - return Response.json( - { error: 'indexName and dimension are required' }, - { status: 400 } - ) - } - - try { - const vector = mastraClient.getVector(vectorName) - const result = await vector.createIndex({ - indexName, - dimension, - metric, - }) - return Response.json(result) - } catch (error) { - console.error('Error creating vector index:', error) - return Response.json( - { - error: 'Failed to create vector index', - details: String(error), - }, - { status: 500 } - ) - } -} - -export async function DELETE( - request: Request, - { params }: { params: Promise<{ vectorName: string }> } -): Promise { - const { vectorName } = await params - const { searchParams } = new URL(request.url) - const indexName = searchParams.get('indexName') - - if (!indexName) { - return Response.json( - { error: 'indexName query parameter is required' }, - { status: 400 } - ) - } - - try { - const vector = mastraClient.getVector(vectorName) - const result = await vector.delete(indexName) - return Response.json(result) - } catch (error) { - console.error('Error deleting vector index:', error) - return Response.json( - { - error: 'Failed to delete vector index', - details: String(error), - }, - { status: 500 } - ) - } -} diff --git a/app/api/mastra/vectors/route.ts b/app/api/mastra/vectors/route.ts deleted file mode 100644 index d7e2a9c8..00000000 --- a/app/api/mastra/vectors/route.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -/** - * GET /api/mastra/vectors - * List all vector indexes across all vector stores. - * Uses MastraClient instead of raw fetch to localhost:4111 - */ -export async function GET(request: Request) { - try { - const { searchParams } = new URL(request.url) - const vectorName = searchParams.get('vectorName') || 'pgVector' - - const vector = mastraClient.getVector(vectorName) - const result = await vector.getIndexes() - - const resultRecord = result as unknown as Record - const indexes: unknown[] = Array.isArray(result) - ? result - : (resultRecord.data as unknown[]) || (resultRecord.indexes as unknown[]) || [] - - interface VectorIndexEntry { - name?: string - indexName?: string - dimension?: number - count?: number - vectorCount?: number - } - - const vectorList = indexes.map((idx) => { - const entry = idx as VectorIndexEntry - return { - name: entry.name || entry.indexName || 'default', - dimension: entry.dimension || 3072, - count: entry.count || entry.vectorCount || 0, - } - }) - - return Response.json(vectorList) - } catch (error) { - console.error('Error fetching vectors:', error) - - // Return empty array if no vector store configured - if ( - error instanceof Error && - (error.message.includes('not found') || - error.message.includes('undefined')) - ) { - return Response.json([]) - } - - return Response.json( - { error: 'Failed to fetch vectors', details: String(error) }, - { status: 500 } - ) - } -} - -/** - * POST /api/mastra/vectors - * Create a new vector index. - */ -export async function POST(request: Request) { - const { indexName, dimension, metric } = await request.json() - - try { - const vector = mastraClient.getVector('default') - const result = await vector.createIndex({ - indexName, - dimension, - metric, - }) - return Response.json(result) - } catch (error) { - return Response.json({ error: String(error) }, { status: 500 }) - } -} diff --git a/app/api/mastra/workflows/[workflowId]/route.ts b/app/api/mastra/workflows/[workflowId]/route.ts deleted file mode 100644 index 3ea70d74..00000000 --- a/app/api/mastra/workflows/[workflowId]/route.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET( - request: Request, - { params }: { params: Promise<{ workflowId: string }> } -) { - const { workflowId } = await params - - try { - const workflow = mastraClient.getWorkflow(workflowId) - const details = await workflow.details() - return Response.json(details) - } catch (error) { - return Response.json({ error: 'Workflow not found' }, { status: 404 }) - } -} diff --git a/app/api/mastra/workflows/[workflowId]/run/route.ts b/app/api/mastra/workflows/[workflowId]/run/route.ts deleted file mode 100644 index 00f53ede..00000000 --- a/app/api/mastra/workflows/[workflowId]/run/route.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -// POST - Create and start a workflow run -export async function POST( - request: Request, - { params }: { params: Promise<{ workflowId: string }> } -) { - const { workflowId } = await params - const { inputData, initialState, runId, resourceId } = await request.json() - - try { - const workflow = mastraClient.getWorkflow(workflowId) - - const run = await workflow.createRun({ runId, resourceId }) - const result = await run.startAsync({ inputData, initialState }) - - return Response.json({ runId: run.runId, result }) - } catch (error) { - return Response.json({ error: String(error) }, { status: 500 }) - } -} - -// GET - Get run status by ID (also can use workflow.runById) -export async function GET( - request: Request, - { params }: { params: Promise<{ workflowId: string }> } -) { - const { workflowId } = await params - const { searchParams } = new URL(request.url) - const runId = searchParams.get('runId') - - if (!runId) { - return Response.json({ error: 'runId required' }, { status: 400 }) - } - - try { - const workflow = mastraClient.getWorkflow(workflowId) - const result = await workflow.runById(runId) - return Response.json(result) - } catch (error) { - return Response.json({ error: 'Run not found' }, { status: 404 }) - } -} diff --git a/app/api/mastra/workflows/route.ts b/app/api/mastra/workflows/route.ts deleted file mode 100644 index 49339b4c..00000000 --- a/app/api/mastra/workflows/route.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { MastraClient } from '@mastra/client-js' - -const mastraClient = new MastraClient({ - baseUrl: process.env.NEXT_PUBLIC_MASTRA_API_URL || 'http://localhost:4111', -}) - -export async function GET() { - try { - const workflows = await mastraClient.listWorkflows() - - const workflowList = Object.entries(workflows).map( - ([id, workflow]) => ({ - id, - name: id, - }) - ) - - return Response.json(workflowList) - } catch (error) { - console.error('Error fetching workflows:', error) - return Response.json( - { error: 'Failed to fetch workflows', details: String(error) }, - { status: 500 } - ) - } -} diff --git a/app/chat/harness/page.tsx b/app/chat/harness/page.tsx new file mode 100644 index 00000000..e69de29b diff --git a/lib/AGENTS.md b/lib/AGENTS.md index 0127129b..c486f12b 100644 --- a/lib/AGENTS.md +++ b/lib/AGENTS.md @@ -27,3 +27,12 @@ The `lib/` directory serves as the frontend client library layer for AgentStack, - Queries: `useWorkspaceInfo`, `useWorkspaceFiles`, `useWorkspaceReadFile`, `useWorkspaceStat`, `useWorkspaceSearch`, `useWorkspaceSkills`, `useWorkspaceSearchSkills` - Mutations: `useWorkspaceWriteFileMutation`, `useWorkspaceDeleteMutation`, `useWorkspaceMkdirMutation`, `useWorkspaceIndexMutation` - Added granular workspace query keys to support frontend cache invalidation after file/index mutations. + +## Recent Update (2026-03-16) + +- `hooks/use-mastra-query.ts` now exposes the full installed `@mastra/client-js` dataset/eval/scorer surface for frontend consumers: + - scorer/eval queries: `useScorers`, `useScorer`, `useScoresByRun`, `useScoresByScorer`, `useScoresByEntity` + - dataset queries: `useDatasets`, `useDataset`, `useDatasetItems`, `useDatasetItem`, `useDatasetItemHistory`, `useDatasetItemVersion`, `useDatasetVersions` + - experiment queries: `useDatasetExperiments`, `useDatasetExperiment`, `useDatasetExperimentResults`, `useCompareExperiments` + - dataset/eval mutations: create/update/delete dataset, add/update/delete item, batch item insert/delete, trigger experiment, save score +- `hooks/use-mastra.ts` mirrors the same dataset/scorer/experiment API surface using the generic `useMastraFetch` pattern for non-React-Query consumers. diff --git a/lib/hooks/use-mastra-query.ts b/lib/hooks/use-mastra-query.ts index beeeec2d..01657e51 100644 --- a/lib/hooks/use-mastra-query.ts +++ b/lib/hooks/use-mastra-query.ts @@ -16,11 +16,25 @@ import type { WorkspaceItem, } from '@/lib/types/mastra-api' import type { + AddDatasetItemParams, + BatchDeleteDatasetItemsParams, + BatchInsertDatasetItemsParams, + CompareExperimentsParams, + CompareExperimentsResponse, CloneAgentParams, + CreateDatasetParams, CreateMemoryThreadParams, + DatasetExperiment, + DatasetExperimentResult, + DatasetItem, + DatasetItemVersionResponse, + DatasetRecord, + DatasetVersionResponse, GetLogsParams, GetMemoryConfigParams, + GetScorerResponse, ListSkillsResponse, + ListScoresResponse, ListMemoryThreadMessagesParams, McpServerListResponse, McpServerToolListResponse, @@ -32,6 +46,9 @@ import type { SearchSkillsParams, SearchSkillsResponse, StreamParams, + TriggerDatasetExperimentParams, + UpdateDatasetItemParams, + UpdateDatasetParams, UpdateMemoryThreadParams, UpdateModelParams, WorkspaceFsDeleteResponse, @@ -83,11 +100,171 @@ interface MastraQueryHooks { requestContext?: RequestContext | RequestContextValue, partial?: boolean ) => UseQueryResult + useScorers: ( + requestContext?: RequestContext | RequestContextValue + ) => UseQueryResult, Error> + useScorer: (scorerId: string) => UseQueryResult useTraces: (params?: ListTracesArgs) => UseQueryResult + useScoresByRun: ( + params?: ListScoresByRunIdParams + ) => UseQueryResult + useScoresByScorer: ( + params?: ListScoresByScorerIdParams + ) => UseQueryResult + useScoresByEntity: ( + params?: ListScoresByEntityIdParams + ) => UseQueryResult useThreads: (params?: { resourceId?: string agentId?: string }) => UseQueryResult + useDatasets: (pagination?: { + page?: number + perPage?: number + }) => UseQueryResult<{ + datasets: DatasetRecord[] + pagination: { + total: number + page: number + perPage: number | false + hasMore: boolean + } + }, Error> + useDataset: (datasetId: string) => UseQueryResult + useDatasetItems: ( + datasetId: string, + params?: { + page?: number + perPage?: number + search?: string + version?: number | null + } + ) => UseQueryResult<{ + items: DatasetItem[] + pagination: { + total: number + page: number + perPage: number | false + hasMore: boolean + } + }, Error> + useDatasetItem: ( + datasetId: string, + itemId: string + ) => UseQueryResult + useDatasetItemHistory: ( + datasetId: string, + itemId: string + ) => UseQueryResult<{ history: DatasetItemVersionResponse[] }, Error> + useDatasetItemVersion: ( + datasetId: string, + itemId: string, + datasetVersion: number + ) => UseQueryResult + useDatasetVersions: ( + datasetId: string, + pagination?: { page?: number; perPage?: number } + ) => UseQueryResult<{ + versions: DatasetVersionResponse[] + pagination: { + total: number + page: number + perPage: number | false + hasMore: boolean + } + }, Error> + useDatasetExperiments: ( + datasetId: string, + pagination?: { page?: number; perPage?: number } + ) => UseQueryResult<{ + experiments: DatasetExperiment[] + pagination: { + total: number + page: number + perPage: number | false + hasMore: boolean + } + }, Error> + useDatasetExperiment: ( + datasetId: string, + experimentId: string + ) => UseQueryResult + useDatasetExperimentResults: ( + datasetId: string, + experimentId: string, + pagination?: { page?: number; perPage?: number } + ) => UseQueryResult<{ + results: DatasetExperimentResult[] + pagination: { + total: number + page: number + perPage: number | false + hasMore: boolean + } + }, Error> + useCompareExperiments: ( + params?: CompareExperimentsParams + ) => UseQueryResult + useCreateDatasetMutation: () => UseMutationResult< + DatasetRecord, + Error, + CreateDatasetParams, + unknown + > + useUpdateDatasetMutation: () => UseMutationResult< + DatasetRecord, + Error, + UpdateDatasetParams, + unknown + > + useDeleteDatasetMutation: () => UseMutationResult< + { success: boolean }, + Error, + string, + unknown + > + useAddDatasetItemMutation: () => UseMutationResult< + DatasetItem, + Error, + AddDatasetItemParams, + unknown + > + useUpdateDatasetItemMutation: () => UseMutationResult< + DatasetItem, + Error, + UpdateDatasetItemParams, + unknown + > + useDeleteDatasetItemMutation: () => UseMutationResult< + { success: boolean }, + Error, + { datasetId: string; itemId: string }, + unknown + > + useBatchInsertDatasetItemsMutation: () => UseMutationResult< + { items: DatasetItem[]; count: number }, + Error, + BatchInsertDatasetItemsParams, + unknown + > + useBatchDeleteDatasetItemsMutation: () => UseMutationResult< + { success: boolean; deletedCount: number }, + Error, + BatchDeleteDatasetItemsParams, + unknown + > + useTriggerDatasetExperimentMutation: () => UseMutationResult< + Awaited>, + Error, + TriggerDatasetExperimentParams, + unknown + > + useSaveScoreMutation: () => UseMutationResult< + Awaited>, + Error, + Parameters[0], + unknown + > useVectorIndexes: (vectorName?: string) => UseQueryResult useLogs: (params: GetLogsParams) => UseQueryResult useLogTransports: () => UseQueryResult @@ -384,6 +561,51 @@ export const mastraQueryKeys = { { vectorName, indexName }, ] as const, }, + datasets: { + all: ['mastra', 'datasets'] as const, + list: (params?: unknown) => + [...mastraQueryKeys.datasets.all, 'list', params] as const, + details: (datasetId: string) => + [...mastraQueryKeys.datasets.all, 'details', datasetId] as const, + items: (datasetId: string, params?: unknown) => + [...mastraQueryKeys.datasets.all, 'items', datasetId, params] as const, + item: (datasetId: string, itemId: string) => + [...mastraQueryKeys.datasets.all, 'item', datasetId, itemId] as const, + itemHistory: (datasetId: string, itemId: string) => + [...mastraQueryKeys.datasets.all, 'itemHistory', datasetId, itemId] as const, + itemVersion: ( + datasetId: string, + itemId: string, + datasetVersion: number + ) => + [ + ...mastraQueryKeys.datasets.all, + 'itemVersion', + datasetId, + itemId, + datasetVersion, + ] as const, + versions: (datasetId: string, params?: unknown) => + [...mastraQueryKeys.datasets.all, 'versions', datasetId, params] as const, + experiments: (datasetId: string, params?: unknown) => + [...mastraQueryKeys.datasets.all, 'experiments', datasetId, params] as const, + experiment: (datasetId: string, experimentId: string) => + [...mastraQueryKeys.datasets.all, 'experiment', datasetId, experimentId] as const, + experimentResults: ( + datasetId: string, + experimentId: string, + params?: unknown + ) => + [ + ...mastraQueryKeys.datasets.all, + 'experimentResults', + datasetId, + experimentId, + params, + ] as const, + compare: (params?: unknown) => + [...mastraQueryKeys.datasets.all, 'compare', params] as const, + }, workspaces: { all: ['mastra', 'workspaces'] as const, list: () => [...mastraQueryKeys.workspaces.all, 'list'] as const, @@ -614,6 +836,21 @@ export function useMastraQuery(): MastraQueryHooks { enabled: !!workflowId, }) + const useScorers = ( + requestContext?: RequestContext | RequestContextValue + ) => + useQuery, Error>({ + queryKey: [...mastraQueryKeys.observability.all, 'scorers', requestContext] as const, + queryFn: () => mastraClient.listScorers(requestContext as RequestContext), + }) + + const useScorer = (scorerId: string) => + useQuery({ + queryKey: [...mastraQueryKeys.observability.all, 'scorer', scorerId] as const, + queryFn: () => mastraClient.getScorer(scorerId), + enabled: !!scorerId, + }) + const useWorkflowRun = ( workflowId: string, runId: string, @@ -824,6 +1061,115 @@ export function useMastraQuery(): MastraQueryHooks { enabled: !!params, }) + const useDatasets = (pagination?: { page?: number; perPage?: number }) => + useQuery({ + queryKey: mastraQueryKeys.datasets.list(pagination), + queryFn: () => mastraClient.listDatasets(pagination), + }) + + const useDataset = (datasetId: string) => + useQuery({ + queryKey: mastraQueryKeys.datasets.details(datasetId), + queryFn: () => mastraClient.getDataset(datasetId), + enabled: !!datasetId, + }) + + const useDatasetItems = ( + datasetId: string, + params?: { + page?: number + perPage?: number + search?: string + version?: number | null + } + ) => + useQuery({ + queryKey: mastraQueryKeys.datasets.items(datasetId, params), + queryFn: () => mastraClient.listDatasetItems(datasetId, params), + enabled: !!datasetId, + }) + + const useDatasetItem = (datasetId: string, itemId: string) => + useQuery({ + queryKey: mastraQueryKeys.datasets.item(datasetId, itemId), + queryFn: () => mastraClient.getDatasetItem(datasetId, itemId), + enabled: !!datasetId && !!itemId, + }) + + const useDatasetItemHistory = (datasetId: string, itemId: string) => + useQuery<{ history: DatasetItemVersionResponse[] }, Error>({ + queryKey: mastraQueryKeys.datasets.itemHistory(datasetId, itemId), + queryFn: () => mastraClient.getItemHistory(datasetId, itemId), + enabled: !!datasetId && !!itemId, + }) + + const useDatasetItemVersion = ( + datasetId: string, + itemId: string, + datasetVersion: number + ) => + useQuery({ + queryKey: mastraQueryKeys.datasets.itemVersion(datasetId, itemId, datasetVersion), + queryFn: () => + mastraClient.getDatasetItemVersion(datasetId, itemId, datasetVersion), + enabled: !!datasetId && !!itemId, + }) + + const useDatasetVersions = ( + datasetId: string, + pagination?: { page?: number; perPage?: number } + ) => + useQuery({ + queryKey: mastraQueryKeys.datasets.versions(datasetId, pagination), + queryFn: () => mastraClient.listDatasetVersions(datasetId, pagination), + enabled: !!datasetId, + }) + + const useDatasetExperiments = ( + datasetId: string, + pagination?: { page?: number; perPage?: number } + ) => + useQuery({ + queryKey: mastraQueryKeys.datasets.experiments(datasetId, pagination), + queryFn: () => mastraClient.listDatasetExperiments(datasetId, pagination), + enabled: !!datasetId, + }) + + const useDatasetExperiment = (datasetId: string, experimentId: string) => + useQuery({ + queryKey: mastraQueryKeys.datasets.experiment(datasetId, experimentId), + queryFn: () => mastraClient.getDatasetExperiment(datasetId, experimentId), + enabled: !!datasetId && !!experimentId, + }) + + const useDatasetExperimentResults = ( + datasetId: string, + experimentId: string, + pagination?: { page?: number; perPage?: number } + ) => + useQuery({ + queryKey: mastraQueryKeys.datasets.experimentResults( + datasetId, + experimentId, + pagination + ), + queryFn: () => + mastraClient.listDatasetExperimentResults( + datasetId, + experimentId, + pagination + ), + enabled: !!datasetId && !!experimentId, + }) + + const useCompareExperiments = (params?: CompareExperimentsParams) => + useQuery({ + queryKey: mastraQueryKeys.datasets.compare(params), + queryFn: () => + mastraClient.compareExperiments(params as CompareExperimentsParams), + enabled: !!params, + }) + // --- LOGS --- const useLogs: (params: GetLogsParams) => @@ -1390,6 +1736,84 @@ export function useMastraQuery(): MastraQueryHooks { }, }) + const useCreateDatasetMutation = () => + useMutation({ + mutationFn: (params: CreateDatasetParams) => mastraClient.createDataset(params), + onSuccess: async () => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.all }) + }, + }) + + const useUpdateDatasetMutation = () => + useMutation({ + mutationFn: (params: UpdateDatasetParams) => mastraClient.updateDataset(params), + onSuccess: async (_, variables) => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.all }) + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.details(variables.datasetId) }) + }, + }) + + const useDeleteDatasetMutation = () => + useMutation({ + mutationFn: (datasetId: string) => mastraClient.deleteDataset(datasetId), + onSuccess: async () => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.all }) + }, + }) + + const useAddDatasetItemMutation = () => + useMutation({ + mutationFn: (params: AddDatasetItemParams) => mastraClient.addDatasetItem(params), + onSuccess: async (_, variables) => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.items(variables.datasetId) }) + }, + }) + + const useUpdateDatasetItemMutation = () => + useMutation({ + mutationFn: (params: UpdateDatasetItemParams) => mastraClient.updateDatasetItem(params), + onSuccess: async (_, variables) => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.items(variables.datasetId) }) + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.item(variables.datasetId, variables.itemId) }) + }, + }) + + const useDeleteDatasetItemMutation = () => + useMutation({ + mutationFn: ({ datasetId, itemId }: { datasetId: string; itemId: string }) => + mastraClient.deleteDatasetItem(datasetId, itemId), + onSuccess: async (_, variables) => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.items(variables.datasetId) }) + }, + }) + + const useBatchInsertDatasetItemsMutation = () => + useMutation({ + mutationFn: (params: BatchInsertDatasetItemsParams) => + mastraClient.batchInsertDatasetItems(params), + onSuccess: async (_, variables) => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.items(variables.datasetId) }) + }, + }) + + const useBatchDeleteDatasetItemsMutation = () => + useMutation({ + mutationFn: (params: BatchDeleteDatasetItemsParams) => + mastraClient.batchDeleteDatasetItems(params), + onSuccess: async (_, variables) => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.items(variables.datasetId) }) + }, + }) + + const useTriggerDatasetExperimentMutation = () => + useMutation({ + mutationFn: (params: TriggerDatasetExperimentParams) => + mastraClient.triggerDatasetExperiment(params), + onSuccess: async (_, variables) => { + await queryClient.invalidateQueries({ queryKey: mastraQueryKeys.datasets.experiments(variables.datasetId) }) + }, + }) + // Vector Mutations const useVectorQueryMutation = (vectorName: string) => useMutation({ @@ -1416,6 +1840,12 @@ export function useMastraQuery(): MastraQueryHooks { }) => mastraClient.score(params), }) + const useSaveScoreMutation = () => + useMutation({ + mutationFn: (params: Parameters[0]) => + mastraClient.saveScore(params), + }) + const hooks = { // Queries useAgents, @@ -1429,6 +1859,8 @@ export function useMastraQuery(): MastraQueryHooks { useWorkflow, useWorkflowRun, useWorkflowRuns, + useScorers, + useScorer, useTools, useTool, useThreads, @@ -1439,6 +1871,17 @@ export function useMastraQuery(): MastraQueryHooks { useScoresByRun, useScoresByScorer, useScoresByEntity, + useDatasets, + useDataset, + useDatasetItems, + useDatasetItem, + useDatasetItemHistory, + useDatasetItemVersion, + useDatasetVersions, + useDatasetExperiments, + useDatasetExperiment, + useDatasetExperimentResults, + useCompareExperiments, useTraces, useTrace, useLogs, @@ -1485,6 +1928,15 @@ export function useMastraQuery(): MastraQueryHooks { useDeleteThreadMutation, useUpdateMemoryThreadMutation, useUpdateWorkingMemoryMutation, + useCreateDatasetMutation, + useUpdateDatasetMutation, + useDeleteDatasetMutation, + useAddDatasetItemMutation, + useUpdateDatasetItemMutation, + useDeleteDatasetItemMutation, + useBatchInsertDatasetItemsMutation, + useBatchDeleteDatasetItemsMutation, + useTriggerDatasetExperimentMutation, useVectorQueryMutation, useVectorUpsertMutation, useWorkspaceWriteFileMutation, @@ -1499,6 +1951,7 @@ export function useMastraQuery(): MastraQueryHooks { useA2ASendMessageMutation, useA2ACancelTaskMutation, useScoreMutation, + useSaveScoreMutation, } return hooks as MastraQueryHooks diff --git a/lib/hooks/use-mastra.ts b/lib/hooks/use-mastra.ts index eb46727a..e720f719 100644 --- a/lib/hooks/use-mastra.ts +++ b/lib/hooks/use-mastra.ts @@ -3,6 +3,28 @@ import { useCallback, useEffect, useState } from 'react' import { mastraClient } from '@/lib/mastra-client' import type { SpanType } from '@mastra/core/observability' +import type { + AddDatasetItemParams, + BatchDeleteDatasetItemsParams, + BatchInsertDatasetItemsParams, + CompareExperimentsParams, + CompareExperimentsResponse, + CreateDatasetParams, + DatasetExperiment, + DatasetExperimentResult, + DatasetItem, + DatasetItemVersionResponse, + DatasetRecord, + DatasetVersionResponse, + GetScorerResponse, + ListScoresByEntityIdParams, + ListScoresByRunIdParams, + ListScoresByScorerIdParams, + ListScoresResponse, + TriggerDatasetExperimentParams, + UpdateDatasetItemParams, + UpdateDatasetParams, +} from '@mastra/client-js' interface MastraPaginationInfo { total: number @@ -29,6 +51,176 @@ interface MastraTraceRecord { spans: unknown[] } +interface MastraDatasetsResponse { + datasets: DatasetRecord[] + pagination: MastraPaginationInfo +} + +interface MastraDatasetItemsResponse { + items: DatasetItem[] + pagination: MastraPaginationInfo +} + +interface MastraDatasetVersionsResponse { + versions: DatasetVersionResponse[] + pagination: MastraPaginationInfo +} + +interface MastraDatasetExperimentsResponse { + experiments: DatasetExperiment[] + pagination: MastraPaginationInfo +} + +interface MastraDatasetExperimentResultsResponse { + results: DatasetExperimentResult[] + pagination: MastraPaginationInfo +} + +export interface HarnessModeView { + id: string + name?: string + color?: string + default?: boolean +} + +export interface HarnessThreadView { + id: string + resourceId: string + title?: string + createdAt: string + updatedAt: string +} + +export interface HarnessMessageView { + id: string + role: 'system' | 'user' | 'assistant' + content: string + createdAt?: string + type?: string +} + +export interface HarnessDisplayStateView { + currentModeId?: string + currentThreadId?: string | null + isRunning?: boolean + activeTool?: unknown + activeSubagent?: unknown + pendingQuestion?: unknown + pendingToolApproval?: unknown + pendingPlanApproval?: unknown + omProgress?: unknown + lastError?: string | null +} + +export interface HarnessSessionView { + currentThreadId: string | null + currentModeId: string + threads: HarnessThreadView[] +} + +export interface HarnessSnapshotResponse { + session: HarnessSessionView + modes: HarnessModeView[] + messages: HarnessMessageView[] + displayState: HarnessDisplayStateView + state: Record + currentModelId?: string | null + resourceId?: string +} + +export interface HarnessSnapshotParams { + resourceId?: string + threadId?: string + messageLimit?: number +} + +export interface HarnessSendMessageParams { + content: string + resourceId?: string + threadId?: string +} + +export interface HarnessSwitchModeParams { + modeId: string + resourceId?: string + threadId?: string +} + +export interface HarnessCreateThreadParams { + title?: string + resourceId?: string +} + +export interface HarnessSwitchThreadParams { + threadId: string + resourceId?: string +} + +const HARNESS_PATH = '/harness' + +function buildHarnessPath(params?: HarnessSnapshotParams): string { + const searchParams = new URLSearchParams() + + if (typeof params?.resourceId === 'string' && params.resourceId.length > 0) { + searchParams.set('resourceId', params.resourceId) + } + + if (typeof params?.threadId === 'string' && params.threadId.length > 0) { + searchParams.set('threadId', params.threadId) + } + + if (typeof params?.messageLimit === 'number') { + searchParams.set('messageLimit', String(params.messageLimit)) + } + + const query = searchParams.toString() + return query.length > 0 ? `${HARNESS_PATH}?${query}` : HARNESS_PATH +} + +export function getHarnessSnapshot(params?: HarnessSnapshotParams) { + return mastraClient.request(buildHarnessPath(params)) +} + +export function sendHarnessMessage(params: HarnessSendMessageParams) { + return mastraClient.request(HARNESS_PATH, { + method: 'POST', + body: { + action: 'send-message', + ...params, + }, + }) +} + +export function switchHarnessMode(params: HarnessSwitchModeParams) { + return mastraClient.request(HARNESS_PATH, { + method: 'POST', + body: { + action: 'switch-mode', + ...params, + }, + }) +} + +export function createHarnessThread(params?: HarnessCreateThreadParams) { + return mastraClient.request(HARNESS_PATH, { + method: 'POST', + body: { + action: 'create-thread', + ...(params ?? {}), + }, + }) +} + +export function switchHarnessThread(params: HarnessSwitchThreadParams) { + return mastraClient.request(HARNESS_PATH, { + method: 'POST', + body: { + action: 'switch-thread', + ...params, + }, + }) +} + // Generic fetch hook for MastraClient data export function useMastraFetch( fetcher: () => Promise, @@ -364,11 +556,14 @@ export function useAITraces(params?: { page: params?.page ?? 1, perPage: params?.perPage ?? 20, }, - filter: { - name: params?.filters?.name, + filters: { + // name: params?.filters?.name, + // status: typeof TraceStatus, // Example filter by completed traces + // hasChildError: params?.filters?.hasChildError, spanType: params?.filters?.spanType, entityId: params?.filters?.entityId, - entityType: params?.filters?.entityType, + // entityType: params?.filters?.entityType, + //tags: {}, }, }) return res as MastraListTracesResponse @@ -385,6 +580,204 @@ export function useAITrace(traceId: string | null) { }, [traceId]) } +export function useScorers() { + return useMastraFetch>( + async () => await mastraClient.listScorers(), + [] + ) +} + +export function useScorer(scorerId: string | null) { + return useMastraFetch(async () => { + if (scorerId === null || scorerId === undefined) { + return null + } + + return await mastraClient.getScorer(scorerId) + }, [scorerId]) +} + +export function useScoresByRun(params: ListScoresByRunIdParams | null) { + return useMastraFetch(async () => { + if (params === null) { + return null + } + + return await mastraClient.listScoresByRunId(params) + }, [params]) +} + +export function useScoresByScorer(params: ListScoresByScorerIdParams | null) { + return useMastraFetch(async () => { + if (params === null) { + return null + } + + return await mastraClient.listScoresByScorerId(params) + }, [params]) +} + +export function useScoresByEntity(params: ListScoresByEntityIdParams | null) { + return useMastraFetch(async () => { + if (params === null) { + return null + } + + return await mastraClient.listScoresByEntityId(params) + }, [params]) +} + +export function useDatasets(pagination?: { page?: number; perPage?: number }) { + return useMastraFetch( + async () => await mastraClient.listDatasets(pagination), + [pagination?.page, pagination?.perPage] + ) +} + +export function useDataset(datasetId: string | null) { + return useMastraFetch(async () => { + if (datasetId === null || datasetId === undefined) { + return null + } + + return await mastraClient.getDataset(datasetId) + }, [datasetId]) +} + +export function useDatasetItems( + datasetId: string | null, + params?: { page?: number; perPage?: number; search?: string; version?: number | null } +) { + return useMastraFetch(async () => { + if (datasetId === null || datasetId === undefined) { + return null + } + + return await mastraClient.listDatasetItems(datasetId, params) + }, [datasetId, params?.page, params?.perPage, params?.search, params?.version]) +} + +export function useDatasetItem(datasetId: string | null, itemId: string | null) { + return useMastraFetch(async () => { + if (datasetId === null || itemId === null || datasetId === undefined || itemId === undefined) { + return null + } + + return await mastraClient.getDatasetItem(datasetId, itemId) + }, [datasetId, itemId]) +} + +export function useDatasetItemHistory(datasetId: string | null, itemId: string | null) { + return useMastraFetch<{ history: DatasetItemVersionResponse[] } | null>(async () => { + if (datasetId === null || itemId === null || datasetId === undefined || itemId === undefined) { + return null + } + + return await mastraClient.getItemHistory(datasetId, itemId) + }, [datasetId, itemId]) +} + +export function useDatasetItemVersion( + datasetId: string | null, + itemId: string | null, + datasetVersion: number | null +) { + return useMastraFetch(async () => { + if ( + datasetId === null || + itemId === null || + datasetVersion === null || + datasetId === undefined || + itemId === undefined + ) { + return null + } + + return await mastraClient.getDatasetItemVersion( + datasetId, + itemId, + datasetVersion + ) + }, [datasetId, itemId, datasetVersion]) +} + +export function useDatasetVersions( + datasetId: string | null, + pagination?: { page?: number; perPage?: number } +) { + return useMastraFetch(async () => { + if (datasetId === null || datasetId === undefined) { + return null + } + + return await mastraClient.listDatasetVersions(datasetId, pagination) + }, [datasetId, pagination?.page, pagination?.perPage]) +} + +export function useDatasetExperiments( + datasetId: string | null, + pagination?: { page?: number; perPage?: number } +) { + return useMastraFetch(async () => { + if (datasetId === null || datasetId === undefined) { + return null + } + + return await mastraClient.listDatasetExperiments(datasetId, pagination) + }, [datasetId, pagination?.page, pagination?.perPage]) +} + +export function useDatasetExperiment( + datasetId: string | null, + experimentId: string | null +) { + return useMastraFetch(async () => { + if ( + datasetId === null || + experimentId === null || + datasetId === undefined || + experimentId === undefined + ) { + return null + } + + return await mastraClient.getDatasetExperiment(datasetId, experimentId) + }, [datasetId, experimentId]) +} + +export function useDatasetExperimentResults( + datasetId: string | null, + experimentId: string | null, + pagination?: { page?: number; perPage?: number } +) { + return useMastraFetch(async () => { + if ( + datasetId === null || + experimentId === null || + datasetId === undefined || + experimentId === undefined + ) { + return null + } + + return await mastraClient.listDatasetExperimentResults( + datasetId, + experimentId, + pagination + ) + }, [datasetId, experimentId, pagination?.page, pagination?.perPage]) +} + +export function useCompareExperiments(params: CompareExperimentsParams | null) { + return useMastraFetch(async () => { + if (params === null) { + return null + } + + return await mastraClient.compareExperiments(params) + }, [params]) +} + // Logs hooks export function useLogs(transportId?: string) { return useMastraFetch(async () => { @@ -495,6 +888,195 @@ export function useCreateMemoryThread() { return { create, loading, error } } +export function useCreateDataset() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const create = useCallback(async (params: CreateDatasetParams) => { + setLoading(true) + setError(null) + try { + return await mastraClient.createDataset(params) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { create, loading, error } +} + +export function useUpdateDataset() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const update = useCallback(async (params: UpdateDatasetParams) => { + setLoading(true) + setError(null) + try { + return await mastraClient.updateDataset(params) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { update, loading, error } +} + +export function useDeleteDataset() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const remove = useCallback(async (datasetId: string) => { + setLoading(true) + setError(null) + try { + return await mastraClient.deleteDataset(datasetId) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { remove, loading, error } +} + +export function useAddDatasetItem() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const add = useCallback(async (params: AddDatasetItemParams) => { + setLoading(true) + setError(null) + try { + return await mastraClient.addDatasetItem(params) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { add, loading, error } +} + +export function useUpdateDatasetItem() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const update = useCallback(async (params: UpdateDatasetItemParams) => { + setLoading(true) + setError(null) + try { + return await mastraClient.updateDatasetItem(params) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { update, loading, error } +} + +export function useDeleteDatasetItem() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const remove = useCallback(async (datasetId: string, itemId: string) => { + setLoading(true) + setError(null) + try { + return await mastraClient.deleteDatasetItem(datasetId, itemId) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { remove, loading, error } +} + +export function useBatchInsertDatasetItems() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const insert = useCallback(async (params: BatchInsertDatasetItemsParams) => { + setLoading(true) + setError(null) + try { + return await mastraClient.batchInsertDatasetItems(params) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { insert, loading, error } +} + +export function useBatchDeleteDatasetItems() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const remove = useCallback(async (params: BatchDeleteDatasetItemsParams) => { + setLoading(true) + setError(null) + try { + return await mastraClient.batchDeleteDatasetItems(params) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { remove, loading, error } +} + +export function useTriggerDatasetExperiment() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const trigger = useCallback(async (params: TriggerDatasetExperimentParams) => { + setLoading(true) + setError(null) + try { + return await mastraClient.triggerDatasetExperiment(params) + } catch (err) { + const errorInstance = err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, []) + + return { trigger, loading, error } +} + export function useUpdateWorkingMemory() { const [loading, setLoading] = useState(false) const [error, setError] = useState(null) @@ -591,3 +1173,29 @@ export function useScoreTraces() { return { score, loading, error } } + +export function useSaveScore() { + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + + const save = useCallback( + async (params: Parameters[0]) => { + setLoading(true) + setError(null) + try { + return await mastraClient.saveScore(params) + } catch (err) { + const errorInstance = + err instanceof Error ? err : new Error(String(err)) + setError(errorInstance) + throw errorInstance + } finally { + setLoading(false) + } + }, + [] + ) + + return { save, loading, error } +} + diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index d4c83bc6..ed1e179a 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -1,3 +1,60 @@ +## Active Context Update (2026-03-16 - Mastra evals production-grade typing cleanup) + +- Cleaned `src/mastra/evals/**` to a targeted `get_errors` clean state. +- Verified current Mastra eval behavior against installed typings/docs: + - scorer authoring remains `createScorer` from `@mastra/core/evals` + - built-in/reference scorer packages live under `@mastra/evals` + - agents support live scorer attachment directly in agent config + - local eval experiments in this repo now use `agent.generate(..., { returnScorerData: true })` + `scorer.run(...)` instead of the previously failing `runEvals(...)` calls + - installed `runEvals` agent overload still exists and accepts dataset-style items shaped like `{ input, groundTruth?, requestContext?: RequestContext }` +- Hardened eval utilities/scorers to remove unsafe `any` patterns and object-stringification lint issues: + - `src/mastra/evals/scorers/utils.ts` + - `src/mastra/evals/scorers/keyword-coverage.ts` + - `src/mastra/evals/scorers/prebuilt.ts` + - `src/mastra/evals/scorers/custom-scorers.ts` + - `src/mastra/evals/scorers/financial-scorers.ts` + - `src/mastra/evals/agent-experiments.ts` +- Judge-backed eval scorers were normalized to the explicit model string `google/gemini-3.1-flash-lite-preview`. +- Eval tests no longer rely on `(scorer as any).run(...)`; the local harness now returns agent-typed scorer payloads. +- `seoAgent.ts` was aligned with the same convention by removing the stale unused `googleAI3` import while keeping the inline model string already present there. + +## Active Context Update (2026-03-16 - Frontend dataset/eval hook coverage) + +- Extended both frontend Mastra hook layers to expose installed dataset/eval APIs without touching `lib/mastra-client.ts`: + - `lib/hooks/use-mastra-query.ts` + - `lib/hooks/use-mastra.ts` +- Added dataset CRUD, dataset item CRUD/history/version access, experiment listing/detail/results/compare, scorer listing/detail, score listing, trigger-experiment, and save-score hooks. +- Validation: targeted `get_errors` on both hook files returned **No errors found**. + +## Active Context Update (2026-03-16 - Mastra nested agent typing cleanup) + +- Fixed `src/mastra/agents`, `src/mastra/a2a`, and `src/mastra/networks` folder errors using targeted VS Code `get_errors` validation only. +- Root cause verified in installed Mastra types: `@mastra/core/dist/agent/types.d.ts` defines nested `agents?: DynamicArgument>`, which rejects valid child agents with narrower request-context generics. +- Added `src/mastra/agents/nestedAgents.ts` as the single boundary adapter for nested sub-agent registration. +- Updated all affected A2A/network/agent registries to use `asNestedAgents(...)` and removed the earlier `agentRegistry.ts` helper. +- Cleaned adjacent issues found by `get_errors` during the same pass: + - removed unused imports in `researchAgent.ts` and `customerSupportAgent.ts` + - fixed markdown fence language in `src/mastra/networks/AGENTS.md` + +## Active Context Update (2026-03-16 - Tools production typing/hook hardening) + +- Hardened the Mastra tools layer using targeted `get_errors` validation and folder-level revalidation on `src/mastra/tools`. +- Fixed strict typing and nullable handling in: + - `pdf-data-conversion.tool.ts` + - `url-tool.ts` + - `color-change-tool.ts` + - `chartjs.tool.ts` + - `data-processing-tools.ts` + - `image-tool.ts` +- Also cleaned concrete folder diagnostics exposed during the pass in: + - `e2b.ts` + - `find-references.tool.ts` + - `extractLearningsTool.ts` + - `document-chunking.tool.ts` + - `technical-analysis.tool.ts` +- Normalized hook placement in touched tool definitions so hook declarations sit alongside schema definitions before `execute` where appropriate. +- Final verification: `get_errors` on `src/mastra/tools` returned **No errors found**. + ## Active Context Update (2026-03-05 - Workspace/Sandbox Hook Expansion) - Mastra workspace docs were reviewed for frontend integration (`local-filesystem`, `local-sandbox`, `sandbox`, `workspace-class`, `workspace/search`). diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 8384cc32..f85ddb49 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -1,3 +1,22 @@ +# 2026-03-16 Mastra evals hardening + +- Resolved all current `get_errors` issues under `src/mastra/evals`. +- Reworked `agent-experiments.ts` away from the broken local `runEvals(agent, ...)` usage path and onto a typed helper that: + - executes the agent with `returnScorerData: true` + - feeds canonical `scoringData.input` / `scoringData.output` into `scorer.run(...)` +- Removed unsafe `any`/member-access patterns from keyword coverage, financial scorer parsing, custom scorers, and scorer utility helpers. +- Standardized judge-backed eval scorers on the explicit Mastra model string `google/gemini-3.1-flash-lite-preview`. +- Added `type: 'agent'` to custom agent scorers so experiment helpers accept them without `any`/unsafe widening. +- Removed `as any` scorer execution from eval tests by making the local test harness return agent-shaped scorer input/output. +- Verified current installed `@mastra/core` typings directly from `node_modules`: + - `runEvals(...)` is supported for datasets/manual batches + - `RunEvalsDataItem` expects `{ input, groundTruth?, requestContext?: RequestContext }` +- Final convention pass: judge-backed eval scorers now use the inline literal model string exactly as requested, and `src/mastra/agents/seoAgent.ts` no longer has an unused Google model import. +- Added the full frontend dataset/scorer/experiment API surface to both `lib/hooks/use-mastra-query.ts` and `lib/hooks/use-mastra.ts`, matching the installed `@mastra/client-js` methods exactly. +- Validation: + - ✅ targeted `get_errors` on edited eval files clean + - ✅ final `get_errors` on `src/mastra/evals` returned **No errors found** + ## 2026-02-17 Landing Components Full Pass - Completed landing-wide component polish across all `landing-*` sections: @@ -47,6 +66,37 @@ # Progress +## 2026-03-16 Mastra nested-agent type fix + +- Resolved folder-level `get_errors` failures in: + - `src/mastra/agents` + - `src/mastra/a2a` + - `src/mastra/networks` +- Verified upstream cause in installed dependency typings rather than guessing: + - `node_modules/@mastra/core/dist/agent/types.d.ts` + - nested `agents` config is typed too narrowly for child agents with stricter runtime contexts. +- Added a single local adapter: + - `src/mastra/agents/nestedAgents.ts` +- Updated all affected parent agent/network registrations to use `asNestedAgents(...)`. +- Removed obsolete `src/mastra/agents/agentRegistry.ts`. +- Validation: + - ✅ targeted `get_errors` on edited files clean + - ✅ final `get_errors` on `src/mastra/agents`, `src/mastra/a2a`, and `src/mastra/networks` returned **No errors found** + +## 2026-03-16 Mastra tools strict-clean pass + +- Completed strict type/hook cleanup across the requested Mastra tool files and resolved additional concrete diagnostics surfaced by folder-wide validation. +- Key fixes included: + - removed avoidable `any` usage in touched schemas/helpers + - tightened nullable booleans/strings for strict checks + - added/normalized output schemas so hook payloads are typed correctly + - normalized tool hook placement around schema definitions in touched tools + - repaired Excalidraw → SVG compatibility typing + - cleaned E2B/listing path regression and several leftover utility tool diagnostics +- Validation: + - ✅ requested tool files clean under `get_errors` + - ✅ final `get_errors` on `src/mastra/tools` returned **No errors found** + ## 2026-03-05 use-mastra-query error cleanup - Fixed `lib/hooks/use-mastra-query.ts` compile issues caused by partially wired hooks. diff --git a/package-lock.json b/package-lock.json index 91acce7b..be16adad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,57 +1,57 @@ { "name": "agentstack", - "version": "1.2.1", + "version": "1.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "agentstack", - "version": "1.2.1", + "version": "1.3.1", "license": "ISC", "dependencies": { - "@ai-sdk/google": "^3.0.35", - "@ai-sdk/google-vertex": "^4.0.69", - "@ai-sdk/openai": "^3.0.38", - "@ai-sdk/openai-compatible": "^2.0.31", - "@ai-sdk/provider-utils": "^4.0.16", - "@ai-sdk/react": "^3.0.108", - "@dotenvx/dotenvx": "^1.52.0", + "@ai-sdk/google": "^3.0.43", + "@ai-sdk/google-vertex": "^4.0.80", + "@ai-sdk/openai": "^3.0.41", + "@ai-sdk/openai-compatible": "^2.0.35", + "@ai-sdk/provider-utils": "^4.0.19", + "@ai-sdk/react": "^3.0.118", + "@dotenvx/dotenvx": "^1.55.1", "@e2b/code-interpreter": "^2.3.3", "@emotion/react": "^11.14.0", "@gsap/react": "^2.1.2", - "@mastra/ai-sdk": "^1.1.0", + "@mastra/ai-sdk": "^1.1.3", "@mastra/auth-supabase": "^1.0.0", - "@mastra/client-js": "^1.7.1", - "@mastra/cloudflare-d1": "^1.0.0", - "@mastra/convex": "^1.0.4", - "@mastra/core": "^1.8.0", - "@mastra/daytona": "^0.0.1", - "@mastra/deployer": "^1.8.0", + "@mastra/client-js": "^1.8.4", + "@mastra/cloudflare-d1": "^1.0.3", + "@mastra/convex": "^1.0.6", + "@mastra/core": "^1.13.2", + "@mastra/daytona": "^0.2.0", + "@mastra/deployer": "^1.13.2", "@mastra/evals": "^1.1.2", - "@mastra/lance": "^1.0.2", - "@mastra/libsql": "^1.6.2", + "@mastra/lance": "^1.0.4", + "@mastra/libsql": "^1.7.0", "@mastra/loggers": "^1.0.2", - "@mastra/mcp": "^1.0.2", - "@mastra/memory": "^1.5.2", - "@mastra/mongodb": "^1.5.2", - "@mastra/observability": "^1.2.1", - "@mastra/otel-bridge": "^1.0.3", - "@mastra/pg": "^1.7.0", + "@mastra/mcp": "^1.2.1", + "@mastra/memory": "^1.8.2", + "@mastra/mongodb": "^1.5.5", + "@mastra/observability": "^1.5.0", + "@mastra/otel-bridge": "^1.0.7", + "@mastra/pg": "^1.8.0", "@mastra/qdrant": "^1.0.1", "@mastra/rag": "^2.1.2", - "@mastra/react": "^0.2.7", - "@mastra/upstash": "^1.0.2", + "@mastra/react": "^0.2.14", + "@mastra/upstash": "^1.0.4", "@mastra/vectorize": "^1.0.1", "@mastra/voice-google": "^0.12.0", "@mastra/voice-openai": "^0.12.1", - "@mcpc-tech/acp-ai-provider": "^0.2.4", + "@mcpc-tech/acp-ai-provider": "^0.2.8", "@next/bundle-analyzer": "^16.1.6", "@next/mdx": "^16.1.6", "@octokit/plugin-retry": "^8.1.0", - "@openrouter/ai-sdk-provider": "^2.2.3", + "@openrouter/ai-sdk-provider": "^2.3.1", "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-node": "^0.70.1", - "@opentelemetry/exporter-trace-otlp-proto": "^0.212.0", + "@opentelemetry/auto-instrumentations-node": "^0.71.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.213.0", "@opeoginni/github-copilot-openai-compatible": "^1.0.0", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-collapsible": "^1.1.12", @@ -68,9 +68,9 @@ "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tooltip": "^1.2.8", "@radix-ui/react-use-controllable-state": "^1.2.2", - "@rive-app/react-webgl2": "^4.27.0", + "@rive-app/react-webgl2": "^4.27.1", "@streamdown/cjk": "^1.0.2", - "@streamdown/code": "^1.0.3", + "@streamdown/code": "^1.1.0", "@streamdown/math": "^1.0.2", "@streamdown/mermaid": "^1.0.2", "@tanstack/react-query": "^5.90.21", @@ -81,10 +81,10 @@ "@xterm/xterm": "^6.0.0", "@xyflow/react": "^12.10.1", "a2a-ai-provider": "^0.4.0-alpha.2", - "ai": "^6.0.105", + "ai": "^6.0.116", "ai-sdk-ollama": "^3.8.0", "ai-sdk-provider-gemini-cli": "^2.0.1", - "ai-sdk-provider-opencode-sdk": "^2.1.1", + "ai-sdk-provider-opencode-sdk": "^2.1.2", "ansi-to-react": "^6.2.6", "arraystat": "^1.7.81", "axios": "^1.13.6", @@ -101,7 +101,7 @@ "cmdk": "^1.1.1", "concurrently": "^9.2.1", "convert-csv-to-json": "^3.20.0", - "convex": "^1.32.0", + "convex": "^1.33.1", "crawlee": "^3.16.0", "critters": "^0.0.25", "csv-parse": "^6.1.0", @@ -114,28 +114,28 @@ "embla-carousel-react": "^8.6.0", "excalidraw-to-svg": "^3.1.0", "fast-glob": "^3.3.3", - "fast-xml-parser": "^5.4.1", - "framer-motion": "^12.34.4", + "fast-xml-parser": "^5.5.6", + "framer-motion": "^12.37.0", "globals": "^17.4.0", "gray-matter": "^4.0.3", "gsap": "^3.14.2", "html-to-image": "^1.11.13", "husky": "^9.1.7", "input-otp": "^1.4.2", - "isolated-vm": "^6.0.2", - "jose": "^6.1.3", - "jsdom": "^28.1.0", + "isolated-vm": "^6.1.2", + "jose": "^6.2.1", + "jsdom": "^29.0.0", "langfuse-vercel": "^3.38.6", "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", - "lenis": "^1.3.17", + "lenis": "^1.3.18", "lodash": "^4.17.23", - "lucide-react": "^0.575.0", - "marked": "^17.0.3", + "lucide-react": "^0.577.0", + "marked": "^17.0.4", "mathjs": "^15.1.1", "media-chrome": "^4.18.0", - "motion": "^12.34.4", - "nanoid": "^5.1.6", + "motion": "^12.37.0", + "nanoid": "^5.1.7", "next": "^16.1.6", "next-themes": "^0.4.6", "octokit": "^5.0.5", @@ -143,7 +143,7 @@ "pino": "^10.3.1", "pino-pretty": "^13.1.3", "playwright": "^1.58.2", - "postcss": "^8.5.6", + "postcss": "^8.5.8", "radix-ui": "^1.4.3", "rbush": "^4.0.1", "re2": "^1.23.3", @@ -151,7 +151,7 @@ "react-chartjs-2": "^5.3.1", "react-dom": "^19.2.4", "react-jsx-parser": "^2.4.1", - "react-resizable-panels": "^4.7.0", + "react-resizable-panels": "^4.7.3", "recharts": "^2.15.4", "rehype": "^13.0.2", "rehype-class-names": "^2.0.0", @@ -165,10 +165,10 @@ "remark-rehype": "^11.1.2", "serpapi": "^2.2.1", "sharp": "^0.34.5", - "shiki": "^3.23.0", - "simple-statistics": "^7.8.8", + "shiki": "^4.0.2", + "simple-statistics": "^7.8.9", "sonner": "^2.0.7", - "streamdown": "^2.3.0", + "streamdown": "^2.4.0", "strip-comments": "^2.0.1", "svgjson": "^2.2.3", "tailwind-merge": "^3.5.0", @@ -182,11 +182,12 @@ "unified": "^11.0.5", "unpdf": "^1.4.0", "use-stick-to-bottom": "^1.1.3", - "v0-sdk": "^0.16.2", + "v0-sdk": "^0.16.4", "zod": "^4.3.6" }, "devDependencies": { - "@eslint/compat": "^2.0.2", + "@eslint/compat": "^2.0.3", + "@eslint/js": "^9.39.4", "@mdx-js/loader": "^3.1.1", "@mdx-js/react": "^3.1.1", "@tailwindcss/postcss": "^4.2.1", @@ -196,29 +197,29 @@ "@types/jsdom": "^28.0.0", "@types/leaflet.markercluster": "^1.5.6", "@types/mdx": "^2.0.13", - "@types/node": "^24.10.13", + "@types/node": "^24.12.0", "@types/rbush": "^4.0.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/strip-comments": "^2.0.4", "@types/unist": "^3.0.3", - "@typescript-eslint/eslint-plugin": "^8.56.1", - "@typescript-eslint/parser": "^8.56.1", - "@vitest/coverage-v8": "^4.0.18", + "@typescript-eslint/eslint-plugin": "^8.57.0", + "@typescript-eslint/parser": "^8.57.0", + "@vitest/coverage-v8": "^4.1.0", "cross-env": "^10.1.0", - "eslint": "^9.39.3", + "eslint": "^9.39.4", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.5.2", "ink-testing-library": "^4.0.0", - "mastra": "^1.3.5", + "mastra": "^1.3.12", "prettier": "^3.8.1", "tailwindcss": "^4.2.1", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.56.1", + "typescript-eslint": "^8.57.0", "typescript-language-server": "^5.1.3", - "vitest": "^4.0.18" + "vitest": "^4.1.0" }, "engines": { "node": ">=20.9.0" @@ -240,12 +241,6 @@ "node": ">=18" } }, - "node_modules/@acemir/cssom": { - "version": "0.9.31", - "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", - "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", - "license": "MIT" - }, "node_modules/@adobe/css-tools": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", @@ -254,31 +249,22 @@ "license": "MIT" }, "node_modules/@agentclientprotocol/sdk": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-0.4.9.tgz", - "integrity": "sha512-ExwH828LaTGoTTjxuw49l+fwOLA+Yx0+qkWn1TcHMOsY5mVI9CUfkj7ZDhv2klgZ7mJeT+lxX/Dn/KINv1AkNQ==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-0.14.1.tgz", + "integrity": "sha512-b6r3PS3Nly+Wyw9U+0nOr47bV8tfS476EgyEMhoKvJCZLbgqoDFN7DJwkxL88RR0aiOqOYV1ZnESHqb+RmdH8w==", "license": "Apache-2.0", - "dependencies": { - "zod": "^3.0.0" - } - }, - "node_modules/@agentclientprotocol/sdk/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" } }, "node_modules/@ai-sdk/anthropic": { - "version": "3.0.51", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.51.tgz", - "integrity": "sha512-ZQ3UE4KpKFBe6Vr1mJu6QwUxlnwwJNGrnxGpW1eFj9CA3hmDVT3XVeevCWps4R+c1YT4GZig6IjJgFmwLeWlFQ==", + "version": "3.0.60", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.60.tgz", + "integrity": "sha512-CoSexBeEEkdMVxUbikH4mqIzC3hhxZr2TcisaCmVqozsh+cNmMa0d3J2wJxDw2onBQU33t3YGW1n/RhN83Yk4g==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.16" + "@ai-sdk/provider-utils": "4.0.20" }, "engines": { "node": ">=18" @@ -288,13 +274,13 @@ } }, "node_modules/@ai-sdk/gateway": { - "version": "3.0.59", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.59.tgz", - "integrity": "sha512-MbtheWHgEFV/8HL1Z6E3hOAsmP73zZlNFg0F0nJAD0Adnjp4J/plqNK00Y896d+dWTw+r0OXzyov9/2wCFjH0Q==", + "version": "3.0.66", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.66.tgz", + "integrity": "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.16", + "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "engines": { @@ -304,14 +290,31 @@ "zod": "^3.25.76 || ^4.1.8" } }, + "node_modules/@ai-sdk/gateway/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.19.tgz", + "integrity": "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/@ai-sdk/google": { - "version": "3.0.35", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.35.tgz", - "integrity": "sha512-5b+2hVXESm24KOyjznLkEdxPXQSanGQfsYRIFuVGCscVq8eQxVV9S+s2I+7dVJtQtmBcgQiOwroMH1z1zmqQuA==", + "version": "3.0.51", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.51.tgz", + "integrity": "sha512-S5pG/iRt+E12a4TSnquBFnkHkbS+rcAJ2lRzds59vdnVqTsZGGIncaLefpGmq/MZNfbSo6JIO60duoZIpZXOqg==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.16" + "@ai-sdk/provider-utils": "4.0.20" }, "engines": { "node": ">=18" @@ -321,15 +324,15 @@ } }, "node_modules/@ai-sdk/google-vertex": { - "version": "4.0.69", - "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-4.0.69.tgz", - "integrity": "sha512-o3C37uvqoz8Hc9fbDs7Oe64ZEyXHcZhiK5RT/RrO3Mz2s9yRPwFcPaUTXALp4MkkyG4bPsFRtMvwgMMn0zPpeg==", + "version": "4.0.89", + "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-4.0.89.tgz", + "integrity": "sha512-nE4Q+WjS+Fp09bTirRCCd+1yh2xZAJEv5BX8w0TzO0uAsirvyHCkqUmIbeG4qZLOVEFaaQsZbpcObfir591Adg==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "3.0.51", - "@ai-sdk/google": "3.0.35", + "@ai-sdk/anthropic": "3.0.60", + "@ai-sdk/google": "3.0.51", "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.16", + "@ai-sdk/provider-utils": "4.0.20", "google-auth-library": "^10.5.0" }, "engines": { @@ -340,13 +343,13 @@ } }, "node_modules/@ai-sdk/openai": { - "version": "3.0.38", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.38.tgz", - "integrity": "sha512-TtHxdEOUpRTEGgYOUHzgrrFYBiI3BBz8zbQokWNtQtR6CWSP/7JjmsGamU31CEhH2LD98vxc4V30/kjTNgGGUQ==", + "version": "3.0.45", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.45.tgz", + "integrity": "sha512-bHOw3E73pxo4D/dZUXk7zwmlofq2nURYlK1dSAy/CI+t6btVhr/BXbElAR7yst6P8Ukqy5GfFlFfsru5p6YSig==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.16" + "@ai-sdk/provider-utils": "4.0.20" }, "engines": { "node": ">=18" @@ -356,13 +359,13 @@ } }, "node_modules/@ai-sdk/openai-compatible": { - "version": "2.0.31", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.31.tgz", - "integrity": "sha512-e78xiImcTe2aCMQoFbVJluQmUV4XgahOmmehAuRPlcwzRv2KtkvuLCXPC9Xcy2u83e8SimVva9k9G8SvZcnaBA==", + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.36.tgz", + "integrity": "sha512-YMfukkCwZ/CDj99JPVxTr7Hq1WY1nrLVlyzMTpruDzlwTaXlwHMc89ObvprQYCggSADIuto2tD4Vm1uoKY1y6Q==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.16" + "@ai-sdk/provider-utils": "4.0.20" }, "engines": { "node": ">=18" @@ -384,9 +387,9 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.16.tgz", - "integrity": "sha512-kBvDqNkt5EwlzF9FujmNhhtl8FYg3e8FO8P5uneKliqfRThWemzBj+wfYr7ZCymAQhTRnwSSz1/SOqhOAwmx9g==", + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.20.tgz", + "integrity": "sha512-gpUIj9uDhIGbuo9afKEgQ074BWmhvK4THJAAeBjRnroTy2yQYo6rbtGD7pQDMZM8ouXPYmT/SCdkWVJ0KcpX8A==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.8", @@ -462,9 +465,9 @@ }, "node_modules/@ai-sdk/provider-v5": { "name": "@ai-sdk/provider", - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.1.tgz", + "integrity": "sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -475,9 +478,9 @@ }, "node_modules/@ai-sdk/provider-v6": { "name": "@ai-sdk/provider", - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.0.tgz", - "integrity": "sha512-m9ka3ptkPQbaHHZHqDXDF9C9B5/Mav0KTdky1k2HZ3/nrW2t1AgObxIVPyGDWQNS9FXT/FS6PIoSjpcP/No8rQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.5.tgz", + "integrity": "sha512-2Xmoq6DBJqmSl80U6V9z5jJSJP7ehaJJQMy2iFUqTay06wdCqTnPVBBQbtEL8RCChenL+q5DC5H5WzU3vV3v8w==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -487,13 +490,13 @@ } }, "node_modules/@ai-sdk/react": { - "version": "3.0.108", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.108.tgz", - "integrity": "sha512-dN5AXRw2uYuKJdB2sDxuvQjge/JhVWNY0ANh1lAoeDU1SBoNw7lLfGSpvq0hFFUfTmIOt6KqhE8g6Xgrof2+nQ==", + "version": "3.0.118", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.118.tgz", + "integrity": "sha512-fBAix8Jftxse6/2YJnOFkwW1/O6EQK4DK68M9DlFmZGAzBmsaHXEPVS77sVIlkaOWCy11bE7434NAVXRY+3OsQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider-utils": "4.0.16", - "ai": "6.0.106", + "@ai-sdk/provider-utils": "4.0.19", + "ai": "6.0.116", "swr": "^2.2.5", "throttleit": "2.1.0" }, @@ -504,6 +507,23 @@ "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" } }, + "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.19.tgz", + "integrity": "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -620,22 +640,25 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", - "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", + "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", "license": "MIT", "dependencies": { - "@csstools/css-calc": "^3.0.0", - "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-calc": "^3.1.1", + "@csstools/css-color-parser": "^4.0.2", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.5" + "lru-cache": "^11.2.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@asamuzakjp/css-color/node_modules/@csstools/color-helpers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.1.tgz", - "integrity": "sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", "funding": [ { "type": "github", @@ -675,9 +698,9 @@ } }, "node_modules/@asamuzakjp/css-color/node_modules/@csstools/css-color-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.1.tgz", - "integrity": "sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", + "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", "funding": [ { "type": "github", @@ -690,8 +713,8 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^6.0.1", - "@csstools/css-calc": "^3.0.0" + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.1.1" }, "engines": { "node": ">=20.19.0" @@ -743,16 +766,19 @@ } }, "node_modules/@asamuzakjp/dom-selector": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", - "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.3.tgz", + "integrity": "sha512-Q6mU0Z6bfj6YvnX2k9n0JxiIwrCFN59x/nWmYQnAqP000ruX/yV+5bp/GRcF5T8ncvfwJQ7fgfP74DlpKExILA==", "license": "MIT", "dependencies": { "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", - "css-tree": "^3.1.0", + "css-tree": "^3.2.1", "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.6" + "lru-cache": "^11.2.7" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@asamuzakjp/nwsapi": { @@ -3222,9 +3248,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.0.27", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.27.tgz", - "integrity": "sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz", + "integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==", "funding": [ { "type": "github", @@ -3235,7 +3261,15 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0" + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", @@ -3808,9 +3842,9 @@ } }, "node_modules/@dotenvx/dotenvx": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.52.0.tgz", - "integrity": "sha512-CaQcc8JvtzQhUSm9877b6V4Tb7HCotkcyud9X2YwdqtQKwgljkMRwU96fVYKnzN3V0Hj74oP7Es+vZ0mS+Aa1w==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.55.1.tgz", + "integrity": "sha512-WEuKyoe9CA7dfcFBnNbL0ndbCNcptaEYBygfFo9X1qEG+HD7xku4CYIplw6sbAHJavesZWbVBHeRSpvri0eKqw==", "license": "BSD-3-Clause", "dependencies": { "commander": "^11.1.0", @@ -4011,9 +4045,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], @@ -4027,9 +4061,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], @@ -4043,9 +4077,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], @@ -4059,9 +4093,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], @@ -4075,9 +4109,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], @@ -4091,9 +4125,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], @@ -4107,9 +4141,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], @@ -4123,9 +4157,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], @@ -4139,9 +4173,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], @@ -4155,9 +4189,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], @@ -4171,9 +4205,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], @@ -4187,9 +4221,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], @@ -4203,9 +4237,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], @@ -4219,9 +4253,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], @@ -4235,9 +4269,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], @@ -4251,9 +4285,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], @@ -4267,9 +4301,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], @@ -4283,9 +4317,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], @@ -4299,9 +4333,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], @@ -4315,9 +4349,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "cpu": [ "arm64" ], @@ -4331,9 +4365,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], @@ -4347,9 +4381,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "cpu": [ "arm64" ], @@ -4363,9 +4397,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], @@ -4379,9 +4413,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], @@ -4395,9 +4429,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], @@ -4411,9 +4445,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], @@ -4469,13 +4503,13 @@ } }, "node_modules/@eslint/compat": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.2.tgz", - "integrity": "sha512-pR1DoD0h3HfF675QZx0xsyrsU8q70Z/plx7880NOhS02NuWLgBCOMDL787nUeQ7EWLkxv3bPQJaarjcPQb2Dwg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.3.tgz", + "integrity": "sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.0" + "@eslint/core": "^1.1.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -4490,15 +4524,15 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4531,9 +4565,9 @@ } }, "node_modules/@eslint/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz", - "integrity": "sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4544,9 +4578,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", - "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { @@ -4557,7 +4591,7 @@ "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.3", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -4618,9 +4652,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -4674,9 +4708,9 @@ "license": "MIT" }, "node_modules/@exodus/bytes": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.14.1.tgz", - "integrity": "sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", "license": "MIT", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" @@ -7451,9 +7485,9 @@ ] }, "node_modules/@mastra/ai-sdk": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mastra/ai-sdk/-/ai-sdk-1.1.0.tgz", - "integrity": "sha512-NukoFp2yZ90UbAIaxfsCR6Y2k5wKiDdlzHFLOK9J39E7TMuNUNONqCGYucKcUAoRA+qVQHqRqqsA+D6OnMygeA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@mastra/ai-sdk/-/ai-sdk-1.1.3.tgz", + "integrity": "sha512-ragZGiod88p9KmZYL3IardB1PBAyiD2Rd1f2m5Ztl6cgdknK9hqxxpbgN7XF8uYGx7lJgw6/0DuuTmlKZhE66g==", "license": "Apache-2.0", "engines": { "node": ">=22.13.0" @@ -7476,14 +7510,14 @@ } }, "node_modules/@mastra/client-js": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@mastra/client-js/-/client-js-1.7.1.tgz", - "integrity": "sha512-+MIIjhNr61WKWcEZgdNzBhYdNSVOQMRTXYO749kNXAuwPN8yeh4ESHesOPHPOs+3o8wFB8Cg82bz5Gl2FZyvJg==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@mastra/client-js/-/client-js-1.8.4.tgz", + "integrity": "sha512-afJVujjefBm3FAlWF1nRcnzyrXSljMdyRwfPIGOej3+4QEdaV4H7unExGcv+nyfPbHWV/UovCt44u2XE4cBu0g==", "license": "Apache-2.0", "dependencies": { "@lukeed/uuid": "^2.0.1", - "@mastra/core": "1.8.0", - "@mastra/schema-compat": "1.1.3", + "@mastra/core": "1.13.2", + "@mastra/schema-compat": "1.2.4", "json-schema": "^0.4.0" }, "engines": { @@ -7493,28 +7527,10 @@ "zod": "^3.25.0 || ^4.0.0" } }, - "node_modules/@mastra/client-js/node_modules/@mastra/schema-compat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.1.3.tgz", - "integrity": "sha512-szLMJhqfnEn4VctFLKRZ2NIpfg+3UTghQWgy8Fcdchj2HvHxB2uilJxRybM9ugMmvyE+W48tVdz4Xi2Z1P3pFA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema-to-zod": "^2.7.0", - "zod-from-json-schema": "^0.5.0", - "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", - "zod-to-json-schema": "^3.24.6" - }, - "engines": { - "node": ">=22.13.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - }, "node_modules/@mastra/cloudflare-d1": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@mastra/cloudflare-d1/-/cloudflare-d1-1.0.0.tgz", - "integrity": "sha512-7rCLV8z0WY+kn+n1rQd7r8jlc9pUsQrn9Ed/OY7fZHpTGx48m5vmf6P+912Dgp5Syj1Nftq+LPnSSuVHj+IHow==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@mastra/cloudflare-d1/-/cloudflare-d1-1.0.3.tgz", + "integrity": "sha512-swhtUcCWnK+425R5gmUaZYmwCNBFjIM16FmhiHNcmhIuRbeRPidR3YIooLq+gOaHrIEEHAPiV5RkC9ntaqLntg==", "dependencies": { "cloudflare": "^4.5.0" }, @@ -7526,9 +7542,9 @@ } }, "node_modules/@mastra/convex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@mastra/convex/-/convex-1.0.4.tgz", - "integrity": "sha512-Dg7ZkfmExRV0gNTfDWaGGWaPTyoczTzUVuNWwtSdyBMyUcw2qP/nC/dVOTuotvqNqTIhFvjcqNlc6WG4BKh1TA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@mastra/convex/-/convex-1.0.6.tgz", + "integrity": "sha512-NJMphrdZiafELp+Nt9fYmXH73xPsGqwhVXGwl9gh8eRiy4YRWYXVV27gR70jPHe0Txn3T3XbCDOoCRo3whocnQ==", "license": "Apache-2.0", "dependencies": { "convex": "^1.29.3" @@ -7541,33 +7557,38 @@ } }, "node_modules/@mastra/core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.8.0.tgz", - "integrity": "sha512-AK6Isj21mWlwX1zIZNUxgAQvRfjJmdjsPsKoh1cOvaM+h748S4U48TJ5DsmundSj/8NBeKHmYXqH2RYqwN35nw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.13.2.tgz", + "integrity": "sha512-IZOLcHxag2H43XTm2qUEXtkUyZw/R9OUyQfRDYGmqpwOY2T4lap0HvS/yclTFmK6gC1zUhPTlrsKLBq/Ilqe+Q==", "license": "Apache-2.0", "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.20", "@ai-sdk/provider-utils-v6": "npm:@ai-sdk/provider-utils@4.0.0", - "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", - "@ai-sdk/provider-v6": "npm:@ai-sdk/provider@3.0.0", + "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.1", + "@ai-sdk/provider-v6": "npm:@ai-sdk/provider@3.0.5", "@ai-sdk/ui-utils-v5": "npm:@ai-sdk/ui-utils@1.2.11", "@isaacs/ttlcache": "^2.1.4", "@lukeed/uuid": "^2.0.1", - "@mastra/schema-compat": "1.1.3", + "@mastra/schema-compat": "1.2.4", "@modelcontextprotocol/sdk": "^1.17.5", "@sindresorhus/slugify": "^2.2.1", + "@standard-schema/spec": "^1.1.0", + "ajv": "^8.18.0", "dotenv": "^17.2.3", + "execa": "^9.6.1", "gray-matter": "^4.0.3", "hono": "^4.11.9", "hono-openapi": "^1.1.1", + "ignore": "^7.0.5", "js-tiktoken": "^1.0.21", "json-schema": "^0.4.0", "lru-cache": "^11.2.6", - "p-map": "^7.0.3", - "p-retry": "^7.1.0", + "p-map": "^7.0.4", + "p-retry": "^7.1.1", "picomatch": "^4.0.3", "radash": "^12.1.1", + "ws": "^8.19.0", "xxhash-wasm": "^1.1.0" }, "engines": { @@ -7624,24 +7645,6 @@ "zod": "^3.23.8" } }, - "node_modules/@mastra/core/node_modules/@mastra/schema-compat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.1.3.tgz", - "integrity": "sha512-szLMJhqfnEn4VctFLKRZ2NIpfg+3UTghQWgy8Fcdchj2HvHxB2uilJxRybM9ugMmvyE+W48tVdz4Xi2Z1P3pFA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema-to-zod": "^2.7.0", - "zod-from-json-schema": "^0.5.0", - "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", - "zod-to-json-schema": "^3.24.6" - }, - "engines": { - "node": ">=22.13.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - }, "node_modules/@mastra/core/node_modules/@standard-community/standard-openapi": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@standard-community/standard-openapi/-/standard-openapi-0.2.9.tgz", @@ -7684,6 +7687,63 @@ } } }, + "node_modules/@mastra/core/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@mastra/core/node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mastra/core/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@mastra/core/node_modules/hono-openapi": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/hono-openapi/-/hono-openapi-1.1.2.tgz", @@ -7706,6 +7766,48 @@ } } }, + "node_modules/@mastra/core/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@mastra/core/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@mastra/core/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mastra/core/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@mastra/core/node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -7724,16 +7826,80 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/@mastra/core/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mastra/core/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@mastra/core/node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", "license": "BSD-3-Clause" }, + "node_modules/@mastra/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mastra/core/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mastra/core/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@mastra/daytona": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mastra/daytona/-/daytona-0.0.1.tgz", - "integrity": "sha512-HgSkMTiKgqZfDo1X/t8mNbdRUb+HtBPWOYnAd3vHP/5+UCl6tUG34O3Z88dQ87mo46LrZEiZc3xCUhuoP5HtKw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mastra/daytona/-/daytona-0.2.0.tgz", + "integrity": "sha512-RUcYZ3jUfiRxsNN1O8WWbKb4lrkLRuiVw972Jvsyz0pYpzxVsQr5cNfze24zKdD41aJ+4jdehelYGLTsRtVMDg==", "license": "Apache-2.0", "dependencies": { "@daytonaio/sdk": "^0.143.0" @@ -7742,18 +7908,19 @@ "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.3.0-0 <2.0.0-0" + "@mastra/core": ">=1.12.0-0 <2.0.0-0" } }, "node_modules/@mastra/deployer": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@mastra/deployer/-/deployer-1.8.0.tgz", - "integrity": "sha512-NWCAHStM1WMISuEMheGPH7WMFAsNlfm22pej4a1p0dS9V48qq6AdCdOjzWKJQ4CewCFC2qI0sNqZNJtCtTkemw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@mastra/deployer/-/deployer-1.13.2.tgz", + "integrity": "sha512-/WH2miSxdnXl95A72we/d0c8hz7gP0zkfgUygRkI+f3GNWZ8Jg2CmavTisj8FPwcI0gATwQCtDzrqz1S8MCfJw==", "license": "Apache-2.0", "dependencies": { "@babel/core": "^7.29.0", "@babel/preset-typescript": "^7.28.5", - "@mastra/server": "1.8.0", + "@babel/traverse": "^7.28.6", + "@mastra/server": "1.13.2", "@optimize-lodash/rollup-plugin": "^5.0.2", "@rollup/plugin-alias": "6.0.0", "@rollup/plugin-commonjs": "29.0.0", @@ -7762,15 +7929,16 @@ "@rollup/plugin-node-resolve": "16.0.3", "@rollup/plugin-virtual": "3.0.2", "@sindresorhus/slugify": "^2.2.1", + "@types/babel__traverse": "^7.28.0", "empathic": "^2.0.0", - "esbuild": "^0.25.10", + "esbuild": "^0.27.3", "find-workspaces": "^0.3.1", - "fs-extra": "^11.3.3", + "fs-extra": "^11.3.4", "hono": "^4.11.9", "local-pkg": "^1.1.2", "resolve-from": "^5.0.0", "resolve.exports": "^2.0.3", - "rollup": "~4.55.1", + "rollup": "^4.59.0", "rollup-plugin-esbuild": "^6.2.1", "strip-json-comments": "^5.0.3", "tinyglobby": "^0.2.15", @@ -7784,22 +7952,6 @@ "zod": "^3.25.0 || ^4.0.0" } }, - "node_modules/@mastra/deployer/node_modules/@mastra/server": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@mastra/server/-/server-1.8.0.tgz", - "integrity": "sha512-j65lk9h/BGUf6GqbmRtf+WFmzN2d6SmY/aOa1gtBbgGafM03PLgx5k8CuSP9DPRDDB9XSSWWpO8dKyBzGDauQw==", - "license": "Apache-2.0", - "dependencies": { - "hono": "^4.11.9" - }, - "engines": { - "node": ">=22.13.0" - }, - "peerDependencies": { - "@mastra/core": ">=1.7.1-0 <2.0.0-0", - "zod": "^3.25.0 || ^4.0.0" - } - }, "node_modules/@mastra/evals": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@mastra/evals/-/evals-1.1.2.tgz", @@ -7820,9 +7972,9 @@ } }, "node_modules/@mastra/lance": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mastra/lance/-/lance-1.0.2.tgz", - "integrity": "sha512-o8KI7T19MHZxz+ltGM1rxXgbuyUa2IgnkB3nHtACPVpPU8CLw/BYB6Gf96r0oXZGu72wFMMAhajlzIGuCkcv/g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@mastra/lance/-/lance-1.0.4.tgz", + "integrity": "sha512-ONk0aPU1zx8lX5o3Zx84jgjXei+BtVNCUhwHx6JdDJvU16ul6XIGHdViKjE3lB2MmuLhD4L9SRZ3hS9rHppX8w==", "dependencies": { "@lancedb/lancedb": "^0.22.3", "apache-arrow": "^18.1.0" @@ -7835,9 +7987,9 @@ } }, "node_modules/@mastra/libsql": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@mastra/libsql/-/libsql-1.6.2.tgz", - "integrity": "sha512-0PTZKQwSMxSkqkWlULYPUk6fnqQWkhN3jaKZrT/GbImZG6xvid1+NoopjIdhUpf9Ws3eIkv+EBhZWqhSew5nEA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@mastra/libsql/-/libsql-1.7.0.tgz", + "integrity": "sha512-8xsKXpN4YuzOqegQo2DiLeqGr1RVKedTDj+o2AjxAWmpULXIIZCVxYYkmTymmEFRak0rzs0sw50nULRFVImxAA==", "license": "Apache-2.0", "dependencies": { "@libsql/client": "^0.15.15" @@ -7846,7 +7998,7 @@ "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.4.0-0 <2.0.0-0" + "@mastra/core": ">=1.0.0-0 <2.0.0-0" } }, "node_modules/@mastra/loggers": { @@ -7866,18 +8018,16 @@ } }, "node_modules/@mastra/mcp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mastra/mcp/-/mcp-1.0.2.tgz", - "integrity": "sha512-6nnkEy971czCXmWVZbxW3qdJq2nJAtBp+CyK1Lx+ypC1NDYCaUWr3o8rqSwM1YKaA1sCIQb61kQ/SAN+rWbBsA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@mastra/mcp/-/mcp-1.2.1.tgz", + "integrity": "sha512-c1qDulZR2msgKW+7aoVJdS6TcCZ00U3sFJlp7tfTRMnwRhVKuaKkCkJzZFkzOmdkLr2s4KIrqXfjHkwLfvySLA==", "license": "Apache-2.0", "dependencies": { "@apidevtools/json-schema-ref-parser": "^14.2.1", "@modelcontextprotocol/sdk": "^1.17.5", "exit-hook": "^5.0.1", "fast-deep-equal": "^3.1.3", - "uuid": "^13.0.0", - "zod-from-json-schema": "^0.5.0", - "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5" + "uuid": "^13.0.0" }, "engines": { "node": ">=22.13.0" @@ -7901,16 +8051,18 @@ } }, "node_modules/@mastra/memory": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@mastra/memory/-/memory-1.5.2.tgz", - "integrity": "sha512-0m7ZLZ55/RqlQZap274fDW0cyJ+EG4veDEA63oV1Kno0PP8l74e4IgUdpr7nkzl+iNHyKDceavIll+lFwDmViw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@mastra/memory/-/memory-1.8.2.tgz", + "integrity": "sha512-NtE7A/qVTguxyXOW9ndq0bJqbq8g5A1zZmmMGiuiCRRcj8baQp36DMHigQfEf0Od6snybvBFrzlBnwT0OVJ4cw==", "license": "Apache-2.0", "dependencies": { - "@mastra/schema-compat": "1.1.3", + "@mastra/schema-compat": "1.2.4", "async-mutex": "^0.5.0", - "js-tiktoken": "^1.0.21", + "image-size": "^2.0.2", "json-schema": "^0.4.0", "lru-cache": "^11.2.6", + "probe-image-size": "^7.2.3", + "tokenx": "^1.3.0", "xxhash-wasm": "^1.1.0" }, "engines": { @@ -7921,28 +8073,10 @@ "zod": "^3.25.0 || ^4.0.0" } }, - "node_modules/@mastra/memory/node_modules/@mastra/schema-compat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.1.3.tgz", - "integrity": "sha512-szLMJhqfnEn4VctFLKRZ2NIpfg+3UTghQWgy8Fcdchj2HvHxB2uilJxRybM9ugMmvyE+W48tVdz4Xi2Z1P3pFA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema-to-zod": "^2.7.0", - "zod-from-json-schema": "^0.5.0", - "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", - "zod-to-json-schema": "^3.24.6" - }, - "engines": { - "node": ">=22.13.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - }, "node_modules/@mastra/mongodb": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@mastra/mongodb/-/mongodb-1.5.2.tgz", - "integrity": "sha512-BmYkkQws1UT6z9Eks0JL7fVXBKYAr00pCkbeNMEfnNmKdysUSgUKvBgjfkKVjvpD9EIL7qrgV7VaOpAQLgEhIQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@mastra/mongodb/-/mongodb-1.5.5.tgz", + "integrity": "sha512-6Qt5n/h0mkwmaLrCOs2hVKv3jjo30c/BmsNPdGNiBDNnPEjpzyszi0Dn7cu1MoWt0GVUtuHG7vcdvmCziC5ttA==", "dependencies": { "@types/mongodb": "^4.0.7", "cloudflare": "^4.5.0", @@ -7953,7 +8087,7 @@ "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.1.0-0 <2.0.0-0" + "@mastra/core": ">=1.0.0-0 <2.0.0-0" } }, "node_modules/@mastra/mongodb/node_modules/uuid": { @@ -7970,25 +8104,25 @@ } }, "node_modules/@mastra/observability": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@mastra/observability/-/observability-1.2.1.tgz", - "integrity": "sha512-XogyAgXPnojehAo85ypXzGyofgDaEcqbI8YPP27npGfNDtx+9jxetyCYJMzDi56VodxIl/8JgNph4uWNBZasyg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mastra/observability/-/observability-1.5.0.tgz", + "integrity": "sha512-uT8nQkcJKZ86h3vJvgCzoEny7ZeTUfSKsaQyW8uLxVX7PPIFSc3ftrwOhX69v7ws++BO8Kd1f7Z/dKkr33sO4g==", "license": "Apache-2.0", "engines": { "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.1.0-0 <2.0.0-0" + "@mastra/core": ">=1.13.0-0 <2.0.0-0" } }, "node_modules/@mastra/otel-bridge": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@mastra/otel-bridge/-/otel-bridge-1.0.3.tgz", - "integrity": "sha512-SeLxridf5AGp2UygfIVESWSQsYvRphUutVw4Fz6w7VK0COCXyWyyYbCTvENBW7wklesZMPFJofcMv19mnhTHTw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@mastra/otel-bridge/-/otel-bridge-1.0.7.tgz", + "integrity": "sha512-Bn9dJPdbZY2LFk4Ksh3O2O1j4934EifogNDYghfKBVcYhD5TOFsikxdHJmDfs7rXGJ7WgBwnrNGfitZ7cEYTqg==", "license": "Apache-2.0", "dependencies": { - "@mastra/observability": "1.2.1", - "@mastra/otel-exporter": "1.0.3", + "@mastra/observability": "1.5.0", + "@mastra/otel-exporter": "1.0.7", "@opentelemetry/api": "^1.9.0" }, "engines": { @@ -8009,12 +8143,12 @@ } }, "node_modules/@mastra/otel-exporter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@mastra/otel-exporter/-/otel-exporter-1.0.3.tgz", - "integrity": "sha512-P3l5yej3SW6R9zN9hXVh8m9KT1p8TxRn166+8DrmUEWjbdCYjuqL0LmC2SGPwNwafeBckMvo5jhh/eKzSKd9Jw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@mastra/otel-exporter/-/otel-exporter-1.0.7.tgz", + "integrity": "sha512-wxqIWtW/NcYwcuXH6oHH/1ZvG1MrM/YatkU1f5V4RakmtgBxuUY+6xKp0Tlo1jzRFn9lIeCAIwJlJS7rIA9Vqg==", "license": "Apache-2.0", "dependencies": { - "@mastra/observability": "1.2.1", + "@mastra/observability": "1.5.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^2.1.0", "@opentelemetry/resources": "^2.1.0", @@ -8127,9 +8261,9 @@ } }, "node_modules/@mastra/pg": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@mastra/pg/-/pg-1.7.0.tgz", - "integrity": "sha512-RX/I4vZkt2n0g3NfVq7dS1u7Qvd+1r0ll2uHAbG9xQ8m10tb9QwXZCVrX7ki6s16/odLjJYgJGZImo20SR7N5A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@mastra/pg/-/pg-1.8.0.tgz", + "integrity": "sha512-0Vs2Jrke4kBXi6UWGWKNmTsDiOHCmp7m2Xnyw0FBlSLYATi+FU9jJh9kKDG+B/d+HIVsHL38RgvzfvRh8xSpTg==", "license": "Apache-2.0", "dependencies": { "async-mutex": "^0.5.0", @@ -8180,23 +8314,24 @@ } }, "node_modules/@mastra/react": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@mastra/react/-/react-0.2.7.tgz", - "integrity": "sha512-U9wC2CWs+aR4f0KmcCc2/mn1YkM7lPUk06mJ8So56nWUXjpLIPk70QuE3HWL5PF7RKNF3CMhlpiqMgq45lZ+ag==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@mastra/react/-/react-0.2.14.tgz", + "integrity": "sha512-hcNWn0ri11fJ2bvcnLNllR/wrSFfqJLQ2Nrw05r1rO8io2OC8nvi1RS0TyAjdCeWcOA9CKGRKKBVSZUn8wNQZw==", "license": "Apache-2.0", "dependencies": { "@lukeed/uuid": "^2.0.1", - "@mastra/client-js": "1.7.1", + "@mastra/client-js": "1.8.4", "@radix-ui/react-tooltip": "^1.2.7", "hast-util-to-jsx-runtime": "^2.3.6", "lucide-react": "^0.522.0", "shiki": "^1.29.2", - "tailwind-merge": "^3.4.1" + "tailwind-merge": "^3.5.0" }, "engines": { "node": ">=22.13.0" }, "peerDependencies": { + "@mastra/core": ">=1.8.0-0 <2.0.0-0", "react": ">=19.0.0", "react-dom": ">=19.0.0", "zod": "^3.25.0 || ^4.0.0" @@ -8320,13 +8455,47 @@ "@types/hast": "^3.0.4" } }, + "node_modules/@mastra/schema-compat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.2.4.tgz", + "integrity": "sha512-MVZ0NGBdUuF0u1EE0lMPPLH+le4Roy2cOW0w6rd4BakW0MUfswSkvrKlxAotBEpMAxVjkd1aT5zEf8lzFnEqEQ==", + "license": "Apache-2.0", + "dependencies": { + "json-schema-to-zod": "^2.7.0", + "zod-from-json-schema": "^0.5.2", + "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", + "zod-to-json-schema": "^3.24.6" + }, + "engines": { + "node": ">=22.13.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/@mastra/server": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@mastra/server/-/server-1.13.2.tgz", + "integrity": "sha512-X0SN5Cci28tU7Ynwbl6HF3/96c21i6wl2wyziuk89NxL8LkpdObGrP8NDgS1bX67ZXMEF9tG+vU8Amhxo92g3Q==", + "license": "Apache-2.0", + "dependencies": { + "hono": "^4.11.9" + }, + "engines": { + "node": ">=22.13.0" + }, + "peerDependencies": { + "@mastra/core": ">=1.7.1-0 <2.0.0-0", + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/@mastra/upstash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mastra/upstash/-/upstash-1.0.2.tgz", - "integrity": "sha512-wuAREWf7+JUvt3JmJ4hQFSkeyy01QL03wjDhcsa+AvUoF50ObFdiBG6FxEojZjIsrIsW2xQSYgYxerfEqqUjAw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@mastra/upstash/-/upstash-1.0.4.tgz", + "integrity": "sha512-gaEXbpPy/BGeLx/fpNyLj9KiU50xm4PcnpkU+cZMc5cwJhBLph7Ws2yHorfhCIB0wMBt/OL2FdS4bTjXR17qEw==", "license": "Apache-2.0", "dependencies": { - "@upstash/redis": "^1.36.2", + "@upstash/redis": "^1.36.3", "@upstash/vector": "^1.2.2" }, "engines": { @@ -8406,11 +8575,11 @@ } }, "node_modules/@mcpc-tech/acp-ai-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@mcpc-tech/acp-ai-provider/-/acp-ai-provider-0.2.4.tgz", - "integrity": "sha512-fv7xUseKpm646u3R+kmL5c9dLnJlUMXGey2lG1JWQlPkLO1el9NPbBqhRqCvuez5hyueW6awjHfkF4qfznIblg==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@mcpc-tech/acp-ai-provider/-/acp-ai-provider-0.2.8.tgz", + "integrity": "sha512-dO/sAT75JtNCbeIV1u9Wng5CHEdM5mDxmaeiT/JMB4UOkxajj8DNZVaP+Xi+rcBclqfhs58qKoqEI2GU4RzDaw==", "dependencies": { - "@agentclientprotocol/sdk": "^0.4.8", + "@agentclientprotocol/sdk": "^0.14.1", "@ai-sdk/provider": "^3.0.0", "@modelcontextprotocol/sdk": "^1.8.0", "ai": "^6.0.0", @@ -8782,16 +8951,20 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, "node_modules/@neon-rs/load": { @@ -9429,15 +9602,15 @@ } }, "node_modules/@opencode-ai/sdk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.2.4.tgz", - "integrity": "sha512-IPgtBpif46wTviC3HQxkjS4M/1tZSnRmD/6aEF3lL88MT+PAqKA30G+AhBlpvXBITq9EmjO4gjzM59ly2z7mYQ==", + "version": "1.2.26", + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.2.26.tgz", + "integrity": "sha512-HPB+0pfvTMPj2KEjNLF3oqgldKW8koTJ7ssqXwzndazqxS+gUynzvdIKIQP4+QIInNcc5nJMG9JtfLcePGgTLQ==", "license": "MIT" }, "node_modules/@openrouter/ai-sdk-provider": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.2.3.tgz", - "integrity": "sha512-NovC+BaCfEeJwhToDrs8JeDYXXlJdEyz7lcxkjtyePSE4eoAKik872SyDK0MzXKcz8MRkv7XlNhPI6zz4TQp0g==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-2.3.1.tgz", + "integrity": "sha512-RkOUMSetrbS1i8kW1wIkfuq0RpXtiJOiFCx/AfEjGNZA8xOjdAosqPiImo2805Q6Px/9k1LUxu8NUmlSnrWrqg==", "license": "Apache-2.0", "engines": { "node": ">=18" @@ -9457,9 +9630,9 @@ } }, "node_modules/@opentelemetry/api-logs": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.212.0.tgz", - "integrity": "sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.213.0.tgz", + "integrity": "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.3.0" @@ -9469,60 +9642,60 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.70.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.70.1.tgz", - "integrity": "sha512-r8BKs0rHtBAzZViPIuzSD2eh65fOPau0NqVsca2sACuZ6LFGu6a+QMhqq7skXz+/OqKwFr/7/b6VsaNMS+zZpQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", - "@opentelemetry/instrumentation-amqplib": "^0.59.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.64.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.67.0", - "@opentelemetry/instrumentation-bunyan": "^0.57.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.57.0", - "@opentelemetry/instrumentation-connect": "^0.55.0", - "@opentelemetry/instrumentation-cucumber": "^0.28.0", - "@opentelemetry/instrumentation-dataloader": "^0.29.0", - "@opentelemetry/instrumentation-dns": "^0.55.0", - "@opentelemetry/instrumentation-express": "^0.60.0", - "@opentelemetry/instrumentation-fastify": "^0.56.0", - "@opentelemetry/instrumentation-fs": "^0.31.0", - "@opentelemetry/instrumentation-generic-pool": "^0.55.0", - "@opentelemetry/instrumentation-graphql": "^0.60.0", - "@opentelemetry/instrumentation-grpc": "^0.212.0", - "@opentelemetry/instrumentation-hapi": "^0.58.0", - "@opentelemetry/instrumentation-http": "^0.212.0", - "@opentelemetry/instrumentation-ioredis": "^0.60.0", - "@opentelemetry/instrumentation-kafkajs": "^0.21.0", - "@opentelemetry/instrumentation-knex": "^0.56.0", - "@opentelemetry/instrumentation-koa": "^0.60.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.56.0", - "@opentelemetry/instrumentation-memcached": "^0.55.0", - "@opentelemetry/instrumentation-mongodb": "^0.65.0", - "@opentelemetry/instrumentation-mongoose": "^0.58.0", - "@opentelemetry/instrumentation-mysql": "^0.58.0", - "@opentelemetry/instrumentation-mysql2": "^0.58.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.58.0", - "@opentelemetry/instrumentation-net": "^0.56.0", - "@opentelemetry/instrumentation-openai": "^0.10.0", - "@opentelemetry/instrumentation-oracledb": "^0.37.0", - "@opentelemetry/instrumentation-pg": "^0.64.0", - "@opentelemetry/instrumentation-pino": "^0.58.0", - "@opentelemetry/instrumentation-redis": "^0.60.0", - "@opentelemetry/instrumentation-restify": "^0.57.0", - "@opentelemetry/instrumentation-router": "^0.56.0", - "@opentelemetry/instrumentation-runtime-node": "^0.25.0", - "@opentelemetry/instrumentation-socket.io": "^0.59.0", - "@opentelemetry/instrumentation-tedious": "^0.31.0", - "@opentelemetry/instrumentation-undici": "^0.22.0", - "@opentelemetry/instrumentation-winston": "^0.56.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.33.2", - "@opentelemetry/resource-detector-aws": "^2.12.0", - "@opentelemetry/resource-detector-azure": "^0.20.0", - "@opentelemetry/resource-detector-container": "^0.8.3", - "@opentelemetry/resource-detector-gcp": "^0.47.0", + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.71.0.tgz", + "integrity": "sha512-umqazfIujHj9fE+p3skrPMO9uCsDodSUqIgVRtELaPX036HhGkVaI7MwCQL3/kiyqrXRsKYSow2vCBR4CVsnOA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.213.0", + "@opentelemetry/instrumentation-amqplib": "^0.60.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.65.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.68.0", + "@opentelemetry/instrumentation-bunyan": "^0.58.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.58.0", + "@opentelemetry/instrumentation-connect": "^0.56.0", + "@opentelemetry/instrumentation-cucumber": "^0.29.0", + "@opentelemetry/instrumentation-dataloader": "^0.30.0", + "@opentelemetry/instrumentation-dns": "^0.56.0", + "@opentelemetry/instrumentation-express": "^0.61.0", + "@opentelemetry/instrumentation-fastify": "^0.57.0", + "@opentelemetry/instrumentation-fs": "^0.32.0", + "@opentelemetry/instrumentation-generic-pool": "^0.56.0", + "@opentelemetry/instrumentation-graphql": "^0.61.0", + "@opentelemetry/instrumentation-grpc": "^0.213.0", + "@opentelemetry/instrumentation-hapi": "^0.59.0", + "@opentelemetry/instrumentation-http": "^0.213.0", + "@opentelemetry/instrumentation-ioredis": "^0.61.0", + "@opentelemetry/instrumentation-kafkajs": "^0.22.0", + "@opentelemetry/instrumentation-knex": "^0.57.0", + "@opentelemetry/instrumentation-koa": "^0.61.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.57.0", + "@opentelemetry/instrumentation-memcached": "^0.56.0", + "@opentelemetry/instrumentation-mongodb": "^0.66.0", + "@opentelemetry/instrumentation-mongoose": "^0.59.0", + "@opentelemetry/instrumentation-mysql": "^0.59.0", + "@opentelemetry/instrumentation-mysql2": "^0.59.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.59.0", + "@opentelemetry/instrumentation-net": "^0.57.0", + "@opentelemetry/instrumentation-openai": "^0.11.0", + "@opentelemetry/instrumentation-oracledb": "^0.38.0", + "@opentelemetry/instrumentation-pg": "^0.65.0", + "@opentelemetry/instrumentation-pino": "^0.59.0", + "@opentelemetry/instrumentation-redis": "^0.61.0", + "@opentelemetry/instrumentation-restify": "^0.58.0", + "@opentelemetry/instrumentation-router": "^0.57.0", + "@opentelemetry/instrumentation-runtime-node": "^0.26.0", + "@opentelemetry/instrumentation-socket.io": "^0.60.0", + "@opentelemetry/instrumentation-tedious": "^0.32.0", + "@opentelemetry/instrumentation-undici": "^0.23.0", + "@opentelemetry/instrumentation-winston": "^0.57.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.33.3", + "@opentelemetry/resource-detector-aws": "^2.13.0", + "@opentelemetry/resource-detector-azure": "^0.21.0", + "@opentelemetry/resource-detector-container": "^0.8.4", + "@opentelemetry/resource-detector-gcp": "^0.48.0", "@opentelemetry/resources": "^2.0.0", - "@opentelemetry/sdk-node": "^0.212.0" + "@opentelemetry/sdk-node": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9533,12 +9706,12 @@ } }, "node_modules/@opentelemetry/configuration": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/configuration/-/configuration-0.212.0.tgz", - "integrity": "sha512-D8sAY6RbqMa1W8lCeiaSL2eMCW2MF87QI3y+I6DQE1j+5GrDMwiKPLdzpa/2/+Zl9v1//74LmooCTCJBvWR8Iw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/configuration/-/configuration-0.213.0.tgz", + "integrity": "sha512-MfVgZiUuwL1d3bPPvXcEkVHGTGNUGoqGK97lfwBuRoKttcVGGqDyxTCCVa5MGbirtBQkUTysXMBUVWPaq7zbWw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", + "@opentelemetry/core": "2.6.0", "yaml": "^2.0.0" }, "engines": { @@ -9549,9 +9722,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.5.1.tgz", - "integrity": "sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.0.tgz", + "integrity": "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9561,9 +9734,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz", - "integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", + "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -9576,17 +9749,17 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.212.0.tgz", - "integrity": "sha512-/0bk6fQG+eSFZ4L6NlckGTgUous/ib5+OVdg0x4OdwYeHzV3lTEo3it1HgnPY6UKpmX7ki+hJvxjsOql8rCeZA==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.213.0.tgz", + "integrity": "sha512-QiRZzvayEOFnenSXi85Eorgy5WTqyNQ+E7gjl6P6r+W3IUIwAIH8A9/BgMWfP056LwmdrBL6+qvnwaIEmug6Yg==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/sdk-logs": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/sdk-logs": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9596,13 +9769,13 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9612,15 +9785,15 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.212.0.tgz", - "integrity": "sha512-YidOSlzpsun9uw0iyIWrQp6HxpMtBlECE3tiHGAsnpEqJWbAUWcMnIffvIuvTtTQ1OyRtwwaE79dWSQ8+eiB7g==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.213.0.tgz", + "integrity": "sha512-XgRGuLE9usFNlnw2lgMIM4HTwpcIyjdU/xPoJ8v3LbBLBfjaDkIugjc9HoWa7ZSJ/9Bhzgvm/aD0bGdYUFgnTw==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9630,18 +9803,18 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9650,41 +9823,17 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.212.0.tgz", - "integrity": "sha512-JidJasLwG/7M9RTxV/64xotDKmFAUSBc9SNlxI32QYuUMK5rVKhHNWMPDzC7E0pCAL3cu+FyiKvsTwLi2KqPYw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.213.0.tgz", + "integrity": "sha512-vqDVSpLp09ZzcFIdb7QZrEFPxUlO3GzdhBKLstq3jhYB5ow3+ZtV5V0ngSdi/0BZs+J5WPiN1+UDV4X5zD/GzA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/sdk-logs": "0.212.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/sdk-logs": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9694,13 +9843,13 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9710,18 +9859,18 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9730,43 +9879,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-proto": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.212.0.tgz", - "integrity": "sha512-RpKB5UVfxc7c6Ta1UaCrxXDTQ0OD7BCGT66a97Q5zR1x3+9fw4dSaiqMXT/6FAWj2HyFbem6Rcu1UzPZikGTWQ==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.213.0.tgz", + "integrity": "sha512-gQk41nqfK3KhDk8jbSo3LR/fQBlV7f6Q5xRcfDmL1hZlbgXQPdVFV9/rIfYUrCoq1OM+2NnKnFfGjBt6QpLSsA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-trace-base": "2.5.1" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-trace-base": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9776,13 +9901,13 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9792,18 +9917,18 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9812,44 +9937,20 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.212.0.tgz", - "integrity": "sha512-/6Gqf9wpBq22XsomR1i0iPGnbQtCq2Vwnrq5oiDPjYSqveBdK1jtQbhGfmpK2mLLxk4cPDtD1ZEYdIou5K8EaA==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.213.0.tgz", + "integrity": "sha512-Z8gYKUAU48qwm+a1tjnGv9xbE7a5lukVIwgF6Z5i3VPXPVMe4Sjra0nN3zU7m277h+V+ZpsPGZJ2Xf0OTkL7/w==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.212.0", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-metrics": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.213.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-metrics": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9859,13 +9960,13 @@ } }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9875,15 +9976,15 @@ } }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.212.0.tgz", - "integrity": "sha512-YidOSlzpsun9uw0iyIWrQp6HxpMtBlECE3tiHGAsnpEqJWbAUWcMnIffvIuvTtTQ1OyRtwwaE79dWSQ8+eiB7g==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.213.0.tgz", + "integrity": "sha512-XgRGuLE9usFNlnw2lgMIM4HTwpcIyjdU/xPoJ8v3LbBLBfjaDkIugjc9HoWa7ZSJ/9Bhzgvm/aD0bGdYUFgnTw==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9893,18 +9994,18 @@ } }, "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9913,41 +10014,17 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.212.0.tgz", - "integrity": "sha512-8hgBw3aTTRpSTkU4b9MLf/2YVLnfWp+hfnLq/1Fa2cky+vx6HqTodo+Zv1GTIrAKMOOwgysOjufy0gTxngqeBg==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.213.0.tgz", + "integrity": "sha512-yw3fTIw4KQIRXC/ZyYQq5gtA3Ogfdfz/g5HVgleobQAcjUUE8Nj3spGMx8iQPp+S+u6/js7BixufRkXhzLmpJA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-metrics": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-metrics": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9957,13 +10034,13 @@ } }, "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9973,18 +10050,18 @@ } }, "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -9993,42 +10070,18 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.212.0.tgz", - "integrity": "sha512-C7I4WN+ghn3g7SnxXm2RK3/sRD0k/BYcXaK6lGU3yPjiM7a1M25MLuM6zY3PeVPPzzTZPfuS7+wgn/tHk768Xw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.213.0.tgz", + "integrity": "sha512-geHF+zZaDb0/WRkJTxR8o8dG4fCWT/Wq7HBdNZCxwH5mxhwRi/5f37IDYH7nvU+dwU6IeY4Pg8TPI435JCiNkg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/exporter-metrics-otlp-http": "0.212.0", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-metrics": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.213.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-metrics": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10038,13 +10091,13 @@ } }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10054,18 +10107,18 @@ } }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10074,39 +10127,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/exporter-prometheus": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.212.0.tgz", - "integrity": "sha512-hJFLhCJba5MW5QHexZMHZdMhBfNqNItxOsN0AZojwD1W2kU9xM+BEICowFGJFo/vNV+I2BJvTtmuKafeDSAo7Q==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.213.0.tgz", + "integrity": "sha512-FyV3/JfKGAgx+zJUwCHdjQHbs+YeGd2fOWvBHYrW6dmfv/w89lb8WhJTSZEoWgP525jwv/gFeBttlGu1flebdA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-metrics": "2.5.1", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-metrics": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -10261,16 +10290,16 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.212.0.tgz", - "integrity": "sha512-d1ivqPT0V+i0IVOOdzGaLqonjtlk5jYrW7ItutWzXL/Mk+PiYb59dymy/i2reot9dDnBFWfrsvxyqdutGF5Vig==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.213.0.tgz", + "integrity": "sha512-six3vPq3sL+ge1iZOfKEg+RHuFQhGb8ZTdlvD234w/0gi8ty/qKD46qoGpKvM3amy5yYunWBKiFBW47WaVS26w==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10280,13 +10309,13 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10296,18 +10325,18 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10316,39 +10345,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/exporter-zipkin": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.5.1.tgz", - "integrity": "sha512-Me6JVO7WqXGXsgr4+7o+B7qwKJQbt0c8WamFnxpkR43avgG9k/niTntwCaXiXUTjonWy0+61ZuX6CGzj9nn8CQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.6.0.tgz", + "integrity": "sha512-AFP77OQMLfw/Jzh6WT2PtrywstNjdoyT9t9lYrYdk1s4igsvnMZ8DkZKCwxsItC01D+4Lydgrb+Wy0bAvpp8xg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -10359,13 +10364,13 @@ } }, "node_modules/@opentelemetry/instrumentation": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.212.0.tgz", - "integrity": "sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.213.0.tgz", + "integrity": "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "import-in-the-middle": "^2.0.6", + "@opentelemetry/api-logs": "0.213.0", + "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "engines": { @@ -10376,13 +10381,13 @@ } }, "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.59.0.tgz", - "integrity": "sha512-xscSgOJA+GHphESDZxBHNk/zjNaEgoeufMwmiqYdL+qM27Xw3BbR9vN6Ucbq9dW6Y+oYUPgTTj17qf+Za4+uzg==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.60.0.tgz", + "integrity": "sha512-q/B2IvoVXRm1M00MvhnzpMN6rKYOszPXVsALi6u0ss4AYHe+TidZEtLW9N1ZhrobI1dSriHnBqqtAOZVAv07sg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "engines": { @@ -10393,12 +10398,12 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.64.0.tgz", - "integrity": "sha512-vYhM/a8fG34/Dl/Q9gfv5Ih3OFPgqeyn79S8FN+Xs/QZw6h6L8a1lDa3CyigyicOXLCmVIM7Fc9vFD4BGqgGLA==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.65.0.tgz", + "integrity": "sha512-7SiaXnyEH0abDi61r72YCpkeQr27ePiCK3SaE2uFEF/riAUwk18r6vDXQKPZczWv3BGrGpk1YDc4qYYlY0uomA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/aws-lambda": "^8.10.155" }, @@ -10410,13 +10415,13 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.67.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.67.0.tgz", - "integrity": "sha512-btpwJnZ2RBXDh/pTpfVpInpBu9Pedi+lbLKbt3naB344SggbbYnIdT7u8EzmGIApWi9EV91vw7hm896I7nESQA==", + "version": "0.68.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.68.0.tgz", + "integrity": "sha512-nHXSRX3iYSE9MaiPE+jIovuNA8dTmleeg0vdLHkk5nvWCYFf/I9kMdqA3KcfKCPonVc5+NtSTft6OVtuGtawIA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.34.0" }, "engines": { @@ -10427,13 +10432,13 @@ } }, "node_modules/@opentelemetry/instrumentation-bunyan": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.57.0.tgz", - "integrity": "sha512-W4zLz1Y9ptCsdL+QMXR7xQaBHkJivLBmVlLCjUe23rX4V8E65fGAtlIJSKTKAfz4aEgtWgQAGMdkeqACwG0Caw==", + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.58.0.tgz", + "integrity": "sha512-vxotqOCzUQf2C4Dlrv+feY9XhQSa2wG/R+0S/JZ/axhbW0/yJeNKWsWWQ1FUFZQkUlZUS5nyWM8ePvgVmPq/Kg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.212.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/api-logs": "^0.213.0", + "@opentelemetry/instrumentation": "^0.213.0", "@types/bunyan": "1.8.11" }, "engines": { @@ -10444,12 +10449,12 @@ } }, "node_modules/@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.57.0.tgz", - "integrity": "sha512-xLwrK+XnN32IB5i6t/a2j+SVdjlq/BIgjpVRkke4HAsKjoSMy1GeSI+ZOiJffRLFb4MojcvH4RG2+nEg1uC6Zg==", + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.58.0.tgz", + "integrity": "sha512-qPzEANo6IVz02sctrbihMwcNGq+LUUrISnzFitUmFzBz5SjPp5iEPy59KFNqpNa9k/oas5B7650OWB/z2Ld7qQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.37.0" }, "engines": { @@ -10460,13 +10465,13 @@ } }, "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.55.0.tgz", - "integrity": "sha512-UfGw7ubKKZBoTRjxi5KlfeECEaXZinS20RdRNlZE5tVF+O17hJOnrcGwAoQAHp6eYmxI2jW9IQ4t6450gnNF9g==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.56.0.tgz", + "integrity": "sha512-PKp+sSZ7AfzMvGgO3VCyo1inwNu+q7A1k9X88WK4PQ+S6Hp7eFk8pie+sWHDTaARovmqq5V2osav3lQej2B0nw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.38" }, @@ -10478,12 +10483,12 @@ } }, "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.28.0.tgz", - "integrity": "sha512-kim+bRxu4LZqKEyF2SgO01tgG88W+/iYltyP1XjT31FIXzlBjzQpwtSLLM8byayO85mcZIBha54WSNFDLM/7qQ==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.29.0.tgz", + "integrity": "sha512-u3bECWikRK/nHQemb5TJbfht/eC70sVUwzkhAOTuXHAU+QAtUV9XLy6snjtGSJ1RLgOXU26tb4SqNplLa26COA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -10494,12 +10499,12 @@ } }, "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.29.0.tgz", - "integrity": "sha512-220WjRb1G1UiAKbVblSMxwxxFdpyB4wj1XYIO9BJs5r62Azj2dL5fyZiXK3/WO6wB3uLul9R946iKI1bpPxktQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.30.0.tgz", + "integrity": "sha512-MXHP2Q38cd2OhzEBKAIXUi9uBlPEYzF6BNJbyjUXBQ6kLaf93kRC41vNMIz0Nl5mnuwK7fDvKT+/lpx7BXRwdg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10509,12 +10514,12 @@ } }, "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.55.0.tgz", - "integrity": "sha512-cfWLaFi22V+sQrKY7t6QroYzT3kO9m3PpkN1OXYmuCyfwxQaXOVlF8NSAHtua/RQYw0aQl+2fe6JOWyJdEZiwA==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.56.0.tgz", + "integrity": "sha512-u2E07CxapafcgNkTH5V0XSeE7xm3VA19HpKVEcwV+j9S7lKb9CE1j42dAM6nT7NgIQocIyyon1vFU2ubS0ukpA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10524,13 +10529,13 @@ } }, "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.60.0.tgz", - "integrity": "sha512-KghHCDqKq0D7iuPIVCuPSXut5WVAI6uwKcPrhwTUJL5VE2LC18id2vKoiAm1V8XvVlgIGAiECtEvbrFwkTCj3g==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.61.0.tgz", + "integrity": "sha512-Xdmqo9RZuZlL29Flg8QdwrrX7eW1CZ7wFQPKHyXljNymgKhN1MCsYuqQ/7uxavhSKwAl7WxkTzKhnqpUApLMvQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -10541,13 +10546,13 @@ } }, "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.56.0.tgz", - "integrity": "sha512-zotOPoZsWtMF47BjottK23XaaBSmVuwG5D/R3FlGfAAwMNFoDR3IY1OGO9v9KfOU/1/xDVkxsQ22NFfu9lE8aA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.57.0.tgz", + "integrity": "sha512-D+rwRtbiOediYocpKGvY/RQTpuLsLdCVwaOREyqWViwItJGibWI7O/wgd9xIV63pMP0D9IdSy27wnARfUaotKg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -10558,13 +10563,13 @@ } }, "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.31.0.tgz", - "integrity": "sha512-C7tdXGDnkMgLVlE79VSekB+Y+P345zKUigvFMs5M7U0GIYA8ERx3FS0aAcY/ICIq9YwRmH2uuMb++Br5M2vNUg==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.32.0.tgz", + "integrity": "sha512-koR6apx0g0wX6RRiPpjA4AFQUQUbXrK16kq4/SZjVp7u5cffJhNkY4TnITxcGA4acGSPYAfx3NHRIv4Khn1axQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10574,12 +10579,12 @@ } }, "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.55.0.tgz", - "integrity": "sha512-7hWiyLbEX/dIS4LZy/h8VaAQPs8oBeEqsrysDWbos0b9PF414L6Rsbi2um/omtxIs+GTvsbuqDscWigeaxyWdA==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.56.0.tgz", + "integrity": "sha512-fg+Jffs6fqrf0uQS0hom7qBFKsbtpBiBl8+Vkc63Gx8xh6pVh+FhagmiO6oM0m3vyb683t1lP7yGYq22SiDnqg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10589,12 +10594,12 @@ } }, "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.60.0.tgz", - "integrity": "sha512-XPATrmxAd2tFCsYbJ3eVIXt+gyvMKjc36QQuQxjtssMnAbw006Le9b5lKs7WXik7ItOpM1exATi1aDdOcCjRRg==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.61.0.tgz", + "integrity": "sha512-pUiVASv6nh2XrerTvlbVHh7vKFzscpgwiQ/xvnZuAIzQ5lRjWVdRPUuXbvZJ/Yq79QsE81TZdJ7z9YsXiss1ew==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10604,12 +10609,12 @@ } }, "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.212.0.tgz", - "integrity": "sha512-r1t7LNKWVhSQMUrBdDJtooFmmLZ93kGuFixqeXPoUP8W+chJCxhey9l0c0+L3xriNdyB7TzvkKHhPXUDevgVEA==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.213.0.tgz", + "integrity": "sha512-GT53wIJnEffHcWlDUXRodTSUUspy57PNBZXc46z9rfy3Ee+VeM5XqWnieF1yefCd01QTaISYB49LXNc2SayIBQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "0.212.0", + "@opentelemetry/instrumentation": "0.213.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -10620,13 +10625,13 @@ } }, "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.58.0.tgz", - "integrity": "sha512-reuRApR2KHm2VsfyDgsrLhNE+IOy4uIU6n3oMjUleReHacEEZmf4vXxdt4/qcmJ6GoUXnRN2AOu3s5N3pMrgYA==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.59.0.tgz", + "integrity": "sha512-33wa4mEr+9+ztwdgLor1SeBu4Opz4IsmpcLETXAd3VmBrOjez8uQtrsOhPCa5Vhbm5gzDlMYTgFRLQzf8/YHFA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -10637,13 +10642,13 @@ } }, "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.212.0.tgz", - "integrity": "sha512-t2nt16Uyv9irgR+tqnX96YeToOStc3X5js7Ljn3EKlI2b4Fe76VhMkTXtsTQ0aId6AsYgefrCRnXSCo/Fn/vww==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.213.0.tgz", + "integrity": "sha512-B978Xsm5XEPGhm1P07grDoaOFLHapJPkOG9h016cJsyWWxmiLnPu2M/4Nrm7UCkHSiLnkXgC+zVGUAIahy8EEA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/instrumentation": "0.212.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/instrumentation": "0.213.0", "@opentelemetry/semantic-conventions": "^1.29.0", "forwarded-parse": "2.1.2" }, @@ -10655,12 +10660,12 @@ } }, "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.60.0.tgz", - "integrity": "sha512-R+nnbPD9l2ruzu248qM3YDWzpdmWVaFFFv08lQqsc0EP4pT/B1GGUg06/tHOSo3L5njB2eejwyzpkvJkjaQEMA==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.61.0.tgz", + "integrity": "sha512-hsHDadUtAFbws1YSDc1XW0svGFKiUbqv2td1Cby+UAiwvojm1NyBo/taifH0t8CuFZ0x/2SDm0iuTwrM5pnVOg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/redis-common": "^0.38.2", "@opentelemetry/semantic-conventions": "^1.33.0" }, @@ -10672,12 +10677,12 @@ } }, "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.21.0.tgz", - "integrity": "sha512-lkLrILnKGO7SHw1xPJnuGx2S4XwbKmQiJyzUGuEImRoU/6Gj0Nka0lkbeRd4ANN20dxr/mLdXIsUsk6DzTrX6A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.22.0.tgz", + "integrity": "sha512-wJU4IBQMUikdJAcTChLFqK5lo+flo7pahqd8DSLv7uMxsdOdAHj6RzKYAm8pPfUS6ItKYutYyuicwKaFwQKsoA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "engines": { @@ -10688,12 +10693,12 @@ } }, "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.56.0.tgz", - "integrity": "sha512-pKqtY5lbAQ70MC5K/BJeAA1t2gAUlRBZBAJ5ergRUNs5jw8zbdOXEZOLztiuNvQqD2z4a9N0Tkde9JMFm2pKMQ==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.57.0.tgz", + "integrity": "sha512-vMCSh8kolEm5rRsc+FZeTZymWmIJwc40hjIKnXH4O0Dv/gAkJJIRXCsPX5cPbe0c0j/34+PsENd0HqKruwhVYw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.1" }, "engines": { @@ -10704,13 +10709,13 @@ } }, "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.60.0.tgz", - "integrity": "sha512-UOmu2y2LHgPzKsm9xd0sCQJimr11YP4MKFc190Do1ufd8qds7Zd5BI3f6TudqYhH9dUIhojsQyUaS6K4nv5FsQ==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.61.0.tgz", + "integrity": "sha512-lvrfWe9ShK/D2X4brmx8ZqqeWPfRl8xekU0FCn7C1dHm5k6+rTOOi36+4fnaHAP8lig9Ux6XQ1D4RNIpPCt1WQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.36.0" }, "engines": { @@ -10721,12 +10726,12 @@ } }, "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.56.0.tgz", - "integrity": "sha512-vXtOValhKRgWA9tLAiTU3P37Q31OveRuM2N5iLSVHl4GzkMBQ5p50A9kSKvt5gReL6BzFDXPCM9ItJiAhSS2KQ==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.57.0.tgz", + "integrity": "sha512-cEqpUocSKJfwDtLYTTJehRLWzkZ2eoePCxfVIgGkGkb83fMB71O+y4MvRHJPbeV2bdoWdOVrl8uO0+EynWhTEA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10736,12 +10741,12 @@ } }, "node_modules/@opentelemetry/instrumentation-memcached": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.55.0.tgz", - "integrity": "sha512-kdhW/j5X+vNCAvHVc50PZfvE7diUScg1ZkBaNFRygY3Z6IUjgPLR0luWQMDPSFun6AVo1HaMDPxbUqJrot6qrA==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.56.0.tgz", + "integrity": "sha512-rU5kc6g465SgG52uUl2Qlf5OiNopYleqzNgJCDPokPdEeUb3Hpj3O7kqjAJ5bKEVMZVG9UC1MBp2TQwGv60byw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@types/memcached": "^2.2.6" }, @@ -10753,12 +10758,12 @@ } }, "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.65.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.65.0.tgz", - "integrity": "sha512-hOAJRs5vrY7fZolSYUXmf29Y+HFDHWrek0DeLq82uwMPjPSda7h6oumQnqEX5olzw357q/QG39/uJdkclJ/JUg==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.66.0.tgz", + "integrity": "sha512-d7m9QnAY+4TCWI4q1QRkfrc6fo/92VwssaB1DzQfXNRvu51b78P+HJlWP7Qg6N6nkwdb9faMZNBCZJfftmszkw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "engines": { @@ -10769,13 +10774,13 @@ } }, "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.58.0.tgz", - "integrity": "sha512-3L0Fqo1y2oreISFPWaqdt/bg3NhLgrkn5U/E/9RNG1QaM81drTMBCHseMY1q8SlejjE43ZWOy+0KbmRBlUPJ+g==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.59.0.tgz", + "integrity": "sha512-6/jWU+c1NgznkVLDU/2y0bXV2nJo3o9FWZ9mZ9nN6T/JBNRoMnVXZl2FdBmgH+a5MwaWLs5kmRJTP5oUVGIkPw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "engines": { @@ -10786,12 +10791,12 @@ } }, "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.58.0.tgz", - "integrity": "sha512-wZDrBCL3WfJclV6KywWVV3/B2ZiUYmDQdgyu3pq4jK/5qSfoDmezHzT/Nayln5MVVWMAGXIMLrCj8BKa6jaKQQ==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.59.0.tgz", + "integrity": "sha512-r+V/Fh0sm7Ga8/zk/TI5H5FQRAjwr0RrpfPf8kNIehlsKf12XnvIaZi8ViZkpX0gyPEpLXqzqWD6QHlgObgzZw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@types/mysql": "2.15.27" }, @@ -10803,12 +10808,12 @@ } }, "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.58.0.tgz", - "integrity": "sha512-EubjV1XZb7XHrENqF7TW2lnah+KN0LddMneKNAB8PjGVKL5lJkVV/vhJ6EIcUNn9nCWmAwZ3GRcFVEDKCnyXfQ==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.59.0.tgz", + "integrity": "sha512-n9/xrVCRBfG9egVbffnlU1uhr+HX0vF4GgtAB/Bvm48wpFgRidqD8msBMiym1kRYzmpWvJqTxNT47u1MkgBEdw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@opentelemetry/sql-common": "^0.41.2" }, @@ -10820,12 +10825,12 @@ } }, "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.58.0.tgz", - "integrity": "sha512-0lE9oW8j6nmvBHJoOxIQgKzMQQYNfX1nhiWZdXD0sNAMFsWBtvECWS7NAPSroKrEP53I04TcHCyyhcK4I9voXg==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.59.0.tgz", + "integrity": "sha512-tt2cFTENV8XB3D3xjhOz0q4hLc1eqkMZS5UyT9nnHF5FfYH94S2vAGdssvsMv+pFtA6/PmhPUZd4onUN1O7STg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "engines": { @@ -10836,12 +10841,12 @@ } }, "node_modules/@opentelemetry/instrumentation-net": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.56.0.tgz", - "integrity": "sha512-h69x7U6f86mP3gGWWTaMkQZk0K3tBvpVMIU7E0q2kkVw6eZ5TqFm9rkaEy38moQmixiDFQ9j/2/cwxG9P7ZEeA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.57.0.tgz", + "integrity": "sha512-UUb59z83btvU8q9sQFOc3wr6dsxZP9O17dPlqRUxl1gVrxx8+CIajEGFP+KhJNdlkGyRjH09UfMRvWvCtJdakw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "engines": { @@ -10852,13 +10857,13 @@ } }, "node_modules/@opentelemetry/instrumentation-openai": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-openai/-/instrumentation-openai-0.10.0.tgz", - "integrity": "sha512-0lV2zxge2mMaruVCw/bmypWVu+aJ76rc0HBvAVFCPUI3zzJdgBZJZafGIHZ1IB2F6VvrDFL+JstEnle6V8brvA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-openai/-/instrumentation-openai-0.11.0.tgz", + "integrity": "sha512-dlE35fB8xUFBFvlVOQcaMMii+mKk6kWeQbwQEePOLBp2U4oQd2wGGeVPYyihMnTFLVhQdQm2k5DVPFc2Gcllow==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.212.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/api-logs": "^0.213.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.36.0" }, "engines": { @@ -10869,12 +10874,12 @@ } }, "node_modules/@opentelemetry/instrumentation-oracledb": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.37.0.tgz", - "integrity": "sha512-OzMghtAEAEkXlkUrZI4QcXSZq0MILeU6WC0/N5+1MSkuIkruIeaRw99/RtyS2of8vlPDa8XbbXl32Q1RM3wSyg==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.38.0.tgz", + "integrity": "sha512-xPVEN9jO5pdpuzRYY8d7JTMEk2sPA3KShzoK4mBQgfLvM2BR3k0XwtyyX/FmWYSrjE7oxnO30HlhuyfkEd6o5A==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.34.0", "@types/oracledb": "6.5.2" }, @@ -10886,13 +10891,13 @@ } }, "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.64.0.tgz", - "integrity": "sha512-NbfB/rlfsRI3zpTjnbvJv3qwuoGLsN8FxR/XoI+ZTn1Rs62x1IenO+TSSvk4NO+7FlXpd2MiOe8LT/oNbydHGA==", + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.65.0.tgz", + "integrity": "sha512-W0zpHEIEuyZ8zvb3njaX9AAbHgPYOsSWVOoWmv1sjVRSF6ZpBqtlxBWbU+6hhq1TFWBeWJOXZ8nZS/PUFpLJYQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.34.0", "@opentelemetry/sql-common": "^0.41.2", "@types/pg": "8.15.6", @@ -10906,14 +10911,14 @@ } }, "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.58.0.tgz", - "integrity": "sha512-rgy+tA7cDjuSq6dXAO40OiYP25azIDHMBtxG3RzSmCBVEYdjggl6btyuLVasX6VkOOhP2gf6PBuLMNxVwaIqAw==", + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.59.0.tgz", + "integrity": "sha512-IgImVFtWjfMmqxc0NIe3iSjp+J3Asf9lLX8reouUFUk3Aa/qJQO5PEvOtO3sNQtJBkC9bAd1OQdFaFWSFQc03g==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.212.0", + "@opentelemetry/api-logs": "^0.213.0", "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10923,12 +10928,12 @@ } }, "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.60.0.tgz", - "integrity": "sha512-Ea/GffmmzIVHc9geaMjT94IR7poVZzIv4Kk/Lw0tbxGD3cBYcMUsLFVajKxpZsE1NRCECFpidAWeifCIKD0inw==", + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.61.0.tgz", + "integrity": "sha512-JnPexA034/0UJRsvH96B0erQoNOqKJZjE2ZRSw9hiTSC23LzE0nJE/u6D+xqOhgUhRnhhcPHq4MdYtmUdYTF+Q==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/redis-common": "^0.38.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, @@ -10940,13 +10945,13 @@ } }, "node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.57.0.tgz", - "integrity": "sha512-kO6MsZFU+RdXOKhsKw8SOSBYGYCdFSlza+mpBQRl1DQmveZcnidchv4V5JQPtNgHxCGH+1n3hDpLdxdGUbJPNA==", + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.58.0.tgz", + "integrity": "sha512-E8pEjW9d5rd6xxLhgHiQTwUG6YBOBeWzH/pe/IkdIGwkDzm1NVoExjSCVtMLQ8dRZbVo0nSdv2TqzyDcysuiSQ==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -10957,12 +10962,12 @@ } }, "node_modules/@opentelemetry/instrumentation-router": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.56.0.tgz", - "integrity": "sha512-PHECDGQElLazI/QbHU16C5m9fDC7DGJk+jLIwO5ca6bcp7bXhUPPUTT78l7da2pDsrz4mhv5ytYNZmBbW/Q3rA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.57.0.tgz", + "integrity": "sha512-iWhLFvNee9ZX5QhFbXZeGdoT966QemUfd1i+zxPWceE58P22qf9va6x662LbrNhcvJfXnf7hoW7BU9tzaBLmYg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -10973,12 +10978,12 @@ } }, "node_modules/@opentelemetry/instrumentation-runtime-node": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.25.0.tgz", - "integrity": "sha512-XaCmwBSui5KeTn8M6OzaEn1rEsNWtUkjuc1ylg0tqQTLHibNQ0n7f8v4zdF6x/nBV1OnsiYlN8RLHauGemv/TA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.26.0.tgz", + "integrity": "sha512-Q6xlV3o/ogtAJ1stWNNqL7kKFD6sMEDyC3Rb9GqnMQ5uH1wfnXO189F2XwMNt7Xe52asNU1WCrqiGa0iSrkq1g==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -10988,12 +10993,12 @@ } }, "node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.59.0.tgz", - "integrity": "sha512-71DnM/FEqH0PjvU2uZvzWJeaGyVIy3rJKk8rZrxg/aS2QT3qLGb+UPL/B+1vOw4pzDPn4papLTSMpLVF9G8uvw==", + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.60.0.tgz", + "integrity": "sha512-gzIkrN+hJzuQR87CA1zVCUQASOuuz0uC7kk7qDt9E/4sNvWrCIfI0YYa8ZTPgbaofqZE1fGWt0UqzIzQTb5BWQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11003,12 +11008,12 @@ } }, "node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.31.0.tgz", - "integrity": "sha512-HoF2EtcyP3JR4R3jLPHohZ9lFcj1QLJyGmFfLKDTvUUjPiFuK4XZ6L1OV9HhaqvN0xY+tWKfNdCPS3r33rd0Xw==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.32.0.tgz", + "integrity": "sha512-BQS6gG8RJ1foEqfEZ+wxoqlwfCAzb1ZVG0ad8Gfe4x8T658HJCLGLd4E4NaoQd8EvPfLqOXgzGaE/2U4ytDSWA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@types/tedious": "^4.0.14" }, @@ -11020,13 +11025,13 @@ } }, "node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.22.0.tgz", - "integrity": "sha512-yb6vEWUPOrD5i7yR1XceEEqiVHbMgr5YnUPnom5eQVCjvrTkEVswyrf9i+vvJR+28wrNqILIIphWgOOx6BjnTQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.23.0.tgz", + "integrity": "sha512-LL0VySzKVR2cJSFVZaTYpZl1XTpBGnfzoQPe2W7McS2267ldsaEIqtQY6VXs2KCXN0poFjze5110PIpxHDaDGg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", - "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.24.0" }, "engines": { @@ -11037,13 +11042,13 @@ } }, "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.56.0.tgz", - "integrity": "sha512-ITIA0Qe61CQ6FQU/bN23pNBvJ+5U0ofoASMOOYrODtXyV9wI267AigNTTwDmv2Myt8dPEFvvVFJZKhiZLIpehA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.57.0.tgz", + "integrity": "sha512-0MEeeyTd55OcXEd3SRkDwPvpb2equZ4kIADI7boVB9OYyaxAR2TB7jPX1IGORn1n/V+FXVWlYn9pQc2GuboJ+w==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.212.0", - "@opentelemetry/instrumentation": "^0.212.0" + "@opentelemetry/api-logs": "^0.213.0", + "@opentelemetry/instrumentation": "^0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11052,6 +11057,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/instrumentation/node_modules/import-in-the-middle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.0.0.tgz", + "integrity": "sha512-OnGy+eYT7wVejH2XWgLRgbmzujhhVIATQH0ztIeRilwHBjTeG3pD+XnH3PKX0r9gJ0BuJmJ68q/oh9qgXnNDQg==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.205.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.205.0.tgz", @@ -11242,12 +11262,12 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.5.1.tgz", - "integrity": "sha512-AU6sZgunZrZv/LTeHP+9IQsSSH5p3PtOfDPe8VTdwYH69nZCfvvvXehhzu+9fMW2mgJMh5RVpiH8M9xuYOu5Dg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.6.0.tgz", + "integrity": "sha512-SguK4jMmRvQ0c0dxAMl6K+Eu1+01X0OP7RLiIuHFjOS8hlB23ZYNnhnbAdSQEh5xVXQmH0OAS0TnmVI+6vB2Kg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1" + "@opentelemetry/core": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11257,12 +11277,12 @@ } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.5.1.tgz", - "integrity": "sha512-8+SB94/aSIOVGDUPRFSBRHVUm2A8ye1vC6/qcf/D+TF4qat7PC6rbJhRxiUGDXZtMtKEPM/glgv5cBGSJQymSg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.6.0.tgz", + "integrity": "sha512-KGWJuvp9X8X36bhHgIhWEnHAzXDInFr+Fvo9IQhhuu6pXLT8mF7HzFyx/X+auZUITvPaZhM39Phj3vK12MbhwA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1" + "@opentelemetry/core": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11281,9 +11301,9 @@ } }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.33.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.2.tgz", - "integrity": "sha512-EaS54zwYmOg9Ttc79juaktpCBYqyh2IquXl534sLls+c1/pc8LZfWPMqytFt+iBvSPQ6ajraUnvi6cun4AhSjQ==", + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.3.tgz", + "integrity": "sha512-Ep3LDWALU+wCgGzAa1rgFXh3TObahN7HaQZntAeVQnnNhZ3VSXnBniRGeSCTIRvRr7YdZvq+G+rstixtAN5Ugw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11297,9 +11317,9 @@ } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.12.0.tgz", - "integrity": "sha512-VelueKblsnQEiBVqEYcvM9VEb+B8zN6nftltdO9HAD7qi/OlicP4z/UGJ9EeW2m++WabdMoj0G3QVL8YV0P9tw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.13.0.tgz", + "integrity": "sha512-ZPCn7gZhGqUYUoD+RCHIlayoHBMaJaEjfqlgz2EPKoXJ4y7Ru7CUm+Tm3yJVMKF92cN9xUQR0j5KALyF0fg9aw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11314,9 +11334,9 @@ } }, "node_modules/@opentelemetry/resource-detector-azure": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.20.0.tgz", - "integrity": "sha512-iRy+O2cB6DOlQ/OONaK+L8Cp8nLS89dZVRp6KgnFAfzykXuq9Ws/ygJKcU3CCmjkgY5j2Vk3uVTre/E35bWhYg==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.21.0.tgz", + "integrity": "sha512-gAjK+lKeywMcRk9X/DjJsK9aPrQo+tM9vcp6AKpAAHRN5hNwzO/vAaW/Ezdodu76BK4ELo/O77y/b9qP+uU7vg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11331,9 +11351,9 @@ } }, "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.3.tgz", - "integrity": "sha512-5J0JP2cy655rBKM9Doz26ffO3rG+Xqm7OXeNXkckzmc3JmL6Bj3dPBKugPYsfemhEIqtf7INH9UmPQqTMuWoHg==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.4.tgz", + "integrity": "sha512-kIvGHkMSacp+kb7btTuXbOAIWLyOCO+P/h/8xxaeLcp5ptmHRZ67uEdLAQo61ApdayFB/uqjJ9gY4x2/i/KsoA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11347,9 +11367,9 @@ } }, "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.47.0.tgz", - "integrity": "sha512-57T/kRVdU0ch1P4KPEkmU2b5mWNlUs8hHgqrBYVF+fNZMc1jMdL1mANZhEzoLtWKIeoCEy+57Itt7RkXAYNJiQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.48.0.tgz", + "integrity": "sha512-kT/iG9zjlbWYaj22ixQ+vso0fXKCSKLH0loTb0Xfq+nQpu19MBTAa63IdITGCfqjcffh8/aB4hdyExypwAC16A==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -11364,15 +11384,14 @@ } }, "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gaxios": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", + "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2", - "rimraf": "^5.0.1" + "node-fetch": "^3.3.2" }, "engines": { "node": ">=18" @@ -11393,12 +11412,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.1.tgz", - "integrity": "sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.0.tgz", + "integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", + "@opentelemetry/core": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -11409,14 +11428,15 @@ } }, "node_modules/@opentelemetry/sdk-logs": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.212.0.tgz", - "integrity": "sha512-qglb5cqTf0mOC1sDdZ7nfrPjgmAqs2OxkzOPIf2+Rqx8yKBK0pS7wRtB1xH30rqahBIut9QJDbDePyvtyqvH/Q==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.213.0.tgz", + "integrity": "sha512-00xlU3GZXo3kXKve4DLdrAL0NAFUaZ9appU/mn00S/5kSUdAvyYsORaDUfR04Mp2CLagAOhrzfUvYozY/EZX2g==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11426,13 +11446,13 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.5.1.tgz", - "integrity": "sha512-RKMn3QKi8nE71ULUo0g/MBvq1N4icEBo7cQSKnL3URZT16/YH3nSVgWegOjwx7FRBTrjOIkMJkCUn/ZFIEfn4A==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.0.tgz", + "integrity": "sha512-CicxWZxX6z35HR83jl+PLgtFgUrKRQ9LCXyxgenMnz5A1lgYWfAog7VtdOvGkJYyQgMNPhXQwkYrDLujk7z1Iw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11442,34 +11462,34 @@ } }, "node_modules/@opentelemetry/sdk-node": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.212.0.tgz", - "integrity": "sha512-tJzVDk4Lo44MdgJLlP+gdYdMnjxSNsjC/IiTxj5CFSnsjzpHXwifgl3BpUX67Ty3KcdubNVfedeBc/TlqHXwwg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/configuration": "0.212.0", - "@opentelemetry/context-async-hooks": "2.5.1", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/exporter-logs-otlp-grpc": "0.212.0", - "@opentelemetry/exporter-logs-otlp-http": "0.212.0", - "@opentelemetry/exporter-logs-otlp-proto": "0.212.0", - "@opentelemetry/exporter-metrics-otlp-grpc": "0.212.0", - "@opentelemetry/exporter-metrics-otlp-http": "0.212.0", - "@opentelemetry/exporter-metrics-otlp-proto": "0.212.0", - "@opentelemetry/exporter-prometheus": "0.212.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.212.0", - "@opentelemetry/exporter-trace-otlp-http": "0.212.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.212.0", - "@opentelemetry/exporter-zipkin": "2.5.1", - "@opentelemetry/instrumentation": "0.212.0", - "@opentelemetry/propagator-b3": "2.5.1", - "@opentelemetry/propagator-jaeger": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "@opentelemetry/sdk-trace-node": "2.5.1", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.213.0.tgz", + "integrity": "sha512-8s7SQtY8DIAjraXFrUf0+I90SBAUQbsMWMtUGKmusswRHWXtKJx42aJQMoxEtC82Csqj+IlBH6FoP8XmmUDSrQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/configuration": "0.213.0", + "@opentelemetry/context-async-hooks": "2.6.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.213.0", + "@opentelemetry/exporter-logs-otlp-http": "0.213.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.213.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.213.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.213.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.213.0", + "@opentelemetry/exporter-prometheus": "0.213.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.213.0", + "@opentelemetry/exporter-trace-otlp-http": "0.213.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.213.0", + "@opentelemetry/exporter-zipkin": "2.6.0", + "@opentelemetry/instrumentation": "0.213.0", + "@opentelemetry/propagator-b3": "2.6.0", + "@opentelemetry/propagator-jaeger": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "@opentelemetry/sdk-trace-node": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -11480,18 +11500,18 @@ } }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.212.0.tgz", - "integrity": "sha512-9xTuYWp8ClBhljDGAoa0NSsJcsxJsC9zCFKMSZJp1Osb9pjXCMRdA6fwXtlubyqe7w8FH16EWtQNKx/FWi+Ghw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.213.0.tgz", + "integrity": "sha512-L8y6piP4jBIIx1Nv7/9hkx25ql6/Cro/kQrs+f9e8bPF0Ar5Dm991v7PnbtubKz6Q4fT872H56QXUWVnz/Cs4Q==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11501,16 +11521,16 @@ } }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.212.0.tgz", - "integrity": "sha512-v/0wMozNoiEPRolzC4YoPo4rAT0q8r7aqdnRw3Nu7IDN0CGFzNQazkfAlBJ6N5y0FYJkban7Aw5WnN73//6YlA==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.213.0.tgz", + "integrity": "sha512-tnRmJD39aWrE/Sp7F6AbRNAjKHToDkAqBi6i0lESpGWz3G+f4bhVAV6mgSXH2o18lrDVJXo6jf9bAywQw43wRA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11520,13 +11540,13 @@ } }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.212.0.tgz", - "integrity": "sha512-HoMv5pQlzbuxiMS0hN7oiUtg8RsJR5T7EhZccumIWxYfNo/f4wFc7LPDfFK6oHdG2JF/+qTocfqIHoom+7kLpw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", + "integrity": "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11536,15 +11556,15 @@ } }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.212.0.tgz", - "integrity": "sha512-YidOSlzpsun9uw0iyIWrQp6HxpMtBlECE3tiHGAsnpEqJWbAUWcMnIffvIuvTtTQ1OyRtwwaE79dWSQ8+eiB7g==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.213.0.tgz", + "integrity": "sha512-XgRGuLE9usFNlnw2lgMIM4HTwpcIyjdU/xPoJ8v3LbBLBfjaDkIugjc9HoWa7ZSJ/9Bhzgvm/aD0bGdYUFgnTw==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.14.3", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/otlp-exporter-base": "0.212.0", - "@opentelemetry/otlp-transformer": "0.212.0" + "@opentelemetry/core": "2.6.0", + "@opentelemetry/otlp-exporter-base": "0.213.0", + "@opentelemetry/otlp-transformer": "0.213.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11554,18 +11574,18 @@ } }, "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.212.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.212.0.tgz", - "integrity": "sha512-bj7zYFOg6Db7NUwsRZQ/WoVXpAf41WY2gsd3kShSfdpZQDRKHWJiRZIg7A8HvWsf97wb05rMFzPbmSHyjEl9tw==", + "version": "0.213.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.213.0.tgz", + "integrity": "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.212.0", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", - "@opentelemetry/sdk-logs": "0.212.0", - "@opentelemetry/sdk-metrics": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1", - "protobufjs": "8.0.0" + "@opentelemetry/api-logs": "0.213.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", + "@opentelemetry/sdk-logs": "0.213.0", + "@opentelemetry/sdk-metrics": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0", + "protobufjs": "^7.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11574,38 +11594,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/protobufjs": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", - "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.1.tgz", - "integrity": "sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.0.tgz", + "integrity": "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -11616,14 +11612,14 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.5.1.tgz", - "integrity": "sha512-9lopQ6ZoElETOEN0csgmtEV5/9C7BMfA7VtF4Jape3i954b6sTY2k3Xw3CxUTKreDck/vpAuJM+EDo4zheUw+A==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.0.tgz", + "integrity": "sha512-YhswtasmsbIGEFvLGvR9p/y3PVRTfFf+mgY8van4Ygpnv4sA3vooAjvh+qAn9PNWxs4/IwGGqiQS0PPsaRJ0vQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "2.5.1", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1" + "@opentelemetry/context-async-hooks": "2.6.0", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/sdk-trace-base": "2.6.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -11706,6 +11702,26 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/@paralleldrive/cuid2": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", @@ -13611,21 +13627,301 @@ "license": "MIT" }, "node_modules/@rive-app/react-webgl2": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@rive-app/react-webgl2/-/react-webgl2-4.27.0.tgz", - "integrity": "sha512-OxIRJiTPJtvPDeUWXfXIx2WZ/6OqaTFWTaS9OE0oekHz80yT9kl41MEUZw7GlgY4l4Pzke7bkn8xEeVnDgPFIg==", + "version": "4.27.1", + "resolved": "https://registry.npmjs.org/@rive-app/react-webgl2/-/react-webgl2-4.27.1.tgz", + "integrity": "sha512-QAiUJKU+VdtaRG4jzgj2dzs3He3TsF314S/jtjxbpVbmMtVbvepMk+gb4wl7UbPlzi18t+6hPZQcRX1A+OxXxQ==", "license": "MIT", "dependencies": { - "@rive-app/webgl2": "2.35.0" + "@rive-app/webgl2": "2.35.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0" } }, "node_modules/@rive-app/webgl2": { - "version": "2.35.0", - "resolved": "https://registry.npmjs.org/@rive-app/webgl2/-/webgl2-2.35.0.tgz", - "integrity": "sha512-T6fIVmsn9KiN0pMKOvuODhpnOzJHnhFU6injYmVkzsxKn+VIDhTC0FvR2vr520tR+JsZUBy04KUn61cxZCnUgA==", + "version": "2.35.2", + "resolved": "https://registry.npmjs.org/@rive-app/webgl2/-/webgl2-2.35.2.tgz", + "integrity": "sha512-Xe6g+lPicggYpdffdi9eN4X0hDEK2aWU+G8fUQsR3FCH2SIAVd7jmNUEIB5mksd09KywWtcFd6vZKkQDPKNbNw==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", + "dev": true, "license": "MIT" }, "node_modules/@rollup/plugin-alias": { @@ -13788,9 +14084,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.3.tgz", - "integrity": "sha512-qyX8+93kK/7R5BEXPC2PjUt0+fS/VO2BVHjEHyIEWiYn88rcRBHmdLgoJjktBltgAf+NY7RfCGB1SoyKS/p9kg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -13801,9 +14097,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.3.tgz", - "integrity": "sha512-6sHrL42bjt5dHQzJ12Q4vMKfN+kUnZ0atHHnv4V0Wd9JMTk7FDzSY35+7qbz3ypQYMBPANbpGK7JpnWNnhGt8g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -13814,9 +14110,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.3.tgz", - "integrity": "sha512-1ht2SpGIjEl2igJ9AbNpPIKzb1B5goXOcmtD0RFxnwNuMxqkR6AUaaErZz+4o+FKmzxcSNBOLrzsICZVNYa1Rw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -13827,9 +14123,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.3.tgz", - "integrity": "sha512-FYZ4iVunXxtT+CZqQoPVwPhH7549e/Gy7PIRRtq4t5f/vt54pX6eG9ebttRH6QSH7r/zxAFA4EZGlQ0h0FvXiA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -13840,9 +14136,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.3.tgz", - "integrity": "sha512-M/mwDCJ4wLsIgyxv2Lj7Len+UMHd4zAXu4GQ2UaCdksStglWhP61U3uowkaYBQBhVoNpwx5Hputo8eSqM7K82Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -13853,9 +14149,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.3.tgz", - "integrity": "sha512-5jZT2c7jBCrMegKYTYTpni8mg8y3uY8gzeq2ndFOANwNuC/xJbVAoGKR9LhMDA0H3nIhvaqUoBEuJoICBudFrA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -13866,12 +14162,15 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.3.tgz", - "integrity": "sha512-YeGUhkN1oA+iSPzzhEjVPS29YbViOr8s4lSsFaZKLHswgqP911xx25fPOyE9+khmN6W4VeM0aevbDp4kkEoHiA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13879,12 +14178,15 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.3.tgz", - "integrity": "sha512-eo0iOIOvcAlWB3Z3eh8pVM8hZ0oVkK3AjEM9nSrkSug2l15qHzF3TOwT0747omI6+CJJvl7drwZepT+re6Fy/w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13892,12 +14194,15 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.3.tgz", - "integrity": "sha512-DJay3ep76bKUDImmn//W5SvpjRN5LmK/ntWyeJs/dcnwiiHESd3N4uteK9FDLf0S0W8E6Y0sVRXpOCoQclQqNg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13905,12 +14210,15 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.3.tgz", - "integrity": "sha512-BKKWQkY2WgJ5MC/ayvIJTHjy0JUGb5efaHCUiG/39sSUvAYRBaO3+/EK0AZT1RF3pSj86O24GLLik9mAYu0IJg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13918,12 +14226,15 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.3.tgz", - "integrity": "sha512-Q9nVlWtKAG7ISW80OiZGxTr6rYtyDSkauHUtvkQI6TNOJjFvpj4gcH+KaJihqYInnAzEEUetPQubRwHef4exVg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13931,12 +14242,15 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.3.tgz", - "integrity": "sha512-2H5LmhzrpC4fFRNwknzmmTvvyJPHwESoJgyReXeFoYYuIDfBhP29TEXOkCJE/KxHi27mj7wDUClNq78ue3QEBQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13944,12 +14258,15 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.3.tgz", - "integrity": "sha512-9S542V0ie9LCTznPYlvaeySwBeIEa7rDBgLHKZ5S9DBgcqdJYburabm8TqiqG6mrdTzfV5uttQRHcbKff9lWtA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13957,12 +14274,15 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.3.tgz", - "integrity": "sha512-ukxw+YH3XXpcezLgbJeasgxyTbdpnNAkrIlFGDl7t+pgCxZ89/6n1a+MxlY7CegU+nDgrgdqDelPRNQ/47zs0g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13970,12 +14290,15 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.3.tgz", - "integrity": "sha512-Iauw9UsTTvlF++FhghFJjqYxyXdggXsOqGpFBylaRopVpcbfyIIsNvkf9oGwfgIcf57z3m8+/oSYTo6HutBFNw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -13983,12 +14306,15 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.3.tgz", - "integrity": "sha512-3OqKAHSEQXKdq9mQ4eajqUgNIK27VZPW3I26EP8miIzuKzCJ3aW3oEn2pzF+4/Hj/Moc0YDsOtBgT5bZ56/vcA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -13996,12 +14322,15 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.3.tgz", - "integrity": "sha512-0CM8dSVzVIaqMcXIFej8zZrSFLnGrAE8qlNbbHfTw1EEPnFTg1U1ekI0JdzjPyzSfUsHWtodilQQG/RA55berA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -14009,12 +14338,15 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.3.tgz", - "integrity": "sha512-+fgJE12FZMIgBaKIAGd45rxf+5ftcycANJRWk8Vz0NnMTM5rADPGuRFTYar+Mqs560xuART7XsX2lSACa1iOmQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -14022,12 +14354,15 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.3.tgz", - "integrity": "sha512-tMD7NnbAolWPzQlJQJjVFh/fNH3K/KnA7K8gv2dJWCwwnaK6DFCYST1QXYWfu5V0cDwarWC8Sf/cfMHniNq21A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -14035,9 +14370,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.3.tgz", - "integrity": "sha512-u5KsqxOxjEeIbn7bUK1MPM34jrnPwjeqgyin4/N6e/KzXKfpE9Mi0nCxcQjaM9lLmPcHmn/xx1yOjgTMtu1jWQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], @@ -14048,9 +14383,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.3.tgz", - "integrity": "sha512-vo54aXwjpTtsAnb3ca7Yxs9t2INZg7QdXN/7yaoG7nPGbOBXYXQY41Km+S1Ov26vzOAzLcAjmMdjyEqS1JkVhw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -14061,9 +14396,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.3.tgz", - "integrity": "sha512-HI+PIVZ+m+9AgpnY3pt6rinUdRYrGHvmVdsNQ4odNqQ/eRF78DVpMR7mOq7nW06QxpczibwBmeQzB68wJ+4W4A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -14074,9 +14409,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.3.tgz", - "integrity": "sha512-vRByotbdMo3Wdi+8oC2nVxtc3RkkFKrGaok+a62AT8lz/YBuQjaVYAS5Zcs3tPzW43Vsf9J0wehJbUY5xRSekA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -14087,9 +14422,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.3.tgz", - "integrity": "sha512-POZHq7UeuzMJljC5NjKi8vKMFN6/5EOqcX1yGntNLp7rUTpBAXQ1hW8kWPFxYLv07QMcNM75xqVLGPWQq6TKFA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -14100,9 +14435,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.3.tgz", - "integrity": "sha512-aPFONczE4fUFKNXszdvnd2GqKEYQdV5oEsIbKPujJmWlCI9zEsv1Otig8RKK+X9bed9gFUN6LAeN4ZcNuu4zjg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -14155,64 +14490,97 @@ } }, "node_modules/@shikijs/core": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", - "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", + "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.23.0", + "@shikijs/primitive": "4.0.2", + "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" } }, "node_modules/@shikijs/engine-javascript": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", - "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", + "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.23.0", + "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" + }, + "engines": { + "node": ">=20" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", - "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", + "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.23.0", + "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" } }, "node_modules/@shikijs/langs": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", - "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", + "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.23.0" + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", + "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.0.2", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" } }, "node_modules/@shikijs/themes": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", - "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", + "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.23.0" + "@shikijs/types": "4.0.2" + }, + "engines": { + "node": ">=20" } }, "node_modules/@shikijs/types": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", - "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", + "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" } }, "node_modules/@shikijs/vscode-textmate": { @@ -15099,9 +15467,9 @@ } }, "node_modules/@streamdown/code": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@streamdown/code/-/code-1.0.3.tgz", - "integrity": "sha512-3Ym5TCLcGhrHY2qBaUVWpqNRtxnZvqh4Y5Qm/pTIKA4AmEWwAAoYjZnxG7mOsvOpWVWiDwETjUtchNL1XzQEAw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@streamdown/code/-/code-1.1.0.tgz", + "integrity": "sha512-swypCjtE6vv01bnEtPeaw2ew9cbL2nbsLc06HAIK3K6nYXj5WDA8VLR6GEiwdh7HLIPt5dGze+PJ0eJVkqesug==", "license": "Apache-2.0", "dependencies": { "shiki": "^3.19.0" @@ -15110,6 +15478,83 @@ "react": "^18.0.0 || ^19.0.0" } }, + "node_modules/@streamdown/code/node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@streamdown/code/node_modules/@shikijs/engine-javascript": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@streamdown/code/node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@streamdown/code/node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@streamdown/code/node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@streamdown/code/node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@streamdown/code/node_modules/shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/engine-javascript": "3.23.0", + "@shikijs/engine-oniguruma": "3.23.0", + "@shikijs/langs": "3.23.0", + "@shikijs/themes": "3.23.0", + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, "node_modules/@streamdown/math": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@streamdown/math/-/math-1.0.2.tgz", @@ -15774,6 +16219,15 @@ "integrity": "sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg==", "license": "MIT" }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -16354,9 +16808,9 @@ } }, "node_modules/@types/node": { - "version": "24.10.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", - "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -16625,17 +17079,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", - "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/type-utils": "8.56.1", - "@typescript-eslint/utils": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -16648,7 +17102,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.56.1", + "@typescript-eslint/parser": "^8.57.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -16664,16 +17118,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", - "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3" }, "engines": { @@ -16689,14 +17143,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.1", - "@typescript-eslint/types": "^8.56.1", + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", "debug": "^4.4.3" }, "engines": { @@ -16711,14 +17165,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1" + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -16729,9 +17183,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", "dev": true, "license": "MIT", "engines": { @@ -16746,15 +17200,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", - "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -16771,9 +17225,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", "dev": true, "license": "MIT", "engines": { @@ -16785,16 +17239,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.1", - "@typescript-eslint/tsconfig-utils": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -16826,16 +17280,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", - "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1" + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -16850,13 +17304,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/types": "8.57.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -16874,9 +17328,9 @@ "license": "ISC" }, "node_modules/@upstash/redis": { - "version": "1.36.2", - "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.36.2.tgz", - "integrity": "sha512-C0Yt8hc12vLaQYRG1fMci8iPrLtnTdbJG0HR5T8vKnvEP/1RdMMblsOJs5/jp0JXZJ1oSzMnQz4J9EVezNpI6A==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.37.0.tgz", + "integrity": "sha512-LqOJ3+XWPLSZ2rGSed5DYG3ixybxb8EhZu3yQqF7MdZX1wLBG/FRcI6xcUZXHy/SS7mmXWyadrud0HJHkOc+uw==", "license": "MIT", "dependencies": { "uncrypto": "^0.1.3" @@ -16916,29 +17370,29 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", - "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.0.tgz", + "integrity": "sha512-nDWulKeik2bL2Va/Wl4x7DLuTKAXa906iRFooIRPR+huHkcvp9QDkPQ2RJdmjOFrqOqvNfoSQLF68deE3xC3CQ==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.18", - "ast-v8-to-istanbul": "^0.3.10", + "@vitest/utils": "4.1.0", + "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", - "magicast": "^0.5.1", + "magicast": "^0.5.2", "obug": "^2.1.1", - "std-env": "^3.10.0", + "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.0.18", - "vitest": "4.0.18" + "@vitest/browser": "4.1.0", + "vitest": "4.1.0" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -16947,17 +17401,17 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.0.0", + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", "tinyrainbow": "^3.0.3" }, "funding": { @@ -16965,13 +17419,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.18", + "@vitest/spy": "4.1.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -16980,7 +17434,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -16992,9 +17446,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", "dev": true, "license": "MIT", "dependencies": { @@ -17005,13 +17459,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.18", + "@vitest/utils": "4.1.0", "pathe": "^2.0.3" }, "funding": { @@ -17019,13 +17473,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.18", + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -17034,9 +17489,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", "dev": true, "license": "MIT", "funding": { @@ -17044,19 +17499,27 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.18", + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/utils/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/@vladfrangu/async_event_emitter": { "version": "2.4.7", "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.7.tgz", @@ -17260,14 +17723,14 @@ } }, "node_modules/ai": { - "version": "6.0.105", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.105.tgz", - "integrity": "sha512-rp+exWtZS3J0DDvZIfetpKCIg7D3cCsvBPoFN3I67IDTs9aoBZDbpecoIkmNLT+U9RBkoEial3OGHRvme23HCw==", + "version": "6.0.116", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.116.tgz", + "integrity": "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "3.0.59", + "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.16", + "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -17378,14 +17841,31 @@ } }, "node_modules/ai-sdk-provider-opencode-sdk": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ai-sdk-provider-opencode-sdk/-/ai-sdk-provider-opencode-sdk-2.1.1.tgz", - "integrity": "sha512-ZMsbC3wVnYqOxnYSpfOpsgnnkPeEiaK8yK83cnhc5vRlbA3MGCFUs3FVAOKERyDHF5QjGphhgKcscJ/7LOEgAQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-opencode-sdk/-/ai-sdk-provider-opencode-sdk-2.1.2.tgz", + "integrity": "sha512-cfi7IPHIwEKGIuYBF56oozjFRmSRO9L8Vahri4yjv5qsMipgk6XPpbFwSrtIJvx4QMw1/gj8Yrauqce8RVZd7A==", "license": "MIT", "dependencies": { "@ai-sdk/provider": "^3.0.8", "@ai-sdk/provider-utils": "^4.0.15", - "@opencode-ai/sdk": "^1.1.65" + "@opencode-ai/sdk": "^1.2.15" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ai/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.19.tgz", + "integrity": "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" @@ -17395,9 +17875,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -17658,21 +18138,21 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.10.tgz", - "integrity": "sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" + "js-tokens": "^10.0.0" } }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, @@ -19325,9 +19805,9 @@ "license": "MIT" }, "node_modules/convex": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/convex/-/convex-1.32.0.tgz", - "integrity": "sha512-5FlajdLpW75pdLS+/CgGH5H6yeRuA+ru50AKJEYbJpmyILUS+7fdTvsdTaQ7ZFXMv0gE8mX4S+S3AtJ94k0mfw==", + "version": "1.33.1", + "resolved": "https://registry.npmjs.org/convex/-/convex-1.33.1.tgz", + "integrity": "sha512-mRhR1XqZPLhgJsUepecM/kOgQVRCWKJtHHtyEX/XYY4zmzfItG0D1GNh5fjNEkuO5+72X4PCkzbEFA6327rxog==", "license": "Apache-2.0", "dependencies": { "esbuild": "0.27.0", @@ -20125,13 +20605,13 @@ "license": "MIT" }, "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" @@ -20162,21 +20642,6 @@ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", "license": "MIT" }, - "node_modules/cssstyle": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.0.1.tgz", - "integrity": "sha512-IoJs7La+oFp/AB033wBStxNOJt4+9hHMxsXUPANcoXL2b3W4DZKghlJ2cI/eyeRZIQ9ysvYEorVhjrcYctWbog==", - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^4.1.2", - "@csstools/css-syntax-patches-for-csstree": "^1.0.26", - "css-tree": "^3.1.0", - "lru-cache": "^11.2.5" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -20839,6 +21304,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, "license": "MIT", "engines": { "node": ">=4.0.0" @@ -21528,9 +21994,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -21540,32 +22006,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/escalade": { @@ -21608,25 +22074,25 @@ } }, "node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -21645,7 +22111,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -22333,15 +22799,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -22628,21 +23085,24 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", - "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } }, "node_modules/fast-xml-parser": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", + "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", "funding": [ { "type": "github", @@ -22651,7 +23111,8 @@ ], "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.0.0", + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.1.3", "strnum": "^2.1.2" }, "bin": { @@ -23007,9 +23468,9 @@ "license": "Apache-2.0" }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", "dev": true, "license": "ISC" }, @@ -23145,13 +23606,13 @@ } }, "node_modules/framer-motion": { - "version": "12.34.4", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.4.tgz", - "integrity": "sha512-q1PwNhc1XJ3qYG7nc9+pEU5P3tnjB6Eh9vv5gGzy61nedDLB4+xk5peMCWhKM0Zn6sfhgunf/q9n0UgCoyKOBA==", + "version": "12.37.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.37.0.tgz", + "integrity": "sha512-j/QUcZS9Nw3NzZWoAbkzr3ETRFHyVeQMlGOUYUmG15U+uiyn9DqIktYruVPDcqY8I35qYR70JaZBvFmS6p+Pdg==", "license": "MIT", "dependencies": { - "motion-dom": "^12.34.3", - "motion-utils": "^12.29.2", + "motion-dom": "^12.37.0", + "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -23186,16 +23647,10 @@ "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "license": "MIT" }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -23447,12 +23902,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/glob": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-12.0.0.tgz", @@ -24935,6 +25384,18 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -25043,6 +25504,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, "license": "ISC" }, "node_modules/ink-testing-library": { @@ -25521,13 +25983,13 @@ } }, "node_modules/isolated-vm": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/isolated-vm/-/isolated-vm-6.0.2.tgz", - "integrity": "sha512-Qw6AJuagG/VJuh2AIcSWmQPsAArti/L+lKhjXU+lyhYkbt3J57XZr+ZjgfTnOr4NJcY1r3f8f0eePS7MRGp+pg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/isolated-vm/-/isolated-vm-6.1.2.tgz", + "integrity": "sha512-GGfsHqtlZiiurZaxB/3kY7LLAXR3sgzDul0fom4cSyBjx6ZbjpTrFWiH3z/nUfLJGJ8PIq9LQmQFiAxu24+I7A==", "hasInstallScript": true, "license": "ISC", "dependencies": { - "prebuild-install": "^7.1.3" + "node-gyp-build": "^4.8.4" }, "engines": { "node": ">=22.0.0" @@ -25635,9 +26097,9 @@ } }, "node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz", + "integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -25692,35 +26154,35 @@ } }, "node_modules/jsdom": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.1.0.tgz", - "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.0.tgz", + "integrity": "sha512-9FshNB6OepopZ08unmmGpsF7/qCjxGPbo3NbgfJAnPeHXnsODE9WWffXZtRFRFe0ntzaAOcSKNJFz8wiyvF1jQ==", "license": "MIT", "dependencies": { - "@acemir/cssom": "^0.9.31", - "@asamuzakjp/dom-selector": "^6.8.1", + "@asamuzakjp/css-color": "^5.0.1", + "@asamuzakjp/dom-selector": "^7.0.2", "@bramus/specificity": "^2.4.2", - "@exodus/bytes": "^1.11.0", - "cssstyle": "^6.0.1", + "@csstools/css-syntax-patches-for-csstree": "^1.1.1", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.7", "parse5": "^8.0.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.0", - "undici": "^7.21.0", + "tough-cookie": "^6.0.1", + "undici": "^7.24.3", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0", + "whatwg-url": "^16.0.1", "xml-name-validator": "^5.0.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { "canvas": "^3.0.0" @@ -25756,9 +26218,9 @@ } }, "node_modules/jsdom/node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -26078,9 +26540,9 @@ } }, "node_modules/lenis": { - "version": "1.3.17", - "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.17.tgz", - "integrity": "sha512-k9T9rgcxne49ggJOvXCraWn5dt7u2mO+BNkhyu6yxuEnm9c092kAW5Bus5SO211zUvx7aCCEtzy9UWr0RB+oJw==", + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.18.tgz", + "integrity": "sha512-7KBl3V7vx5y1h05pu9fNFZS66I0+1eZ+zUGNNNBKtEn3BONZy+nkHWvdEe2b+zKT+6WX1x7zyOb1zbYYOs6tcg==", "license": "MIT", "funding": { "type": "github", @@ -26682,18 +27144,18 @@ } }, "node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/lucide-react": { - "version": "0.575.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.575.0.tgz", - "integrity": "sha512-VuXgKZrk0uiDlWjGGXmKV6MSk9Yy4l10qgVvzGn2AWBx1Ylt0iBexKOAoA6I7JO3m+M9oeovJd3yYENfkUbOeg==", + "version": "0.577.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", + "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -26720,14 +27182,14 @@ } }, "node_modules/magicast": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", - "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, @@ -26820,9 +27282,9 @@ } }, "node_modules/marked": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.3.tgz", - "integrity": "sha512-jt1v2ObpyOKR8p4XaUJVk3YWRJ5n+i4+rjQopxvV32rSndTJXvIzuUdWWIy/1pFQMkQmvTXawzDNqOH/CUmx6A==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.4.tgz", + "integrity": "sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -26832,27 +27294,27 @@ } }, "node_modules/mastra": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/mastra/-/mastra-1.3.5.tgz", - "integrity": "sha512-PeSzZYizlVLRdSceqBgWauBNrBC9dFir1KlMuzhOKl3+Spf44GOBWI7GLcxuILAazo8GiFaufsC+ZkALji5s9Q==", + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/mastra/-/mastra-1.3.12.tgz", + "integrity": "sha512-AwxZ7PSjM58r9j2ITjeazu1+7a/YgfKxBsFTm6agfzrM4xN6r6/01sZ0kF8b3ABMeuua5JcvHPWqWjlTbuUPXA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@clack/prompts": "^1.0.1", "@expo/devcert": "^1.2.1", - "@mastra/deployer": "^1.8.0", + "@mastra/deployer": "^1.13.2", "@mastra/loggers": "^1.0.2", "commander": "^14.0.3", "dotenv": "^17.2.3", "execa": "^9.6.1", - "fs-extra": "^11.3.3", + "fs-extra": "^11.3.4", "get-port": "^7.1.0", "local-pkg": "^1.1.2", "picocolors": "^1.1.1", "posthog-node": "5.17.2", - "prettier": "^3.7.4", - "semver": "^7.7.0", - "serve": "^14.2.5", + "prettier": "^3.8.1", + "semver": "^7.7.4", + "serve": "^14.2.6", "serve-handler": "^6.1.6", "shell-quote": "^1.8.3", "strip-json-comments": "^5.0.3", @@ -27453,9 +27915,9 @@ } }, "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, "node_modules/media-chrome": { @@ -28484,9 +28946,9 @@ } }, "node_modules/minimatch": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", - "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.2" @@ -28629,24 +29091,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "node_modules/ml-array-max": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz", @@ -28859,12 +29303,12 @@ } }, "node_modules/motion": { - "version": "12.34.4", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.34.4.tgz", - "integrity": "sha512-J0cuDNRymNzE0M2WY8CFcbQuprHBZwY+iqADKGLLe6kQUVP4kBQ2l7Z6gWK7Zfrt5Wgxs+kCojj4qu7I4wxBIw==", + "version": "12.37.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.37.0.tgz", + "integrity": "sha512-Ph6oyO5hGSIAPjDsqwchEP+EKXjyFK0ci6FTIFBbx+qaMl8zLzLzPLzd9q3DKhAHcvnV7LxQonMyA+FyAv9+gA==", "license": "MIT", "dependencies": { - "framer-motion": "^12.34.4", + "framer-motion": "^12.37.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -28885,18 +29329,18 @@ } }, "node_modules/motion-dom": { - "version": "12.34.3", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.3.tgz", - "integrity": "sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==", + "version": "12.37.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.37.0.tgz", + "integrity": "sha512-LnppZuwX1jQizRWTl9LBLMN3RbAEmdQkX/2Af0UW70NCqYJI/7GfI83vQP9Ucel/Avc0Tf2ZWy8FHawuc0O6Vg==", "license": "MIT", "dependencies": { - "motion-utils": "^12.29.2" + "motion-utils": "^12.36.0" } }, "node_modules/motion-utils": { - "version": "12.29.2", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz", - "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==", + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", + "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", "license": "MIT" }, "node_modules/mrmime": { @@ -28915,21 +29359,22 @@ "license": "MIT" }, "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", + "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.6.0", "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" + "type-is": "^1.6.18" }, "engines": { "node": ">= 10.16.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/multer/node_modules/media-typer": { @@ -28987,9 +29432,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.7.tgz", + "integrity": "sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==", "funding": [ { "type": "github", @@ -29004,12 +29449,6 @@ "node": "^18 || >=20" } }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -29017,6 +29456,44 @@ "dev": true, "license": "MIT" }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -29150,30 +29627,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/node-abi": { - "version": "3.86.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.86.0.tgz", - "integrity": "sha512-sn9Et4N3ynsetj3spsZR729DVlGH6iBG4RiDMV7HEp3guyOW6W3S0unGpLDxT50mXortGUMax/ykUNQXdqc/Xg==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -29547,13 +30000,13 @@ "license": "MIT" }, "node_modules/oniguruma-to-es": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz", + "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", "license": "MIT", "dependencies": { "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", + "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, @@ -30031,6 +30484,21 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -30449,9 +30917,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "funding": [ { "type": "opencollective", @@ -30594,32 +31062,6 @@ "node": ">=20" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -30684,6 +31126,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "license": "MIT", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, "node_modules/proc-log": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", @@ -31163,6 +31616,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -31178,6 +31632,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -31322,9 +31777,9 @@ } }, "node_modules/react-resizable-panels": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.7.0.tgz", - "integrity": "sha512-QJTeh8KJR6lKzDwVez+WGPPUPuarIjR3ptg23thJ0G5dAMYJH4iSN1AnNY0DuSP+PgH8s9eYfwrR7AlmX6TvYA==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.7.3.tgz", + "integrity": "sha512-PYcYMLtvJD+Pr0TQNeMvddcnLOwUa/Yb4iNwU7ThNLlHaQYEEC9MIBWHaBGODzYuXIkPRZ/OWe5sbzG1Rzq5ew==", "license": "MIT", "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -32008,9 +32463,9 @@ } }, "node_modules/remend": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remend/-/remend-1.2.1.tgz", - "integrity": "sha512-4wC12bgXsfKAjF1ewwkNIQz5sqewz/z1xgIgjEMb3r1pEytQ37F0Cm6i+OhbTWEvguJD7lhOUJhK5fSasw9f0w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/remend/-/remend-1.2.2.tgz", + "integrity": "sha512-4ZJgIB9EG9fQE41mOJCRHMmnxDTKHWawQoJWZyUbZuj680wVyogu2ihnj8Edqm7vh2mo/TWHyEZpn2kqeDvS7w==", "license": "Apache-2.0" }, "node_modules/require-directory": { @@ -32263,10 +32718,44 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", "license": "Unlicense" }, + "node_modules/rolldown": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.9" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" + } + }, "node_modules/rollup": { - "version": "4.55.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.3.tgz", - "integrity": "sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -32279,31 +32768,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.3", - "@rollup/rollup-android-arm64": "4.55.3", - "@rollup/rollup-darwin-arm64": "4.55.3", - "@rollup/rollup-darwin-x64": "4.55.3", - "@rollup/rollup-freebsd-arm64": "4.55.3", - "@rollup/rollup-freebsd-x64": "4.55.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.3", - "@rollup/rollup-linux-arm-musleabihf": "4.55.3", - "@rollup/rollup-linux-arm64-gnu": "4.55.3", - "@rollup/rollup-linux-arm64-musl": "4.55.3", - "@rollup/rollup-linux-loong64-gnu": "4.55.3", - "@rollup/rollup-linux-loong64-musl": "4.55.3", - "@rollup/rollup-linux-ppc64-gnu": "4.55.3", - "@rollup/rollup-linux-ppc64-musl": "4.55.3", - "@rollup/rollup-linux-riscv64-gnu": "4.55.3", - "@rollup/rollup-linux-riscv64-musl": "4.55.3", - "@rollup/rollup-linux-s390x-gnu": "4.55.3", - "@rollup/rollup-linux-x64-gnu": "4.55.3", - "@rollup/rollup-linux-x64-musl": "4.55.3", - "@rollup/rollup-openbsd-x64": "4.55.3", - "@rollup/rollup-openharmony-arm64": "4.55.3", - "@rollup/rollup-win32-arm64-msvc": "4.55.3", - "@rollup/rollup-win32-ia32-msvc": "4.55.3", - "@rollup/rollup-win32-x64-gnu": "4.55.3", - "@rollup/rollup-win32-x64-msvc": "4.55.3", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -32614,14 +33103,14 @@ "license": "MIT" }, "node_modules/serve": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.5.tgz", - "integrity": "sha512-Qn/qMkzCcMFVPb60E/hQy+iRLpiU8PamOfOSYoAHmmF+fFFmpPpqa6Oci2iWYpTdOUM3VF+TINud7CfbQnsZbA==", + "version": "14.2.6", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.6.tgz", + "integrity": "sha512-QEjUSA+sD4Rotm1znR8s50YqA3kYpRGPmtd5GlFxbaL9n/FdUNbqMhxClqdditSk0LlZyA/dhud6XNRTOC9x2Q==", "dev": true, "license": "MIT", "dependencies": { "@zeit/schemas": "2.36.0", - "ajv": "8.12.0", + "ajv": "8.18.0", "arg": "5.0.2", "boxen": "7.0.0", "chalk": "5.0.1", @@ -32629,7 +33118,7 @@ "clipboardy": "3.0.0", "compression": "1.8.1", "is-port-reachable": "4.0.0", - "serve-handler": "6.1.6", + "serve-handler": "6.1.7", "update-check": "1.5.4" }, "bin": { @@ -32640,16 +33129,16 @@ } }, "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", "dev": true, "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "mime-types": "2.1.18", - "minimatch": "3.1.2", + "minimatch": "3.1.5", "path-is-inside": "1.0.2", "path-to-regexp": "3.3.0", "range-parser": "1.2.0" @@ -32730,23 +33219,6 @@ "node": ">= 0.8.0" } }, - "node_modules/serve/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/serve/node_modules/chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", @@ -32875,19 +33347,22 @@ } }, "node_modules/shiki": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", - "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", + "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", "license": "MIT", "dependencies": { - "@shikijs/core": "3.23.0", - "@shikijs/engine-javascript": "3.23.0", - "@shikijs/engine-oniguruma": "3.23.0", - "@shikijs/langs": "3.23.0", - "@shikijs/themes": "3.23.0", - "@shikijs/types": "3.23.0", + "@shikijs/core": "4.0.2", + "@shikijs/engine-javascript": "4.0.2", + "@shikijs/engine-oniguruma": "4.0.2", + "@shikijs/langs": "4.0.2", + "@shikijs/themes": "4.0.2", + "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" } }, "node_modules/side-channel": { @@ -32975,78 +33450,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/simple-git": { "version": "3.30.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", @@ -33063,9 +33466,9 @@ } }, "node_modules/simple-statistics": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.8.tgz", - "integrity": "sha512-CUtP0+uZbcbsFpqEyvNDYjJCl+612fNgjT8GaVuvMG7tBuJg8gXGpsP5M7X658zy0IcepWOZ6nPBu1Qb9ezA1w==", + "version": "7.8.9", + "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.9.tgz", + "integrity": "sha512-YT6MLqYsz7y1rQZOLFlOCCgSRpCi6bqY417yhoOLI7aVoBi29dD39EPrOE03W9DY25H0J0jizVsHZnkLzyGJFg==", "license": "ISC", "engines": { "node": "*" @@ -33275,9 +33678,9 @@ } }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", "dev": true, "license": "MIT" }, @@ -33324,6 +33727,30 @@ "stream-chain": "^2.2.5" } }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "license": "MIT", + "dependencies": { + "debug": "2" + } + }, + "node_modules/stream-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stream-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", @@ -33331,9 +33758,9 @@ "license": "MIT" }, "node_modules/streamdown": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/streamdown/-/streamdown-2.3.0.tgz", - "integrity": "sha512-OqS3by/lt91lSicE8RQP2nTsYI6Q/dQgGP2vcyn9YesCmRHhNjswAuBAZA1z0F4+oBU3II/eV51LqjCqwTb1lw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/streamdown/-/streamdown-2.4.0.tgz", + "integrity": "sha512-fRk4HEYNznRLmxoVeT8wsGBwHF6/Yrdey6k+ZrE1Qtp4NyKwm7G/6e2Iw8penY4yLx31TlAHWT5Bsg1weZ9FZg==", "license": "Apache-2.0", "dependencies": { "clsx": "^2.1.1", @@ -33346,7 +33773,7 @@ "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", - "remend": "1.2.1", + "remend": "1.2.2", "tailwind-merge": "^3.4.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", @@ -33870,40 +34297,6 @@ "node": ">=18" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/technicalindicators": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/technicalindicators/-/technicalindicators-3.1.0.tgz", @@ -34290,6 +34683,12 @@ "@tokenlens/models": "1.3.0" } }, + "node_modules/tokenx": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tokenx/-/tokenx-1.3.0.tgz", + "integrity": "sha512-NLdXTEZkKiO0gZuLtMoZKjCXTREXeZZt8nnnNeyoXtNZAfG/GKGSbQtLU5STspc0rMSwcA+UJfWZkbNU01iKmQ==", + "license": "MIT" + }, "node_modules/toml": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", @@ -34306,9 +34705,9 @@ } }, "node_modules/tough-cookie": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", - "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -34736,463 +35135,6 @@ } } }, - "node_modules/tsup/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" - } - }, "node_modules/tsup/node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -35202,18 +35144,6 @@ "node": ">= 12" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/tw-animate-css": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", @@ -35317,16 +35247,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", - "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz", + "integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.56.1", - "@typescript-eslint/parser": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1" + "@typescript-eslint/eslint-plugin": "8.57.0", + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -35835,9 +35765,9 @@ } }, "node_modules/v0-sdk": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/v0-sdk/-/v0-sdk-0.16.2.tgz", - "integrity": "sha512-QkXQeos8wFi2+ojMrtALoJzahddcgagiuJ+o0l4f9+dnzqS8sJl8/4S6TUNlQQueUkzQTPvg+qi3C8pep5Ln1Q==", + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/v0-sdk/-/v0-sdk-0.16.4.tgz", + "integrity": "sha512-ByYyxGbdx1Ab/sTpIK5krf/aK7ATvjWxRiBlqR3f4C4BMh+PzfRzkG/dhOe1lYDYRORQfT4a+SqWcXIGqNsF9w==", "license": "Apache-2.0", "engines": { "node": ">=22", @@ -35937,17 +35867,17 @@ } }, "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.32.0", "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.9", "tinyglobby": "^0.2.15" }, "bin": { @@ -35964,9 +35894,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -35979,13 +35910,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { + "optional": true + }, + "jiti": { "optional": true }, - "lightningcss": { + "less": { "optional": true }, "sass": { @@ -36011,531 +35945,330 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], + "node_modules/vite/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">=18" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], + "node_modules/vite/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "android" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" + "libc": [ + "glibc" ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "cpu": [ - "s390x" + "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" + "libc": [ + "musl" ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" + "libc": [ + "glibc" ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" + "libc": [ + "musl" ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "sunos" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" + "node": ">= 12.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "std-env": "^3.10.0", + "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -36551,12 +36284,13 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -36585,9 +36319,19 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false } } }, + "node_modules/vitest/node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, "node_modules/vitest/node_modules/tinyexec": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", @@ -36783,9 +36527,9 @@ } }, "node_modules/whatwg-url": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.0.tgz", - "integrity": "sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", "license": "MIT", "dependencies": { "@exodus/bytes": "^1.11.0", diff --git a/package.json b/package.json index a9bd9a5b..bea82e89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "agentstack", - "version": "1.2.1", + "version": "1.3.1", "description": "Multi-agent frameworks and tools for building AI applications with Mastra.", "main": "index.js", "scripts": { @@ -47,49 +47,49 @@ "node": ">=20.9.0" }, "dependencies": { - "@ai-sdk/google": "^3.0.35", - "@ai-sdk/google-vertex": "^4.0.69", - "@ai-sdk/openai": "^3.0.38", - "@ai-sdk/openai-compatible": "^2.0.31", - "@ai-sdk/provider-utils": "^4.0.16", - "@ai-sdk/react": "^3.0.108", - "@dotenvx/dotenvx": "^1.52.0", + "@ai-sdk/google": "^3.0.43", + "@ai-sdk/google-vertex": "^4.0.80", + "@ai-sdk/openai": "^3.0.41", + "@ai-sdk/openai-compatible": "^2.0.35", + "@ai-sdk/provider-utils": "^4.0.19", + "@ai-sdk/react": "^3.0.118", + "@dotenvx/dotenvx": "^1.55.1", "@e2b/code-interpreter": "^2.3.3", "@emotion/react": "^11.14.0", "@gsap/react": "^2.1.2", - "@mastra/ai-sdk": "^1.1.0", + "@mastra/ai-sdk": "^1.1.3", "@mastra/auth-supabase": "^1.0.0", - "@mastra/client-js": "^1.7.1", - "@mastra/cloudflare-d1": "^1.0.0", - "@mastra/convex": "^1.0.4", - "@mastra/core": "^1.8.0", - "@mastra/daytona": "^0.0.1", - "@mastra/deployer": "^1.8.0", + "@mastra/client-js": "^1.8.4", + "@mastra/cloudflare-d1": "^1.0.3", + "@mastra/convex": "^1.0.6", + "@mastra/core": "^1.13.2", + "@mastra/daytona": "^0.2.0", + "@mastra/deployer": "^1.13.2", "@mastra/evals": "^1.1.2", - "@mastra/lance": "^1.0.2", - "@mastra/libsql": "^1.6.2", + "@mastra/lance": "^1.0.4", + "@mastra/libsql": "^1.7.0", "@mastra/loggers": "^1.0.2", - "@mastra/mcp": "^1.0.2", - "@mastra/memory": "^1.5.2", - "@mastra/mongodb": "^1.5.2", - "@mastra/observability": "^1.2.1", - "@mastra/otel-bridge": "^1.0.3", - "@mastra/pg": "^1.7.0", + "@mastra/mcp": "^1.2.1", + "@mastra/memory": "^1.8.2", + "@mastra/mongodb": "^1.5.5", + "@mastra/observability": "^1.5.0", + "@mastra/otel-bridge": "^1.0.7", + "@mastra/pg": "^1.8.0", "@mastra/qdrant": "^1.0.1", "@mastra/rag": "^2.1.2", - "@mastra/react": "^0.2.7", - "@mastra/upstash": "^1.0.2", + "@mastra/react": "^0.2.14", + "@mastra/upstash": "^1.0.4", "@mastra/vectorize": "^1.0.1", "@mastra/voice-google": "^0.12.0", "@mastra/voice-openai": "^0.12.1", - "@mcpc-tech/acp-ai-provider": "^0.2.4", + "@mcpc-tech/acp-ai-provider": "^0.2.8", "@next/bundle-analyzer": "^16.1.6", "@next/mdx": "^16.1.6", "@octokit/plugin-retry": "^8.1.0", - "@openrouter/ai-sdk-provider": "^2.2.3", + "@openrouter/ai-sdk-provider": "^2.3.1", "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-node": "^0.70.1", - "@opentelemetry/exporter-trace-otlp-proto": "^0.212.0", + "@opentelemetry/auto-instrumentations-node": "^0.71.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.213.0", "@opeoginni/github-copilot-openai-compatible": "^1.0.0", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-collapsible": "^1.1.12", @@ -106,9 +106,9 @@ "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tooltip": "^1.2.8", "@radix-ui/react-use-controllable-state": "^1.2.2", - "@rive-app/react-webgl2": "^4.27.0", + "@rive-app/react-webgl2": "^4.27.1", "@streamdown/cjk": "^1.0.2", - "@streamdown/code": "^1.0.3", + "@streamdown/code": "^1.1.0", "@streamdown/math": "^1.0.2", "@streamdown/mermaid": "^1.0.2", "@tanstack/react-query": "^5.90.21", @@ -119,10 +119,10 @@ "@xterm/xterm": "^6.0.0", "@xyflow/react": "^12.10.1", "a2a-ai-provider": "^0.4.0-alpha.2", - "ai": "^6.0.105", + "ai": "^6.0.116", "ai-sdk-ollama": "^3.8.0", "ai-sdk-provider-gemini-cli": "^2.0.1", - "ai-sdk-provider-opencode-sdk": "^2.1.1", + "ai-sdk-provider-opencode-sdk": "^2.1.2", "ansi-to-react": "^6.2.6", "arraystat": "^1.7.81", "axios": "^1.13.6", @@ -139,7 +139,7 @@ "cmdk": "^1.1.1", "concurrently": "^9.2.1", "convert-csv-to-json": "^3.20.0", - "convex": "^1.32.0", + "convex": "^1.33.1", "crawlee": "^3.16.0", "critters": "^0.0.25", "csv-parse": "^6.1.0", @@ -152,28 +152,28 @@ "embla-carousel-react": "^8.6.0", "excalidraw-to-svg": "^3.1.0", "fast-glob": "^3.3.3", - "fast-xml-parser": "^5.4.1", - "framer-motion": "^12.34.4", + "fast-xml-parser": "^5.5.6", + "framer-motion": "^12.37.0", "globals": "^17.4.0", "gray-matter": "^4.0.3", "gsap": "^3.14.2", "html-to-image": "^1.11.13", "husky": "^9.1.7", "input-otp": "^1.4.2", - "isolated-vm": "^6.0.2", - "jose": "^6.1.3", - "jsdom": "^28.1.0", + "isolated-vm": "^6.1.2", + "jose": "^6.2.1", + "jsdom": "^29.0.0", "langfuse-vercel": "^3.38.6", "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", - "lenis": "^1.3.17", + "lenis": "^1.3.18", "lodash": "^4.17.23", - "lucide-react": "^0.575.0", - "marked": "^17.0.3", + "lucide-react": "^0.577.0", + "marked": "^17.0.4", "mathjs": "^15.1.1", "media-chrome": "^4.18.0", - "motion": "^12.34.4", - "nanoid": "^5.1.6", + "motion": "^12.37.0", + "nanoid": "^5.1.7", "next": "^16.1.6", "next-themes": "^0.4.6", "octokit": "^5.0.5", @@ -181,7 +181,7 @@ "pino": "^10.3.1", "pino-pretty": "^13.1.3", "playwright": "^1.58.2", - "postcss": "^8.5.6", + "postcss": "^8.5.8", "radix-ui": "^1.4.3", "rbush": "^4.0.1", "re2": "^1.23.3", @@ -189,7 +189,7 @@ "react-chartjs-2": "^5.3.1", "react-dom": "^19.2.4", "react-jsx-parser": "^2.4.1", - "react-resizable-panels": "^4.7.0", + "react-resizable-panels": "^4.7.3", "recharts": "^2.15.4", "rehype": "^13.0.2", "rehype-class-names": "^2.0.0", @@ -203,10 +203,10 @@ "remark-rehype": "^11.1.2", "serpapi": "^2.2.1", "sharp": "^0.34.5", - "shiki": "^3.23.0", - "simple-statistics": "^7.8.8", + "shiki": "^4.0.2", + "simple-statistics": "^7.8.9", "sonner": "^2.0.7", - "streamdown": "^2.3.0", + "streamdown": "^2.4.0", "strip-comments": "^2.0.1", "svgjson": "^2.2.3", "tailwind-merge": "^3.5.0", @@ -220,11 +220,12 @@ "unified": "^11.0.5", "unpdf": "^1.4.0", "use-stick-to-bottom": "^1.1.3", - "v0-sdk": "^0.16.2", + "v0-sdk": "^0.16.4", "zod": "^4.3.6" }, "devDependencies": { - "@eslint/compat": "^2.0.2", + "@eslint/compat": "^2.0.3", + "@eslint/js": "^9.39.4", "@mdx-js/loader": "^3.1.1", "@mdx-js/react": "^3.1.1", "@tailwindcss/postcss": "^4.2.1", @@ -234,42 +235,42 @@ "@types/jsdom": "^28.0.0", "@types/leaflet.markercluster": "^1.5.6", "@types/mdx": "^2.0.13", - "@types/node": "^24.10.13", + "@types/node": "^24.12.0", "@types/rbush": "^4.0.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/strip-comments": "^2.0.4", "@types/unist": "^3.0.3", - "@typescript-eslint/eslint-plugin": "^8.56.1", - "@typescript-eslint/parser": "^8.56.1", - "@vitest/coverage-v8": "^4.0.18", + "@typescript-eslint/eslint-plugin": "^8.57.0", + "@typescript-eslint/parser": "^8.57.0", + "@vitest/coverage-v8": "^4.1.0", "cross-env": "^10.1.0", - "eslint": "^9.39.3", + "eslint": "^9.39.4", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.5.2", "ink-testing-library": "^4.0.0", - "mastra": "^1.3.5", + "mastra": "^1.3.12", "prettier": "^3.8.1", "tailwindcss": "^4.2.1", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.56.1", + "typescript-eslint": "^8.57.0", "typescript-language-server": "^5.1.3", - "vitest": "^4.0.18" + "vitest": "^4.1.0" }, "overrides": { "jsondiffpatch": "0.7.3", - "ai": "^6.0.105", + "ai": "^6.0.116", "morgan": "^1.10.1", "js-yaml": "^4.1.1", - "multer": "^2.0.2", + "multer": "^2.1.1", "body-parser": "^2.2.2", "jws": "^4.0.1", "qs": "^6.15.0", - "eslint": "^9.39.3", - "@typescript-eslint/eslint-plugin": "^8.56.1", - "@typescript-eslint/parser": "^8.56.1", - "minimatch": "^10.2.2" + "eslint": "^9.39.4", + "@typescript-eslint/eslint-plugin": "^8.57.0", + "@typescript-eslint/parser": "^8.57.0", + "minimatch": "^10.2.4" } } \ No newline at end of file diff --git a/src/components/ai-elements/artifact.tsx b/src/components/ai-elements/artifact.tsx index fd76b0e0..8b46804a 100644 --- a/src/components/ai-elements/artifact.tsx +++ b/src/components/ai-elements/artifact.tsx @@ -1,8 +1,5 @@ "use client"; -import type { LucideIcon } from "lucide-react"; -import type { ComponentProps, HTMLAttributes } from "react"; - import { Button } from "@/ui/button"; import { Tooltip, @@ -11,7 +8,9 @@ import { TooltipTrigger, } from "@/ui/tooltip"; import { cn } from "@/lib/utils"; +import type { LucideIcon } from "lucide-react"; import { XIcon } from "lucide-react"; +import type { ComponentProps, HTMLAttributes } from "react"; export type ArtifactProps = HTMLAttributes; @@ -119,7 +118,7 @@ export const ArtifactAction = ({ {...props} > {Icon ? : children} - {label ?? tooltip} + {label || tooltip} ); diff --git a/src/components/ai-elements/attachments.tsx b/src/components/ai-elements/attachments.tsx index c83551a1..247c5c75 100644 --- a/src/components/ai-elements/attachments.tsx +++ b/src/components/ai-elements/attachments.tsx @@ -1,8 +1,5 @@ "use client"; -import type { FileUIPart, SourceDocumentUIPart } from "ai"; -import type { ComponentProps, HTMLAttributes, ReactNode } from "react"; - import { Button } from "@/ui/button"; import { HoverCard, @@ -10,6 +7,7 @@ import { HoverCardTrigger, } from "@/ui/hover-card"; import { cn } from "@/lib/utils"; +import type { FileUIPart, SourceDocumentUIPart } from "ai"; import { FileTextIcon, GlobeIcon, @@ -19,6 +17,7 @@ import { VideoIcon, XIcon, } from "lucide-react"; +import type { ComponentProps, HTMLAttributes, ReactNode } from "react"; import { createContext, useCallback, useContext, useMemo } from "react"; // ============================================================================ @@ -79,11 +78,11 @@ export const getMediaCategory = ( export const getAttachmentLabel = (data: AttachmentData): string => { if (data.type === "source-document") { - return data.title ?? data.filename ?? "Source"; + return data.title || data.filename || "Source"; } const category = getMediaCategory(data); - return data.filename ?? (category === "image" ? "Image" : "Attachment"); + return data.filename || (category === "image" ? "Image" : "Attachment"); }; const renderAttachmentImage = ( @@ -93,7 +92,7 @@ const renderAttachmentImage = ( ) => isGrid ? ( {filename ) : ( {filename, diff --git a/src/components/ai-elements/canvas.tsx b/src/components/ai-elements/canvas.tsx index f4dec7ce..29606276 100644 --- a/src/components/ai-elements/canvas.tsx +++ b/src/components/ai-elements/canvas.tsx @@ -1,7 +1,7 @@ import type { ReactFlowProps } from "@xyflow/react"; +import { Background, ReactFlow } from "@xyflow/react"; import type { ReactNode } from "react"; -import { Background, ReactFlow } from "@xyflow/react"; import "@xyflow/react/dist/style.css"; type CanvasProps = ReactFlowProps & { diff --git a/src/components/ai-elements/chain-of-thought.tsx b/src/components/ai-elements/chain-of-thought.tsx index 08a0da79..7749bf10 100644 --- a/src/components/ai-elements/chain-of-thought.tsx +++ b/src/components/ai-elements/chain-of-thought.tsx @@ -1,8 +1,5 @@ "use client"; -import type { LucideIcon } from "lucide-react"; -import type { ComponentProps, ReactNode } from "react"; - import { useControllableState } from "@radix-ui/react-use-controllable-state"; import { Badge } from "@/ui/badge"; import { @@ -11,7 +8,9 @@ import { CollapsibleTrigger, } from "@/ui/collapsible"; import { cn } from "@/lib/utils"; +import type { LucideIcon } from "lucide-react"; import { BrainIcon, ChevronDownIcon, DotIcon } from "lucide-react"; +import type { ComponentProps, ReactNode } from "react"; import { createContext, memo, useContext, useMemo } from "react"; interface ChainOfThoughtContextValue { @@ -187,7 +186,7 @@ export const ChainOfThoughtContent = memo( & { export const ChainOfThoughtImage = memo( ({ className, children, caption, ...props }: ChainOfThoughtImageProps) => (
-
+
{children}
{caption &&

{caption}

} diff --git a/src/components/ai-elements/checkpoint.tsx b/src/components/ai-elements/checkpoint.tsx index 8b17df05..4b27d543 100644 --- a/src/components/ai-elements/checkpoint.tsx +++ b/src/components/ai-elements/checkpoint.tsx @@ -1,8 +1,5 @@ "use client"; -import type { LucideProps } from "lucide-react"; -import type { ComponentProps, HTMLAttributes } from "react"; - import { Button } from "@/ui/button"; import { Separator } from "@/ui/separator"; import { @@ -11,7 +8,9 @@ import { TooltipTrigger, } from "@/ui/tooltip"; import { cn } from "@/lib/utils"; +import type { LucideProps } from "lucide-react"; import { BookmarkIcon } from "lucide-react"; +import type { ComponentProps, HTMLAttributes } from "react"; export type CheckpointProps = HTMLAttributes; diff --git a/src/components/ai-elements/code-block.tsx b/src/components/ai-elements/code-block.tsx index 3c460807..7c13d701 100644 --- a/src/components/ai-elements/code-block.tsx +++ b/src/components/ai-elements/code-block.tsx @@ -1,13 +1,5 @@ "use client"; -import type { ComponentProps, CSSProperties, HTMLAttributes } from "react"; -import type { - BundledLanguage, - BundledTheme, - HighlighterGeneric, - ThemedToken, -} from "shiki"; - import { Button } from "@/ui/button"; import { Select, @@ -18,6 +10,7 @@ import { } from "@/ui/select"; import { cn } from "@/lib/utils"; import { CheckIcon, CopyIcon } from "lucide-react"; +import type { ComponentProps, CSSProperties, HTMLAttributes } from "react"; import { createContext, memo, @@ -28,18 +21,20 @@ import { useRef, useState, } from "react"; +import type { + BundledLanguage, + BundledTheme, + HighlighterGeneric, + ThemedToken, +} from "shiki"; import { createHighlighter } from "shiki"; // Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline -// biome-ignore lint/suspicious/noBitwiseOperators: shiki bitflag check - +// oxlint-disable-next-line eslint(no-bitwise) const isItalic = (fontStyle: number | undefined) => fontStyle && fontStyle & 1; -// biome-ignore lint/suspicious/noBitwiseOperators: shiki bitflag check - // oxlint-disable-next-line eslint(no-bitwise) const isBold = (fontStyle: number | undefined) => fontStyle && fontStyle & 2; const isUnderline = (fontStyle: number | undefined) => - // biome-ignore lint/suspicious/noBitwiseOperators: shiki bitflag check // oxlint-disable-next-line eslint(no-bitwise) fontStyle && fontStyle & 4; @@ -65,12 +60,12 @@ const addKeysToTokens = (lines: ThemedToken[][]): KeyedLine[] => // Token rendering component const TokenSpan = ({ token }: { token: ThemedToken }) => ( ( ); +// Line number styles using CSS counters +const LINE_NUMBER_CLASSES = cn( + "block", + "before:content-[counter(line)]", + "before:inline-block", + "before:[counter-increment:line]", + "before:w-8", + "before:mr-4", + "before:text-right", + "before:text-muted-foreground/50", + "before:font-mono", + "before:select-none" +); + // Line rendering component const LineSpan = ({ keyedLine, @@ -229,7 +238,6 @@ export const highlightCode = ( }) // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks) .catch((error) => { - // eslint-disable-next-line no-console console.error("Failed to highlight code:", error); subscribers.delete(tokensCacheKey); }); @@ -237,20 +245,6 @@ export const highlightCode = ( return null; }; -// Line number styles using CSS counters -const LINE_NUMBER_CLASSES = cn( - "block", - "before:content-[counter(line)]", - "before:inline-block", - "before:[counter-increment:line]", - "before:w-8", - "before:mr-4", - "before:text-right", - "before:text-muted-foreground/50", - "before:font-mono", - "before:select-none" -); - const CodeBlockBody = memo( ({ tokenized, @@ -277,7 +271,7 @@ const CodeBlockBody = memo( return (
 createRawTokens(code), [code]);
 
-  // Try to get cached result synchronously, otherwise use raw tokens
-  const [tokenized, setTokenized] = useState(
-    () => highlightCode(code, language) ?? rawTokens
+  // Synchronous cache lookup — avoids setState in effect for cached results
+  const syncTokens = useMemo(
+    () => highlightCode(code, language) ?? rawTokens,
+    [code, language, rawTokens]
   );
 
+  // Async highlighting result (populated after shiki loads)
+  const [asyncTokens, setAsyncTokens] = useState(null);
+  const asyncKeyRef = useRef({ code, language });
+
+  // Invalidate stale async tokens synchronously during render
+  if (
+    asyncKeyRef.current.code !== code ||
+    asyncKeyRef.current.language !== language
+  ) {
+    asyncKeyRef.current = { code, language };
+    setAsyncTokens(null);
+  }
+
   useEffect(() => {
     let cancelled = false;
 
-    // Reset to raw tokens when code changes (shows current code, not stale tokens)
-    setTokenized(highlightCode(code, language) ?? rawTokens);
-
-    // Subscribe to async highlighting result
     highlightCode(code, language, (result) => {
       if (!cancelled) {
-        setTokenized(result);
+        setAsyncTokens(result);
       }
     });
 
     return () => {
       cancelled = true;
     };
-  }, [code, language, rawTokens]);
+  }, [code, language]);
+
+  const tokenized = asyncTokens ?? syncTokens;
 
   return (
     
@@ -494,7 +500,7 @@ export const CodeBlockCopyButton = ({ return ( + - +
{children}
@@ -239,7 +271,7 @@ export const FileTreeFile = ({ {children ?? ( <> {/* Spacer for alignment */} - + {icon ?? } @@ -251,30 +283,6 @@ export const FileTreeFile = ({ ); }; -export type FileTreeIconProps = HTMLAttributes; - -export const FileTreeIcon = ({ - className, - children, - ...props -}: FileTreeIconProps) => ( - - {children} - -); - -export type FileTreeNameProps = HTMLAttributes; - -export const FileTreeName = ({ - className, - children, - ...props -}: FileTreeNameProps) => ( - - {children} - -); - export type FileTreeActionsProps = HTMLAttributes; const stopPropagation = (e: React.SyntheticEvent) => e.stopPropagation(); @@ -284,8 +292,6 @@ export const FileTreeActions = ({ children, ...props }: FileTreeActionsProps) => ( - // biome-ignore lint/a11y/noNoninteractiveElementInteractions: stopPropagation required for nested interactions - // biome-ignore lint/a11y/useSemanticElements: fieldset doesn't fit this UI pattern
{ + const syncState = useCallback(() => { if (!api) { return; } - setCount(api.scrollSnapList().length); setCurrent(api.selectedScrollSnap() + 1); + }, [api]); - const handleSelect = () => { - setCurrent(api.selectedScrollSnap() + 1); - }; + useEffect(() => { + if (!api) { + return; + } + + syncState(); - api.on("select", handleSelect); + api.on("select", syncState); return () => { - api.off("select", handleSelect); + api.off("select", syncState); }; - }, [api]); + }, [api, syncState]); return (
void; + setLastGoodJsx: (jsx: string) => void; components: JsxParserProps["components"]; bindings: JsxParserProps["bindings"]; onErrorProp?: (error: Error) => void; @@ -44,9 +45,9 @@ const matchJsxTag = (code: string) => { return null; } - const match = TAG_REGEX.exec(code); + const match = code.match(TAG_REGEX); - if (match?.index === undefined) { + if (!match || match.index === undefined) { return null; } @@ -71,6 +72,22 @@ const matchJsxTag = (code: string) => { }; }; +const stripIncompleteTag = (text: string) => { + // Find the last '<' that isn't part of a complete tag + const lastOpen = text.lastIndexOf("<"); + if (lastOpen === -1) { + return text; + } + + const afterOpen = text.slice(lastOpen); + // If there's no closing '>' after the last '<', it's an incomplete tag + if (!afterOpen.includes(">")) { + return text.slice(0, lastOpen); + } + + return text; +}; + const completeJsxTag = (code: string) => { const stack: string[] = []; let result = ""; @@ -79,8 +96,8 @@ const completeJsxTag = (code: string) => { while (currentPosition < code.length) { const match = matchJsxTag(code.slice(currentPosition)); if (!match) { - // No more tags found, append remaining content - result += code.slice(currentPosition); + // No more tags found, strip any trailing incomplete tag + result += stripIncompleteTag(code.slice(currentPosition)); break; } const { tagName, type, endIndex } = match; @@ -127,6 +144,7 @@ export const JSXPreview = memo( }: JSXPreviewProps) => { const [prevJsx, setPrevJsx] = useState(jsx); const [error, setError] = useState(null); + const [_lastGoodJsx, setLastGoodJsx] = useState(""); // Clear error when jsx changes (derived state pattern) if (jsx !== prevJsx) { @@ -139,18 +157,32 @@ export const JSXPreview = memo( [jsx, isStreaming] ); + const contextValue = useMemo( + () => ({ + bindings, + components, + error, + isStreaming, + jsx, + onErrorProp: onError, + processedJsx, + setError, + setLastGoodJsx, + }), + [ + bindings, + components, + error, + isStreaming, + jsx, + onError, + processedJsx, + setError, + ] + ); + return ( - +
{children}
@@ -165,14 +197,23 @@ export type JSXPreviewContentProps = Omit, "children">; export const JSXPreviewContent = memo( ({ className, ...props }: JSXPreviewContentProps) => { - const { processedJsx, components, bindings, setError, onErrorProp } = - useJSXPreview(); + const { + processedJsx, + isStreaming, + components, + bindings, + setError, + setLastGoodJsx, + onErrorProp, + } = useJSXPreview(); const errorReportedRef = useRef(null); + const lastGoodJsxRef = useRef(""); + const [hadError, setHadError] = useState(false); // Reset error tracking when jsx changes - // biome-ignore lint/correctness/useExhaustiveDependencies: processedJsx change should reset tracking useEffect(() => { errorReportedRef.current = null; + setHadError(false); }, [processedJsx]); const handleError = useCallback( @@ -182,18 +223,37 @@ export const JSXPreviewContent = memo( return; } errorReportedRef.current = processedJsx; + + // During streaming, suppress errors and fall back to last good JSX + if (isStreaming) { + setHadError(true); + return; + } + setError(err); onErrorProp?.(err); }, - [processedJsx, onErrorProp, setError] + [processedJsx, isStreaming, onErrorProp, setError] ); + // Track the last JSX that rendered without error + useEffect(() => { + if (!errorReportedRef.current) { + lastGoodJsxRef.current = processedJsx; + setLastGoodJsx(processedJsx); + } + }, [processedJsx, setLastGoodJsx]); + + // During streaming, if the current JSX errored, re-render with last good version + const displayJsx = + isStreaming && hadError ? lastGoodJsxRef.current : processedJsx; + return (
diff --git a/src/components/ai-elements/message.tsx b/src/components/ai-elements/message.tsx index bf82f0ad..b6f0c77c 100644 --- a/src/components/ai-elements/message.tsx +++ b/src/components/ai-elements/message.tsx @@ -1,8 +1,5 @@ "use client"; -import type { UIMessage } from "ai"; -import type { ComponentProps, HTMLAttributes, ReactElement } from "react"; - import { Button } from "@/ui/button"; import { ButtonGroup, @@ -19,7 +16,9 @@ import { cjk } from "@streamdown/cjk"; import { code } from "@streamdown/code"; import { math } from "@streamdown/math"; import { mermaid } from "@streamdown/mermaid"; +import type { UIMessage } from "ai"; import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react"; +import type { ComponentProps, HTMLAttributes, ReactElement } from "react"; import { createContext, memo, @@ -94,7 +93,7 @@ export const MessageAction = ({ const button = ( ); @@ -203,7 +202,7 @@ export const MessageBranchContent = ({ }: MessageBranchContentProps) => { const { currentBranch, setBranches, branches } = useMessageBranch(); const childrenArray = useMemo( - () => (Array.isArray(children) ? (children as ReactElement[]) : ([children] as ReactElement[])), + () => (Array.isArray(children) ? children : [children]), [children] ); @@ -335,7 +334,9 @@ export const MessageResponse = memo( {...props} /> ), - (prevProps, nextProps) => prevProps.children === nextProps.children + (prevProps, nextProps) => + prevProps.children === nextProps.children && + nextProps.isAnimating === prevProps.isAnimating ); MessageResponse.displayName = "MessageResponse"; diff --git a/src/components/ai-elements/mic-selector.tsx b/src/components/ai-elements/mic-selector.tsx index 3edb8f1c..3acdbc36 100644 --- a/src/components/ai-elements/mic-selector.tsx +++ b/src/components/ai-elements/mic-selector.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps, ReactNode } from "react"; - import { useControllableState } from "@radix-ui/react-use-controllable-state"; import { Button } from "@/ui/button"; import { @@ -18,6 +16,7 @@ import { } from "@/ui/popover"; import { cn } from "@/lib/utils"; import { ChevronsUpDownIcon } from "lucide-react"; +import type { ComponentProps, ReactNode } from "react"; import { createContext, useCallback, @@ -50,6 +49,105 @@ const MicSelectorContext = createContext({ width: 200, }); +export const useAudioDevices = () => { + const [devices, setDevices] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [hasPermission, setHasPermission] = useState(false); + + const loadDevicesWithoutPermission = useCallback(async () => { + try { + setLoading(true); + setError(null); + + const deviceList = await navigator.mediaDevices.enumerateDevices(); + const audioInputs = deviceList.filter( + (device) => device.kind === "audioinput" + ); + + setDevices(audioInputs); + } catch (caughtError) { + const message = + caughtError instanceof Error + ? caughtError.message + : "Failed to get audio devices"; + + setError(message); + console.error("Error getting audio devices:", message); + } finally { + setLoading(false); + } + }, []); + + const loadDevicesWithPermission = useCallback(async () => { + if (loading) { + return; + } + + try { + setLoading(true); + setError(null); + + const tempStream = await navigator.mediaDevices.getUserMedia({ + audio: true, + }); + + for (const track of tempStream.getTracks()) { + track.stop(); + } + + const deviceList = await navigator.mediaDevices.enumerateDevices(); + const audioInputs = deviceList.filter( + (device) => device.kind === "audioinput" + ); + + setDevices(audioInputs); + setHasPermission(true); + } catch (caughtError) { + const message = + caughtError instanceof Error + ? caughtError.message + : "Failed to get audio devices"; + + setError(message); + console.error("Error getting audio devices:", message); + } finally { + setLoading(false); + } + }, [loading]); + + useEffect(() => { + loadDevicesWithoutPermission(); + }, [loadDevicesWithoutPermission]); + + useEffect(() => { + const handleDeviceChange = () => { + if (hasPermission) { + loadDevicesWithPermission(); + } else { + loadDevicesWithoutPermission(); + } + }; + + navigator.mediaDevices.addEventListener("devicechange", handleDeviceChange); + + return () => { + navigator.mediaDevices.removeEventListener( + "devicechange", + handleDeviceChange + ); + }; + }, [hasPermission, loadDevicesWithPermission, loadDevicesWithoutPermission]); + + return { + devices, + error, + hasPermission, + loadDevices: loadDevicesWithPermission, + loading, + }; +}; + export type MicSelectorProps = ComponentProps & { defaultValue?: string; value?: string | undefined; @@ -229,7 +327,7 @@ export const MicSelectorLabel = ({ className, ...props }: MicSelectorLabelProps) => { - const matches = deviceIdRegex.exec(device.label); + const matches = device.label.match(deviceIdRegex); if (!matches) { return ( @@ -275,98 +373,3 @@ export const MicSelectorValue = ({ /> ); }; - -export const useAudioDevices = () => { - const [devices, setDevices] = useState([]); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - const [hasPermission, setHasPermission] = useState(false); - - const loadDevicesWithoutPermission = useCallback(async () => { - try { - setLoading(true); - setError(null); - - const deviceList = await navigator.mediaDevices.enumerateDevices(); - const audioInputs = deviceList.filter( - (device) => device.kind === "audioinput" - ); - - setDevices(audioInputs); - } catch (error) { - const message = - error instanceof Error ? error.message : "Failed to get audio devices"; - - setError(message); - console.error("Error getting audio devices:", message); - } finally { - setLoading(false); - } - }, []); - - const loadDevicesWithPermission = useCallback(async () => { - if (loading) { - return; - } - - try { - setLoading(true); - setError(null); - - const tempStream = await navigator.mediaDevices.getUserMedia({ - audio: true, - }); - - for (const track of tempStream.getTracks()) { - track.stop(); - } - - const deviceList = await navigator.mediaDevices.enumerateDevices(); - const audioInputs = deviceList.filter( - (device) => device.kind === "audioinput" - ); - - setDevices(audioInputs); - setHasPermission(true); - } catch (error) { - const message = - error instanceof Error ? error.message : "Failed to get audio devices"; - - setError(message); - console.error("Error getting audio devices:", message); - } finally { - setLoading(false); - } - }, [loading]); - - useEffect(() => { - loadDevicesWithoutPermission(); - }, [loadDevicesWithoutPermission]); - - useEffect(() => { - const handleDeviceChange = () => { - if (hasPermission) { - loadDevicesWithPermission(); - } else { - loadDevicesWithoutPermission(); - } - }; - - navigator.mediaDevices.addEventListener("devicechange", handleDeviceChange); - - return () => { - navigator.mediaDevices.removeEventListener( - "devicechange", - handleDeviceChange - ); - }; - }, [hasPermission, loadDevicesWithPermission, loadDevicesWithoutPermission]); - - return { - devices, - error, - hasPermission, - loadDevices: loadDevicesWithPermission, - loading, - }; -}; diff --git a/src/components/ai-elements/model-selector.tsx b/src/components/ai-elements/model-selector.tsx index 1e92c804..baf68a26 100644 --- a/src/components/ai-elements/model-selector.tsx +++ b/src/components/ai-elements/model-selector.tsx @@ -1,5 +1,3 @@ -import type { ComponentProps, ReactNode } from "react"; - import { Command, CommandDialog, @@ -18,6 +16,7 @@ import { DialogTrigger, } from "@/ui/dialog"; import { cn } from "@/lib/utils"; +import type { ComponentProps, ReactNode } from "react"; export type ModelSelectorProps = ComponentProps; diff --git a/src/components/ai-elements/node.tsx b/src/components/ai-elements/node.tsx index a0b916d5..14ae0292 100644 --- a/src/components/ai-elements/node.tsx +++ b/src/components/ai-elements/node.tsx @@ -1,5 +1,3 @@ -import type { ComponentProps } from "react"; - import { Card, CardAction, @@ -11,6 +9,7 @@ import { } from "@/ui/card"; import { cn } from "@/lib/utils"; import { Handle, Position } from "@xyflow/react"; +import type { ComponentProps } from "react"; export type NodeProps = ComponentProps & { handles: { diff --git a/src/components/ai-elements/open-in-chat.tsx b/src/components/ai-elements/open-in-chat.tsx index a37d8da6..aa38b167 100644 --- a/src/components/ai-elements/open-in-chat.tsx +++ b/src/components/ai-elements/open-in-chat.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps } from "react"; - import { Button } from "@/ui/button"; import { DropdownMenu, @@ -17,7 +15,8 @@ import { ExternalLinkIcon, MessageCircleIcon, } from "lucide-react"; -import { createContext, useContext } from "react"; +import type { ComponentProps } from "react"; +import { createContext, useContext, useMemo } from "react"; const providers = { chatgpt: { @@ -199,18 +198,22 @@ export type OpenInProps = ComponentProps & { query: string; }; -export const OpenIn = ({ query, ...props }: OpenInProps) => ( - - - -); +export const OpenIn = ({ query, ...props }: OpenInProps) => { + const contextValue = useMemo(() => ({ query }), [query]); + + return ( + + + + ); +}; export type OpenInContentProps = ComponentProps; export const OpenInContent = ({ className, ...props }: OpenInContentProps) => ( ); diff --git a/src/components/ai-elements/package-info.tsx b/src/components/ai-elements/package-info.tsx index cf3fdae3..e498aca3 100644 --- a/src/components/ai-elements/package-info.tsx +++ b/src/components/ai-elements/package-info.tsx @@ -1,11 +1,10 @@ "use client"; -import type { HTMLAttributes } from "react"; - import { Badge } from "@/ui/badge"; import { cn } from "@/lib/utils"; import { ArrowRightIcon, MinusIcon, PackageIcon, PlusIcon } from "lucide-react"; -import { createContext, useContext } from "react"; +import type { HTMLAttributes } from "react"; +import { createContext, useContext, useMemo } from "react"; type ChangeType = "major" | "minor" | "patch" | "added" | "removed"; @@ -20,42 +19,6 @@ const PackageInfoContext = createContext({ name: "", }); -export type PackageInfoProps = HTMLAttributes & { - name: string; - currentVersion?: string; - newVersion?: string; - changeType?: ChangeType; -}; - -export const PackageInfo = ({ - name, - currentVersion, - newVersion, - changeType, - className, - children, - ...props -}: PackageInfoProps) => ( - -
- {children ?? ( - <> - - - {changeType && } - - {((currentVersion ?? newVersion) !== null) && } - - )} -
-
-); - export type PackageInfoHeaderProps = HTMLAttributes; export const PackageInfoHeader = ({ @@ -143,7 +106,7 @@ export const PackageInfoVersion = ({ }: PackageInfoVersionProps) => { const { currentVersion, newVersion } = useContext(PackageInfoContext); - if (!((Boolean(currentVersion)) || (Boolean(newVersion)))) { + if (!(currentVersion || newVersion)) { return null; } @@ -157,11 +120,11 @@ export const PackageInfoVersion = ({ > {children ?? ( <> - {(Boolean(currentVersion)) && {currentVersion}} - {(Boolean(currentVersion)) && (Boolean(newVersion)) && ( + {currentVersion && {currentVersion}} + {currentVersion && newVersion && ( )} - {(Boolean(newVersion)) && ( + {newVersion && ( {newVersion} )} @@ -170,6 +133,47 @@ export const PackageInfoVersion = ({ ); }; +export type PackageInfoProps = HTMLAttributes & { + name: string; + currentVersion?: string; + newVersion?: string; + changeType?: ChangeType; +}; + +export const PackageInfo = ({ + name, + currentVersion, + newVersion, + changeType, + className, + children, + ...props +}: PackageInfoProps) => { + const contextValue = useMemo( + () => ({ changeType, currentVersion, name, newVersion }), + [changeType, currentVersion, name, newVersion] + ); + + return ( + +
+ {children ?? ( + <> + + + {changeType && } + + {(currentVersion || newVersion) && } + + )} +
+
+ ); +}; + export type PackageInfoDescriptionProps = HTMLAttributes; export const PackageInfoDescription = ({ @@ -228,7 +232,7 @@ export const PackageInfoDependency = ({ {children ?? ( <> {name} - {(Boolean(version)) && {version}} + {version && {version}} )}
diff --git a/src/components/ai-elements/panel.tsx b/src/components/ai-elements/panel.tsx index 47a9926f..059cb7ac 100644 --- a/src/components/ai-elements/panel.tsx +++ b/src/components/ai-elements/panel.tsx @@ -1,7 +1,6 @@ -import type { ComponentProps } from "react"; - import { cn } from "@/lib/utils"; import { Panel as PanelPrimitive } from "@xyflow/react"; +import type { ComponentProps } from "react"; type PanelProps = ComponentProps; diff --git a/src/components/ai-elements/persona.tsx b/src/components/ai-elements/persona.tsx index 9b620547..49085f37 100644 --- a/src/components/ai-elements/persona.tsx +++ b/src/components/ai-elements/persona.tsx @@ -1,9 +1,7 @@ "use client"; -import type { RiveParameters } from "@rive-app/react-webgl2"; -import type { FC, ReactNode } from "react"; - import { cn } from "@/lib/utils"; +import type { RiveParameters } from "@rive-app/react-webgl2"; import { useRive, useStateMachineInput, @@ -11,8 +9,26 @@ import { useViewModelInstance, useViewModelInstanceColor, } from "@rive-app/react-webgl2"; +import type { FC, ReactNode } from "react"; import { memo, useEffect, useMemo, useRef, useState } from "react"; +// Delays Rive initialization by one frame so that React Strict Mode's +// immediate unmount cycle never creates a WebGL2 context. Only the +// second (real) mount will initialise, avoiding context exhaustion. +const useStrictModeSafeInit = () => { + const [ready, setReady] = useState(false); + + useEffect(() => { + const id = requestAnimationFrame(() => setReady(true)); + return () => { + cancelAnimationFrame(id); + setReady(false); + }; + }, []); + + return ready; +}; + export type PersonaState = | "idle" | "listening" @@ -231,17 +247,25 @@ export const Persona: FC = memo( [] ); - const { rive, RiveComponent } = useRive({ - autoplay: true, - onLoad: stableCallbacks.onLoad, - onLoadError: stableCallbacks.onLoadError, - onPause: stableCallbacks.onPause, - onPlay: stableCallbacks.onPlay, - onRiveReady: stableCallbacks.onReady, - onStop: stableCallbacks.onStop, - src: source.source, - stateMachines: stateMachine, - }); + // Delay initialisation by one frame to avoid creating (and leaking) + // a WebGL2 context during React Strict Mode's first throw-away mount. + const ready = useStrictModeSafeInit(); + + const { rive, RiveComponent } = useRive( + ready + ? { + autoplay: true, + onLoad: stableCallbacks.onLoad, + onLoadError: stableCallbacks.onLoadError, + onPause: stableCallbacks.onPause, + onPlay: stableCallbacks.onPlay, + onRiveReady: stableCallbacks.onReady, + onStop: stableCallbacks.onStop, + src: source.source, + stateMachines: stateMachine, + } + : null + ); const listeningInput = useStateMachineInput( rive, @@ -252,37 +276,22 @@ export const Persona: FC = memo( const speakingInput = useStateMachineInput(rive, stateMachine, "speaking"); const asleepInput = useStateMachineInput(rive, stateMachine, "asleep"); - const listeningRef = useRef(listeningInput); - const thinkingRef = useRef(thinkingInput); - const speakingRef = useRef(speakingInput); - const asleepRef = useRef(asleepInput); - + // Rive state machine inputs are mutable objects that must be set via direct + // property assignment — this is the intended Rive API, not a React anti-pattern. useEffect(() => { - listeningRef.current = listeningInput; - thinkingRef.current = thinkingInput; - speakingRef.current = speakingInput; - asleepRef.current = asleepInput; - }, [listeningInput, thinkingInput, speakingInput, asleepInput]); - - useEffect(() => { - // Use a local function to isolate mutation from compiler's view - const updateRiveInputs = () => { - if (listeningRef.current && "value" in listeningRef.current) { - listeningRef.current.value = state === "listening"; - } - if (thinkingRef.current && "value" in thinkingRef.current) { - thinkingRef.current.value = state === "thinking"; - } - if (speakingRef.current && "value" in speakingRef.current) { - speakingRef.current.value = state === "speaking"; - } - if (asleepRef.current && "value" in asleepRef.current) { - asleepRef.current.value = state === "asleep"; - } - }; - - updateRiveInputs(); - }, [state]); + if (listeningInput) { + listeningInput.value = state === "listening"; + } + if (thinkingInput) { + thinkingInput.value = state === "thinking"; + } + if (speakingInput) { + speakingInput.value = state === "speaking"; + } + if (asleepInput) { + asleepInput.value = state === "asleep"; + } + }, [state, listeningInput, thinkingInput, speakingInput, asleepInput]); const Component = source.hasModel ? PersonaWithModel : PersonaWithoutModel; diff --git a/src/components/ai-elements/plan.tsx b/src/components/ai-elements/plan.tsx index 543c2909..3a6db1f8 100644 --- a/src/components/ai-elements/plan.tsx +++ b/src/components/ai-elements/plan.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps } from "react"; - import { Button } from "@/ui/button"; import { Card, @@ -19,7 +17,8 @@ import { } from "@/ui/collapsible"; import { cn } from "@/lib/utils"; import { ChevronsUpDownIcon } from "lucide-react"; -import { createContext, useContext } from "react"; +import type { ComponentProps } from "react"; +import { createContext, useContext, useMemo } from "react"; import { Shimmer } from "./shimmer"; @@ -46,13 +45,17 @@ export const Plan = ({ isStreaming = false, children, ...props -}: PlanProps) => ( - - - {children} - - -); +}: PlanProps) => { + const contextValue = useMemo(() => ({ isStreaming }), [isStreaming]); + + return ( + + + {children} + + + ); +}; export type PlanHeaderProps = ComponentProps; diff --git a/src/components/ai-elements/prompt-input.tsx b/src/components/ai-elements/prompt-input.tsx index 16a3acfe..7d3e9431 100644 --- a/src/components/ai-elements/prompt-input.tsx +++ b/src/components/ai-elements/prompt-input.tsx @@ -1,20 +1,5 @@ "use client"; -import type { ChatStatus, FileUIPart, SourceDocumentUIPart } from "ai"; -import type { - ChangeEvent, - ChangeEventHandler, - ClipboardEventHandler, - ComponentProps, - FormEvent, - FormEventHandler, - HTMLAttributes, - KeyboardEventHandler, - PropsWithChildren, - ReactNode, - RefObject, -} from "react"; - import { Command, CommandEmpty, @@ -55,14 +40,29 @@ import { TooltipTrigger, } from "@/ui/tooltip"; import { cn } from "@/lib/utils"; +import type { ChatStatus, FileUIPart, SourceDocumentUIPart } from "ai"; import { CornerDownLeftIcon, ImageIcon, + Monitor, PlusIcon, SquareIcon, XIcon, } from "lucide-react"; import { nanoid } from "nanoid"; +import type { + ChangeEvent, + ChangeEventHandler, + ClipboardEventHandler, + ComponentProps, + FormEvent, + FormEventHandler, + HTMLAttributes, + KeyboardEventHandler, + PropsWithChildren, + ReactNode, + RefObject, +} from "react"; import { Children, createContext, @@ -97,12 +97,89 @@ const convertBlobUrlToDataUrl = async (url: string): Promise => { } }; +const captureScreenshot = async (): Promise => { + if ( + typeof navigator === "undefined" || + !navigator.mediaDevices?.getDisplayMedia + ) { + return null; + } + + let stream: MediaStream | null = null; + const video = document.createElement("video"); + video.muted = true; + video.playsInline = true; + + try { + stream = await navigator.mediaDevices.getDisplayMedia({ + audio: false, + video: true, + }); + + video.srcObject = stream; + + // Video element uses callback-based API, wrapping in Promise is necessary + // oxlint-disable-next-line eslint-plugin-promise(avoid-new) + await new Promise((resolve, reject) => { + // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener) + video.onloadedmetadata = () => resolve(); + // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener) + video.onerror = () => reject(new Error("Failed to load screen stream")); + }); + + await video.play(); + + const width = video.videoWidth; + const height = video.videoHeight; + if (!width || !height) { + return null; + } + + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const context = canvas.getContext("2d"); + if (!context) { + return null; + } + + context.drawImage(video, 0, 0, width, height); + // canvas.toBlob uses callback-based API, wrapping in Promise is necessary + // oxlint-disable-next-line eslint-plugin-promise(avoid-new) + const blob = await new Promise((resolve) => { + canvas.toBlob(resolve, "image/png"); + }); + if (!blob) { + return null; + } + + const timestamp = new Date() + .toISOString() + .replaceAll(/[:.]/g, "-") + .replace("T", "_") + .replace("Z", ""); + + return new File([blob], `screenshot-${timestamp}.png`, { + lastModified: Date.now(), + type: "image/png", + }); + } finally { + if (stream) { + for (const track of stream.getTracks()) { + track.stop(); + } + } + video.pause(); + video.srcObject = null; + } +}; + // ============================================================================ // Provider Context & Types // ============================================================================ export interface AttachmentsContext { - files: Array; + files: (FileUIPart & { id: string })[]; add: (files: File[] | FileList) => void; remove: (id: string) => void; clear: () => void; @@ -178,7 +255,7 @@ export const PromptInputProvider = ({ // ----- attachments state (global when wrapped) const [attachmentFiles, setAttachmentFiles] = useState< - Array + (FileUIPart & { id: string })[] >([]); const fileInputRef = useRef(null); // oxlint-disable-next-line eslint(no-empty-function) @@ -312,7 +389,7 @@ export const usePromptInputAttachments = () => { // ============================================================================ export interface ReferencedSourcesContext { - sources: Array; + sources: (SourceDocumentUIPart & { id: string })[]; add: (sources: SourceDocumentUIPart[] | SourceDocumentUIPart) => void; remove: (id: string) => void; clear: () => void; @@ -358,6 +435,52 @@ export const PromptInputActionAddAttachments = ({ ); }; +export type PromptInputActionAddScreenshotProps = ComponentProps< + typeof DropdownMenuItem +> & { + label?: string; +}; + +export const PromptInputActionAddScreenshot = ({ + label = "Take screenshot", + onSelect, + ...props +}: PromptInputActionAddScreenshotProps) => { + const attachments = usePromptInputAttachments(); + + const handleSelect = useCallback( + async (event: Event) => { + onSelect?.(event); + if (event.defaultPrevented) { + return; + } + + try { + const screenshot = await captureScreenshot(); + if (screenshot) { + attachments.add([screenshot]); + } + } catch (error) { + if ( + error instanceof DOMException && + (error.name === "NotAllowedError" || error.name === "AbortError") + ) { + return; + } + throw error; + } + }, + [onSelect, attachments] + ); + + return ( + + + {label} + + ); +}; + export interface PromptInputMessage { text: string; files: FileUIPart[]; @@ -410,12 +533,12 @@ export const PromptInput = ({ const formRef = useRef(null); // ----- Local attachments (only used when no provider) - const [items, setItems] = useState>([]); + const [items, setItems] = useState<(FileUIPart & { id: string })[]>([]); const files = usingProvider ? controller.attachments.files : items; // ----- Local referenced sources (always local to PromptInput) const [referencedSources, setReferencedSources] = useState< - Array + (SourceDocumentUIPart & { id: string })[] >([]); // Keep a ref to files for cleanup on unmount (avoids stale closure) @@ -487,7 +610,7 @@ export const PromptInput = ({ message: "Too many files. Some were not added.", }); } - const next: Array = []; + const next: (FileUIPart & { id: string })[] = []; for (const file of capped) { next.push({ filename: file.name, @@ -601,7 +724,7 @@ export const PromptInput = ({ // Note: File input cannot be programmatically set for security reasons // The syncHiddenInput prop is no longer functional useEffect(() => { - if ((syncHiddenInput ?? false) && inputRef.current && files.length === 0) { + if (syncHiddenInput && inputRef.current && files.length === 0) { inputRef.current.value = ""; } }, [files, syncHiddenInput]); @@ -674,7 +797,6 @@ export const PromptInput = ({ } } }, - [usingProvider] ); @@ -720,7 +842,7 @@ export const PromptInput = ({ ); const handleSubmit: FormEventHandler = useCallback( - (event) => { + async (event) => { event.preventDefault(); const form = event.currentTarget; @@ -737,49 +859,45 @@ export const PromptInput = ({ form.reset(); } - // Snapshot files synchronously to avoid stale/changed state inside async work - const filesSnapshot = files.map((f) => ({ ...f })); - - void (async () => { - try { - // Convert blob URLs to data URLs asynchronously - const convertedFiles: FileUIPart[] = await Promise.all( - filesSnapshot.map(async (file) => { - const { filename, mediaType, type, url } = file; - const item: FileUIPart = { filename, mediaType, type, url }; - if (item.url?.startsWith("blob:")) { - const dataUrl = await convertBlobUrlToDataUrl(item.url); - // If conversion failed, keep the original blob URL - return { ...item, url: dataUrl ?? item.url }; - } - return item; - }) - ); - - const result = onSubmit({ files: convertedFiles, text }, event); - - // Handle both sync and async onSubmit - if (result instanceof Promise) { - try { - await result; - clear(); - if (usingProvider) { - controller.textInput.clear(); - } - } catch { - // Don't clear on error - user may want to retry + try { + // Convert blob URLs to data URLs asynchronously + const convertedFiles: FileUIPart[] = await Promise.all( + files.map(async ({ id: _id, ...item }) => { + if (item.url?.startsWith("blob:")) { + const dataUrl = await convertBlobUrlToDataUrl(item.url); + // If conversion failed, keep the original blob URL + return { + ...item, + url: dataUrl ?? item.url, + }; } - } else { - // Sync function completed without throwing, clear inputs + return item; + }) + ); + + const result = onSubmit({ files: convertedFiles, text }, event); + + // Handle both sync and async onSubmit + if (result instanceof Promise) { + try { + await result; clear(); if (usingProvider) { controller.textInput.clear(); } + } catch { + // Don't clear on error - user may want to retry + } + } else { + // Sync function completed without throwing, clear inputs + clear(); + if (usingProvider) { + controller.textInput.clear(); } - } catch { - // Don't clear on error - user may want to retry } - })(); + } catch { + // Don't clear on error - user may want to retry + } }, [usingProvider, controller, files, onSubmit, clear] ); @@ -1040,7 +1158,7 @@ export const PromptInputButton = ({ {button} {tooltipContent} - {(Boolean(shortcut)) && ( + {shortcut && ( {shortcut} )} diff --git a/src/components/ai-elements/queue.tsx b/src/components/ai-elements/queue.tsx index ba55a081..a0d37488 100644 --- a/src/components/ai-elements/queue.tsx +++ b/src/components/ai-elements/queue.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps } from "react"; - import { Button } from "@/ui/button"; import { Collapsible, @@ -11,6 +9,7 @@ import { import { ScrollArea } from "@/ui/scroll-area"; import { cn } from "@/lib/utils"; import { ChevronDownIcon, PaperclipIcon } from "lucide-react"; +import type { ComponentProps } from "react"; export interface QueueMessagePart { type: string; @@ -76,7 +75,7 @@ export const QueueItemContent = ({ }: QueueItemContentProps) => ( - {children} + {children} ); @@ -242,7 +241,7 @@ export const QueueSectionLabel = ({ ...props }: QueueSectionLabelProps) => ( - + {icon} {count} {label} diff --git a/src/components/ai-elements/reasoning.tsx b/src/components/ai-elements/reasoning.tsx index db8fdd93..e619f678 100644 --- a/src/components/ai-elements/reasoning.tsx +++ b/src/components/ai-elements/reasoning.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps, ReactNode } from "react"; - import { useControllableState } from "@radix-ui/react-use-controllable-state"; import { Collapsible, @@ -14,6 +12,7 @@ import { code } from "@streamdown/code"; import { math } from "@streamdown/math"; import { mermaid } from "@streamdown/mermaid"; import { BrainIcon, ChevronDownIcon } from "lucide-react"; +import type { ComponentProps, ReactNode } from "react"; import { createContext, memo, @@ -31,7 +30,7 @@ import { Shimmer } from "./shimmer"; interface ReasoningContextValue { isStreaming: boolean; isOpen: boolean; - setIsOpen: (this: void, open: boolean) => void; + setIsOpen: (open: boolean) => void; duration: number | undefined; } @@ -45,11 +44,11 @@ export const useReasoning = () => { return context; }; -export type ReasoningProps = Omit, "onOpenChange"> & { +export type ReasoningProps = ComponentProps & { isStreaming?: boolean; open?: boolean; defaultOpen?: boolean; - onOpenChange?: (this: void, open: boolean) => void; + onOpenChange?: (open: boolean) => void; duration?: number; }; @@ -73,7 +72,7 @@ export const Reasoning = memo( const [isOpen, setIsOpen] = useControllableState({ defaultProp: resolvedDefaultOpen, - onChange: onOpenChange ? (nextOpen) => onOpenChange(nextOpen) : undefined, + onChange: onOpenChange, prop: open, }); const [duration, setDuration] = useControllableState({ @@ -150,10 +149,10 @@ export const Reasoning = memo( export type ReasoningTriggerProps = ComponentProps< typeof CollapsibleTrigger > & { - getThinkingMessage?: (this: void, isStreaming: boolean, duration?: number) => ReactNode; + getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode; }; -const defaultGetThinkingMessage: (this: void, isStreaming: boolean, duration?: number) => ReactNode = (isStreaming, duration) => { +const defaultGetThinkingMessage = (isStreaming: boolean, duration?: number) => { if (isStreaming || duration === 0) { return Thinking...; } @@ -215,9 +214,7 @@ export const ReasoningContent = memo( )} {...props} > - - {children} - + {children} ) ); diff --git a/src/components/ai-elements/sandbox.tsx b/src/components/ai-elements/sandbox.tsx index 7147177e..953da518 100644 --- a/src/components/ai-elements/sandbox.tsx +++ b/src/components/ai-elements/sandbox.tsx @@ -1,8 +1,5 @@ "use client"; -import type { ToolUIPart } from "ai"; -import type { ComponentProps } from "react"; - import { Collapsible, CollapsibleContent, @@ -15,7 +12,9 @@ import { TabsTrigger, } from "@/ui/tabs"; import { cn } from "@/lib/utils"; +import type { ToolUIPart } from "ai"; import { ChevronDownIcon, Code } from "lucide-react"; +import type { ComponentProps } from "react"; import { getStatusBadge } from "./tool"; @@ -68,7 +67,7 @@ export const SandboxContent = ({ }: SandboxContentProps) => ( ({ path: "", }); -export type SchemaDisplayProps = HTMLAttributes & { - method: HttpMethod; - path: string; - description?: string; - parameters?: SchemaParameter[]; - requestBody?: SchemaProperty[]; - responseBody?: SchemaProperty[]; -}; - -export const SchemaDisplay = ({ - method, - path, - description, - parameters, - requestBody, - responseBody, - className, - children, - ...props -}: SchemaDisplayProps) => { - const contextValue = useMemo( - () => ({ - description, - method, - parameters, - path, - requestBody, - responseBody, - }), - [description, method, parameters, path, requestBody, responseBody] - ); - - return ( - -
- {children ?? ( - <> - -
- - -
-
- {(Boolean(description)) && } - - {parameters && parameters.length > 0 && ( - - )} - {requestBody && requestBody.length > 0 && ( - - )} - {responseBody && responseBody.length > 0 && ( - - )} - - - )} -
-
- ); +const methodStyles: Record = { + DELETE: "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400", + GET: "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400", + PATCH: + "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400", + POST: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400", + PUT: "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400", }; export type SchemaDisplayHeaderProps = HTMLAttributes; @@ -128,15 +68,6 @@ export const SchemaDisplayHeader = ({
); -const methodStyles: Record = { - DELETE: "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400", - GET: "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400", - PATCH: - "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400", - POST: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400", - PUT: "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400", -}; - export type SchemaDisplayMethodProps = ComponentProps; export const SchemaDisplayMethod = ({ @@ -172,14 +103,11 @@ export const SchemaDisplayPath = ({ '{$1}' ); - const htmlContent = typeof children === "string" ? children : highlightedPath; - return ( ); @@ -220,36 +148,6 @@ export const SchemaDisplayContent = ({
); -export type SchemaDisplayParametersProps = ComponentProps; - -export const SchemaDisplayParameters = ({ - className, - children, - ...props -}: SchemaDisplayParametersProps) => { - const { parameters } = useContext(SchemaDisplayContext); - - return ( - - - - Parameters - - {parameters?.length} - - - -
- {children ?? - parameters?.map((param) => ( - - ))} -
-
-
- ); -}; - export type SchemaDisplayParameterProps = HTMLAttributes & SchemaParameter; @@ -282,59 +180,35 @@ export const SchemaDisplayParameter = ({ )}
- {(Boolean(description)) && ( + {description && (

{description}

)}
); -export type SchemaDisplayRequestProps = ComponentProps; - -export const SchemaDisplayRequest = ({ - className, - children, - ...props -}: SchemaDisplayRequestProps) => { - const { requestBody } = useContext(SchemaDisplayContext); - - return ( - - - - Request Body - - -
- {children ?? - requestBody?.map((prop) => ( - - ))} -
-
-
- ); -}; - -export type SchemaDisplayResponseProps = ComponentProps; +export type SchemaDisplayParametersProps = ComponentProps; -export const SchemaDisplayResponse = ({ +export const SchemaDisplayParameters = ({ className, children, ...props -}: SchemaDisplayResponseProps) => { - const { responseBody } = useContext(SchemaDisplayContext); +}: SchemaDisplayParametersProps) => { + const { parameters } = useContext(SchemaDisplayContext); return ( - Response + Parameters + + {parameters?.length} + -
+
{children ?? - responseBody?.map((prop) => ( - + parameters?.map((param) => ( + ))}
@@ -342,18 +216,6 @@ export const SchemaDisplayResponse = ({ ); }; -export type SchemaDisplayBodyProps = HTMLAttributes; - -export const SchemaDisplayBody = ({ - className, - children, - ...props -}: SchemaDisplayBodyProps) => ( -
- {children} -
-); - export type SchemaDisplayPropertyProps = HTMLAttributes & SchemaProperty & { depth?: number; @@ -370,7 +232,7 @@ export const SchemaDisplayProperty = ({ className, ...props }: SchemaDisplayPropertyProps) => { - const hasChildren = properties ?? items; + const hasChildren = properties || items; const paddingLeft = 40 + depth * 16; if (hasChildren) { @@ -397,7 +259,7 @@ export const SchemaDisplayProperty = ({ )} - {(Boolean(description)) && ( + {description && (

)}

- {(Boolean(description)) && ( + {description && (

{description}

)} ); }; +export type SchemaDisplayRequestProps = ComponentProps; + +export const SchemaDisplayRequest = ({ + className, + children, + ...props +}: SchemaDisplayRequestProps) => { + const { requestBody } = useContext(SchemaDisplayContext); + + return ( + + + + Request Body + + +
+ {children ?? + requestBody?.map((prop) => ( + + ))} +
+
+
+ ); +}; + +export type SchemaDisplayResponseProps = ComponentProps; + +export const SchemaDisplayResponse = ({ + className, + children, + ...props +}: SchemaDisplayResponseProps) => { + const { responseBody } = useContext(SchemaDisplayContext); + + return ( + + + + Response + + +
+ {children ?? + responseBody?.map((prop) => ( + + ))} +
+
+
+ ); +}; + +export type SchemaDisplayProps = HTMLAttributes & { + method: HttpMethod; + path: string; + description?: string; + parameters?: SchemaParameter[]; + requestBody?: SchemaProperty[]; + responseBody?: SchemaProperty[]; +}; + +export const SchemaDisplay = ({ + method, + path, + description, + parameters, + requestBody, + responseBody, + className, + children, + ...props +}: SchemaDisplayProps) => { + const contextValue = useMemo( + () => ({ + description, + method, + parameters, + path, + requestBody, + responseBody, + }), + [description, method, parameters, path, requestBody, responseBody] + ); + + return ( + +
+ {children ?? ( + <> + +
+ + +
+
+ {description && } + + {parameters && parameters.length > 0 && ( + + )} + {requestBody && requestBody.length > 0 && ( + + )} + {responseBody && responseBody.length > 0 && ( + + )} + + + )} +
+
+ ); +}; + +export type SchemaDisplayBodyProps = HTMLAttributes; + +export const SchemaDisplayBody = ({ + className, + children, + ...props +}: SchemaDisplayBodyProps) => ( +
+ {children} +
+); + export type SchemaDisplayExampleProps = HTMLAttributes; export const SchemaDisplayExample = ({ diff --git a/src/components/ai-elements/shimmer.tsx b/src/components/ai-elements/shimmer.tsx index 8b56804e..6b635d01 100644 --- a/src/components/ai-elements/shimmer.tsx +++ b/src/components/ai-elements/shimmer.tsx @@ -1,10 +1,9 @@ "use client"; -import type { MotionProps } from "motion/react"; -import type { CSSProperties, ElementType, JSX } from "react"; - import { cn } from "@/lib/utils"; +import type { MotionProps } from "motion/react"; import { motion } from "motion/react"; +import type { CSSProperties, ElementType, JSX } from "react"; import { memo, useMemo } from "react"; type MotionHTMLProps = MotionProps & Record; @@ -52,7 +51,7 @@ const ShimmerComponent = ({ ( - - - {children} - - -); +}: SnippetProps) => { + const contextValue = useMemo(() => ({ code }), [code]); + + return ( + + + {children} + + + ); +}; export type SnippetAddonProps = ComponentProps; diff --git a/src/components/ai-elements/sources.tsx b/src/components/ai-elements/sources.tsx index d4dc1799..e6a39f5b 100644 --- a/src/components/ai-elements/sources.tsx +++ b/src/components/ai-elements/sources.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps } from "react"; - import { Collapsible, CollapsibleContent, @@ -9,6 +7,7 @@ import { } from "@/ui/collapsible"; import { cn } from "@/lib/utils"; import { BookIcon, ChevronDownIcon } from "lucide-react"; +import type { ComponentProps } from "react"; export type SourcesProps = ComponentProps<"div">; @@ -51,7 +50,7 @@ export const SourcesContent = ({ { const trimmed = line.trim(); // Pattern: at functionName (filePath:line:column) - const withParensMatch = STACK_FRAME_WITH_PARENS_REGEX.exec(trimmed); + const withParensMatch = trimmed.match(STACK_FRAME_WITH_PARENS_REGEX); if (withParensMatch) { const [, functionName, filePath, lineNum, colNum] = withParensMatch; const isInternal = @@ -89,7 +88,7 @@ const parseStackFrame = (line: string): StackFrame => { } // Pattern: at filePath:line:column (no function name) - const withoutFnMatch = STACK_FRAME_WITHOUT_FN_REGEX.exec(trimmed); + const withoutFnMatch = trimmed.match(STACK_FRAME_WITHOUT_FN_REGEX); if (withoutFnMatch) { const [, filePath, lineNum, colNum] = withoutFnMatch; const isInternal = @@ -134,7 +133,7 @@ const parseStackTrace = (trace: string): ParsedStackTrace => { let errorMessage = firstLine; // Try to extract error type from "ErrorType: message" format - const errorMatch = ERROR_TYPE_REGEX.exec(firstLine); + const errorMatch = firstLine.match(ERROR_TYPE_REGEX); if (errorMatch) { const [, type, msg] = errorMatch; errorType = type; @@ -291,8 +290,6 @@ const handleActionsKeyDown = (e: React.KeyboardEvent) => { export const StackTraceActions = memo( ({ className, children, ...props }: StackTraceActionsProps) => ( - // biome-ignore lint/a11y/noNoninteractiveElementInteractions: stopPropagation required for nested interactions - // biome-ignore lint/a11y/useSemanticElements: fieldset doesn't fit this UI pattern
void copyToClipboard()} + onClick={copyToClipboard} size="icon" variant="ghost" {...props} @@ -408,7 +405,7 @@ export const StackTraceContent = memo( - {framesToShow.map((frame, index) => ( + {framesToShow.map((frame) => (
at - {(Boolean(frame.functionName)) && ( + {frame.functionName && ( {frame.functionName}{" "} )} - {(Boolean(frame.filePath)) && ( + {frame.filePath && ( <> ( ) )} - {(!(frame.filePath ?? frame.functionName)) && ( + {!(frame.filePath || frame.functionName) && ( {frame.raw.replace(AT_PREFIX_REGEX, "")} )}
diff --git a/src/components/ai-elements/suggestion.tsx b/src/components/ai-elements/suggestion.tsx index 8c7f16ff..6d25b247 100644 --- a/src/components/ai-elements/suggestion.tsx +++ b/src/components/ai-elements/suggestion.tsx @@ -1,13 +1,12 @@ "use client"; -import type { ComponentProps } from "react"; - import { Button } from "@/ui/button"; import { ScrollArea, ScrollBar, } from "@/ui/scroll-area"; import { cn } from "@/lib/utils"; +import type { ComponentProps } from "react"; import { useCallback } from "react"; export type SuggestionsProps = ComponentProps; @@ -52,7 +51,7 @@ export const Suggestion = ({ variant={variant} {...props} > - {children ?? suggestion} + {children || suggestion} ); }; diff --git a/src/components/ai-elements/task.tsx b/src/components/ai-elements/task.tsx index 0f758fc0..24fa3a85 100644 --- a/src/components/ai-elements/task.tsx +++ b/src/components/ai-elements/task.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps } from "react"; - import { Collapsible, CollapsibleContent, @@ -9,6 +7,7 @@ import { } from "@/ui/collapsible"; import { cn } from "@/lib/utils"; import { ChevronDownIcon, SearchIcon } from "lucide-react"; +import type { ComponentProps } from "react"; export type TaskItemFileProps = ComponentProps<"div">; @@ -76,7 +75,7 @@ export const TaskContent = ({ }: TaskContentProps) => ( ({ output: "", }); -export type TerminalProps = HTMLAttributes & { - output: string; - isStreaming?: boolean; - autoScroll?: boolean; - onClear?: () => void; -}; - -export const Terminal = ({ - output, - isStreaming = false, - autoScroll = true, - onClear, - className, - children, - ...props -}: TerminalProps) => { - const contextValue = useMemo( - () => ({ autoScroll, isStreaming, onClear, output }), - [autoScroll, isStreaming, onClear, output] - ); - - return ( - -
- {children ?? ( - <> - - -
- - - - {onClear && } - -
-
- - - )} -
-
- ); -}; - export type TerminalHeaderProps = HTMLAttributes; export const TerminalHeader = ({ @@ -133,7 +80,7 @@ export const TerminalStatus = ({ className={cn("flex items-center gap-2 text-xs text-zinc-400", className)} {...props} > - {children ?? } + {children}
); }; @@ -184,12 +131,6 @@ export const TerminalCopyButton = ({ } }, [output, onCopy, onError, timeout]); - const handleClick = useCallback(() => { - copyToClipboard().catch(() => { - // Error handling already done in copyToClipboard - }); - }, [copyToClipboard]); - useEffect( () => () => { window.clearTimeout(timeoutRef.current); @@ -205,7 +146,7 @@ export const TerminalCopyButton = ({ "size-7 shrink-0 text-zinc-400 hover:bg-zinc-800 hover:text-zinc-100", className )} - onClick={handleClick} + onClick={copyToClipboard} size="icon" variant="ghost" {...props} @@ -254,7 +195,6 @@ export const TerminalContent = ({ const { output, isStreaming, autoScroll } = useContext(TerminalContext); const containerRef = useRef(null); - // biome-ignore lint/correctness/useExhaustiveDependencies: output triggers auto-scroll when new content arrives useEffect(() => { if (autoScroll && containerRef.current) { containerRef.current.scrollTop = containerRef.current.scrollHeight; @@ -271,7 +211,7 @@ export const TerminalContent = ({ {...props} > {children ?? ( -
+        
           {output}
           {isStreaming && (
             
@@ -281,3 +221,53 @@ export const TerminalContent = ({
     
   );
 };
+
+export type TerminalProps = HTMLAttributes & {
+  output: string;
+  isStreaming?: boolean;
+  autoScroll?: boolean;
+  onClear?: () => void;
+};
+
+export const Terminal = ({
+  output,
+  isStreaming = false,
+  autoScroll = true,
+  onClear,
+  className,
+  children,
+  ...props
+}: TerminalProps) => {
+  const contextValue = useMemo(
+    () => ({ autoScroll, isStreaming, onClear, output }),
+    [autoScroll, isStreaming, onClear, output]
+  );
+
+  return (
+    
+      
+ {children ?? ( + <> + + +
+ + + + {onClear && } + +
+
+ + + )} +
+
+ ); +}; diff --git a/src/components/ai-elements/test-results.tsx b/src/components/ai-elements/test-results.tsx index 20a3cfa8..0bc90f15 100644 --- a/src/components/ai-elements/test-results.tsx +++ b/src/components/ai-elements/test-results.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps, HTMLAttributes } from "react"; - import { Badge } from "@/ui/badge"; import { Collapsible, @@ -16,6 +14,7 @@ import { CircleIcon, XCircleIcon, } from "lucide-react"; +import type { ComponentProps, HTMLAttributes } from "react"; import { createContext, useContext, useMemo } from "react"; type TestStatus = "passed" | "failed" | "skipped" | "running"; @@ -41,36 +40,6 @@ const formatDuration = (ms: number) => { return `${(ms / 1000).toFixed(2)}s`; }; -export type TestResultsProps = HTMLAttributes & { - summary?: TestResultsSummary; -}; - -export const TestResults = ({ - summary, - className, - children, - ...props -}: TestResultsProps) => { - const contextValue = useMemo(() => ({ summary }), [summary]); - - return ( - -
- {children ?? - (summary && ( - - - - - ))} -
-
- ); -}; - export type TestResultsHeaderProps = HTMLAttributes; export const TestResultsHeader = ({ @@ -89,6 +58,26 @@ export const TestResultsHeader = ({ ); +export type TestResultsDurationProps = HTMLAttributes; + +export const TestResultsDuration = ({ + className, + children, + ...props +}: TestResultsDurationProps) => { + const { summary } = useContext(TestResultsContext); + + if (!summary?.duration) { + return null; + } + + return ( + + {children ?? formatDuration(summary.duration)} + + ); +}; + export type TestResultsSummaryProps = HTMLAttributes; export const TestResultsSummary = ({ @@ -137,23 +126,33 @@ export const TestResultsSummary = ({ ); }; -export type TestResultsDurationProps = HTMLAttributes; +export type TestResultsProps = HTMLAttributes & { + summary?: TestResultsSummary; +}; -export const TestResultsDuration = ({ +export const TestResults = ({ + summary, className, children, ...props -}: TestResultsDurationProps) => { - const { summary } = useContext(TestResultsContext); - - if (!summary?.duration) { - return null; - } +}: TestResultsProps) => { + const contextValue = useMemo(() => ({ summary }), [summary]); return ( - - {children ?? formatDuration(summary.duration)} - + +
+ {children ?? + (summary && ( + + + + + ))} +
+
); }; @@ -221,6 +220,26 @@ const TestSuiteContext = createContext({ status: "passed", }); +const statusStyles: Record = { + failed: "text-red-600 dark:text-red-400", + passed: "text-green-600 dark:text-green-400", + running: "text-blue-600 dark:text-blue-400", + skipped: "text-yellow-600 dark:text-yellow-400", +}; + +const statusIcons: Record = { + failed: , + passed: , + running: , + skipped: , +}; + +const TestStatusIcon = ({ status }: { status: TestStatus }) => ( + + {statusIcons[status]} + +); + export type TestSuiteProps = ComponentProps & { name: string; status: TestStatus; @@ -331,63 +350,41 @@ const TestContext = createContext({ status: "passed", }); -export type TestProps = HTMLAttributes & { - name: string; - status: TestStatus; - duration?: number; +export type TestNameProps = HTMLAttributes; + +export const TestName = ({ className, children, ...props }: TestNameProps) => { + const { name } = useContext(TestContext); + + return ( + + {children ?? name} + + ); }; -export const Test = ({ - name, - status, - duration, +export type TestDurationProps = HTMLAttributes; + +export const TestDuration = ({ className, children, ...props -}: TestProps) => { - const contextValue = useMemo( - () => ({ duration, name, status }), - [duration, name, status] - ); +}: TestDurationProps) => { + const { duration } = useContext(TestContext); + + if (duration === undefined) { + return null; + } return ( - -
- {children ?? ( - <> - - - {duration !== undefined && } - - )} -
-
+ + {children ?? `${duration}ms`} + ); }; -const statusStyles: Record = { - failed: "text-red-600 dark:text-red-400", - passed: "text-green-600 dark:text-green-400", - running: "text-blue-600 dark:text-blue-400", - skipped: "text-yellow-600 dark:text-yellow-400", -}; - -const statusIcons: Record = { - failed: , - passed: , - running: , - skipped: , -}; - -const TestStatusIcon = ({ status }: { status: TestStatus }) => ( - - {statusIcons[status]} - -); - export type TestStatusProps = HTMLAttributes; export const TestStatus = ({ @@ -407,38 +404,40 @@ export const TestStatus = ({ ); }; -export type TestNameProps = HTMLAttributes; - -export const TestName = ({ className, children, ...props }: TestNameProps) => { - const { name } = useContext(TestContext); - - return ( - - {children ?? name} - - ); +export type TestProps = HTMLAttributes & { + name: string; + status: TestStatus; + duration?: number; }; -export type TestDurationProps = HTMLAttributes; - -export const TestDuration = ({ +export const Test = ({ + name, + status, + duration, className, children, ...props -}: TestDurationProps) => { - const { duration } = useContext(TestContext); - - if (duration === undefined) { - return null; - } +}: TestProps) => { + const contextValue = useMemo( + () => ({ duration, name, status }), + [duration, name, status] + ); return ( - - {children ?? `${duration}ms`} - + +
+ {children ?? ( + <> + + + {duration !== undefined && } + + )} +
+
); }; diff --git a/src/components/ai-elements/tool.tsx b/src/components/ai-elements/tool.tsx index e516b7ab..2249a4e7 100644 --- a/src/components/ai-elements/tool.tsx +++ b/src/components/ai-elements/tool.tsx @@ -1,8 +1,5 @@ "use client"; -import type { DynamicToolUIPart, ToolUIPart } from "ai"; -import type { ComponentProps, ReactNode } from "react"; - import { Badge } from "@/ui/badge"; import { Collapsible, @@ -10,6 +7,7 @@ import { CollapsibleTrigger, } from "@/ui/collapsible"; import { cn } from "@/lib/utils"; +import type { DynamicToolUIPart, ToolUIPart } from "ai"; import { CheckCircleIcon, ChevronDownIcon, @@ -18,6 +16,7 @@ import { WrenchIcon, XCircleIcon, } from "lucide-react"; +import type { ComponentProps, ReactNode } from "react"; import { isValidElement } from "react"; import { CodeBlock } from "./code-block"; @@ -106,7 +105,7 @@ export type ToolContentProps = ComponentProps; export const ToolContent = ({ className, ...props }: ToolContentProps) => (

- {(errorText) ? "Error" : "Result"} + {errorText ? "Error" : "Result"}

- {(Boolean(errorText)) &&
{errorText}
} + {errorText &&
{errorText}
} {Output}
diff --git a/src/components/ai-elements/toolbar.tsx b/src/components/ai-elements/toolbar.tsx index a0c6c118..b55aa889 100644 --- a/src/components/ai-elements/toolbar.tsx +++ b/src/components/ai-elements/toolbar.tsx @@ -1,7 +1,6 @@ -import type { ComponentProps } from "react"; - import { cn } from "@/lib/utils"; import { NodeToolbar, Position } from "@xyflow/react"; +import type { ComponentProps } from "react"; type ToolbarProps = ComponentProps; diff --git a/src/components/ai-elements/transcription.tsx b/src/components/ai-elements/transcription.tsx index 57f2c6a8..054b7daa 100644 --- a/src/components/ai-elements/transcription.tsx +++ b/src/components/ai-elements/transcription.tsx @@ -1,10 +1,9 @@ "use client"; -import type { Experimental_TranscriptionResult as TranscriptionResult } from "ai"; -import type { ComponentProps, ReactNode } from "react"; - import { useControllableState } from "@radix-ui/react-use-controllable-state"; import { cn } from "@/lib/utils"; +import type { Experimental_TranscriptionResult as TranscriptionResult } from "ai"; +import type { ComponentProps, ReactNode } from "react"; import { createContext, useCallback, useContext, useMemo } from "react"; type TranscriptionSegment = TranscriptionResult["segments"][number]; diff --git a/src/components/ai-elements/voice-selector.tsx b/src/components/ai-elements/voice-selector.tsx index 06061a12..55ebb668 100644 --- a/src/components/ai-elements/voice-selector.tsx +++ b/src/components/ai-elements/voice-selector.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps, ReactNode } from "react"; - import { useControllableState } from "@radix-ui/react-use-controllable-state"; import { Button } from "@/ui/button"; import { @@ -34,6 +32,7 @@ import { VenusAndMarsIcon, VenusIcon, } from "lucide-react"; +import type { ComponentProps, ReactNode } from "react"; import { createContext, useCallback, useContext, useMemo } from "react"; interface VoiceSelectorContextValue { diff --git a/src/components/ai-elements/web-preview.tsx b/src/components/ai-elements/web-preview.tsx index dc5a347f..ea04b427 100644 --- a/src/components/ai-elements/web-preview.tsx +++ b/src/components/ai-elements/web-preview.tsx @@ -1,7 +1,5 @@ "use client"; -import type { ComponentProps, ReactNode } from "react"; - import { Button } from "@/ui/button"; import { Collapsible, @@ -17,6 +15,7 @@ import { } from "@/ui/tooltip"; import { cn } from "@/lib/utils"; import { ChevronDownIcon } from "lucide-react"; +import type { ComponentProps, ReactNode } from "react"; import { createContext, useCallback, @@ -211,11 +210,11 @@ export const WebPreviewBody = ({ }; export type WebPreviewConsoleProps = ComponentProps<"div"> & { - logs?: Array<{ + logs?: { level: "log" | "warn" | "error"; message: string; timestamp: Date; - }>; + }[]; }; export const WebPreviewConsole = ({ @@ -250,14 +249,14 @@ export const WebPreviewConsole = ({
{logs.length === 0 ? (

No console output

) : ( - logs.map((log, index) => ( + logs.map((log) => (
{log.timestamp.toLocaleTimeString()} diff --git a/src/mastra/a2a/AGENTS.md b/src/mastra/a2a/AGENTS.md index 30296019..87794510 100644 --- a/src/mastra/a2a/AGENTS.md +++ b/src/mastra/a2a/AGENTS.md @@ -98,11 +98,17 @@ coordinate_a2a_task({ }) ``` +## Typing Note + +- Parent coordinators that register child agents should use `@/src/mastra/agents/nestedAgents` for the `agents` config. +- This keeps the current Mastra nested-agent typing workaround isolated to one boundary while upstream typings remain restrictive. + --- ## Change Log | Version | Date (UTC) | Changes | | ------- | ---------- | ----------------------------------------------- | +| 2.0.1 | 2026-03-16 | Added note about `nestedAgents` boundary adapter for child-agent registration typing. | | 2.0.0 | 2025-11-26 | Major update: documented all coordinated agents | | 1.0.0 | 2025-11-14 | Initial A2A coordinator implementation | diff --git a/src/mastra/a2a/a2aCoordinatorAgent.ts b/src/mastra/a2a/a2aCoordinatorAgent.ts index 1959350e..fd47008b 100644 --- a/src/mastra/a2a/a2aCoordinatorAgent.ts +++ b/src/mastra/a2a/a2aCoordinatorAgent.ts @@ -10,6 +10,7 @@ import { refactoringAgent, testEngineerAgent, } from '../agents/codingAgents' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { contentStrategistAgent } from '../agents/contentStrategistAgent' import { copywriterAgent } from '../agents/copywriterAgent' import { editorAgent } from '../agents/editorAgent' @@ -107,7 +108,7 @@ Use knowledgeIndexingAgent to provide semantic context for complex queries. model: googleAI, memory: pgMemory, options: {}, - agents: { + agents: asNestedAgents({ researchAgent, knowledgeIndexingAgent, editorAgent, @@ -118,7 +119,7 @@ Use knowledgeIndexingAgent to provide semantic context for complex queries. refactoringAgent, contentStrategistAgent, projectManagementAgent, - }, + }), workflows: { researchSynthesisWorkflow, repoIngestionWorkflow, diff --git a/src/mastra/a2a/codingA2ACoordinator.ts b/src/mastra/a2a/codingA2ACoordinator.ts index 57b9e398..9de01bf9 100644 --- a/src/mastra/a2a/codingA2ACoordinator.ts +++ b/src/mastra/a2a/codingA2ACoordinator.ts @@ -16,6 +16,7 @@ import { refactoringAgent, testEngineerAgent, } from '../agents/codingAgents' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { checkFileExists, createDirectory, @@ -205,12 +206,12 @@ When a user's request requires prolonged, structured work across multiple subtas model: googleAIFlashLite, memory: pgMemory, - agents: { + agents: asNestedAgents({ codeArchitectAgent, codeReviewerAgent, testEngineerAgent, refactoringAgent, - }, + }), workflows: { researchSynthesisWorkflow, financialReportWorkflow, diff --git a/src/mastra/agents/AGENTS.md b/src/mastra/agents/AGENTS.md index 51521c9e..7bd6dd69 100644 --- a/src/mastra/agents/AGENTS.md +++ b/src/mastra/agents/AGENTS.md @@ -90,6 +90,7 @@ This directory contains 22+ agent definitions that map use-case intents to seque - **Logging**: Use the provided logger for consistent logging - **Testing**: Write unit tests for all agent functionality - **Documentation**: Document your agent's purpose, inputs, and outputs +- **Nested Agent Registration**: When an agent exposes child agents via the `agents` config, use `@/src/mastra/agents/nestedAgents` to adapt Mastra's current nested-agent typing without spreading one-off workarounds across files. ## Execution & Testing @@ -120,6 +121,7 @@ npm test src/mastra/__tests__/agents/your-agent.test.ts | Version | Date (UTC) | Changes | | ------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------ | | 2.2.0 | 2025-12-15 | Added 5 new specialized agents: socialMediaAgent, seoAgent, translationAgent, customerSupportAgent, projectManagementAgent. | +| 2.2.1 | 2026-03-16 | Added `nestedAgents.ts` boundary adapter for Mastra nested sub-agent typing and cleaned folder-level agent errors. | | 2.1.0 | 2025-11-28 | Added 4 Financial Chart agents: chartTypeAdvisorAgent, chartDataProcessorAgent, chartGeneratorAgent, chartSupervisorAgent. | | 2.0.0 | 2025-11-26 | Major update: 22 agents documented. Added data pipeline, research paper, document processing, knowledge indexing agents. | | 1.2.0 | 2025-11-19 | Added content creation and stock analysis agents. | diff --git a/src/mastra/agents/customerSupportAgent.ts b/src/mastra/agents/customerSupportAgent.ts index 37932cc8..0133451d 100644 --- a/src/mastra/agents/customerSupportAgent.ts +++ b/src/mastra/agents/customerSupportAgent.ts @@ -1,9 +1,9 @@ import { Agent } from '@mastra/core/agent' -import { googleAI3 } from '../config/google' import { log } from '../config/logger' import { pgMemory } from '../config/pg-storage' import { InternalSpans } from '@mastra/core/observability' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { evaluationAgent } from './evaluationAgent' import { reportAgent } from './reportAgent' import { researchAgent } from './researchAgent' @@ -126,11 +126,11 @@ export const customerSupportAgent = new Agent({ `, model: "google/gemini-3.1-flash-lite-preview", memory: pgMemory, - agents: { + agents: asNestedAgents({ researchAgent, evaluationAgent, reportAgent, - }, + }), options: { tracingPolicy: { internal: InternalSpans.ALL, diff --git a/src/mastra/agents/nestedAgents.ts b/src/mastra/agents/nestedAgents.ts new file mode 100644 index 00000000..251b1d46 --- /dev/null +++ b/src/mastra/agents/nestedAgents.ts @@ -0,0 +1,17 @@ +import type { Agent } from '@mastra/core/agent' + +type NestedAgentsInput = Record + +/** + * Upstream Mastra currently types `AgentConfig.agents` as `Record` + * in `@mastra/core/dist/agent/types.d.ts`, which rejects valid child agents that + * keep stricter request-context generics. + * + * This is a single boundary adaptation only. Child agents keep their exact + * requestContext typing internally; the cast is only for the parent registry slot. + */ +export function asNestedAgents( + agents: TAgents +): Record { + return agents as never as Record +} diff --git a/src/mastra/agents/projectManagementAgent.ts b/src/mastra/agents/projectManagementAgent.ts index 18323aa0..0cae40c1 100644 --- a/src/mastra/agents/projectManagementAgent.ts +++ b/src/mastra/agents/projectManagementAgent.ts @@ -4,6 +4,7 @@ import { pgMemory } from '../config/pg-storage' import { log } from '../config/logger' import { calendarAgent } from './calendarAgent' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { reportAgent } from './reportAgent' import { evaluationAgent } from './evaluationAgent' import { scrapingSchedulerTool } from '../tools/web-scraper-tool' @@ -142,11 +143,11 @@ export const projectManagementAgent = new Agent({ `, model: "google/gemini-3.1-flash-lite-preview", memory: pgMemory, - agents: { + agents: asNestedAgents({ calendarAgent, reportAgent, evaluationAgent, - }, + }), options: { tracingPolicy: { internal: InternalSpans.ALL, diff --git a/src/mastra/agents/researchAgent.ts b/src/mastra/agents/researchAgent.ts index 062cb3ce..60aa44d5 100644 --- a/src/mastra/agents/researchAgent.ts +++ b/src/mastra/agents/researchAgent.ts @@ -5,7 +5,6 @@ import { } from '@mastra/core/processors' import type { RequestContext } from '@mastra/core/request-context' import { log } from '../config/logger' -import { pgMemory } from '../config/pg-storage' import { mdocumentChunker } from '../tools/document-chunking.tool' import { evaluateResultTool } from '../tools/evaluateResultTool' import { extractLearningsTool } from '../tools/extractLearningsTool' @@ -21,7 +20,7 @@ import { googleNewsLiteTool, googleTrendsTool, } from '../tools/serpapi-news-trends.tool' -import { htmlToMarkdownTool, webScraperTool } from '../tools/web-scraper-tool' +import { htmlToMarkdownTool } from '../tools/web-scraper-tool' // Scorers import { InternalSpans } from '@mastra/core/observability' @@ -99,7 +98,7 @@ Tier: ${userTier} | Lang: ${language} | Phase: ${researchPhase} tools: { // Core Research Tools fetchTool, - webScraperTool, +// webScraperTool, googleScholarTool, googleNewsLiteTool, googleTrendsTool, diff --git a/src/mastra/agents/seoAgent.ts b/src/mastra/agents/seoAgent.ts index 97979073..0212d67c 100644 --- a/src/mastra/agents/seoAgent.ts +++ b/src/mastra/agents/seoAgent.ts @@ -1,9 +1,9 @@ import { Agent } from '@mastra/core/agent' -import { googleAI3 } from '../config/google' import { log } from '../config/logger' import { pgMemory } from '../config/pg-storage' import { InternalSpans } from '@mastra/core/observability' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { contentStrategistAgent } from './contentStrategistAgent' import { evaluationAgent } from './evaluationAgent' import { researchAgent } from './researchAgent' @@ -102,11 +102,11 @@ export const seoAgent = new Agent({ `, model: "google/gemini-3.1-flash-lite-preview", memory: pgMemory, - agents: { + agents: asNestedAgents({ researchAgent, contentStrategistAgent, evaluationAgent, - }, + }), options: { tracingPolicy: { internal: InternalSpans.ALL, diff --git a/src/mastra/agents/socialMediaAgent.ts b/src/mastra/agents/socialMediaAgent.ts index 4467fb08..0454f243 100644 --- a/src/mastra/agents/socialMediaAgent.ts +++ b/src/mastra/agents/socialMediaAgent.ts @@ -4,6 +4,7 @@ import { log } from '../config/logger' import { pgMemory } from '../config/pg-storage' import { InternalSpans } from '@mastra/core/observability' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { calendarAgent } from './calendarAgent' import { contentStrategistAgent } from './contentStrategistAgent' import { copywriterAgent } from './copywriterAgent' @@ -94,12 +95,12 @@ export const socialMediaAgent = new Agent({ `, model: "google/gemini-3.1-flash-lite-preview", memory: pgMemory, - agents: { + agents: asNestedAgents({ copywriterAgent, contentStrategistAgent, researchAgent, calendarAgent, - }, + }), options: { tracingPolicy: { internal: InternalSpans.ALL, diff --git a/src/mastra/agents/translationAgent.ts b/src/mastra/agents/translationAgent.ts index 2740f86a..4edb3b8f 100644 --- a/src/mastra/agents/translationAgent.ts +++ b/src/mastra/agents/translationAgent.ts @@ -4,6 +4,7 @@ import { log } from '../config/logger' import { pgMemory } from '../config/pg-storage' import { InternalSpans } from '@mastra/core/observability' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { evaluationAgent } from './evaluationAgent' import { researchAgent } from './researchAgent' @@ -118,10 +119,10 @@ export const translationAgent = new Agent({ `, model: "google/gemini-3.1-flash-lite-preview", memory: pgMemory, - agents: { + agents: asNestedAgents({ evaluationAgent, researchAgent, - }, + }), options: { tracingPolicy: { internal: InternalSpans.ALL, diff --git a/src/mastra/evals/AGENTS.md b/src/mastra/evals/AGENTS.md index 0f82078f..f944c5b5 100644 --- a/src/mastra/evals/AGENTS.md +++ b/src/mastra/evals/AGENTS.md @@ -2,12 +2,17 @@ This folder contains evaluation helpers and prebuilt scorers aligned with Mastra's evals reference. -Purpose: Provide scorer utils, prebuilt scorers (bias, completeness, prompt-alignment, tool-call-accuracy, noise-sensitivity), and runEvals helper exports for local experiments and CI tests. +Purpose: Provide scorer utils, prebuilt scorers (bias, completeness, prompt-alignment, tool-call-accuracy, noise-sensitivity), and typed local experiment helpers for CI and manual evaluation. Guidelines: - Use `createScorer` and `runEvals` from `@mastra/core/evals` when building scorers. - Keep prebuilt scorers small and well-tested; use judge (LLM) configuration for LLM-based scorers. +- For this repo's local agent experiments, prefer `agent.generate(..., { returnScorerData: true })` followed by `scorer.run(...)` using the returned `scoringData` payloads. This is the currently verified production-safe path for the installed Mastra version. +- For dataset-style/manual batch runs against agents, the installed Mastra typings support `runEvals({ data, scorers, target })`. Each dataset item should be shaped like `{ input, groundTruth?, requestContext?: RequestContext }`. +- All judge-backed scorers in this folder should use the explicit model string `google/gemini-3.1-flash-lite-preview` unless there is a documented reason to diverge. +- Custom scorers intended for agent outputs should declare `type: 'agent'` so `run.output` / `run.input` use `ScorerRunOutputForAgent` / `ScorerRunInputForAgent` instead of falling back to weak inference. +- Avoid `any`/unsafe request-context access in scorers; narrow `requestContext`, parsed JSON output, and message content explicitly. Local Prebuilt Scorers (registered in Mastra instance): @@ -32,4 +37,4 @@ Docs & local references: - docs/evals/noise-sensitivity.md — Noise sensitivity reference - docs/evals/scorer-utils.md — Helper utilities and test helpers -Add new experiments in src/mastra/evals/agent-experiments.ts for running targeted scorer experiments (keyword coverage, textual difference, source diversity). +Add new experiments in `src/mastra/evals/agent-experiments.ts` for targeted scorer experiments (keyword coverage, textual difference, source diversity). Keep experiment helpers aligned with the installed Mastra eval typings and verify changes with targeted `get_errors` on `src/mastra/evals`. diff --git a/src/mastra/evals/agent-experiments.ts b/src/mastra/evals/agent-experiments.ts index dc371964..28f22e87 100644 --- a/src/mastra/evals/agent-experiments.ts +++ b/src/mastra/evals/agent-experiments.ts @@ -1,4 +1,10 @@ -import { createScorer, runEvals } from '@mastra/core/evals' +import type { Agent, ToolsInput } from '@mastra/core/agent' +import type { + MastraScorer, + ScorerRunInputForAgent, + ScorerRunOutputForAgent, +} from '@mastra/core/evals' +import { RequestContext } from '@mastra/core/request-context' import { contentStrategistAgent } from '../agents/contentStrategistAgent' import { copywriterAgent } from '../agents/copywriterAgent' import { scriptWriterAgent } from '../agents/scriptWriterAgent' @@ -12,13 +18,130 @@ import { weatherAgent } from '../agents/weather-agent' import { log } from '../config/logger' import { researchAgent } from '../agents/researchAgent' -export async function runContentStrategistExperiment() { - log.info('Running Content Strategist Experiment', { - event: 'Running Content Strategist Experiment', +type JsonPrimitive = boolean | number | string | null +type JsonValue = JsonPrimitive | JsonObject | JsonValue[] + +interface JsonObject { + [key: string]: JsonValue | undefined +} + +type EvalScorer = MastraScorer + +interface ExperimentSample { + input: string + groundTruth?: string + requestContext?: JsonObject +} + +interface ExperimentCaseResult { + input: string + text: string + scores: Record + reasons: Record +} + +interface ExperimentSummary { + experiment: string + cases: ExperimentCaseResult[] +} + +type ScoreEntry = readonly [ + string, + { + score: number + reason: string | undefined + }, +] + +function createRequestContext( + values?: JsonObject +): RequestContext | undefined { + if (values === undefined) { + return undefined + } + + return new RequestContext(Object.entries(values)) +} + +async function runAgentExperiment( + experiment: string, + agent: Agent, + samples: ExperimentSample[], + scorers: readonly EvalScorer[] = [] +): Promise { + log.info(`Running ${experiment}...`) + + const cases = await Promise.all( + samples.map(async (sample): Promise => { + const result = await agent.generate(sample.input, { + requestContext: createRequestContext(sample.requestContext), + returnScorerData: true, + }) + + const scorerInput = result.scoringData?.input + const scorerOutput = result.scoringData?.output + + const scoreEntries: ScoreEntry[] = await Promise.all( + scorers.map(async (scorer) => { + if (!scorerInput || !scorerOutput) { + throw new Error( + `Missing scoring data while running ${scorer.name} for ${experiment}` + ) + } + + const scorerResult = await scorer.run({ + input: scorerInput, + output: scorerOutput, + groundTruth: sample.groundTruth, + requestContext: sample.requestContext, + }) + + const entry: ScoreEntry = [ + scorer.name, + { + score: scorerResult.score, + reason: + typeof scorerResult.reason === 'string' + ? scorerResult.reason + : undefined, + }, + ] + + return entry + }) + ) + + const scores: Record = {} + const reasons: Record = {} + + for (const [name, value] of scoreEntries) { + scores[name] = value.score + reasons[name] = value.reason + } + + return { + input: sample.input, + text: result.text, + scores, + reasons, + } + }) + ) + + const summary = { experiment, cases } + + log.info(`${experiment} Results`, { + results: JSON.stringify(summary, null, 2), }) - const results = await runEvals({ - target: contentStrategistAgent, - data: [ + + return summary +} + +export async function runContentStrategistExperiment() { + return runAgentExperiment( + 'Content Strategist Experiment', + contentStrategistAgent, + [ { input: 'Create a content plan for a new AI-powered coffee machine. Focus on tech enthusiasts. Tone: Exciting.', }, @@ -28,20 +151,12 @@ export async function runContentStrategistExperiment() { { input: 'Plan a blog series for a B2B SaaS accounting tool. Target audience: CFOs. Tone: Professional and authoritative.', }, - ], - scorers: [], - }) - log.info('Content Strategist Experiment Results', { - results: JSON.stringify(results, null, 2), - }) - return results + ] + ) } export async function runCopywriterExperiment() { - log.info('Running Copywriter Experiment...') - const results = await runEvals({ - target: copywriterAgent, - data: [ + return runAgentExperiment('Copywriter Experiment', copywriterAgent, [ { input: 'Write a landing page headline for a noise-cancelling headphone. Tone: Punchy and minimalist.', }, @@ -51,198 +166,126 @@ export async function runCopywriterExperiment() { { input: 'Write a product description for a luxury watch. Tone: Sophisticated and elegant.', }, - ], - scorers: [], - }) - log.info('Copywriter Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ]) } export async function runScriptWriterExperiment() { - log.info('Running Script Writer Experiment...') - const results = await runEvals({ - target: scriptWriterAgent, - data: [ + return runAgentExperiment('Script Writer Experiment', scriptWriterAgent, [ { input: 'Write a 60-second TikTok script about productivity hacks.', }, { input: 'Create a YouTube intro for a tech review channel.', }, - ], - scorers: [], - }) - log.info('Script Writer Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ]) } export async function runStockAnalysisExperiment() { - log.info('Running Stock Analysis Experiment...') - const results = await runEvals({ - target: stockAnalysisAgent, - data: [ + return runAgentExperiment('Stock Analysis Experiment', stockAnalysisAgent, [ { input: 'Analyze AAPL stock.', }, { input: 'Should I buy TSLA right now?', }, - ], - scorers: [], - }) - log.info('Stock Analysis Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ]) } export async function runReportAgentExperiment() { - log.info('Running Report Agent Experiment...') - const results = await runEvals({ - target: reportAgent, - data: [ + return runAgentExperiment('Report Agent Experiment', reportAgent, [ { input: 'Generate a quarterly performance report for a marketing team. Include sections for KPIs, Highlights, and Next Steps.', }, { input: 'Summarize the key findings from the user research interviews.', }, - ], - scorers: [], - }) - log.info('Report Agent Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ]) } export async function runLearningExtractionExperiment() { - log.info('Running Learning Extraction Experiment...') - const results = await runEvals({ - target: learningExtractionAgent, - data: [ + return runAgentExperiment( + 'Learning Extraction Experiment', + learningExtractionAgent, + [ { input: 'Extract key learning points from this article about Rust ownership.', }, - ], - scorers: [], - }) - log.info('Learning Extraction Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ] + ) } export async function runEvaluationAgentExperiment() { - log.info('Running Evaluation Agent Experiment...') - const results = await runEvals({ - target: evaluationAgent, - data: [ + return runAgentExperiment('Evaluation Agent Experiment', evaluationAgent, [ { input: 'Evaluate this python code for efficiency: def fib(n): return n if n < 2 else fib(n-1) + fib(n-2)', }, - ], - scorers: [], - }) - log.info('Evaluation Agent Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ]) } export async function runImageToCsvExperiment() { - log.info('Running Image to CSV Experiment...') - const results = await runEvals({ - target: imageToCsvAgent, - data: [ + return runAgentExperiment('Image to CSV Experiment', imageToCsvAgent, [ { input: 'https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv', }, - ], - scorers: [], - }) - log.info('Image to CSV Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ]) } export async function runCsvToExcalidrawExperiment() { - log.info('Running CSV to Excalidraw Experiment...') - const results = await runEvals({ - target: csvToExcalidrawAgent, - data: [ + return runAgentExperiment( + 'CSV to Excalidraw Experiment', + csvToExcalidrawAgent, + [ { input: 'id,label,x,y\n1,Start,0,0\n2,Process,100,0\n3,End,200,0', }, - ], - scorers: [], - }) - log.info('CSV to Excalidraw Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ] + ) } export async function runWeatherAgentExperiment() { - log.info('Running Weather Agent Experiment...') - const results = await runEvals({ - target: weatherAgent, - data: [ + return runAgentExperiment('Weather Agent Experiment', weatherAgent, [ { input: 'What is the weather in Tokyo?', }, { input: 'Forecast for London tomorrow.', }, - ], - scorers: [], - }) - log.info('Weather Agent Experiment Results:', { - results: JSON.stringify(results, null, 2), - }) - return results + ]) } export async function runKeywordCoverageExperiment() { - log.info('Running Keyword Coverage Experiment...') const scorer = await import('./scorers/keyword-coverage').then( (m) => m.keywordCoverageScorer ) - const results = await runEvals({ - target: researchAgent, - data: [ + + return runAgentExperiment( + 'Keyword Coverage Experiment', + researchAgent, + [ { input: 'Compare React and Vue frameworks', - requestContext: { requiredKeywords: ['React', 'Vue'] } as any, + requestContext: { requiredKeywords: ['React', 'Vue'] }, }, { input: 'Discuss TypeScript features like generics and interfaces', requestContext: { requiredKeywords: ['TypeScript', 'generics', 'interfaces'], - } as any, + }, }, ], - scorers: [scorer], - }) - log.info('Keyword Coverage Results', { - results: JSON.stringify(results, null, 2), - }) - return results + [scorer] + ) } export async function runTextualDifferenceExperiment() { - log.info('Running Textual Difference Experiment...') const scorer = await import('./scorers/prebuilt').then((m) => m.createTextualDifferenceScorer() ) - const results = await runEvals({ - target: contentStrategistAgent, - data: [ + + return runAgentExperiment( + 'Textual Difference Experiment', + contentStrategistAgent, + [ { input: 'Summarize the concept of recursion', groundTruth: @@ -253,36 +296,29 @@ export async function runTextualDifferenceExperiment() { groundTruth: 'The capital of France is Paris.', }, ], - scorers: [scorer], - }) - log.info('Textual Difference Results', { - results: JSON.stringify(results, null, 2), - }) - return results + [scorer] + ) } export async function runSourceDiversityExperiment() { - log.info('Running Source Diversity Experiment...') const scorer = await import('./scorers/custom-scorers').then( (m) => m.sourceDiversityScorer ) - const results = await runEvals({ - target: researchAgent, - data: [ + + return runAgentExperiment( + 'Source Diversity Experiment', + researchAgent, + [ { input: 'Collect sources about climate change', - requestContext: {} as any, + requestContext: {}, }, ], - scorers: [scorer], - }) - log.info('Source Diversity Results', { - results: JSON.stringify(results, null, 2), - }) - return results + [scorer] + ) } -export async function runAllExperiments(p0: unknown) { +export async function runAllExperiments() { await runContentStrategistExperiment() await runCopywriterExperiment() await runScriptWriterExperiment() diff --git a/src/mastra/evals/scorers/custom-scorers.ts b/src/mastra/evals/scorers/custom-scorers.ts index 743e0b5b..c234dfdc 100644 --- a/src/mastra/evals/scorers/custom-scorers.ts +++ b/src/mastra/evals/scorers/custom-scorers.ts @@ -1,5 +1,5 @@ -import { createScorer, runEvals } from '@mastra/core/evals' -import { googleAIFlashLite } from '../../config/google' +import { createScorer } from '@mastra/core/evals' +import { extractAgentResponseMessages } from './utils' // Typings for parsed outputs interface Source { @@ -19,39 +19,31 @@ export const sourceDiversityScorer = createScorer({ name: 'Source Diversity', description: 'Evaluates if research sources come from diverse domains and avoid single-source bias', + type: 'agent', judge: { - model: googleAIFlashLite, + model: 'google/gemini-3.1-flash-lite-preview', instructions: 'You are an expert research evaluator focused on source credibility and diversity.', }, }) .preprocess(({ run }) => { - const { output } = run + const outputText = extractAgentResponseMessages(run.output).join('\n') let sources: string[] = [] - if (typeof output === 'string') { - try { - const parsed = JSON.parse(output) as { sources?: Source[] } - sources = parsed.sources?.map((s) => s.url) ?? [] - } catch { - const urlRegex = /https?:\/\/[^\s]+/g - sources = output.match(urlRegex) ?? [] - } - } else if ( - output !== null && - typeof output === 'object' && - 'sources' in (output as Record) - ) { - const typed = output as { sources?: Source[] } - sources = typed.sources?.map((s) => s.url) ?? [] + try { + const parsed = JSON.parse(outputText) as { sources?: Source[] } + sources = parsed.sources?.map((source) => source.url) ?? [] + } catch { + const urlRegex = /https?:\/\/[^\s]+/g + sources = Array.from(outputText.matchAll(urlRegex), (match) => match[0]) } return { sources } }) .analyze(({ results }) => { - const { sources } = results.preprocessStepResult + const sources = results.preprocessStepResult.sources ?? [] - if (Array.isArray(sources) && sources.length === 0) { + if (sources.length === 0) { return { diversityScore: 0, uniqueDomains: 0, @@ -61,7 +53,7 @@ export const sourceDiversityScorer = createScorer({ } } - const domains = (sources || []) + const domains = sources .map((url: string) => { try { const urlObj = new URL(url) @@ -79,19 +71,18 @@ export const sourceDiversityScorer = createScorer({ domainBreakdown[domain] = (domainBreakdown[domain] || 0) + 1 }) - const diversityScore = - uniqueDomains.size / Math.max((sources || []).length, 1) + const diversityScore = uniqueDomains.size / Math.max(sources.length, 1) const issues: string[] = [] if (uniqueDomains.size < 2) { issues.push('Limited domain diversity - mostly single source') } - if ((sources || []).length < 3) { + if (sources.length < 3) { issues.push('Insufficient number of sources') } if ( Object.values(domainBreakdown).some( - (count) => count > (sources || []).length * 0.6 + (count) => count > sources.length * 0.6 ) ) { issues.push('Heavy reliance on single domain') @@ -100,7 +91,7 @@ export const sourceDiversityScorer = createScorer({ return { diversityScore, uniqueDomains: uniqueDomains.size, - totalSources: (sources || []).length, + totalSources: sources.length, domainBreakdown, issues, } @@ -115,46 +106,38 @@ export const researchCompletenessScorer = createScorer({ name: 'Research Completeness', description: 'Evaluates if the research comprehensively covers the topic from multiple angles', + type: 'agent', judge: { - model: googleAIFlashLite, + model: 'google/gemini-3.1-flash-lite-preview', instructions: 'You are an expert research evaluator focused on completeness and depth of analysis.', }, }) .preprocess(({ run }) => { - const { output } = run + const outputText = extractAgentResponseMessages(run.output).join('\n') let learnings: Learning[] = [] let summary = '' let data = '' - if (typeof output === 'string') { - try { - const parsed = JSON.parse(output) as { - learnings?: Learning[] - summary?: string - data?: string - } - learnings = parsed.learnings ?? [] - summary = parsed.summary ?? '' - data = parsed.data ?? '' - } catch { - summary = output - } - } else if (output !== null && typeof output === 'object') { - const typed = output as { + try { + const parsed = JSON.parse(outputText) as { learnings?: Learning[] summary?: string data?: string } - learnings = typed.learnings ?? [] - summary = typed.summary ?? '' - data = typed.data ?? '' + learnings = parsed.learnings ?? [] + summary = parsed.summary ?? '' + data = parsed.data ?? '' + } catch { + summary = outputText } return { learnings, summary, data } }) .analyze(({ results }) => { - const { learnings, summary, data } = results.preprocessStepResult + const learnings = results.preprocessStepResult.learnings ?? [] + const summary = results.preprocessStepResult.summary ?? '' + const data = results.preprocessStepResult.data ?? '' const totalContent = `${summary} ${data}`.toLowerCase() const learningCount = learnings.length diff --git a/src/mastra/evals/scorers/factuality.scorer.ts b/src/mastra/evals/scorers/factuality.scorer.ts index afce2b86..68b5339c 100644 --- a/src/mastra/evals/scorers/factuality.scorer.ts +++ b/src/mastra/evals/scorers/factuality.scorer.ts @@ -1,5 +1,4 @@ import { createScorer } from '@mastra/core/evals' -import { googleAIFlashLite } from '../../config/google' import { z } from 'zod' export const factualityScorer = createScorer({ @@ -8,7 +7,7 @@ export const factualityScorer = createScorer({ description: 'Evaluates if the claims in the output are factual and supported by evidence', judge: { - model: googleAIFlashLite, + model: 'google/gemini-3.1-flash-lite-preview', instructions: 'You are a fact-checker and research evaluator.', }, type: 'agent', diff --git a/src/mastra/evals/scorers/financial-scorers.ts b/src/mastra/evals/scorers/financial-scorers.ts index b9107e33..9d06ab5d 100644 --- a/src/mastra/evals/scorers/financial-scorers.ts +++ b/src/mastra/evals/scorers/financial-scorers.ts @@ -1,5 +1,57 @@ import { createScorer } from '@mastra/core/evals' -import { googleAIFlashLite } from '../../config/google' + +interface FinancialAnalysisSections { + technical?: unknown + fundamental?: unknown + sentiment?: unknown +} + +interface FinancialAnalysisPayload { + symbol?: unknown + currentPrice?: unknown + analysis?: FinancialAnalysisSections + recommendation?: unknown + priceTarget?: unknown + risks?: unknown + sources?: unknown +} + +function isFinancialAnalysisPayload( + value: unknown +): value is FinancialAnalysisPayload { + return typeof value === 'object' && value !== null +} + +function parseFinancialOutput(output: unknown): { + json: FinancialAnalysisPayload | null + text: string +} { + if (typeof output === 'string') { + const text = output + + try { + const match = /```json\s*([\s\S]*?)\s*```/.exec(output) + const rawJson = match?.[1] ?? output + const parsed: unknown = JSON.parse(rawJson) + + return { + json: isFinancialAnalysisPayload(parsed) ? parsed : null, + text, + } + } catch { + return { json: null, text } + } + } + + if (isFinancialAnalysisPayload(output)) { + return { + json: output, + text: JSON.stringify(output), + } + } + + return { json: null, text: '' } +} export const financialDataScorer = createScorer({ id: 'financial-data-scorer', @@ -7,39 +59,18 @@ export const financialDataScorer = createScorer({ description: 'Evaluates if the financial analysis output contains valid, complete, and sane data', judge: { - model: googleAIFlashLite, + model: 'google/gemini-3.1-flash-lite-preview', instructions: 'You are a financial data auditor.', }, type: 'agent', }) .preprocess(({ run }) => { - const { output } = run - let json: any = null - let text = '' - - if (typeof output === 'string') { - text = output - try { - const match = /```json\s*([\s\S]*?)\s*```/.exec(output) - if (match) { - json = JSON.parse(match[1]) - } else { - json = JSON.parse(output) - } - } catch (e) { - // invalid json - } - } else if (output && typeof output === 'object') { - json = output - text = JSON.stringify(output) - } - - return { json, text } + return parseFinancialOutput(run.output) }) .analyze(({ results }) => { const { json } = results.preprocessStepResult - if (!json) { + if (json === null) { return { isValidJson: false, hasRequiredFields: false, @@ -86,14 +117,14 @@ export const financialDataScorer = createScorer({ dataSanityCheck = false } - if (json.analysis) { - if (!json.analysis.technical) { + if (json.analysis !== undefined) { + if (json.analysis.technical === undefined) { issues.push('Missing technical analysis') } - if (!json.analysis.fundamental) { + if (json.analysis.fundamental === undefined) { issues.push('Missing fundamental analysis') } - if (!json.analysis.sentiment) { + if (json.analysis.sentiment === undefined) { issues.push('Missing sentiment analysis') } } diff --git a/src/mastra/evals/scorers/keyword-coverage.ts b/src/mastra/evals/scorers/keyword-coverage.ts index 621dd02e..de47e58b 100644 --- a/src/mastra/evals/scorers/keyword-coverage.ts +++ b/src/mastra/evals/scorers/keyword-coverage.ts @@ -1,21 +1,45 @@ import { createScorer } from '@mastra/core/evals' +interface KeywordCoverageRequestContext { + requiredKeywords?: string[] +} + +function getRequiredKeywords( + requestContext: unknown +): string[] { + if (typeof requestContext !== 'object' || requestContext === null) { + return [] + } + + const requiredKeywords = (requestContext as Record)[ + 'requiredKeywords' + ] + + if (!Array.isArray(requiredKeywords)) { + return [] + } + + return requiredKeywords.filter( + (keyword): keyword is string => typeof keyword === 'string' + ) +} + export const keywordCoverageScorer = createScorer({ id: 'keyword-coverage', name: 'Keyword Coverage', description: 'Measures coverage of required keywords in output', type: 'agent', }).generateScore(({ run }) => { - const input = (run.input && JSON.stringify(run.input)) || '' - const output = (run.output && JSON.stringify(run.output)) || '' - const required = - (run.requestContext && (run.requestContext as any).requiredKeywords) ?? - [] - if (!required || required.length === 0) { + const output = JSON.stringify(run.output ?? '') + const required = getRequiredKeywords(run.requestContext) + + if (required.length === 0) { return 1 } + const matched = required.filter((k: string) => output.toLowerCase().includes(k.toLowerCase()) ).length + return matched / required.length }) diff --git a/src/mastra/evals/scorers/prebuilt.ts b/src/mastra/evals/scorers/prebuilt.ts index d5d9851e..e4721edd 100644 --- a/src/mastra/evals/scorers/prebuilt.ts +++ b/src/mastra/evals/scorers/prebuilt.ts @@ -4,9 +4,37 @@ import { extractInputMessages, extractAgentResponseMessages, getAssistantMessageFromRunOutput, + getUserMessageFromRunInput, extractToolCalls, } from './utils' +interface GroundTruthCarrier { + groundTruth?: unknown +} + +interface ContextPenalties { + unusedHighRelevanceContext?: number + missingContextPerItem?: number + maxMissingContextPenalty?: number +} + +interface ContextScorerOptions { + penalties?: ContextPenalties + scale?: number + context?: string[] + contextExtractor?: (inputText: string, outputText: string) => string[] +} + +interface ContextPrecisionOptions { + scale?: number + context?: string[] + contextExtractor?: (inputText: string, outputText: string) => string[] +} + +function getGroundTruth(run: GroundTruthCarrier): string | undefined { + return typeof run.groundTruth === 'string' ? run.groundTruth : undefined +} + export function createCompletenessScorer() { return createScorer({ id: 'completeness-scorer', @@ -189,12 +217,7 @@ export function createNoiseSensitivityScorerLLM( type: 'agent', }) .preprocess(({ run }) => { - const input = - (run.input && - (Array.isArray(run.input) - ? run.input[0]?.content - : run.input)) ?? - '' + const input = getUserMessageFromRunInput(run.input) ?? '' const outputText = getAssistantMessageFromRunOutput(run.output) ?? '' return { input, outputText, opts: options } @@ -239,42 +262,29 @@ export function createTextualDifferenceScorer() { .preprocess(({ run }) => { const outputText = getAssistantMessageFromRunOutput(run.output) ?? '' - const groundTruth = - (run as any).groundTruth ?? - (Array.isArray(run.input) ? undefined : undefined) - // groundTruth may be passed via run.groundTruth when using runEvals - const gt = (run as any).groundTruth ?? undefined - return { outputText, groundTruth: gt } + return { outputText, groundTruth: getGroundTruth(run) ?? '' } }) .analyze(({ results }) => { const outputText = results.preprocessStepResult.outputText ?? '' const groundTruth = results.preprocessStepResult.groundTruth ?? '' - const maxLen = Math.max( - outputText.length, - (groundTruth as string).length, - 1 - ) - const distance = levenshtein(outputText, groundTruth as string) + const maxLen = Math.max(outputText.length, groundTruth.length, 1) + const distance = levenshtein(outputText, groundTruth) const ratio = 1 - distance / maxLen const confidence = 1 - - Math.abs(outputText.length - (groundTruth as string).length) / - Math.max( - outputText.length, - (groundTruth as string).length, - 1 - ) + Math.abs(outputText.length - groundTruth.length) / + Math.max(outputText.length, groundTruth.length, 1) return { confidence, ratio, changes: distance, - lengthDiff: outputText.length - (groundTruth as string).length, + lengthDiff: outputText.length - groundTruth.length, } }) .generateScore(({ results }) => { - const analysis = results.analyzeStepResult || { - ratio: 0.0, - confidence: 0.0, + const analysis = results.analyzeStepResult + if (!analysis) { + return 0 } const ratio = Math.max(0, Math.min(1, analysis.ratio ?? 0)) const confidence = Math.max( @@ -444,12 +454,7 @@ export function createToneScorer() { } export function createContextRelevanceScorerLLM( - opts: { - penalties?: any - scale?: number - context?: string[] - contextExtractor?: any - } = {} + opts: ContextScorerOptions = {} ) { // Lightweight heuristic implementation for local testing return createScorer({ @@ -497,7 +502,8 @@ export function createContextRelevanceScorerLLM( ).length const missing = details.filter((d) => d.relevance === 0.0).length const unusedPenalty = - (opts.penalties?.unusedHighRelevanceContext ?? 0.1) * unusedHigh + (opts.penalties?.unusedHighRelevanceContext ?? 0.1) * + unusedHigh const missingPenalty = Math.min( opts.penalties?.maxMissingContextPenalty ?? 0.5, (opts.penalties?.missingContextPerItem ?? 0.15) * missing @@ -511,7 +517,7 @@ export function createContextRelevanceScorerLLM( } export function createContextPrecisionScorer( - opts: { scale?: number; context?: string[]; contextExtractor?: any } = {} + opts: ContextPrecisionOptions = {} ) { // MAP-based heuristic for local testing return createScorer({ @@ -525,8 +531,7 @@ export function createContextPrecisionScorer( const outputText = extractAgentResponseMessages(run.output).join( '\n' ) - const gt = (run as any).groundTruth ?? '' - return { ctx, outputText, groundTruth: gt } + return { ctx, outputText, groundTruth: getGroundTruth(run) ?? '' } }) .analyze(({ results }) => { const ctx: string[] = results.preprocessStepResult.ctx ?? [] diff --git a/src/mastra/evals/scorers/utils.ts b/src/mastra/evals/scorers/utils.ts index a999441b..3fbf6281 100644 --- a/src/mastra/evals/scorers/utils.ts +++ b/src/mastra/evals/scorers/utils.ts @@ -1,3 +1,8 @@ +import type { + ScorerRunInputForAgent, + ScorerRunOutputForAgent, +} from '@mastra/core/evals' + /* Utility helpers for scorers - minimal implementations used by prebuilt scorers and tests */ export interface Message { @@ -7,6 +12,21 @@ export interface Message { toolInvocations?: unknown[] } +interface ContentWithReasoning { + reasoning?: string + parts?: unknown[] +} + +interface ReasoningPart { + type?: string + details?: string +} + +interface ToolInvocation { + toolName?: string + toolCallId?: string | number +} + export type RunInput = | string | Message[] @@ -14,6 +34,34 @@ export type RunInput = | undefined export type RunOutput = string | Message | Message[] | undefined +function isRecord(value: unknown): value is Record { + return typeof value === 'object' && value !== null +} + +function toText(value: unknown): string { + if (typeof value === 'string') { + return value + } + + if ( + typeof value === 'number' || + typeof value === 'boolean' || + typeof value === 'bigint' + ) { + return String(value) + } + + if (value === null || value === undefined) { + return '' + } + + try { + return JSON.stringify(value) + } catch { + return '' + } +} + export function getAssistantMessageFromRunOutput( output: RunOutput ): string | undefined { @@ -25,11 +73,12 @@ export function getAssistantMessageFromRunOutput( } if (Array.isArray(output)) { const assistantMsg = output.find((msg) => msg.role === 'assistant') - return assistantMsg?.content as string | undefined + const content = toText(assistantMsg?.content) + return content.length > 0 ? content : undefined } if (typeof output === 'object') { - // single message - return output.content as string | undefined + const content = toText(output.content) + return content.length > 0 ? content : undefined } return undefined } @@ -37,7 +86,7 @@ export function getAssistantMessageFromRunOutput( export function getUserMessageFromRunInput( input: RunInput ): string | undefined { - if (!input) { + if (input === undefined) { return undefined } if (typeof input === 'string') { @@ -45,99 +94,101 @@ export function getUserMessageFromRunInput( } if (Array.isArray(input)) { const userMsg = input.find((msg) => msg.role === 'user') - return userMsg?.content as string | undefined + const content = toText(userMsg?.content) + return content.length > 0 ? content : undefined } if (typeof input === 'object') { - const im = (input as { inputMessages?: Message[] }).inputMessages - return im?.[0]?.content as string | undefined + const content = toText(input.inputMessages?.[0]?.content) + return content.length > 0 ? content : undefined } return undefined } export function extractInputMessages(input: RunInput): string[] { - if (!input) { + if (input === undefined) { return [] } if (typeof input === 'string') { return [input] } if (Array.isArray(input)) { - return input.map((m) => String(m.content ?? '')) + return input.map((m) => toText(m.content)) } - if ( - typeof input === 'object' && - Array.isArray((input as { inputMessages?: Message[] }).inputMessages) - ) { - return (input as { inputMessages?: Message[] }).inputMessages!.map( - (m) => String(m.content ?? '') - ) + if (typeof input === 'object' && Array.isArray(input.inputMessages)) { + return input.inputMessages.map((m) => toText(m.content)) } return [] } export function extractAgentResponseMessages(output: RunOutput): string[] { - if (!output) { + if (output === undefined) { return [] } if (typeof output === 'string') { return [output] } if (Array.isArray(output)) { - return output.map((m) => String(m.content ?? '')) + return output.map((m) => toText(m.content)) } if (typeof output === 'object') { - return [String(output.content ?? '')] + return [toText(output.content)] } return [] } export function getReasoningFromRunOutput(output: unknown): string | undefined { - if (!output) { + if (output === undefined || output === null) { return undefined } + const messages: unknown[] = Array.isArray(output) ? output : [output] + for (const m of messages) { - if (typeof m === 'object' && m !== null) { - const { content } = m as Record - if (typeof content === 'object' && content !== null) { - if ((content as Record).reasoning) { - return (content as Record) - .reasoning as string - } - if (Array.isArray((content as Record).parts)) { - const parts = (content as Record) - .parts as unknown[] - const r = parts.find( - (p) => - typeof p === 'object' && - p !== null && - (p as Record).type === 'reasoning' - ) as Record | undefined - if (r) { - return r.details as string | undefined - } - } - } + if (!isRecord(m)) { + continue + } + + const { content } = m + if (!isRecord(content)) { + continue + } + + const typedContent = content as ContentWithReasoning + + if (typeof typedContent.reasoning === 'string') { + return typedContent.reasoning + } + + if (!Array.isArray(typedContent.parts)) { + continue + } + + const reasoningPart = typedContent.parts.find( + (part): part is ReasoningPart => + isRecord(part) && part.type === 'reasoning' + ) + + if (typeof reasoningPart?.details === 'string') { + return reasoningPart.details } } + return undefined } export function getSystemMessagesFromRunInput(input: RunInput): string[] { - if (!input) { + if (input === undefined) { return [] } if (Array.isArray(input)) { return input .filter((m) => m.role === 'system') - .map((m) => String(m.content ?? '')) + .map((m) => toText(m.content)) } if (typeof input === 'object') { - const sys = - (input as { systemMessages?: Array }) - .systemMessages ?? [] + const sys = input.systemMessages ?? [] return sys.map((m) => - typeof m === 'string' ? m : String(m.content ?? m) + typeof m === 'string' ? m : toText(m.content) ) } return [] @@ -166,15 +217,23 @@ export function extractToolCalls(output: unknown): { invocationIndex: number }> = [] messages.forEach((m: unknown, msgIdx: number) => { - const invs = (m as Record)?.toolInvocations + if (!isRecord(m)) { + return + } + + const invs = m.toolInvocations if (Array.isArray(invs)) { invs.forEach((t: unknown, invIdx: number) => { - const tt = t as Record - const toolName = String(tt.toolName ?? '') + if (!isRecord(t)) { + return + } + + const tt = t as ToolInvocation + const toolName = typeof tt.toolName === 'string' ? tt.toolName : '' tools.push(toolName) toolCallInfos.push({ toolName, - toolCallId: tt.toolCallId as string | number | undefined, + toolCallId: tt.toolCallId, messageIndex: msgIdx, invocationIndex: invIdx, }) @@ -202,6 +261,17 @@ export function createTestMessage(opts: { export function createAgentTestRun({ inputMessages = [], output = [], -}: { inputMessages?: Message[]; output?: unknown[] } = {}) { - return { input: { inputMessages }, output } +}: { inputMessages?: Message[]; output?: Message[] } = {}): { + input: ScorerRunInputForAgent + output: ScorerRunOutputForAgent +} { + return { + input: { + inputMessages: inputMessages as ScorerRunInputForAgent['inputMessages'], + rememberedMessages: [], + systemMessages: [], + taggedSystemMessages: {}, + }, + output: output as ScorerRunOutputForAgent, + } } diff --git a/src/mastra/evals/tests/completeness.test.ts b/src/mastra/evals/tests/completeness.test.ts index 03680eb7..590f3216 100644 --- a/src/mastra/evals/tests/completeness.test.ts +++ b/src/mastra/evals/tests/completeness.test.ts @@ -13,7 +13,7 @@ describe('Completeness Scorer', () => { { role: 'assistant', content: 'Apples, oranges, bananas' }, ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) @@ -31,7 +31,7 @@ describe('Completeness Scorer', () => { ], output: [{ role: 'assistant', content: 'I like pizza' }], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) diff --git a/src/mastra/evals/tests/context-precision.test.ts b/src/mastra/evals/tests/context-precision.test.ts index 25a19efc..846556b8 100644 --- a/src/mastra/evals/tests/context-precision.test.ts +++ b/src/mastra/evals/tests/context-precision.test.ts @@ -1,16 +1,17 @@ import { describe, it, expect } from 'vitest' import { createContextPrecisionScorer } from '../scorers/prebuilt' +import { createAgentTestRun } from '../scorers/utils' describe('Context Precision Scorer (MAP heuristic)', () => { it('gives high MAP when relevant items appear early', async () => { const scorer = createContextPrecisionScorer({ context: ['A', 'B', 'C', 'D'], }) - const run: any = { - input: { inputMessages: [{ role: 'user', content: 'Query' }] }, + const run = createAgentTestRun({ + inputMessages: [{ role: 'user', content: 'Query' }], output: [{ role: 'assistant', content: 'A B irrelevant C' }], - } - const res = await (scorer as any).run(run) + }) + const res = await scorer.run(run) expect(res.score).toBeGreaterThan(0.5) }) @@ -18,11 +19,11 @@ describe('Context Precision Scorer (MAP heuristic)', () => { const scorer = createContextPrecisionScorer({ context: ['A', 'B', 'C', 'D'], }) - const run: any = { - input: { inputMessages: [{ role: 'user', content: 'Query' }] }, + const run = createAgentTestRun({ + inputMessages: [{ role: 'user', content: 'Query' }], output: [{ role: 'assistant', content: 'irrelevant D C' }], - } - const res = await (scorer as any).run(run) + }) + const res = await scorer.run(run) expect(res.score).toBeLessThan(0.82) }) }) diff --git a/src/mastra/evals/tests/context-relevance.test.ts b/src/mastra/evals/tests/context-relevance.test.ts index f082be66..dc6d6ff2 100644 --- a/src/mastra/evals/tests/context-relevance.test.ts +++ b/src/mastra/evals/tests/context-relevance.test.ts @@ -1,5 +1,6 @@ import { describe, it, expect } from 'vitest' import { createContextRelevanceScorerLLM } from '../scorers/prebuilt' +import { createAgentTestRun } from '../scorers/utils' describe('Context Relevance Scorer (heuristic)', () => { it('penalizes unused high relevance context', async () => { @@ -11,13 +12,18 @@ describe('Context Relevance Scorer (heuristic)', () => { }, context: ['Important fact', 'Other detail'], }) - const run: any = { - input: { inputMessages: [{ role: 'user', content: 'Query' }] }, + const run = createAgentTestRun({ + inputMessages: [{ role: 'user', content: 'Query' }], output: [{ role: 'assistant', content: 'Other detail' }], - } - const res = await (scorer as any).run(run) + }) + const res = await scorer.run(run) expect(res.score).toBeLessThan(1) + const analysis = res.analyzeStepResult + expect(analysis).toBeDefined() + if (!analysis) { + throw new Error('Expected analyzeStepResult to be defined') + } // ensure unused high context counted - expect(res.analyzeStepResult.unusedHigh).toBeGreaterThanOrEqual(0) + expect(analysis.unusedHigh).toBeGreaterThanOrEqual(0) }) }) diff --git a/src/mastra/evals/tests/keyword-coverage.test.ts b/src/mastra/evals/tests/keyword-coverage.test.ts index a542dd5a..258f1408 100644 --- a/src/mastra/evals/tests/keyword-coverage.test.ts +++ b/src/mastra/evals/tests/keyword-coverage.test.ts @@ -14,7 +14,7 @@ describe('Keyword Coverage Scorer', () => { ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, requestContext: { requiredKeywords: ['React', 'Vue'] }, @@ -30,7 +30,7 @@ describe('Keyword Coverage Scorer', () => { ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, requestContext: { requiredKeywords: ['React', 'Vue'] }, diff --git a/src/mastra/evals/tests/noise-sensitivity.test.ts b/src/mastra/evals/tests/noise-sensitivity.test.ts index 11044a55..84ab3669 100644 --- a/src/mastra/evals/tests/noise-sensitivity.test.ts +++ b/src/mastra/evals/tests/noise-sensitivity.test.ts @@ -15,7 +15,7 @@ describe('Noise Sensitivity (heuristic)', () => { }), ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) @@ -31,7 +31,7 @@ describe('Noise Sensitivity (heuristic)', () => { createTestMessage({ role: 'assistant', content: 'Berlin' }), ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) diff --git a/src/mastra/evals/tests/tone-consistency.test.ts b/src/mastra/evals/tests/tone-consistency.test.ts index 86bebbb4..b83a4333 100644 --- a/src/mastra/evals/tests/tone-consistency.test.ts +++ b/src/mastra/evals/tests/tone-consistency.test.ts @@ -13,7 +13,7 @@ describe('Tone Consistency Scorer', () => { { role: 'assistant', content: 'I am very happy to help!' }, ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) @@ -28,7 +28,7 @@ describe('Tone Consistency Scorer', () => { ], output: [{ role: 'assistant', content: 'I love this product!' }], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) diff --git a/src/mastra/evals/tests/tool-call-accuracy.test.ts b/src/mastra/evals/tests/tool-call-accuracy.test.ts index bc28a3f2..5354b285 100644 --- a/src/mastra/evals/tests/tool-call-accuracy.test.ts +++ b/src/mastra/evals/tests/tool-call-accuracy.test.ts @@ -18,7 +18,7 @@ describe('Tool Call Accuracy (Code)', () => { }), ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) @@ -42,7 +42,7 @@ describe('Tool Call Accuracy (Code)', () => { }), ], }) - const res = await (scorer as any).run({ + const res = await scorer.run({ input: run.input, output: run.output, }) diff --git a/src/mastra/harness.ts b/src/mastra/harness.ts index 12705d83..cebd4870 100644 --- a/src/mastra/harness.ts +++ b/src/mastra/harness.ts @@ -6,6 +6,7 @@ * * @see https://mastra.ai/reference/harness/harness-class */ +import type { Agent as MastraAgent } from '@mastra/core/agent' import { Harness } from '@mastra/core/harness' import { z } from 'zod' @@ -33,6 +34,8 @@ const harnessStateSchema = z.object({ export type HarnessState = z.infer +const asHarnessAgent = (agent: unknown): MastraAgent => agent as MastraAgent + /** * Main Harness instance for AgentStack * @@ -52,62 +55,55 @@ export const mainHarness = new Harness({ storage: pgStore, // State management stateSchema: harnessStateSchema, - initialState: { - files: [], - context: {}, - // currentTask: any, - // lastMode: undefined, - }, - // Agent modes - each represents a different capability/personality modes: [ { id: 'plan', name: 'Planner', - agent: codeArchitectAgent, + agent: asHarnessAgent(codeArchitectAgent), default: true, color: '#7c3aed', // Purple }, { id: 'code', name: 'Builder', - agent: codeArchitectAgent, + agent: asHarnessAgent(codeArchitectAgent), color: '#22c55e', // Green }, { id: 'review', name: 'Reviewer', - agent: codeReviewerAgent, + agent: asHarnessAgent(codeReviewerAgent), color: '#f59e0b', // Amber }, { id: 'test', name: 'Tester', - agent: testEngineerAgent, + agent: asHarnessAgent(testEngineerAgent), color: '#3b82f6', // Blue }, { id: 'refactor', name: 'Refactorer', - agent: refactoringAgent, + agent: asHarnessAgent(refactoringAgent), color: '#ec4899', // Pink }, { id: 'research', name: 'Researcher', - agent: researchAgent, + agent: asHarnessAgent(researchAgent), color: '#06b6d4', // Cyan }, { id: 'edit', name: 'Editor', - agent: editorAgent, + agent: asHarnessAgent(editorAgent), color: '#8b5cf6', // Violet }, { id: 'report', name: 'Reporter', - agent: reportAgent, + agent: asHarnessAgent(reportAgent), color: '#f97316', // Orange }, ], @@ -124,7 +120,6 @@ export const mainHarness = new Harness({ instructions: 'You are a focused exploration agent. Quickly scan and identify relevant patterns, files, and code structures. Be concise and efficient.', allowedHarnessTools: [], - defaultModelId: 'opencode/GLM-5-free', }, { id: 'quick-fix', @@ -133,7 +128,6 @@ export const mainHarness = new Harness({ instructions: 'You are a focused fix agent. Apply minimal, surgical fixes to resolve the specific issue. Do not refactor or optimize beyond what is necessary.', allowedHarnessTools: [], - defaultModelId: 'opencode/GLM-5-free', }, { id: 'deep-dive', diff --git a/src/mastra/mcp/index.ts b/src/mastra/mcp/index.ts index 9df374c4..7c84b405 100644 --- a/src/mastra/mcp/index.ts +++ b/src/mastra/mcp/index.ts @@ -130,7 +130,7 @@ export const a2aCoordinatorMcpServer = new MCPServer({ agents: { a2aCoordinator: a2aCoordinatorAgent, codingCoordinator: codingA2ACoordinator, - knowledgeIndexing: knowledgeIndexingAgent, + // knowledgeIndexing: knowledgeIndexingAgent, }, // resources: {}, prompts: { diff --git a/src/mastra/networks/AGENTS.md b/src/mastra/networks/AGENTS.md index 1eec4d95..3b7ae91a 100644 --- a/src/mastra/networks/AGENTS.md +++ b/src/mastra/networks/AGENTS.md @@ -29,7 +29,7 @@ Networks are routing agents that coordinate multiple specialized agents to handl ## Network Architecture -``` +```text ┌─────────────────────────────────────────────────────────────────┐ │ agentNetwork (Primary) │ │ Routes: research | stock | weather | content | general │ @@ -195,6 +195,7 @@ Networks are routing agents that coordinate multiple specialized agents to handl - Chain agents for complex multi-step workflows - Preserve context when passing between agents - Log routing decisions for debugging +- Use `@/src/mastra/agents/nestedAgents` when assigning child agents to a network's `agents` field; this is the repo's standard boundary for the current Mastra nested-agent typing limitation. --- @@ -202,5 +203,6 @@ Networks are routing agents that coordinate multiple specialized agents to handl | Version | Date (UTC) | Changes | | ------- | ---------- | ------------------------------------------------------------- | +| 2.0.1 | 2026-03-16 | Added standard guidance for `nestedAgents` when wiring child agents into networks. | | 2.0.0 | 2025-11-26 | Major update: 4 networks with workflows, architecture diagram | | 1.0.0 | 2025-11-14 | Initial version with agentNetwork | diff --git a/src/mastra/networks/businessIntelligenceNetwork.ts b/src/mastra/networks/businessIntelligenceNetwork.ts index c088c891..e2beb80f 100644 --- a/src/mastra/networks/businessIntelligenceNetwork.ts +++ b/src/mastra/networks/businessIntelligenceNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { dataIngestionAgent } from '../agents/dataIngestionAgent' import { dataTransformationAgent } from '../agents/dataTransformationAgent' import { evaluationAgent } from '../agents/evaluationAgent' @@ -171,7 +172,7 @@ export const businessIntelligenceNetwork = new Agent({ `, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ dataIngestionAgent, dataTransformationAgent, reportAgent, @@ -179,7 +180,7 @@ export const businessIntelligenceNetwork = new Agent({ researchAgent, evaluationAgent, chartSupervisorAgent, - }, + }), options: {}, // tools: { confirmationTool }, outputProcessors: [ diff --git a/src/mastra/networks/codingTeamNetwork.ts b/src/mastra/networks/codingTeamNetwork.ts index 9e7662ef..52fe378f 100644 --- a/src/mastra/networks/codingTeamNetwork.ts +++ b/src/mastra/networks/codingTeamNetwork.ts @@ -7,6 +7,7 @@ import type { import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { codeArchitectAgent, codeReviewerAgent, @@ -92,11 +93,7 @@ async function evaluateQuality(text: string): Promise { positives.reduce((acc, kw) => acc + (lower.includes(kw) ? 0.05 : 0), 0) ) - const score = Math.max( - 0, - Math.min(1, lengthScore * negativeScore + positiveBoost) - ) - return score + return Math.max(0, Math.min(1, lengthScore * negativeScore + positiveBoost)) } /** @@ -175,12 +172,12 @@ Invoke these for structured, multi-phase processes: model: google3, memory: upstashMemory, options: {}, - agents: { + agents: asNestedAgents({ codeArchitectAgent, codeReviewerAgent, testEngineerAgent, refactoringAgent, - }, + }), tools: {}, workflows: { researchSynthesisWorkflow, diff --git a/src/mastra/networks/contentCreationNetwork.ts b/src/mastra/networks/contentCreationNetwork.ts index 8cd7d155..cd6e0847 100644 --- a/src/mastra/networks/contentCreationNetwork.ts +++ b/src/mastra/networks/contentCreationNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { contentStrategistAgent } from '../agents/contentStrategistAgent' import { copywriterAgent } from '../agents/copywriterAgent' import { editorAgent } from '../agents/editorAgent' @@ -109,13 +110,13 @@ export const contentCreationNetwork = new Agent({ `, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ copywriterAgent, editorAgent, contentStrategistAgent, scriptWriterAgent, evaluationAgent, - }, + }), workflows: { contentStudioWorkflow, contentReviewWorkflow, diff --git a/src/mastra/networks/dataPipelineNetwork.ts b/src/mastra/networks/dataPipelineNetwork.ts index d90c039b..956056db 100644 --- a/src/mastra/networks/dataPipelineNetwork.ts +++ b/src/mastra/networks/dataPipelineNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { dataExportAgent } from '../agents/dataExportAgent' import { dataIngestionAgent } from '../agents/dataIngestionAgent' import { dataTransformationAgent } from '../agents/dataTransformationAgent' @@ -84,12 +85,12 @@ For complex requests requiring multiple agents: model: googleAI, memory: pgMemory, options: {}, - agents: { + agents: asNestedAgents({ dataExportAgent, dataIngestionAgent, dataTransformationAgent, reportAgent, - }, + }), tools: { confirmationTool }, workflows: { stockAnalysisWorkflow, diff --git a/src/mastra/networks/devopsNetwork.ts b/src/mastra/networks/devopsNetwork.ts index 0efe02a7..a313d13a 100644 --- a/src/mastra/networks/devopsNetwork.ts +++ b/src/mastra/networks/devopsNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { codeArchitectAgent, codeReviewerAgent, @@ -159,7 +160,7 @@ export const devopsNetwork = new Agent({ `, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ codeArchitectAgent, codeReviewerAgent, testEngineerAgent, @@ -167,7 +168,7 @@ export const devopsNetwork = new Agent({ danePackagePublisher, projectManagementAgent, evaluationAgent, - }, + }), options: {}, tools: { confirmationTool }, outputProcessors: [ diff --git a/src/mastra/networks/financialIntelligenceNetwork.ts b/src/mastra/networks/financialIntelligenceNetwork.ts index a88a5a77..3a540787 100644 --- a/src/mastra/networks/financialIntelligenceNetwork.ts +++ b/src/mastra/networks/financialIntelligenceNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { chartDataProcessorAgent, chartGeneratorAgent, @@ -134,7 +135,7 @@ export const financialIntelligenceNetwork = new Agent({ `, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ stockAnalysisAgent, researchAgent, chartSupervisorAgent, @@ -142,7 +143,7 @@ export const financialIntelligenceNetwork = new Agent({ chartGeneratorAgent, chartTypeAdvisorAgent, reportAgent, - }, + }), workflows: { financialReportWorkflow, stockAnalysisWorkflow, diff --git a/src/mastra/networks/index.ts b/src/mastra/networks/index.ts index a046bd42..4e7d8311 100644 --- a/src/mastra/networks/index.ts +++ b/src/mastra/networks/index.ts @@ -1,4 +1,5 @@ import { Agent } from '@mastra/core/agent' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { copywriterAgent } from '../agents/copywriterAgent' import { editorAgent } from '../agents/editorAgent' import { reportAgent } from '../agents/reportAgent' @@ -89,7 +90,7 @@ export const agentNetwork = new Agent({ model: googleAI, memory: pgMemory, // Required for network capabilities options: {}, - agents: { + agents: asNestedAgents({ researchAgent, stockAnalysisAgent, weatherAgent, @@ -101,7 +102,7 @@ export const agentNetwork = new Agent({ translationAgent, customerSupportAgent, projectManagementAgent, - }, + }), // tools: { confirmationTool }, scorers: {}, workflows: { weatherWorkflow }, diff --git a/src/mastra/networks/learningNetwork.ts b/src/mastra/networks/learningNetwork.ts index e1381148..1615554c 100644 --- a/src/mastra/networks/learningNetwork.ts +++ b/src/mastra/networks/learningNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { documentProcessingAgent } from '../agents/documentProcessingAgent' import { evaluationAgent } from '../agents/evaluationAgent' import { knowledgeIndexingAgent } from '../agents/knowledgeIndexingAgent' @@ -118,13 +119,13 @@ export const learningNetwork = new Agent({ `, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ learningExtractionAgent, knowledgeIndexingAgent, researchAgent, documentProcessingAgent, evaluationAgent, - }, + }), workflows: { learningExtractionWorkflow, researchSynthesisWorkflow, diff --git a/src/mastra/networks/marketingAutomationNetwork.ts b/src/mastra/networks/marketingAutomationNetwork.ts index 461fa7be..c2d938f9 100644 --- a/src/mastra/networks/marketingAutomationNetwork.ts +++ b/src/mastra/networks/marketingAutomationNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { contentStrategistAgent } from '../agents/contentStrategistAgent' import { copywriterAgent } from '../agents/copywriterAgent' import { researchAgent } from '../agents/researchAgent' @@ -156,14 +157,14 @@ export const marketingAutomationNetwork = new Agent({ `, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ socialMediaAgent, seoAgent, copywriterAgent, contentStrategistAgent, researchAgent, translationAgent, - }, + }), options: {}, // tools: { confirmationTool }, outputProcessors: [ diff --git a/src/mastra/networks/reportGenerationNetwork.ts b/src/mastra/networks/reportGenerationNetwork.ts index 6fdc309e..2f59db7f 100644 --- a/src/mastra/networks/reportGenerationNetwork.ts +++ b/src/mastra/networks/reportGenerationNetwork.ts @@ -3,6 +3,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { dataIngestionAgent } from '../agents/dataIngestionAgent' import { dataTransformationAgent } from '../agents/dataTransformationAgent' import { reportAgent } from '../agents/reportAgent' @@ -121,12 +122,12 @@ export const reportGenerationNetwork = new Agent({ // options: { // tracingPolicy: { internal: InternalSpans.ALL }, // }, - agents: { + agents: asNestedAgents({ dataIngestionAgent, dataTransformationAgent, researchAgent, reportAgent, - }, + }), // tools: { confirmationTool }, workflows: { weatherWorkflow, diff --git a/src/mastra/networks/researchPipelineNetwork.ts b/src/mastra/networks/researchPipelineNetwork.ts index ed0ed339..679f1fb9 100644 --- a/src/mastra/networks/researchPipelineNetwork.ts +++ b/src/mastra/networks/researchPipelineNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { documentProcessingAgent } from '../agents/documentProcessingAgent' import { knowledgeIndexingAgent } from '../agents/knowledgeIndexingAgent' import { researchAgent } from '../agents/researchAgent' @@ -134,12 +135,12 @@ Use for: building research knowledge bases, literature reviews, indexing academi }, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ researchPaperAgent, documentProcessingAgent, knowledgeIndexingAgent, researchAgent, - }, + }), workflows: { documentProcessingWorkflow, contentReviewWorkflow, diff --git a/src/mastra/networks/securityNetwork.ts b/src/mastra/networks/securityNetwork.ts index 74bbe0a7..269d16ad 100644 --- a/src/mastra/networks/securityNetwork.ts +++ b/src/mastra/networks/securityNetwork.ts @@ -2,6 +2,7 @@ import { Agent } from '@mastra/core/agent' import { TokenLimiterProcessor } from '@mastra/core/processors' +import { asNestedAgents } from '@/src/mastra/agents/nestedAgents' import { codeReviewerAgent } from '../agents/codingAgents' import { evaluationAgent } from '../agents/evaluationAgent' import { reportAgent } from '../agents/reportAgent' @@ -165,12 +166,12 @@ export const securityNetwork = new Agent({ `, model: googleAI3, memory: pgMemory, - agents: { + agents: asNestedAgents({ codeReviewerAgent, evaluationAgent, researchAgent, reportAgent, - }, + }), // tools: { confirmationTool }, options: {}, diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/agent.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/agent.tsx index e83af14f..a9313a4f 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/agent.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/agent.tsx @@ -8,7 +8,7 @@ import { AgentOutput, AgentTool, AgentTools, -} from "@/components/ai-elements/agent"; +} from "@/src/components/ai-elements/agent"; import { z } from "zod"; const webSearchTool = { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/artifact.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/artifact.tsx index eb130636..9fdc797b 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/artifact.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/artifact.tsx @@ -8,8 +8,8 @@ import { ArtifactDescription, ArtifactHeader, ArtifactTitle, -} from "@/components/ai-elements/artifact"; -import { CodeBlock } from "@/components/ai-elements/code-block"; +} from "@/src/components/ai-elements/artifact"; +import { CodeBlock } from "@/src/components/ai-elements/code-block"; import { CopyIcon, DownloadIcon, diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-inline.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-inline.tsx index ae931a55..8381612f 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-inline.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-inline.tsx @@ -11,7 +11,7 @@ import { Attachments, getAttachmentLabel, getMediaCategory, -} from "@/components/ai-elements/attachments"; +} from "@/src/components/ai-elements/attachments"; import { nanoid } from "nanoid"; import { memo, useCallback, useState } from "react"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-list.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-list.tsx index b363dea9..4068228e 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-list.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments-list.tsx @@ -6,7 +6,7 @@ import { AttachmentPreview, AttachmentRemove, Attachments, -} from "@/components/ai-elements/attachments"; +} from "@/src/components/ai-elements/attachments"; import { nanoid } from "nanoid"; import { memo, useCallback, useState } from "react"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments.tsx index fc8e4490..52367e71 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/attachments.tsx @@ -5,7 +5,7 @@ import { AttachmentPreview, AttachmentRemove, Attachments, -} from "@/components/ai-elements/attachments"; +} from "@/src/components/ai-elements/attachments"; import { nanoid } from "nanoid"; import { memo, useCallback, useState } from "react"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player-remote.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player-remote.tsx index 19d8d89d..83f79efc 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player-remote.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player-remote.tsx @@ -12,7 +12,7 @@ import { AudioPlayerTimeDisplay, AudioPlayerTimeRange, AudioPlayerVolumeRange, -} from "@/components/ai-elements/audio-player"; +} from "@/src/components/ai-elements/audio-player"; const Example = () => (
diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player.tsx index 8ef7ff2b..56373ecc 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/audio-player.tsx @@ -14,7 +14,7 @@ import { AudioPlayerTimeDisplay, AudioPlayerTimeRange, AudioPlayerVolumeRange, -} from "@/components/ai-elements/audio-player"; +} from "@/src/components/ai-elements/audio-player"; import { useEffect, useState } from "react"; const Example = () => { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/chain-of-thought.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/chain-of-thought.tsx index 04dac445..c2eac6f8 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/chain-of-thought.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/chain-of-thought.tsx @@ -8,8 +8,8 @@ import { ChainOfThoughtSearchResult, ChainOfThoughtSearchResults, ChainOfThoughtStep, -} from "@/components/ai-elements/chain-of-thought"; -import { Image } from "@/components/ai-elements/image"; +} from "@/src/components/ai-elements/chain-of-thought"; +import { Image } from "@/src/components/ai-elements/image"; import { ImageIcon, SearchIcon } from "lucide-react"; const exampleImage = { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/checkpoint.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/checkpoint.tsx index 426f0a8a..2a896392 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/checkpoint.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/checkpoint.tsx @@ -4,13 +4,13 @@ import { Checkpoint, CheckpointIcon, CheckpointTrigger, -} from "@/components/ai-elements/checkpoint"; -import { Conversation, ConversationContent } from "@/components/ai-elements/conversation"; +} from "@/src/components/ai-elements/checkpoint"; +import { Conversation, ConversationContent } from "@/src/components/ai-elements/conversation"; import { Message, MessageContent, MessageResponse, -} from "@/components/ai-elements/message"; +} from "@/src/components/ai-elements/message"; import { nanoid } from "nanoid"; import { Fragment, memo, useCallback, useState } from "react"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block-dark.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block-dark.tsx index cbafe3f5..2e2385dd 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block-dark.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block-dark.tsx @@ -7,7 +7,7 @@ import { CodeBlockFilename, CodeBlockHeader, CodeBlockTitle, -} from "@/components/ai-elements/code-block"; +} from "@/src/components/ai-elements/code-block"; import { FileIcon } from "lucide-react"; const handleCopy = () => { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block.tsx index a0547ecd..14f173aa 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/code-block.tsx @@ -14,7 +14,7 @@ import { CodeBlockLanguageSelectorTrigger, CodeBlockLanguageSelectorValue, CodeBlockTitle, -} from "@/components/ai-elements/code-block"; +} from "@/src/components/ai-elements/code-block"; import { FileIcon } from "lucide-react"; import { useCallback, useState } from "react"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/commit.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/commit.tsx index 53a4e082..d483eb8b 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/commit.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/commit.tsx @@ -23,7 +23,7 @@ import { CommitMetadata, CommitSeparator, CommitTimestamp, -} from "@/components/ai-elements/commit"; +} from "@/src/components/ai-elements/commit"; const handleCopy = () => { console.log("Copied hash!"); diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-accepted.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-accepted.tsx index 5e112d2c..21d29b5f 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-accepted.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-accepted.tsx @@ -6,7 +6,7 @@ import { ConfirmationRejected, ConfirmationRequest, ConfirmationTitle, -} from "@/components/ai-elements/confirmation"; +} from "@/src/components/ai-elements/confirmation"; import { CheckIcon, XIcon } from "lucide-react"; import { nanoid } from "nanoid"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-rejected.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-rejected.tsx index d29e650a..15b38610 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-rejected.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-rejected.tsx @@ -6,7 +6,7 @@ import { ConfirmationRejected, ConfirmationRequest, ConfirmationTitle, -} from "@/components/ai-elements/confirmation"; +} from "@/src/components/ai-elements/confirmation"; import { CheckIcon, XIcon } from "lucide-react"; import { nanoid } from "nanoid"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-request.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-request.tsx index 1fd68542..d082b9f5 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-request.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation-request.tsx @@ -8,7 +8,7 @@ import { ConfirmationRejected, ConfirmationRequest, ConfirmationTitle, -} from "@/components/ai-elements/confirmation"; +} from "@/src/components/ai-elements/confirmation"; import { CheckIcon, XIcon } from "lucide-react"; import { nanoid } from "nanoid"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation.tsx index 5120b319..39392e4a 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/confirmation.tsx @@ -8,7 +8,7 @@ import { ConfirmationRejected, ConfirmationRequest, ConfirmationTitle, -} from "@/components/ai-elements/confirmation"; +} from "@/src/components/ai-elements/confirmation"; import { CheckIcon, XIcon } from "lucide-react"; import { nanoid } from "nanoid"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/context.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/context.tsx index 3ed101a4..eebc5535 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/context.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/context.tsx @@ -11,7 +11,7 @@ import { ContextOutputUsage, ContextReasoningUsage, ContextTrigger, -} from "@/components/ai-elements/context"; +} from "@/src/components/ai-elements/context"; const Example = () => (
diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/conversation.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/conversation.tsx index 15de5c0a..7b90f793 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/conversation.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/conversation.tsx @@ -6,8 +6,8 @@ import { ConversationDownload, ConversationEmptyState, ConversationScrollButton, -} from "@/components/ai-elements/conversation"; -import { Message, MessageContent } from "@/components/ai-elements/message"; +} from "@/src/components/ai-elements/conversation"; +import { Message, MessageContent } from "@/src/components/ai-elements/message"; import { MessageSquareIcon } from "lucide-react"; import { nanoid } from "nanoid"; import { useEffect, useState } from "react"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/environment-variables.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/environment-variables.tsx index 703accd8..baa1184d 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/environment-variables.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/environment-variables.tsx @@ -12,7 +12,7 @@ import { EnvironmentVariablesTitle, EnvironmentVariablesToggle, EnvironmentVariableValue, -} from "@/components/ai-elements/environment-variables"; +} from "@/src/components/ai-elements/environment-variables"; const variables = [ { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-basic.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-basic.tsx index f9455fd0..26b997ad 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-basic.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-basic.tsx @@ -4,7 +4,7 @@ import { FileTree, FileTreeFile, FileTreeFolder, -} from "@/components/ai-elements/file-tree"; +} from "@/src/components/ai-elements/file-tree"; const Example = () => ( diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-expanded.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-expanded.tsx index 53126275..a12fdd2a 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-expanded.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-expanded.tsx @@ -4,7 +4,7 @@ import { FileTree, FileTreeFile, FileTreeFolder, -} from "@/components/ai-elements/file-tree"; +} from "@/src/components/ai-elements/file-tree"; const Example = () => ( diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-selection.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-selection.tsx index 6cc489fb..1f810c63 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-selection.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree-selection.tsx @@ -4,7 +4,7 @@ import { FileTree, FileTreeFile, FileTreeFolder, -} from "@/components/ai-elements/file-tree"; +} from "@/src/components/ai-elements/file-tree"; import { useState } from "react"; const Example = () => { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree.tsx index 2f26deaf..e342eaaa 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/file-tree.tsx @@ -4,7 +4,7 @@ import { FileTree, FileTreeFile, FileTreeFolder, -} from "@/components/ai-elements/file-tree"; +} from "@/src/components/ai-elements/file-tree"; import { useState } from "react"; const Example = () => { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/image.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/image.tsx index 6f0448e0..4c177e08 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/image.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/image.tsx @@ -1,6 +1,6 @@ "use client"; -import { Image } from "@/components/ai-elements/image"; +import { Image } from "@/src/components/ai-elements/image"; const exampleImage = { base64: diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/inline-citation.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/inline-citation.tsx index 2616d472..03918e84 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/inline-citation.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/inline-citation.tsx @@ -14,7 +14,7 @@ import { InlineCitationCarouselPrev, InlineCitationSource, InlineCitationText, -} from "@/components/ai-elements/inline-citation"; +} from "@/src/components/ai-elements/inline-citation"; const citation = { sources: [ diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/jsx-preview.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/jsx-preview.tsx index d198ed58..bf5dbee0 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/jsx-preview.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/jsx-preview.tsx @@ -4,8 +4,8 @@ import { JSXPreview, JSXPreviewContent, JSXPreviewError, -} from "@/components/ai-elements/jsx-preview"; -import { Button } from "@/components/ui/button"; +} from "@/src/components/ai-elements/jsx-preview"; +import { Button } from "@/src/components/ui/button"; import { useCallback, useEffect, useRef, useState } from "react"; const handleError = (error: Error) => { diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/message.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/message.tsx index 892ae751..a283debd 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/message.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/message.tsx @@ -5,7 +5,7 @@ import { AttachmentPreview, AttachmentRemove, Attachments, -} from "@/components/ai-elements/attachments"; +} from "@/src/components/ai-elements/attachments"; import { Message, MessageAction, @@ -19,7 +19,7 @@ import { MessageContent, MessageResponse, MessageToolbar, -} from "@/components/ai-elements/message"; +} from "@/src/components/ai-elements/message"; import { CopyIcon, RefreshCcwIcon, diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/mic-selector.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/mic-selector.tsx index 34ff88d6..891767e2 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/mic-selector.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/mic-selector.tsx @@ -10,7 +10,7 @@ import { MicSelectorList, MicSelectorTrigger, MicSelectorValue, -} from "@/components/ai-elements/mic-selector"; +} from "@/src/components/ai-elements/mic-selector"; const handleOpenChange = (open: boolean) => { console.log("MicSelector is open?", open); diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/model-selector.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/model-selector.tsx index 5864c152..3d7e326a 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/model-selector.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/model-selector.tsx @@ -12,8 +12,8 @@ import { ModelSelectorLogoGroup, ModelSelectorName, ModelSelectorTrigger, -} from "@/components/ai-elements/model-selector"; -import { Button } from "@/components/ui/button"; +} from "@/src/components/ai-elements/model-selector"; +import { Button } from "@/ui/button"; import { CheckIcon } from "lucide-react"; import { memo, useCallback, useState } from "react"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/open-in-chat.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/open-in-chat.tsx index d47f0341..30c43f91 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/open-in-chat.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/open-in-chat.tsx @@ -10,7 +10,7 @@ import { OpenInT3, OpenInTrigger, OpenInv0, -} from "@/components/ai-elements/open-in-chat"; +} from "@/src/components/ai-elements/open-in-chat"; const Example = () => { const sampleQuery = "How can I implement authentication in Next.js?"; diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-command.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-command.tsx index 779c604d..20c9a4a1 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-command.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-command.tsx @@ -1,16 +1,16 @@ "use client"; -import type { PersonaState } from "@/components/ai-elements/persona"; +import type { PersonaState } from "@/src/components/ai-elements/persona"; import type { LucideIcon } from "lucide-react"; -import { Persona } from "@/components/ai-elements/persona"; -import { Button } from "@/components/ui/button"; -import { ButtonGroup } from "@/components/ui/button-group"; +import { Persona } from "@/src/components/ai-elements/persona"; +import { Button } from "@/ui/button"; +import { ButtonGroup } from "@/ui/button-group"; import { Tooltip, TooltipContent, TooltipTrigger, -} from "@/components/ui/tooltip"; +} from "@/ui/tooltip"; import { BrainIcon, CircleIcon, diff --git a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-glint.tsx b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-glint.tsx index c02d863a..fbf8b05d 100644 --- a/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-glint.tsx +++ b/src/mastra/public/workspace/workspace/skills/ai-elements/scripts/persona-glint.tsx @@ -1,16 +1,16 @@ "use client"; -import type { PersonaState } from "@/components/ai-elements/persona"; +import type { PersonaState } from "@/src/components/ai-elements/persona"; import type { LucideIcon } from "lucide-react"; -import { Persona } from "@/components/ai-elements/persona"; -import { Button } from "@/components/ui/button"; -import { ButtonGroup } from "@/components/ui/button-group"; +import { Persona } from "@/src/components/ai-elements/persona"; +import { Button } from "@/ui/button"; +import { ButtonGroup } from "@/ui/button-group"; import { Tooltip, TooltipContent, TooltipTrigger, -} from "@/components/ui/tooltip"; +} from "@/ui/tooltip"; import { BrainIcon, CircleIcon, diff --git a/src/mastra/tools/AGENTS.md b/src/mastra/tools/AGENTS.md index 3bb41888..8e3eec0c 100644 --- a/src/mastra/tools/AGENTS.md +++ b/src/mastra/tools/AGENTS.md @@ -256,9 +256,17 @@ See these docs for details and examples: - [ ] Add/verify `data-tool-progress` messages with `status` and `stage` - [ ] Add unit tests that mock `tracingContext.currentSpan.createChildSpan()` to assert spans are created/updated/ended +## Tool Definition Conventions + +- Keep tool configuration fields grouped predictably: `id`, `description`, `inputSchema`, `outputSchema`, hook callbacks (`onInputStart`, `onInputDelta`, `onInputAvailable`, `onOutput`), then `execute`. +- Prefer explicit schema constants plus `z.infer`-derived types when hook payloads or execute return values need additional local typing help. +- Avoid `z.any()` unless there is a strong boundary reason; prefer `z.unknown()` or a narrowed union/object schema. +- Default nullable booleans/strings/numbers explicitly inside `execute` even when schema defaults exist if strict analysis still sees nullable inputs. +- When a tool returns structured output and hooks inspect that output, define an `outputSchema` so hook payloads are strongly typed. + These rules help ensure consistent, filterable traces across Mastra and better integration with exporters and OTEL bridges. -#### Migration: Replacing OpenTelemetry usage in tools +### Migration: Replacing OpenTelemetry usage in tools If a tool currently imports and uses OpenTelemetry APIs directly (for example `trace.getTracer(...)`, `span.recordException(...)`, `span.setStatus(...)`), migrate it to the runtime `tracingContext` pattern above. Example migration: diff --git a/src/mastra/tools/alpha-vantage.tool.ts b/src/mastra/tools/alpha-vantage.tool.ts index be1afdee..18a0f7c0 100644 --- a/src/mastra/tools/alpha-vantage.tool.ts +++ b/src/mastra/tools/alpha-vantage.tool.ts @@ -220,12 +220,13 @@ export const alphaVantageCryptoTool = createTool({ (toolCallCounters.get('alpha-vantage-crypto') ?? 0) + 1 ) try { - const params = new URLSearchParams({ - apikey: apiKey, - function: inputData.function, - symbol: inputData.symbol, - market: inputData.market, - }) + const params = new URLSearchParams() + params.append('apikey', apiKey) + params.append('function', inputData.function) + params.append('symbol', inputData.symbol) + if (typeof inputData.market === 'string' && inputData.market !== '') { + params.append('market', inputData.market) + } // Add optional parameters if (inputData.interval !== undefined) { diff --git a/src/mastra/tools/chartjs.tool.ts b/src/mastra/tools/chartjs.tool.ts index c8ce8aee..23a5ada6 100644 --- a/src/mastra/tools/chartjs.tool.ts +++ b/src/mastra/tools/chartjs.tool.ts @@ -6,75 +6,127 @@ import { z } from 'zod' import { log, logToolExecution } from '../config/logger' import { downsampleTool } from './downsample.tool' -export const chartJsTool = createTool({ - id: 'chartjs-generator', - description: - 'Generates Chart.js configuration with technical indicators for UI visualization', - inputSchema: z.object({ - data: z - .array( - z.object({ - date: z.string(), - close: z.number(), - open: z.number().optional(), - high: z.number().optional(), - low: z.number().optional(), - volume: z.number().optional(), - }) - ) - .describe('Time series data'), - indicators: z - .array( +const ChartJsInputSchema = z.object({ + data: z + .array( + z.object({ + date: z.string(), + close: z.number(), + open: z.number().optional(), + high: z.number().optional(), + low: z.number().optional(), + volume: z.number().optional(), + }) + ) + .describe('Time series data'), + indicators: z + .array( + z.object({ + type: z.enum(['SMA', 'EMA', 'RSI', 'MACD', 'BollingerBands']), + period: z.number().optional().default(14), + color: z.string().optional(), + stdDev: z.number().optional(), + fastPeriod: z.number().optional(), + slowPeriod: z.number().optional(), + signalPeriod: z.number().optional(), + }) + ) + .optional() + .default([]) + .describe('Indicators to overlay'), + chartType: z + .enum(['line', 'bar', 'candlestick']) + .default('line') + .describe('Base chart type'), + title: z.string().optional(), +}) + +const ChartJsOutputSchema = z.object({ + config: z.object({ + type: z.string(), + data: z.object({ + labels: z.array(z.string()), + datasets: z.array( z.object({ - type: z.enum([ - 'SMA', - 'EMA', - 'RSI', - 'MACD', - 'BollingerBands', - ]), - period: z.number().optional().default(14), - color: z.string().optional(), - stdDev: z.number().optional(), - fastPeriod: z.number().optional(), - slowPeriod: z.number().optional(), - signalPeriod: z.number().optional(), + label: z.string().optional(), + data: z.array(z.union([z.number(), z.null()])), + borderColor: z.string().optional(), + backgroundColor: z.string().optional(), + type: z.string().optional(), + yAxisID: z.string().optional(), + order: z.number().optional(), + borderWidth: z.number().optional(), + pointRadius: z.number().optional(), + fill: z.union([z.boolean(), z.string()]).optional(), }) - ) - .optional() - .default([]) - .describe('Indicators to overlay'), - chartType: z - .enum(['line', 'bar', 'candlestick']) - .default('line') - .describe('Base chart type'), - title: z.string().optional(), - }), - outputSchema: z.object({ - config: z.object({ - type: z.string(), - data: z.object({ - labels: z.array(z.string()), - datasets: z.array( - z.object({ - label: z.string().optional(), - data: z.array(z.union([z.number(), z.null()])), - borderColor: z.string().optional(), - backgroundColor: z.string().optional(), - type: z.string().optional(), - yAxisID: z.string().optional(), - order: z.number().optional(), - borderWidth: z.number().optional(), - pointRadius: z.number().optional(), - fill: z.union([z.boolean(), z.string()]).optional(), - }) - ), - }), - options: z.record(z.string(), z.unknown()), + ), }), + options: z.record(z.string(), z.unknown()), }), +}) + +type ChartJsToolOutput = z.infer + +interface ChartJsDataset { + label?: string + data: Array + borderColor?: string + backgroundColor?: string + type?: string + yAxisID?: string + order?: number + borderWidth?: number + pointRadius?: number + fill?: boolean | string +} + +interface MacdPoint { + MACD: number + signal: number + histogram: number +} + +export const chartJsTool = createTool({ + id: 'chartjs-generator', + description: + 'Generates Chart.js configuration with technical indicators for UI visualization', + inputSchema: ChartJsInputSchema, + outputSchema: ChartJsOutputSchema, + onInputStart: ({ toolCallId, messages }) => { + log.info('Chart.js generator tool input streaming started', { + toolCallId, + messages: messages.length, + hook: 'onInputStart', + }) + }, + onInputDelta: ({ inputTextDelta, toolCallId, messages }) => { + log.info('Chart.js generator tool received input chunk', { + toolCallId, + inputTextDelta, + messages: messages.length, + hook: 'onInputDelta', + }) + }, + onInputAvailable: ({ input, toolCallId, messages }) => { + log.info('Chart.js generator tool received input', { + toolCallId, + inputData: input, + messages: messages.length, + hook: 'onInputAvailable', + }) + }, + onOutput: ({ output, toolCallId, toolName }) => { + log.info('Chart.js generator tool completed', { + toolCallId, + toolName, + output, + hook: 'onOutput', + }) + }, execute: async (input, context) => { - const { data, indicators, chartType, title } = input + const { data, title } = input + const indicators = input.indicators ?? [] + const chartType = input.chartType ?? 'line' await context?.writer?.custom({ type: 'data-tool-progress', @@ -120,19 +172,6 @@ export const chartJsTool = createTool({ const labels = data.map((d) => d.date) const closePrices = data.map((d) => d.close) - interface ChartJsDataset { - label?: string - data: Array - borderColor?: string - backgroundColor?: string - type?: string - yAxisID?: string - order?: number - borderWidth?: number - pointRadius?: number - fill?: boolean | string - } - const datasets: ChartJsDataset[] = [] // Base price dataset @@ -146,13 +185,7 @@ export const chartJsTool = createTool({ order: 1, }) - let config: - | { - type: string - data: { labels: string[]; datasets: ChartJsDataset[] } - options: Record - } - | undefined + let config: ChartJsToolOutput['config'] | null = null try { // Calculate indicators @@ -165,7 +198,7 @@ export const chartJsTool = createTool({ switch (ind.type) { case 'SMA': { const sma = (SMA.calculate({ - period: ind.period, + period: ind.period ?? 14, values: closePrices, })) ?? [] label = `SMA (${ind.period})` @@ -186,7 +219,7 @@ export const chartJsTool = createTool({ } case 'EMA': { const ema = EMA.calculate({ - period: ind.period, + period: ind.period ?? 14, values: closePrices, }) ?? [] label = `EMA (${ind.period})` @@ -204,7 +237,7 @@ export const chartJsTool = createTool({ } case 'RSI': { const rsiValues = (RSI.calculate({ - period: ind.period, + period: ind.period ?? 14, values: closePrices, }) ?? []) label = `RSI (${ind.period})` @@ -233,18 +266,12 @@ export const chartJsTool = createTool({ values: closePrices, SimpleMAOscillator: false, SimpleMASignal: false, - }) ?? []) as Array> + }) ?? []) as MacdPoint[] // Ensure the mapped series are typed as numbers to avoid `any[]` assignments - const macd = macdResult.map((m: Record) => - Number((m.MACD) as number) - ) - const signal = macdResult.map((m: Record) => - Number((m.signal) as number) - ) - const histogram = macdResult.map((m: Record) => - Number((m.histogram) as number) - ) + const macd = macdResult.map((m) => Number(m.MACD)) + const signal = macdResult.map((m) => Number(m.signal)) + const histogram = macdResult.map((m) => Number(m.histogram)) const padding = Array( closePrices.length - macd.length @@ -280,7 +307,7 @@ export const chartJsTool = createTool({ case 'BollingerBands': { const bb = (BollingerBands.calculate({ - period: ind.period, + period: ind.period ?? 14, stdDev: ind.stdDev ?? 2, values: closePrices, }) ?? []) as Array<{ @@ -371,16 +398,9 @@ export const chartJsTool = createTool({ // Build new labels and datasets sampled at the chosen indices finalLabels = indices.map((i) => labels[i]) finalDatasets = datasets.map((ds) => { - const dsData = (ds as { data?: unknown }).data - const dsArr = Array.isArray(dsData) - ? (dsData as unknown[]) - : [] return { ...ds, - data: indices.map((idx) => { - const v = dsArr[idx] - return typeof v === 'number' ? v : null - }), + data: indices.map((idx) => ds.data[idx] ?? null), } }) } catch (e) { @@ -452,6 +472,10 @@ export const chartJsTool = createTool({ toolSpan?.end() // Log tool execution success + if (config === null) { + throw new Error('Chart configuration generation failed') + } + logToolExecution( 'chartjs-generator', { dataCount: data.length, indicatorsCount: indicators.length }, @@ -461,9 +485,9 @@ export const chartJsTool = createTool({ durationMs: duration, } ) - } catch (e: unknown) { - // Cast unknown to Error when reporting to span - const err = e instanceof Error ? e : new Error(String(e)) + } catch (error) { + const err = + error instanceof Error ? error : new Error(String(error)) toolSpan?.error({ error: err, endSpan: true }) // Log error to central logger log.error('chartjs-generator failed', { error: err.message }) @@ -473,7 +497,7 @@ export const chartJsTool = createTool({ { dataCount: data.length, indicatorsCount: indicators.length }, { success: false, error: err.message } ) - throw e + throw err } await context?.writer?.custom({ @@ -488,67 +512,6 @@ export const chartJsTool = createTool({ return { config } }, - onInputStart: ({ - toolCallId, - messages, - }: { - toolCallId: string - messages: unknown[] - }) => { - log.info('Chart.js generator tool input streaming started', { - toolCallId, - messages: Array.isArray(messages) ? messages.length : 0, - hook: 'onInputStart', - }) - }, - onInputDelta: ({ - inputTextDelta, - toolCallId, - messages, - }: { - inputTextDelta: string - toolCallId: string - messages: unknown[] - }) => { - log.info('Chart.js generator tool received input chunk', { - toolCallId, - inputTextDelta, - messages: Array.isArray(messages) ? messages.length : 0, - hook: 'onInputDelta', - }) - }, - onInputAvailable: ({ - input, - toolCallId, - messages, - }: { - input: unknown - toolCallId: string - messages: unknown[] - }) => { - log.info('Chart.js generator tool received input', { - toolCallId, - inputData: input, - messages: Array.isArray(messages) ? messages.length : 0, - hook: 'onInputAvailable', - }) - }, - onOutput: ({ - output, - toolCallId, - toolName, - }: { - output: unknown - toolCallId: string - toolName: string - }) => { - log.info('Chart.js generator tool completed', { - toolCallId, - toolName, - output, - hook: 'onOutput', - }) - }, }) export type ChartJsUITool = InferUITool diff --git a/src/mastra/tools/code-chunking.ts b/src/mastra/tools/code-chunking.ts index 7eaaa457..86af5f4f 100644 --- a/src/mastra/tools/code-chunking.ts +++ b/src/mastra/tools/code-chunking.ts @@ -45,11 +45,8 @@ export const codeChunkerTool = createTool({ 'Intelligently chunks code files based on syntax (functions, classes) for TS/JS and Python, falling back to recursive chunking for others.', inputSchema: codeChunkingInputSchema, outputSchema: codeChunkingOutputSchema, - execute: async ( - input: z.infer, - context - ) => { - const { filePath, content, options } = input + execute: async (inputData, context) => { + const { filePath, content, options } = inputData const requestContext = context?.requestContext as | CodeChunkingRequestContext | undefined diff --git a/src/mastra/tools/color-change-tool.ts b/src/mastra/tools/color-change-tool.ts index 44062c7d..d7c40242 100644 --- a/src/mastra/tools/color-change-tool.ts +++ b/src/mastra/tools/color-change-tool.ts @@ -17,12 +17,56 @@ export function changeBgColor(color: string) { } } +const ColorChangeInputSchema = z.object({ + color: z.string(), +}) + +const ColorChangeOutputSchema = z.object({ + success: z.boolean(), + color: z.string(), +}) + export const colorChangeTool = createTool({ id: 'changeColor', description: 'Changes the background color', - inputSchema: z.object({ - color: z.string(), - }), + inputSchema: ColorChangeInputSchema, + outputSchema: ColorChangeOutputSchema, + onInputStart: ({ toolCallId, messages, abortSignal }) => { + log.info('Color change tool input streaming started', { + toolCallId, + messageCount: messages.length, + abortSignal: abortSignal?.aborted, + hook: 'onInputStart', + }) + }, + onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { + log.info('Color change received input chunk', { + toolCallId, + inputTextDelta, + messageCount: messages.length, + abortSignal: abortSignal?.aborted, + hook: 'onInputDelta', + }) + }, + onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { + log.info('Color change received complete input', { + toolCallId, + messageCount: messages.length, + abortSignal: abortSignal?.aborted, + color: input.color, + hook: 'onInputAvailable', + }) + }, + onOutput: ({ output, toolCallId, toolName, abortSignal }) => { + log.info('Color change completed', { + toolCallId, + toolName, + abortSignal: abortSignal?.aborted, + success: output.success, + color: output.color, + hook: 'onOutput', + }) + }, execute: async (input, context) => { const { color } = input const writer = context?.writer @@ -112,40 +156,4 @@ export const colorChangeTool = createTool({ throw error } }, - onInputStart: ({ toolCallId, messages, abortSignal }) => { - log.info('Color change tool input streaming started', { - toolCallId, - messageCount: messages.length, - abortSignal: abortSignal?.aborted, - hook: 'onInputStart', - }) - }, - onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { - log.info('Color change received input chunk', { - toolCallId, - inputTextDelta, - messageCount: messages.length, - abortSignal: abortSignal?.aborted, - hook: 'onInputDelta', - }) - }, - onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { - log.info('Color change received complete input', { - toolCallId, - messageCount: messages.length, - abortSignal: abortSignal?.aborted, - color: input.color, - hook: 'onInputAvailable', - }) - }, - onOutput: ({ output, toolCallId, toolName, abortSignal }) => { - log.info('Color change completed', { - toolCallId, - toolName, - abortSignal: abortSignal?.aborted, - success: output.success, - color: output.color, - hook: 'onOutput', - }) - }, }) diff --git a/src/mastra/tools/confirmation.tool.ts b/src/mastra/tools/confirmation.tool.ts index 26948e94..6c91f487 100644 --- a/src/mastra/tools/confirmation.tool.ts +++ b/src/mastra/tools/confirmation.tool.ts @@ -70,10 +70,14 @@ const confirmationTool = createTool({ }) rootSpan?.end() - return suspend?.({ - message: `Please confirm: ${action}`, - action, - }) + if (typeof suspend === 'function') { + await suspend({ + message: `Please confirm: ${action}`, + action, + }) + } + + return { confirmed: false, action } } const result = { confirmed: true, action } diff --git a/src/mastra/tools/csv-to-json.tool.ts b/src/mastra/tools/csv-to-json.tool.ts index fb0cd0b1..c535a951 100644 --- a/src/mastra/tools/csv-to-json.tool.ts +++ b/src/mastra/tools/csv-to-json.tool.ts @@ -261,11 +261,18 @@ export const csvToJsonTool = createTool({ }) }, onOutput: ({ output, toolCallId, toolName, abortSignal }) => { + const recordsProcessed = + typeof output === 'object' && + output !== null && + 'data' in output && + Array.isArray((output as { data?: unknown }).data) + ? ((output as { data: unknown[] }).data).length + : 0 log.info('CSV to JSON conversion completed', { toolCallId, toolName, abortSignal: abortSignal?.aborted, - recordsProcessed: output.data.length, + recordsProcessed, hook: 'onOutput', }) }, diff --git a/src/mastra/tools/data-processing-tools.ts b/src/mastra/tools/data-processing-tools.ts index 689be2ab..a59e884d 100644 --- a/src/mastra/tools/data-processing-tools.ts +++ b/src/mastra/tools/data-processing-tools.ts @@ -97,21 +97,21 @@ const ExcalidrawElementSchema = z.object({ opacity: z.number().default(100), angle: z.number().default(0), points: z.array(z.array(z.number())).optional(), - startBinding: z.any().optional(), - endBinding: z.any().optional(), - arrowheads: z.any().optional(), + startBinding: z.unknown().optional(), + endBinding: z.unknown().optional(), + arrowheads: z.unknown().optional(), fontSize: z.number().optional(), fontFamily: z.number().optional(), textAlign: z.enum(['left', 'center', 'right']).optional(), verticalAlign: z.enum(['top', 'middle', 'bottom']).optional(), groupIds: z.array(z.string()).optional(), frameId: z.string().nullable().optional(), - roundness: z.any().optional(), + roundness: z.unknown().optional(), seed: z.number().default(Math.floor(Math.random() * 1000000)), version: z.number().default(1), versionNonce: z.number().default(Math.floor(Math.random() * 1000000)), isDeleted: z.boolean().default(false), - boundElements: z.any().optional(), + boundElements: z.unknown().optional(), updated: z.number().default(Date.now()), link: z.string().nullable().optional(), locked: z.boolean().default(false), @@ -128,7 +128,7 @@ const ExcalidrawSchema = z.object({ gridModeEnabled: z.boolean().optional(), viewBackgroundColor: z.string(), }), - files: z.record(z.string(), z.any()).optional(), + files: z.record(z.string(), z.unknown()).optional(), }) // Type aliases derived from Zod schemas to avoid using `any` @@ -655,7 +655,7 @@ export const validateDataTool = createTool({ id: 'validate-data', description: 'Validates data against a specified schema', inputSchema: z.object({ - data: z.any().describe('Data to validate'), + data: z.unknown().describe('Data to validate'), schemaType: z.enum(['excalidraw', 'csv', 'json', 'xml']), strict: z.boolean().optional().default(true), }), @@ -663,7 +663,7 @@ export const validateDataTool = createTool({ isValid: z.boolean(), errors: z.array(z.string()), warnings: z.array(z.string()), - validatedData: z.any().optional(), + validatedData: z.unknown().optional(), }), execute: async (inputData, context) => { @@ -1062,8 +1062,32 @@ export const excalidrawToSVGTool = createTool({ } // Convert to SVG + type ExcalidrawSvgInput = Parameters[0] + const svgReadyData: ExcalidrawSvgInput = { + ...inputData.excalidrawData, + elements: inputData.excalidrawData.elements.map((element) => ({ + ...element, + angle: element.angle ?? 0, + strokeColor: element.strokeColor ?? '#000000', + backgroundColor: element.backgroundColor ?? 'transparent', + fillStyle: element.fillStyle ?? 'solid', + strokeWidth: element.strokeWidth ?? 2, + strokeStyle: element.strokeStyle ?? 'solid', + roughness: element.roughness ?? 1, + opacity: element.opacity ?? 100, + groupIds: element.groupIds ?? [], + frameId: element.frameId ?? null, + seed: element.seed ?? 0, + version: element.version ?? 1, + versionNonce: element.versionNonce ?? 0, + isDeleted: element.isDeleted ?? false, + updated: element.updated ?? Date.now(), + locked: element.locked ?? false, + })), + } + const svgContent = await excalidrawToSvg( - inputData.excalidrawData, + svgReadyData, inputData.exportOptions ) diff --git a/src/mastra/tools/document-chunking.tool.ts b/src/mastra/tools/document-chunking.tool.ts index 0b797088..472499b9 100644 --- a/src/mastra/tools/document-chunking.tool.ts +++ b/src/mastra/tools/document-chunking.tool.ts @@ -244,6 +244,9 @@ Use this tool when you need advanced document processing with metadata extractio const abortSignal = context?.abortSignal const tracingContext: TracingContext | undefined = context?.tracingContext + const chunkingStrategy = inputData.chunkingStrategy ?? 'recursive' + const chunkSize = inputData.chunkSize ?? 512 + const chunkOverlap = inputData.chunkOverlap ?? 50 // Check if operation was already cancelled if (abortSignal?.aborted ?? false) { @@ -268,7 +271,7 @@ Use this tool when you need advanced document processing with metadata extractio input: { documentLength: inputData.documentContent.length, chunkingStrategy: inputData.chunkingStrategy, - chunkSize: inputData.chunkSize, + chunkSize, extractTitle: inputData.extractTitle, extractSummary: inputData.extractSummary, extractKeywords: inputData.extractKeywords, @@ -394,25 +397,25 @@ Use this tool when you need advanced document processing with metadata extractio ) { Object.assign(extractParams, inputData.extract as ExtractParams) } - if (inputData.extractTitle) { + if (inputData.extractTitle ?? false) { extractParams.title = true } - if (inputData.extractSummary) { + if (inputData.extractSummary ?? false) { extractParams.summary = true } - if (inputData.extractKeywords) { + if (inputData.extractKeywords ?? false) { extractParams.keywords = true } - if (inputData.extractQuestions) { + if (inputData.extractQuestions ?? false) { extractParams.questions = true } // Execute chunking with metadata extraction const chunkingStartTime = Date.now() const chunkParams = buildChunkParams( - inputData.chunkingStrategy, - inputData.chunkSize, - inputData.chunkOverlap, + chunkingStrategy, + chunkSize, + chunkOverlap, extractParams ) const chunks = await document.chunk(chunkParams) @@ -421,7 +424,7 @@ Use this tool when you need advanced document processing with metadata extractio logStepStart('mastra-chunking-completed', { chunkCount: chunks.length, chunkingTimeMs: chunkingTime, - strategy: inputData.chunkingStrategy, + strategy: chunkingStrategy, extractOptions: Object.keys(extractParams), }) @@ -433,9 +436,9 @@ Use this tool when you need advanced document processing with metadata extractio chunkIndex: index, totalChunks: chunks.length, documentId: `doc_${Date.now()}_${index}`, - chunkingStrategy: inputData.chunkingStrategy, - chunkSize: inputData.chunkSize, - chunkOverlap: inputData.chunkOverlap, + chunkingStrategy, + chunkSize, + chunkOverlap, }, })) @@ -575,6 +578,13 @@ content indexing, or semantic search capabilities. const abortSignal = context?.abortSignal const tracingContext: TracingContext | undefined = context?.tracingContext + const chunkingStrategy = inputData.chunkingStrategy ?? 'recursive' + const chunkSize = inputData.chunkSize ?? 512 + const chunkOverlap = inputData.chunkOverlap ?? 50 + const indexName = inputData.indexName ?? 'memory_messages_3072' + const embeddingModel = + inputData.embeddingModel ?? 'google/gemini-embedding-001' + const embeddingBatchSize = inputData.embeddingBatchSize ?? 50 // Check if operation was already cancelled if (abortSignal?.aborted ?? false) { @@ -599,7 +609,7 @@ content indexing, or semantic search capabilities. input: { documentLength: inputData.documentContent.length, chunkingStrategy: inputData.chunkingStrategy, - chunkSize: inputData.chunkSize, + chunkSize, generateEmbeddings: inputData.generateEmbeddings, }, requestContext: context?.requestContext, @@ -619,8 +629,8 @@ content indexing, or semantic search capabilities. metadata: { ...inputData.documentMetadata, chunkingStrategy: inputData.chunkingStrategy, - chunkSize: inputData.chunkSize, - chunkOverlap: inputData.chunkOverlap, + chunkSize, + chunkOverlap, processedAt: new Date().toISOString(), source: 'mdocument-chunker', }, @@ -714,9 +724,9 @@ content indexing, or semantic search capabilities. // Execute chunking using MDocument.chunk() method const chunkingStartTime = Date.now() const chunkParams = buildChunkParams( - inputData.chunkingStrategy, - inputData.chunkSize, - inputData.chunkOverlap + chunkingStrategy, + chunkSize, + chunkOverlap ) const chunks = await document.chunk(chunkParams) const chunkingTime = Date.now() - chunkingStartTime @@ -724,7 +734,7 @@ content indexing, or semantic search capabilities. logStepStart('custom-chunking-completed', { chunkCount: chunks.length, chunkingTimeMs: chunkingTime, - strategy: inputData.chunkingStrategy, + strategy: chunkingStrategy, }) // Prepare chunks for embedding and storage @@ -735,9 +745,9 @@ content indexing, or semantic search capabilities. chunkIndex: index, totalChunks: chunks.length, documentId: `doc_${Date.now()}_${index}`, - chunkingStrategy: inputData.chunkingStrategy, - chunkSize: inputData.chunkSize, - chunkOverlap: inputData.chunkOverlap, + chunkingStrategy, + chunkSize, + chunkOverlap, }, id: String(chunk.metadata?.id ?? `chunk_${Date.now()}_${randomUUID()}`), })) @@ -746,10 +756,7 @@ content indexing, or semantic search capabilities. let embeddings: number[][] = [] // Generate embeddings if requested - if ( - inputData.generateEmbeddings && - chunksForProcessing.length > 0 - ) { + if ((inputData.generateEmbeddings ?? false) && chunksForProcessing.length > 0) { await context?.writer?.custom({ type: 'data-tool-progress', data: { @@ -774,16 +781,16 @@ content indexing, or semantic search capabilities. for ( let i = 0; i < nonEmptyValues.length; - i += inputData.embeddingBatchSize + i += embeddingBatchSize ) { const batch = nonEmptyValues.slice( i, - i + inputData.embeddingBatchSize + i + embeddingBatchSize ) const result = await embedMany({ values: batch, model: new ModelRouterEmbeddingModel( - inputData.embeddingModel + embeddingModel ), maxRetries: 3, abortSignal: new AbortController().signal, @@ -801,7 +808,7 @@ content indexing, or semantic search capabilities. }) } catch (embedError) { logError('mdocument-chunker-embeddings', embedError, { - embeddingBatchSize: inputData.embeddingBatchSize, + embeddingBatchSize, }) // fall back to no embeddings so chunks are still returned embeddings = [] @@ -825,7 +832,7 @@ content indexing, or semantic search capabilities. // Ensure index exists with the same dimension as embeddings try { await pgVector.createIndex({ - indexName: inputData.indexName, + indexName, dimension: embeddings[0]?.length || 0, }) } catch (idxErr) { @@ -868,7 +875,7 @@ content indexing, or semantic search capabilities. // Store vectors with metadata if (finalVectors.length > 0) { await pgVector.upsert({ - indexName: inputData.indexName, + indexName, vectors: finalVectors, metadata: finalMetadata, ids: finalIds, @@ -881,7 +888,7 @@ content indexing, or semantic search capabilities. const storageTime = Date.now() - storageStartTime logStepStart('vectors-stored', { - indexName: inputData.indexName, + indexName, vectorCount: embeddings.length, storageTimeMs: storageTime, }) @@ -1049,6 +1056,13 @@ Use this tool to improve retrieval quality by re-ranking initial search results. logToolExecution('document-reranker', { userQuery: inputData.userQuery, }) + const indexName = inputData.indexName ?? 'memory_messages_3072' + const topK = inputData.topK ?? 10 + const initialTopK = inputData.initialTopK ?? 20 + const semanticWeight = inputData.semanticWeight ?? 0.5 + const vectorWeight = inputData.vectorWeight ?? 0.3 + const positionWeight = inputData.positionWeight ?? 0.2 + const rerankModel = inputData.rerankModel ?? 'google/gemini-2.5-flash' // Use the existing tracing context if available to create a child span. const tracingContext = context?.tracingContext @@ -1057,9 +1071,9 @@ Use this tool to improve retrieval quality by re-ranking initial search results. name: 'document-reranker', input: { userQuery: inputData.userQuery, - indexName: inputData.indexName, - topK: inputData.topK, - initialTopK: inputData.initialTopK, + indexName, + topK, + initialTopK, }, metadata: { 'tool.id': 'document:reranker', @@ -1095,15 +1109,13 @@ Use this tool to improve retrieval quality by re-ranking initial search results. // Normalize weights to sum to 1 (if user input deviates) const weights = normalizeWeights( - inputData.semanticWeight, - inputData.vectorWeight, - inputData.positionWeight + semanticWeight, + vectorWeight, + positionWeight ) // Log if user-supplied weights did not sum to 1 const origSum = - inputData.semanticWeight + - inputData.vectorWeight + - inputData.positionWeight + semanticWeight + vectorWeight + positionWeight if (Math.abs(origSum - 1) > 1e-6) { log.info('Normalized reranker weights', { originalSum: origSum, @@ -1124,9 +1136,9 @@ Use this tool to improve retrieval quality by re-ranking initial search results. const searchStartTime = Date.now() // NOTE: PGVector query accepts Mongo/Sift-style filter at runtime const initialResults = await pgVector.query({ - indexName: inputData.indexName, + indexName, queryVector: queryEmbedding, - topK: inputData.initialTopK, + topK: initialTopK, filter: inputData.filter, includeVector: inputData.includeVector, }) @@ -1135,7 +1147,7 @@ Use this tool to improve retrieval quality by re-ranking initial search results. logStepStart('initial-search-completed', { resultCount: initialResults.length, searchTimeMs: searchTime, - indexName: inputData.indexName, + indexName, }) if (initialResults.length === 0) { @@ -1182,10 +1194,10 @@ Use this tool to improve retrieval quality by re-ranking initial search results. })), inputData.userQuery, // Use ModelRouterLanguageModel wrapper so the reranker receives a Mastra-compatible model - new ModelRouterLanguageModel(inputData.rerankModel), + new ModelRouterLanguageModel(rerankModel), { weights, - topK: inputData.topK, + topK, } ) const rerankerTime = Date.now() - rerankerStartTime @@ -1196,8 +1208,8 @@ Use this tool to improve retrieval quality by re-ranking initial search results. rerankerTimeMs: rerankerTime, weights: { semantic: inputData.semanticWeight, - vector: inputData.vectorWeight, - position: inputData.positionWeight, + vector: vectorWeight, + position: positionWeight, }, }) diff --git a/src/mastra/tools/e2b.ts b/src/mastra/tools/e2b.ts index b52e64a8..bdceae85 100644 --- a/src/mastra/tools/e2b.ts +++ b/src/mastra/tools/e2b.ts @@ -527,6 +527,10 @@ export const listFiles = createTool({ path: z.string().describe('The path that was listed'), }), execute: async (inputData, context) => { + const listedPath = + typeof inputData.path === 'string' && inputData.path.length > 0 + ? inputData.path + : '/' const tracingContext: TracingContext | undefined = context?.tracingContext const span = getOrCreateSpan({ @@ -538,7 +542,7 @@ export const listFiles = createTool({ metadata: { 'tool.id': 'listFiles', 'tool.input.sandboxId': inputData.sandboxId, - 'tool.input.path': inputData.path, + 'tool.input.path': listedPath, }, }) const startTime = Date.now() @@ -547,13 +551,13 @@ export const listFiles = createTool({ logToolStart('listFiles', inputData, context) const sandbox = await Sandbox.connect(inputData.sandboxId) - const fileList = await sandbox.files.list(inputData.path) + const fileList = await sandbox.files.list(listedPath) span?.update({ metadata: { 'operation.status': 'success', 'sandbox.id': inputData.sandboxId, - 'list.path': inputData.path, + 'list.path': listedPath, 'list.file_count': fileList.length, 'list.directory_count': fileList.filter( (f) => f.type === FileType.DIR @@ -568,7 +572,7 @@ export const listFiles = createTool({ path: file.path, isDirectory: file.type === FileType.DIR, })), - path: inputData.path, + path: listedPath, } logToolComplete( @@ -1204,7 +1208,7 @@ export const getFileSize = createTool({ let humanReadableSize: string | undefined - if (inputData.humanReadable) { + if (inputData.humanReadable === true) { const bytes = info.size const sizes = ['B', 'KB', 'MB', 'GB', 'TB'] if (bytes === 0) { diff --git a/src/mastra/tools/extractLearningsTool.ts b/src/mastra/tools/extractLearningsTool.ts index 18ef1753..1fc3b7d7 100644 --- a/src/mastra/tools/extractLearningsTool.ts +++ b/src/mastra/tools/extractLearningsTool.ts @@ -28,7 +28,6 @@ export const extractLearningsTool = createTool({ execute: async (inputData, context) => { const mastra = context?.mastra const writer = context?.writer - const tracingContext = context?.tracingContext const requestContext = context?.requestContext as | ExtractLearningsContext | undefined @@ -317,12 +316,20 @@ export const extractLearningsTool = createTool({ }) }, onOutput: ({ output, toolCallId, toolName, abortSignal }) => { + const parsed = z + .object({ + learning: z.string(), + followUpQuestions: z.array(z.string()), + }) + .safeParse(output) log.info('extractLearningsTool completed', { toolCallId, toolName, outputData: { - learning: output.learning, - followUpQuestions: output.followUpQuestions, + learning: parsed.success ? parsed.data.learning : '', + followUpQuestions: parsed.success + ? parsed.data.followUpQuestions + : [], }, abortSignal: abortSignal?.aborted, hook: 'onOutput', diff --git a/src/mastra/tools/find-references.tool.ts b/src/mastra/tools/find-references.tool.ts index 9b60e959..6db84099 100644 --- a/src/mastra/tools/find-references.tool.ts +++ b/src/mastra/tools/find-references.tool.ts @@ -123,16 +123,26 @@ export const findReferencesTool = createTool({ }, execute: async (inputData, context) => { const writer = context?.writer + const { + symbolName, + projectPath: rawProjectPath, + filePath, + line, + } = inputData + const trimmedProjectPath = rawProjectPath?.trim() + const projectPath = + trimmedProjectPath !== undefined && trimmedProjectPath.length > 0 + ? trimmedProjectPath + : process.cwd() await writer?.custom({ type: 'data-tool-progress', data: { status: 'in-progress', - message: `🔎 Starting semantic find-references for '${inputData.symbolName}' at ${inputData.projectPath}`, + message: `🔎 Starting semantic find-references for '${symbolName}' at ${projectPath}`, stage: 'semantic:find-references', }, id: 'semantic:find-references', }) - const { symbolName, projectPath, filePath, line } = inputData const requestContext = context?.requestContext const refContext = requestContext?.get('semanticAnalysisContext') diff --git a/src/mastra/tools/find-symbol.tool.ts b/src/mastra/tools/find-symbol.tool.ts index 8216ca5f..204f8048 100644 --- a/src/mastra/tools/find-symbol.tool.ts +++ b/src/mastra/tools/find-symbol.tool.ts @@ -126,8 +126,13 @@ export const findSymbolTool = createTool({ }) }, execute: async (inputData, context) => { - const { symbolName, projectPath, symbolType, includeDependencies } = - inputData + const { + symbolName, + projectPath: rawProjectPath, + symbolType = 'all', + includeDependencies = false, + } = inputData + const projectPath = rawProjectPath?.trim() ?? process.cwd() const requestContext = context?.requestContext as RequestContext const abortSignal = context?.abortSignal diff --git a/src/mastra/tools/git-local.tool.ts b/src/mastra/tools/git-local.tool.ts index f935d09d..b0029503 100644 --- a/src/mastra/tools/git-local.tool.ts +++ b/src/mastra/tools/git-local.tool.ts @@ -920,7 +920,7 @@ export const gitLogTool = createTool({ try { const cwd = inputData.repoPath ?? process.cwd() - const actualCount = Math.min(inputData.count, maxCommits) + const actualCount = Math.min(inputData.count ?? 10, maxCommits) const args = ['log'] // Basic formatting diff --git a/src/mastra/tools/github.ts b/src/mastra/tools/github.ts index fbae6568..c9806b3b 100644 --- a/src/mastra/tools/github.ts +++ b/src/mastra/tools/github.ts @@ -1460,11 +1460,19 @@ export const getRepoFileTree = createTool({ try { const octokit = getOctokit() + const resolvedBranch = + inputData.branch?.trim() || + ( + await octokit.rest.repos.get({ + owner: inputData.owner, + repo: inputData.repo, + }) + ).data.default_branch // Get branch commit to find tree SHA const branchRes = await octokit.rest.repos.getBranch({ owner: inputData.owner, repo: inputData.repo, - branch: inputData.branch, + branch: resolvedBranch, }) const treeSha = (branchRes.data as GitHubBranchResponse).commit .commit.tree.sha diff --git a/src/mastra/tools/image-tool.ts b/src/mastra/tools/image-tool.ts index 06b2368a..7d375f34 100644 --- a/src/mastra/tools/image-tool.ts +++ b/src/mastra/tools/image-tool.ts @@ -324,7 +324,12 @@ export const imageProcessorTool = createTool({ await fs.access(input.inputPath) let pipeline = sharp(input.inputPath) - const ops = input.operations + const ops = input.operations ?? { + grayscale: false, + sharpen: false, + flip: false, + flop: false, + } if (ops.resize) { pipeline = pipeline.resize({ @@ -511,6 +516,7 @@ export const imageToMarkdownTool = createTool({ execute: async (input, context) => { const writer = context?.writer const abortSignal = context?.abortSignal + const headingLevel = input.headingLevel ?? 2 if (abortSignal?.aborted ?? false) { throw new Error('Image to markdown conversion cancelled') @@ -645,7 +651,7 @@ export const imageToMarkdownTool = createTool({ if (inList) { inList = false } - const level = Math.min(input.headingLevel, 6) + const level = Math.min(headingLevel, 6) markdown += `${'#'.repeat(level)} ${trimmed}\n\n` continue } diff --git a/src/mastra/tools/json-to-csv.tool.ts b/src/mastra/tools/json-to-csv.tool.ts index 88c219e1..f9875660 100644 --- a/src/mastra/tools/json-to-csv.tool.ts +++ b/src/mastra/tools/json-to-csv.tool.ts @@ -89,6 +89,10 @@ export const jsonToCsvTool = createTool({ jsonCsvSpan?.end() return { csv: '' } } + const resolvedOptions = options ?? { + delimiter: ',', + includeHeaders: true, + } const config = requestContext?.csvToolContext const maxRows = config?.maxRows @@ -103,7 +107,7 @@ export const jsonToCsvTool = createTool({ const headers = Array.from( new Set(data.flatMap((row) => Object.keys(row))) ) - const delimiter = options.delimiter || ',' + const delimiter = resolvedOptions.delimiter || ',' const escapeValue = (value: unknown): string => { if (value === null || value === undefined) { @@ -133,7 +137,7 @@ export const jsonToCsvTool = createTool({ const rows: string[] = [] - if (options.includeHeaders) { + if (resolvedOptions.includeHeaders) { rows.push(headers.map((h) => escapeValue(h)).join(delimiter)) } @@ -240,13 +244,20 @@ export const jsonToCsvTool = createTool({ }) }, onOutput: ({ output, toolCallId, toolName, abortSignal }) => { - const csvLines = output.csv.split('\n').length + const csvOutput = + typeof output === 'object' && + output !== null && + 'csv' in output && + typeof (output as { csv?: unknown }).csv === 'string' + ? (output as { csv: string }).csv + : '' + const csvLines = csvOutput.split('\n').length log.info('JSON to CSV conversion completed', { toolCallId, toolName, abortSignal: abortSignal?.aborted, csvLines, - csvLength: output.csv.length, + csvLength: csvOutput.length, hook: 'onOutput', }) }, diff --git a/src/mastra/tools/pdf-data-conversion.tool.ts b/src/mastra/tools/pdf-data-conversion.tool.ts index d33fb840..69ed3927 100644 --- a/src/mastra/tools/pdf-data-conversion.tool.ts +++ b/src/mastra/tools/pdf-data-conversion.tool.ts @@ -130,7 +130,7 @@ async function extractPdfText( * Sub-tool: Extract and structure PDF metadata * Returns document information useful for markdown frontmatter */ -async function extractPdfMetadata(pdfContent: PdfContent): Promise<{ +function extractPdfMetadata(pdfContent: PdfContent): { title: string author: string subject: string @@ -138,7 +138,7 @@ async function extractPdfMetadata(pdfContent: PdfContent): Promise<{ pageCount: number extractedAt: string contentPreview: string -}> { +} { const metadata = { title: pdfContent.title ?? 'Untitled Document', author: pdfContent.author ?? 'Unknown Author', @@ -448,20 +448,20 @@ Perfect for RAG indexing, documentation conversion, and content processing. `, inputSchema: PdfToMarkdownInputSchema, outputSchema: PdfToMarkdownOutputSchema, - onInputStart: ({ toolCallId, messages, abortSignal }) => { + onInputStart: ({ toolCallId }) => { log.info('pdfToMarkdownTool tool input streaming started', { toolCallId, hook: 'onInputStart', }) }, - onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { + onInputDelta: ({ inputTextDelta, toolCallId }) => { log.info('pdfToMarkdownTool received input chunk', { toolCallId, inputTextDelta, hook: 'onInputDelta', }) }, - onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { + onInputAvailable: ({ input, toolCallId }) => { log.info('pdfToMarkdownTool received input', { toolCallId, inputData: { @@ -498,6 +498,11 @@ Perfect for RAG indexing, documentation conversion, and content processing. const requestContext = context?.requestContext as | PdfDataConversionContext | undefined + const outputFormat = inputData.outputFormat ?? 'markdown' + const includeMetadata = inputData.includeMetadata ?? true + const includeTables = inputData.includeTables ?? true + const includeImages = inputData.includeImages ?? false + const shouldNormalize = inputData.normalizeText ?? true await context?.writer?.custom({ type: 'data-tool-progress', @@ -507,16 +512,18 @@ Perfect for RAG indexing, documentation conversion, and content processing. }) // Create root tracing span - const tracingContext = context?.tracingContext const rootSpan = getOrCreateSpan({ type: SpanType.TOOL_CALL, name: 'pdf-to-markdown-tool', input: { pdfPath: inputData.pdfPath, maxPages: inputData.maxPages }, + requestContext: context?.requestContext, + tracingContext: context?.tracingContext, metadata: { 'tool.id': 'pdfToMarkdown', 'tool.input.pdfPath': inputData.pdfPath, normalization: inputData.normalizeText, operation: 'pdf-to-markdown', + 'user.id': requestContext?.userId, }, }) // Note: nested child spans will be created from tracingContext or rootSpan as needed @@ -593,13 +600,13 @@ Perfect for RAG indexing, documentation conversion, and content processing. metadata: { 'tool.id': 'extract-metadata' }, }) - const metadata = await extractPdfMetadata(pdfContent) + const metadata = extractPdfMetadata(pdfContent) metadataSpan?.update({ output: metadata }) metadataSpan?.end() // Normalize text if requested let processedText = pdfContent.text - if (inputData.normalizeText) { + if (shouldNormalize) { const normalizeSpan = rootSpan?.createChildSpan({ type: SpanType.TOOL_CALL, name: 'normalize-text', @@ -638,7 +645,7 @@ Perfect for RAG indexing, documentation conversion, and content processing. tableCount: 0, tables: [], } - if (inputData.includeTables) { + if (includeTables) { const tableSpan = rootSpan?.createChildSpan({ type: SpanType.TOOL_CALL, name: 'extract-tables', @@ -658,7 +665,7 @@ Perfect for RAG indexing, documentation conversion, and content processing. imageCount: 0, images: [], } - if (inputData.includeImages) { + if (includeImages) { const imageSpan = rootSpan?.createChildSpan({ type: SpanType.TOOL_CALL, name: 'extract-images', @@ -677,7 +684,7 @@ Perfect for RAG indexing, documentation conversion, and content processing. let finalContent = '' const outputMetadata: Record = {} - if (inputData.includeMetadata) { + if (includeMetadata) { // Add YAML frontmatter const frontmatter = { title: metadata.title, @@ -692,7 +699,7 @@ Perfect for RAG indexing, documentation conversion, and content processing. outputMetadata['metadata'] = metadata outputMetadata['frontmatter'] = frontmatter - if (inputData.outputFormat === 'markdown') { + if (outputFormat === 'markdown') { finalContent = `---\n${Object.entries(frontmatter) .map( ([k, v]) => @@ -703,7 +710,7 @@ Perfect for RAG indexing, documentation conversion, and content processing. } // Add main content based on format - switch (inputData.outputFormat) { + switch (outputFormat) { case 'html': { // Convert markdown to HTML using marked finalContent += await marked(markdownResult.markdown) @@ -754,11 +761,9 @@ Perfect for RAG indexing, documentation conversion, and content processing. const output = { success: true, - format: inputData.outputFormat, + format: outputFormat, content: finalContent, - metadata: inputData.includeMetadata - ? outputMetadata - : undefined, + metadata: includeMetadata ? outputMetadata : undefined, statistics: { pageCount: pdfContent.numpages, lineCount: markdownResult.lineCount, @@ -802,7 +807,7 @@ Perfect for RAG indexing, documentation conversion, and content processing. return { success: false, - format: inputData.outputFormat ?? 'markdown', + format: outputFormat, content: '', statistics: { pageCount: 0, diff --git a/src/mastra/tools/random-generator.tool.ts b/src/mastra/tools/random-generator.tool.ts index 9da1c13e..881fdc90 100644 --- a/src/mastra/tools/random-generator.tool.ts +++ b/src/mastra/tools/random-generator.tool.ts @@ -78,6 +78,7 @@ export const randomGeneratorTool = createTool({ const requestContext = context?.requestContext as RandomToolContext const locale = inputData.options?.locale ?? requestContext?.locale ?? 'en' + const count = inputData.count ?? 1 const tracingContext: TracingContext | undefined = context?.tracingContext @@ -91,7 +92,7 @@ export const randomGeneratorTool = createTool({ metadata: { 'tool.id': 'random-generator', 'tool.input.type': inputData.type, - 'tool.input.count': inputData.count, + 'tool.input.count': count, }, requestContext: context?.requestContext, tracingContext, @@ -101,7 +102,7 @@ export const randomGeneratorTool = createTool({ const generationSpan = rootSpan?.createChildSpan({ type: SpanType.TOOL_CALL, name: 'random-generation-operation', - input: { type: inputData.type, count: inputData.count }, + input: { type: inputData.type, count }, metadata: { 'tool.id': 'random-generation', 'operation.type': inputData.type, @@ -112,7 +113,7 @@ export const randomGeneratorTool = createTool({ type: 'data-tool-progress', data: { status: 'in-progress', - message: `🎲 Generating ${inputData.count} random ${inputData.type}(s)...`, + message: `🎲 Generating ${count} random ${inputData.type}(s)...`, stage: 'random-generator', }, id: 'random-generator', @@ -127,14 +128,14 @@ export const randomGeneratorTool = createTool({ | Record | null = null - if (inputData.count === 1) { + if (count === 1) { result = generateRandomItem(inputData.type, { ...inputData.options, locale, }) } else { const items: unknown[] = [] - for (let i = 0; i < inputData.count; i++) { + for (let i = 0; i < count; i++) { items.push( generateRandomItem(inputData.type, { ...inputData.options, @@ -149,7 +150,7 @@ export const randomGeneratorTool = createTool({ type: 'data-tool-progress', data: { status: 'done', - message: `✅ Generated ${inputData.count} random ${inputData.type}(s)`, + message: `✅ Generated ${count} random ${inputData.type}(s)`, stage: 'random-generator', }, id: 'random-generator', @@ -157,7 +158,7 @@ export const randomGeneratorTool = createTool({ // Update spans with successful result generationSpan?.update({ - output: { success: true, count: inputData.count }, + output: { success: true, count }, metadata: { 'operation.completed': true, }, @@ -165,11 +166,11 @@ export const randomGeneratorTool = createTool({ generationSpan?.end() rootSpan?.update({ - output: { success: true, count: inputData.count }, + output: { success: true, count }, metadata: { 'tool.output.success': true, 'tool.output.type': inputData.type, - 'tool.output.count': inputData.count, + 'tool.output.count': count, }, }) rootSpan?.end() @@ -178,7 +179,7 @@ export const randomGeneratorTool = createTool({ success: true, data: result, type: inputData.type, - count: inputData.count, + count, } } catch (e) { const errorMsg = e instanceof Error ? e.message : String(e) @@ -198,7 +199,7 @@ export const randomGeneratorTool = createTool({ success: false, data: null, type: inputData.type, - count: inputData.count, + count, message: errorMsg, } } diff --git a/src/mastra/tools/serpapi-academic-local.tool.ts b/src/mastra/tools/serpapi-academic-local.tool.ts index 1686111a..988baa12 100644 --- a/src/mastra/tools/serpapi-academic-local.tool.ts +++ b/src/mastra/tools/serpapi-academic-local.tool.ts @@ -236,7 +236,9 @@ export const googleScholarTool = createTool({ const params: Record = { engine: 'google_scholar', q: input.query, - num: input.numResults, + } + if (typeof input.numResults === 'number') { + params.num = input.numResults } if ( typeof input.yearStart === 'number' && @@ -248,7 +250,7 @@ export const googleScholarTool = createTool({ if (input.sortBy === 'date') { params.scisbd = '1' } - if (!input.includePatents) { + if (input.includePatents === false) { params.as_sdt = '0,5' } const response = (await getJson(params)) as ScholarApiResponse @@ -626,15 +628,20 @@ export const yelpSearchTool = createTool({ engine: 'yelp', find_desc: input.query, find_loc: input.location, - num: input.numResults, } - if (input.sortBy !== 'recommended') { + if (typeof input.numResults === 'number') { + params.num = input.numResults + } + if ( + typeof input.sortBy === 'string' && + input.sortBy !== 'recommended' + ) { params.sortby = input.sortBy } if (input.priceRange) { params.price = input.priceRange } - if (input.openNow) { + if (input.openNow === true) { params.open_now = 'true' } const response = (await getJson(params)) as YelpApiResponse diff --git a/src/mastra/tools/serpapi-news-trends.tool.ts b/src/mastra/tools/serpapi-news-trends.tool.ts index d2bb97b0..94419595 100644 --- a/src/mastra/tools/serpapi-news-trends.tool.ts +++ b/src/mastra/tools/serpapi-news-trends.tool.ts @@ -210,7 +210,9 @@ export const googleNewsTool = createTool({ const params: Record = { engine: 'google_news', q: input.query, - num: input.numResults, + } + if (typeof input.numResults === 'number') { + params.num = input.numResults } if ( typeof input.location === 'string' && @@ -358,7 +360,9 @@ export const googleNewsLiteTool = createTool({ const params: Record = { engine: 'google_news', q: input.query, - num: input.numResults, + } + if (typeof input.numResults === 'number') { + params.num = input.numResults } const response = await getJson(params) @@ -532,8 +536,13 @@ export const googleTrendsTool = createTool({ engine: 'google_trends', q: input.query, data_type: 'TIMESERIES', - geo: input.location, - date: input.timeRange, + } + + if (typeof input.location === 'string' && input.location.length > 0) { + params.geo = input.location + } + if (typeof input.timeRange === 'string' && input.timeRange.length > 0) { + params.date = input.timeRange } if (typeof input.category === 'number') { diff --git a/src/mastra/tools/serpapi-search.tool.ts b/src/mastra/tools/serpapi-search.tool.ts index 6e8131cb..4cc46332 100644 --- a/src/mastra/tools/serpapi-search.tool.ts +++ b/src/mastra/tools/serpapi-search.tool.ts @@ -141,6 +141,7 @@ export const googleSearchTool = createTool({ validateSerpApiKey() const writer = context?.writer const abortSignal = context?.abortSignal + const numResults = input.numResults ?? 10 const requestContext = context?.requestContext as | SerpApiSearchContext | undefined @@ -169,7 +170,7 @@ export const googleSearchTool = createTool({ metadata: { 'tool.id': 'google-search', 'tool.input.query': input.query, - 'tool.input.numResults': input.numResults, + 'tool.input.numResults': numResults, 'tool.input.location': input.location, 'tool.input.language': input.language, 'tool.input.device': input.device, @@ -187,7 +188,7 @@ export const googleSearchTool = createTool({ const params: Record = { engine: 'google', q: input.query, - num: input.numResults, + num: numResults, } if ( typeof input.location === 'string' && diff --git a/src/mastra/tools/serpapi-shopping.tool.ts b/src/mastra/tools/serpapi-shopping.tool.ts index 128ac264..82991763 100644 --- a/src/mastra/tools/serpapi-shopping.tool.ts +++ b/src/mastra/tools/serpapi-shopping.tool.ts @@ -151,6 +151,8 @@ export const amazonSearchTool = createTool({ execute: async (inputData, context) => { const writer = context?.writer const tracingContext = context?.tracingContext + const numResults = inputData.numResults ?? 10 + const sortBy = inputData.sortBy ?? 'relevance' await writer?.custom({ type: 'data-tool-progress', @@ -171,8 +173,8 @@ export const amazonSearchTool = createTool({ metadata: { 'tool.id': 'amazon-search', 'tool.input.query': inputData.query, - 'tool.input.sortBy': inputData.sortBy, - 'tool.input.numResults': inputData.numResults, + 'tool.input.sortBy': sortBy, + 'tool.input.numResults': numResults, }, }) @@ -191,16 +193,16 @@ export const amazonSearchTool = createTool({ const params: Record = { engine: 'amazon', query: inputData.query, - num: inputData.numResults, + num: numResults, } - if (inputData.sortBy !== 'relevance') { + if (sortBy !== 'relevance') { const sortMap: Record = { 'price-asc': 'price-asc-rank', 'price-desc': 'price-desc-rank', rating: 'review-rank', } - const sortValue = sortMap[inputData.sortBy] + const sortValue = sortMap[sortBy] if (sortValue) { params.sort_by = sortValue } @@ -350,6 +352,8 @@ export const walmartSearchTool = createTool({ execute: async (inputData, context) => { const writer = context?.writer const tracingContext = context?.tracingContext + const numResults = inputData.numResults ?? 10 + const sortBy = inputData.sortBy ?? 'relevance' await writer?.custom({ type: 'data-tool-progress', @@ -370,8 +374,8 @@ export const walmartSearchTool = createTool({ metadata: { 'tool.id': 'walmart-search', 'tool.input.query': inputData.query, - 'tool.input.sortBy': inputData.sortBy, - 'tool.input.numResults': inputData.numResults, + 'tool.input.sortBy': sortBy, + 'tool.input.numResults': numResults, }, }) @@ -390,11 +394,11 @@ export const walmartSearchTool = createTool({ const params: Record = { engine: 'walmart', query: inputData.query, - num: inputData.numResults, + num: numResults, } - if (inputData.sortBy !== 'relevance') { - params.sort = inputData.sortBy + if (sortBy !== 'relevance') { + params.sort = sortBy } if (typeof inputData.minPrice === 'number') { params.min_price = inputData.minPrice @@ -543,6 +547,7 @@ export const ebaySearchTool = createTool({ execute: async (inputData, context) => { const writer = context?.writer const tracingContext = context?.tracingContext + const numResults = inputData.numResults ?? 10 await writer?.custom({ type: 'data-tool-progress', @@ -565,7 +570,7 @@ export const ebaySearchTool = createTool({ 'tool.input.query': inputData.query, 'tool.input.condition': inputData.condition, 'tool.input.sortBy': inputData.sortBy, - 'tool.input.numResults': inputData.numResults, + 'tool.input.numResults': numResults, }, }) @@ -584,7 +589,7 @@ export const ebaySearchTool = createTool({ const params: Record = { engine: 'ebay', _nkw: inputData.query, - _ipg: inputData.numResults, + _ipg: numResults, } if (inputData.condition) { params.LH_ItemCondition = @@ -740,6 +745,8 @@ export const homeDepotSearchTool = createTool({ execute: async (inputData, context) => { const writer = context?.writer const tracingContext = context?.tracingContext + const numResults = inputData.numResults ?? 10 + const sortBy = inputData.sortBy ?? 'relevance' await writer?.custom({ type: 'data-tool-progress', @@ -762,8 +769,8 @@ export const homeDepotSearchTool = createTool({ metadata: { 'tool.id': 'home-depot-search', 'tool.input.query': inputData.query, - 'tool.input.sortBy': inputData.sortBy, - 'tool.input.numResults': inputData.numResults, + 'tool.input.sortBy': sortBy, + 'tool.input.numResults': numResults, }, }) @@ -782,10 +789,10 @@ export const homeDepotSearchTool = createTool({ const params: Record = { engine: 'home_depot', q: inputData.query, - num: inputData.numResults, + num: numResults, } - if (inputData.sortBy !== 'relevance') { - params.sort_by = inputData.sortBy + if (sortBy !== 'relevance') { + params.sort_by = sortBy } if (inputData.inStockOnly) { params.in_stock = 'true' diff --git a/src/mastra/tools/technical-analysis.tool.ts b/src/mastra/tools/technical-analysis.tool.ts index 3b319222..e732e110 100644 --- a/src/mastra/tools/technical-analysis.tool.ts +++ b/src/mastra/tools/technical-analysis.tool.ts @@ -124,11 +124,6 @@ interface BollingerBandsOutput { lower: number } -interface StochasticOutput { - k: number - d: number -} - interface HeikinAshiOutput { open: number high: number @@ -177,12 +172,16 @@ export const ichimokuCloudTool = createTool({ const userId = requestCtx?.userId const workspaceId = requestCtx?.workspaceId + const conversionPeriod = inputData.conversionPeriod ?? 9 + const basePeriod = inputData.basePeriod ?? 26 + const spanPeriod = inputData.spanPeriod ?? 52 + const displacement = inputData.displacement ?? 26 await writer?.custom({ type: 'data-tool-progress', data: { status: 'in-progress', - message: `Input: conversionPeriod=${inputData.conversionPeriod} - ☁️ Calculating Ichimoku Cloud`, + message: `Input: conversionPeriod=${conversionPeriod} - ☁️ Calculating Ichimoku Cloud`, stage: 'ichimoku-cloud', }, id: 'ichimoku-cloud', @@ -208,10 +207,10 @@ export const ichimokuCloudTool = createTool({ const results = IchimokuCloud.calculate({ high: inputData.high, low: inputData.low, - conversionPeriod: inputData.conversionPeriod, - basePeriod: inputData.basePeriod, - spanPeriod: inputData.spanPeriod, - displacement: inputData.displacement, + conversionPeriod, + basePeriod, + spanPeriod, + displacement, }) const finalResult = { @@ -270,26 +269,26 @@ export const ichimokuCloudTool = createTool({ return { success: false, message: err.message } } }, - onInputStart: ({ toolCallId, messages, abortSignal }) => { + onInputStart: ({ toolCallId }) => { log.info('Ichimoku tool input streaming started', { toolCallId, hook: 'onInputStart', }) }, - onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { + onInputDelta: ({ toolCallId }) => { log.info('Ichimoku tool received input chunk', { toolCallId, hook: 'onInputDelta', }) }, - onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { + onInputAvailable: ({ input, toolCallId }) => { log.info('Ichimoku tool received input', { toolCallId, inputData: input, hook: 'onInputAvailable', }) }, - onOutput: ({ output, toolCallId, toolName, abortSignal }) => { + onOutput: ({ toolCallId, toolName }) => { log.info('Ichimoku tool completed', { toolCallId, toolName, @@ -394,7 +393,7 @@ export const fibonacciTool = createTool({ }) return finalResult - } catch (error: any) { + } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error) toolSpan?.error({ @@ -414,26 +413,26 @@ export const fibonacciTool = createTool({ return { success: false, message: errorMessage } } }, - onInputStart: ({ toolCallId, messages, abortSignal }) => { + onInputStart: ({ toolCallId }) => { log.info('Fibonacci tool input streaming started', { toolCallId, hook: 'onInputStart', }) }, - onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { + onInputDelta: ({ toolCallId }) => { log.info('Fibonacci tool received input chunk', { toolCallId, hook: 'onInputDelta', }) }, - onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { + onInputAvailable: ({ input, toolCallId }) => { log.info('Fibonacci tool received input', { toolCallId, inputData: input, hook: 'onInputAvailable', }) }, - onOutput: ({ output, toolCallId, toolName, abortSignal }) => { + onOutput: ({ toolCallId, toolName }) => { log.info('Fibonacci tool completed', { toolCallId, toolName, @@ -607,7 +606,7 @@ export const pivotPointsTool = createTool({ }) return results - } catch (error: any) { + } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error) toolSpan?.error({ @@ -635,7 +634,7 @@ export const pivotPointsTool = createTool({ hook: 'onInputStart', }) }, - onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { + onInputDelta: ({ toolCallId, messages, abortSignal }) => { log.info('Pivot points tool received input chunk', { toolCallId, hook: 'onInputDelta', @@ -652,7 +651,7 @@ export const pivotPointsTool = createTool({ hook: 'onInputAvailable', }) }, - onOutput: ({ output, toolCallId, toolName, abortSignal }) => { + onOutput: ({ toolCallId, toolName, abortSignal }) => { log.info('Pivot points tool completed', { toolCallId, toolName, @@ -738,14 +737,18 @@ export const trendAnalysisTool = createTool({ try { const { data, - period, - fastPeriod, - slowPeriod, - signalPeriod, + period: rawPeriod, + fastPeriod: rawFastPeriod, + slowPeriod: rawSlowPeriod, + signalPeriod: rawSignalPeriod, high, low, close, } = inputData + const period = rawPeriod ?? 14 + const fastPeriod = rawFastPeriod ?? 12 + const slowPeriod = rawSlowPeriod ?? 26 + const signalPeriod = rawSignalPeriod ?? 9 const results: Record = { success: true, sma: SMA.calculate({ values: data, period }), @@ -921,8 +924,10 @@ export const momentumAnalysisTool = createTool({ }) try { - const { data, period, signalPeriod, high, low, close, volume } = + const { data, period: rawPeriod, signalPeriod: rawSignalPeriod, high, low, close, volume } = inputData + const period = rawPeriod ?? 14 + const signalPeriod = rawSignalPeriod ?? 3 const results: Record = { success: true, rsi: RSI.calculate({ values: data, period }), @@ -1094,7 +1099,9 @@ export const volatilityAnalysisTool = createTool({ }) try { - const { data, period, stdDev, high, low, close } = inputData + const { data, period: rawPeriod, stdDev: rawStdDev, high, low, close } = inputData + const period = rawPeriod ?? 20 + const stdDev = rawStdDev ?? 2 const results: Record = { success: true, bollinger: BollingerBands.calculate({ @@ -1238,7 +1245,8 @@ export const volumeAnalysisTool = createTool({ }) try { - const { high, low, close, volume, period } = inputData + const { high, low, close, volume, period: rawPeriod } = inputData + const period = rawPeriod ?? 14 const results: Record = { success: true, obv: OBV.calculate({ close, volume }), diff --git a/src/mastra/tools/text-analysis.tool.ts b/src/mastra/tools/text-analysis.tool.ts index a506ebf0..043aa0de 100644 --- a/src/mastra/tools/text-analysis.tool.ts +++ b/src/mastra/tools/text-analysis.tool.ts @@ -66,6 +66,7 @@ export const textAnalysisTool = createTool({ const abortSignal = context?.abortSignal const tracingContext: TracingContext | undefined = context?.tracingContext + const operations = inputData.operations ?? ['word-count'] const requestCtx = context?.requestContext as | TextAnalysisToolContext | undefined @@ -81,7 +82,7 @@ export const textAnalysisTool = createTool({ metadata: { 'tool.id': 'text-analysis', 'tool.input.textLength': inputData.text.length, - 'tool.input.operationsCount': inputData.operations.length, + 'tool.input.operationsCount': operations.length, 'user.id': requestCtx?.userId, }, requestContext: context?.requestContext, @@ -119,7 +120,7 @@ export const textAnalysisTool = createTool({ const language = inputData.language ?? defaultLanguage const includeAdvancedMetricsFlag = includeAdvancedMetrics ?? false - for (const operation of inputData.operations) { + for (const operation of operations) { switch (operation) { case 'word-count': results[operation] = countWords(inputData.text) @@ -161,7 +162,7 @@ export const textAnalysisTool = createTool({ type: 'data-tool-progress', data: { status: 'done', - message: `✅ Text analysis completed (${inputData.operations.length} operations)`, + message: `✅ Text analysis completed (${operations.length} operations)`, stage: 'text-analysis', }, id: 'text-analysis', @@ -171,7 +172,7 @@ export const textAnalysisTool = createTool({ textAnalysisSpan?.update({ output: { success: true, - operationsCount: inputData.operations.length, + operationsCount: operations.length, }, metadata: { 'operation.completed': true, @@ -182,11 +183,11 @@ export const textAnalysisTool = createTool({ rootSpan?.update({ output: { success: true, - operationsCount: inputData.operations.length, + operationsCount: operations.length, }, metadata: { 'tool.output.success': true, - 'tool.output.operationsCount': inputData.operations.length, + 'tool.output.operationsCount': operations.length, }, }) rootSpan?.end() @@ -194,7 +195,7 @@ export const textAnalysisTool = createTool({ return { success: true, results, - operations: inputData.operations, + operations, textLength: inputData.text.length, } } catch (e) { @@ -214,7 +215,7 @@ export const textAnalysisTool = createTool({ return { success: false, results: {}, - operations: inputData.operations, + operations, textLength: inputData.text.length, message: errorMsg, } diff --git a/src/mastra/tools/url-tool.ts b/src/mastra/tools/url-tool.ts index 7b75c5fe..6ed0ff06 100644 --- a/src/mastra/tools/url-tool.ts +++ b/src/mastra/tools/url-tool.ts @@ -12,73 +12,183 @@ export interface UrlToolContext extends RequestContext { userId?: string } -export const urlValidationTool = createTool({ - id: 'url-validation', - description: 'Validate, parse, and analyze URLs', - inputSchema: z.object({ - url: z.string().describe('URL to validate and analyze'), - operations: z - .array( - z.enum([ - 'validate', - 'parse', - 'normalize', - 'shorten', - 'check-reachability', - 'extract-domain', - 'get-metadata', - ]) - ) - .optional() - .default(['validate']) - .describe('Operations to perform on the URL'), - options: z - .object({ - followRedirects: z.boolean().optional().default(false), - userAgent: z.string().optional(), - timeout: z.number().optional(), - }) - .optional(), - }), - outputSchema: z.object({ - success: z.boolean(), - results: z.record( +const UrlScalarSchema = z.union([ + z.string(), + z.number(), + z.boolean(), + z.null(), +]) +const UrlQueryRecordSchema = z.record(z.string(), UrlScalarSchema) +const UrlParameterValueSchema = z.union([ + UrlScalarSchema, + z.array(z.string()), + UrlQueryRecordSchema, +]) + +type UrlScalar = z.infer +type UrlQueryRecord = z.infer +type UrlParameterValue = z.infer +type UrlParameters = Record + +const UrlValidationInputSchema = z.object({ + url: z.string().describe('URL to validate and analyze'), + operations: z + .array( + z.enum([ + 'validate', + 'parse', + 'normalize', + 'shorten', + 'check-reachability', + 'extract-domain', + 'get-metadata', + ]) + ) + .optional() + .default(['validate']) + .describe('Operations to perform on the URL'), + options: z + .object({ + followRedirects: z.boolean().optional().default(false), + userAgent: z.string().optional(), + timeout: z.number().optional(), + }) + .optional(), +}) + +const UrlValidationOutputSchema = z.object({ + success: z.boolean(), + results: z.record( + z.string(), + z.union([ + z.boolean(), z.string(), - z.union([ - z.boolean(), - z.string(), - z.object({ - protocol: z.string(), - hostname: z.string(), - port: z.string().optional(), - pathname: z.string(), - search: z.string(), - hash: z.string(), - query: z.record(z.string(), z.string()), - }), - z.object({ - status: z.number().optional(), - contentType: z.string().optional(), - contentLength: z.number().optional(), - lastModified: z.string().optional(), - title: z.string().optional(), - }), + z.object({ + protocol: z.string(), + hostname: z.string(), + port: z.string().optional(), + pathname: z.string(), + search: z.string(), + hash: z.string(), + query: z.record(z.string(), z.string()), + }), + z.object({ + status: z.number().optional(), + contentType: z.string().optional(), + contentLength: z.number().optional(), + lastModified: z.string().optional(), + title: z.string().optional(), + }), + ]) + ), + operations: z.array(z.string()), + originalUrl: z.string(), + message: z.string().optional(), +}) + +const UrlManipulationInputSchema = z.object({ + baseUrl: z.string().describe('Base URL to manipulate'), + operations: z + .array( + z.enum([ + 'add-query', + 'remove-query', + 'update-query', + 'add-path', + 'replace-path', + 'add-fragment', + 'remove-fragment', + 'change-protocol', + 'change-hostname', + 'change-port', ]) + ) + .describe('URL manipulation operations'), + parameters: z + .record(z.string(), UrlParameterValueSchema) + .optional() + .describe( + 'Parameters for the operations (query params, paths, etc.)' ), - operations: z.array(z.string()), - originalUrl: z.string(), - message: z.string().optional(), - }), +}) + +const UrlManipulationOutputSchema = z.object({ + success: z.boolean(), + resultUrl: z.string(), + operations: z.array(z.string()), + baseUrl: z.string(), + changes: z.array( + z.object({ + operation: z.string(), + description: z.string(), + before: z.string().optional(), + after: z.string().optional(), + }) + ), + message: z.string().optional(), +}) + +export const urlValidationTool = createTool({ + id: 'url-validation', + description: 'Validate, parse, and analyze URLs', + inputSchema: UrlValidationInputSchema, + outputSchema: UrlValidationOutputSchema, + onInputStart: ({ toolCallId, messages, abortSignal }) => { + log.info('URL validation tool input streaming started', { + toolCallId, + messageCount: messages.length, + abortSignal: abortSignal?.aborted, + hook: 'onInputStart', + }) + }, + onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { + log.info('URL validation tool received input chunk', { + toolCallId, + inputTextDelta, + messageCount: messages.length, + abortSignal: abortSignal?.aborted, + hook: 'onInputDelta', + }) + }, + onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { + log.info('URL validation tool received input', { + toolCallId, + messageCount: messages.length, + inputData: { + url: input.url, + operationsCount: input.operations?.length ?? 1, + }, + abortSignal: abortSignal?.aborted, + hook: 'onInputAvailable', + }) + }, + onOutput: ({ output, toolCallId, toolName, abortSignal }) => { + log.info('URL validation tool completed', { + toolCallId, + toolName, + abortSignal: abortSignal?.aborted, + outputData: { + success: output.success, + operationsCompleted: output.operations.length, + }, + hook: 'onOutput', + }) + }, execute: async (inputData, context) => { const writer = context?.writer const abortSignal = context?.abortSignal const tracingContext = context?.tracingContext + const operations = inputData.operations ?? ['validate'] const requestCtx = context?.requestContext as UrlToolContext | undefined const defaultProtocol = requestCtx?.defaultProtocol ?? 'https' const allowLocalhost = requestCtx?.allowLocalhost ?? false const timeout = requestCtx?.timeout ?? 5000 + if (abortSignal?.aborted ?? false) { + throw new Error('URL validation cancelled') + } + // Create child span for URL validation const urlValidationSpan = getOrCreateSpan({ type: SpanType.TOOL_CALL, @@ -89,7 +199,7 @@ export const urlValidationTool = createTool({ metadata: { 'tool.id': 'url-validation', 'tool.input.url': inputData.url, - 'tool.input.operationsCount': inputData.operations.length, + 'tool.input.operationsCount': operations.length, 'user.id': requestCtx?.userId, }, }) @@ -126,7 +236,7 @@ export const urlValidationTool = createTool({ } const results: Record = {} - for (const operation of inputData.operations) { + for (const operation of operations) { switch (operation) { case 'validate': results[operation] = validateUrl( @@ -169,10 +279,15 @@ export const urlValidationTool = createTool({ break } case 'shorten': - results[operation] = await shortenUrl(inputData.url) + results[operation] = shortenUrl(inputData.url) break default: - throw new Error(`Unknown operation: ${operation}`) + { + const unreachableOperation: never = operation + throw new Error( + `Unknown operation: ${String(unreachableOperation)}` + ) + } } } @@ -180,7 +295,7 @@ export const urlValidationTool = createTool({ type: 'data-tool-progress', data: { status: 'done', - message: `✅ URL analysis completed (${inputData.operations.length} operations)`, + message: `✅ URL analysis completed (${operations.length} operations)`, stage: 'url-validation', }, id: 'url-validation', @@ -190,11 +305,11 @@ export const urlValidationTool = createTool({ urlValidationSpan?.update({ output: { success: true, - operationsCount: inputData.operations.length, + operationsCount: operations.length, }, metadata: { 'tool.output.success': true, - 'tool.output.operationsCount': inputData.operations.length, + 'tool.output.operationsCount': operations.length, }, }) urlValidationSpan?.end() @@ -202,7 +317,7 @@ export const urlValidationTool = createTool({ return { success: true, results, - operations: inputData.operations, + operations, originalUrl: inputData.url, } } catch (e) { @@ -218,14 +333,22 @@ export const urlValidationTool = createTool({ return { success: false, results: {}, - operations: inputData.operations, + operations, originalUrl: inputData.url, message: errorMsg, } } - }, + }, + }) + +export const urlManipulationTool = createTool({ + id: 'url-manipulation', + description: + 'Manipulate and transform URLs with query parameters, paths, and fragments', + inputSchema: UrlManipulationInputSchema, + outputSchema: UrlManipulationOutputSchema, onInputStart: ({ toolCallId, messages, abortSignal }) => { - log.info('URL validation tool input streaming started', { + log.info('URL manipulation tool input streaming started', { toolCallId, messageCount: messages.length, abortSignal: abortSignal?.aborted, @@ -233,7 +356,7 @@ export const urlValidationTool = createTool({ }) }, onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { - log.info('URL validation tool received input chunk', { + log.info('URL manipulation tool received input chunk', { toolCallId, inputTextDelta, messageCount: messages.length, @@ -242,11 +365,11 @@ export const urlValidationTool = createTool({ }) }, onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { - log.info('URL validation tool received input', { + log.info('URL manipulation tool received input', { toolCallId, messageCount: messages.length, inputData: { - url: input.url, + baseUrl: input.baseUrl, operationsCount: input.operations.length, }, abortSignal: abortSignal?.aborted, @@ -254,69 +377,27 @@ export const urlValidationTool = createTool({ }) }, onOutput: ({ output, toolCallId, toolName, abortSignal }) => { - log.info('URL validation tool completed', { + log.info('URL manipulation tool completed', { toolCallId, toolName, abortSignal: abortSignal?.aborted, outputData: { success: output.success, - operationsCompleted: output.operations.length, + resultUrl: output.resultUrl, }, hook: 'onOutput', }) }, -}) - -export const urlManipulationTool = createTool({ - id: 'url-manipulation', - description: - 'Manipulate and transform URLs with query parameters, paths, and fragments', - inputSchema: z.object({ - baseUrl: z.string().describe('Base URL to manipulate'), - operations: z - .array( - z.enum([ - 'add-query', - 'remove-query', - 'update-query', - 'add-path', - 'replace-path', - 'add-fragment', - 'remove-fragment', - 'change-protocol', - 'change-hostname', - 'change-port', - ]) - ) - .describe('URL manipulation operations'), - parameters: z - .record(z.string(), z.any()) - .optional() - .describe( - 'Parameters for the operations (query params, paths, etc.)' - ), - }), - outputSchema: z.object({ - success: z.boolean(), - resultUrl: z.string(), - operations: z.array(z.string()), - baseUrl: z.string(), - changes: z.array( - z.object({ - operation: z.string(), - description: z.string(), - before: z.string().optional(), - after: z.string().optional(), - }) - ), - message: z.string().optional(), - }), execute: async (inputData, context) => { const writer = context?.writer const abortSignal = context?.abortSignal const tracingContext = context?.tracingContext const requestCtx = context?.requestContext as UrlToolContext | undefined + if (abortSignal?.aborted ?? false) { + throw new Error('URL manipulation cancelled') + } + // Create child span for URL manipulation const urlManipulationSpan = getOrCreateSpan({ type: SpanType.TOOL_CALL, @@ -362,10 +443,7 @@ export const urlManipulationTool = createTool({ ) { currentUrl = addQueryParams( currentUrl, - inputData.parameters.query as Record< - string, - string | number | boolean - > + inputData.parameters.query as UrlQueryRecord ) } break @@ -387,10 +465,7 @@ export const urlManipulationTool = createTool({ ) { currentUrl = updateQueryParams( currentUrl, - inputData.parameters.query as Record< - string, - string | number | boolean | null | undefined - > + inputData.parameters.query as UrlQueryRecord ) } break @@ -467,7 +542,12 @@ export const urlManipulationTool = createTool({ } break default: - throw new Error(`Unknown operation: ${operation}`) + { + const unreachableOperation: never = operation + throw new Error( + `Unknown operation: ${String(unreachableOperation)}` + ) + } } changes.push({ @@ -532,49 +612,8 @@ export const urlManipulationTool = createTool({ message: errorMsg, } } - }, - onInputStart: ({ toolCallId, messages, abortSignal }) => { - log.info('URL manipulation tool input streaming started', { - toolCallId, - messageCount: messages.length, - abortSignal: abortSignal?.aborted, - hook: 'onInputStart', - }) - }, - onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => { - log.info('URL manipulation tool received input chunk', { - toolCallId, - inputTextDelta, - messageCount: messages.length, - abortSignal: abortSignal?.aborted, - hook: 'onInputDelta', - }) - }, - onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => { - log.info('URL manipulation tool received input', { - toolCallId, - messageCount: messages.length, - inputData: { - baseUrl: input.baseUrl, - operationsCount: input.operations.length, - }, - abortSignal: abortSignal?.aborted, - hook: 'onInputAvailable', - }) - }, - onOutput: ({ output, toolCallId, toolName, abortSignal }) => { - log.info('URL manipulation tool completed', { - toolCallId, - toolName, - abortSignal: abortSignal?.aborted, - outputData: { - success: output.success, - resultUrl: output.resultUrl, - }, - hook: 'onOutput', - }) - }, -}) + }, + }) // Helper functions function validateUrl(url: string, allowLocalhost = false): boolean { @@ -667,10 +706,8 @@ async function checkUrlReachability( const controller = new AbortController() const timeoutId = setTimeout(() => controller.abort(), timeout) - const headers = - userAgent && userAgent.length > 0 - ? { 'User-Agent': userAgent } - : undefined + const hasUserAgent = typeof userAgent === 'string' && userAgent.length > 0 + const headers = hasUserAgent ? { 'User-Agent': userAgent } : undefined const response = await fetch(url, { method: 'HEAD', signal: controller.signal, @@ -689,23 +726,24 @@ async function getUrlMetadata(url: string, timeout = 5000, userAgent?: string) { const controller = new AbortController() const timeoutId = setTimeout(() => controller.abort(), timeout) + const hasUserAgent = typeof userAgent === 'string' && userAgent.length > 0 const response = await fetch(url, { method: 'HEAD', signal: controller.signal, - headers: - userAgent && userAgent.length > 0 - ? { 'User-Agent': userAgent } - : undefined, + headers: hasUserAgent ? { 'User-Agent': userAgent } : undefined, }) clearTimeout(timeoutId) + const contentLengthHeader = response.headers.get('content-length') + return { status: response.status, contentType: response.headers.get('content-type') ?? undefined, - contentLength: response.headers.get('content-length') - ? parseInt(response.headers.get('content-length')!) - : undefined, + contentLength: + contentLengthHeader === null + ? undefined + : Number.parseInt(contentLengthHeader, 10), lastModified: response.headers.get('last-modified') ?? undefined, } } catch { @@ -713,7 +751,7 @@ async function getUrlMetadata(url: string, timeout = 5000, userAgent?: string) { } } -async function shortenUrl(_url: string): Promise { +function shortenUrl(_url: string): string { void _url // For demo purposes, return a mock shortened URL // In a real implementation, you'd call a URL shortening service @@ -721,10 +759,35 @@ async function shortenUrl(_url: string): Promise { return `https://short.ly/${mockShortId}` } -function addQueryParams(url: string, params: Record): string { +function serializeUrlScalar(value: UrlScalar): string { + return value === null ? 'null' : String(value) +} + +function describeParameterValue(value: UrlParameterValue | undefined): string { + if (value === undefined) { + return '' + } + + if (Array.isArray(value)) { + return value.join(', ') + } + + if ( + typeof value === 'string' || + typeof value === 'number' || + typeof value === 'boolean' || + value === null + ) { + return serializeUrlScalar(value) + } + + return Object.keys(value).join(', ') +} + +function addQueryParams(url: string, params: UrlQueryRecord): string { const urlObj = new URL(url) Object.entries(params).forEach(([key, value]) => { - urlObj.searchParams.set(key, String(value)) + urlObj.searchParams.set(key, serializeUrlScalar(value)) }) return urlObj.toString() } @@ -735,16 +798,13 @@ function removeQueryParams(url: string, keys: string[]): string { return urlObj.toString() } -function updateQueryParams( - url: string, - params: Record -): string { +function updateQueryParams(url: string, params: UrlQueryRecord): string { const urlObj = new URL(url) Object.entries(params).forEach(([key, value]) => { if (value === null || value === undefined) { urlObj.searchParams.delete(key) } else { - urlObj.searchParams.set(key, String(value)) + urlObj.searchParams.set(key, serializeUrlScalar(value)) } }) return urlObj.toString() @@ -801,7 +861,7 @@ function changePort(url: string, port?: string | number): string { function getOperationDescription( operation: string, - params?: Record + params?: UrlParameters ): string { switch (operation) { case 'add-query': { @@ -809,7 +869,7 @@ function getOperationDescription( params && typeof params.query === 'object' && params.query !== null - ? Object.keys(params.query as Record).join( + ? Object.keys(params.query as UrlQueryRecord).join( ', ' ) : '' @@ -829,26 +889,26 @@ function getOperationDescription( params && typeof params.query === 'object' && params.query !== null - ? Object.keys(params.query as Record).join( + ? Object.keys(params.query as UrlQueryRecord).join( ', ' ) : '' return `Updated query parameters: ${updated}` } case 'add-path': - return `Added path segment: ${params?.['path'] ?? ''}` + return `Added path segment: ${describeParameterValue(params?.path)}` case 'replace-path': - return `Replaced path with: ${params?.['path'] ?? ''}` + return `Replaced path with: ${describeParameterValue(params?.path)}` case 'add-fragment': - return `Added fragment: ${params?.['fragment'] ?? ''}` + return `Added fragment: ${describeParameterValue(params?.fragment)}` case 'remove-fragment': return 'Removed fragment' case 'change-protocol': - return `Changed protocol to: ${params?.['protocol'] ?? ''}` + return `Changed protocol to: ${describeParameterValue(params?.protocol)}` case 'change-hostname': - return `Changed hostname to: ${params?.['hostname'] ?? ''}` + return `Changed hostname to: ${describeParameterValue(params?.hostname)}` case 'change-port': - return `Changed port to: ${params?.['port'] ?? 'default'}` + return `Changed port to: ${describeParameterValue(params?.port) || 'default'}` default: return operation }