diff --git a/aisdk_client.ts b/aisdk_client.ts new file mode 100644 index 0000000..b6f1d2e --- /dev/null +++ b/aisdk_client.ts @@ -0,0 +1,130 @@ +/****************************************************************************** + * YOU PROBABLY DON'T WANT TO BE USING THIS FILE DIRECTLY * + * INSTEAD, EDIT `stagehand.config.ts` TO MODIFY THE CLIENT CONFIGURATION * + ******************************************************************************/ + +/** + * Welcome to the Stagehand Vercel AI SDK client! + * + * This is a client for OpenAI using Vercel AI SDK + * that allows you to create chat completions with Vercel AI SDK. + * + * To use this client, you need to have Vercel AI SDK installed and the appropriate environment variables set. + * + * ```bash + * npm install @vercel/ai + * ``` + */ + +import { + CoreAssistantMessage, + CoreMessage, + CoreSystemMessage, + CoreTool, + CoreUserMessage, + generateObject, + generateText, + ImagePart, + LanguageModel, + TextPart, +} from "ai"; +import { ChatCompletion } from "openai/resources/chat/completions"; +import { + CreateChatCompletionOptions, + LLMClient, + AvailableModel, +} from "@browserbasehq/stagehand"; + +export class AISdkClient extends LLMClient { + public type = "aisdk" as const; + private model: LanguageModel; + + constructor({ model }: { model: LanguageModel }) { + super(model.modelId as AvailableModel); + this.model = model; + } + + async createChatCompletion({ + options, + }: CreateChatCompletionOptions): Promise { + const formattedMessages: CoreMessage[] = options.messages.map((message) => { + if (Array.isArray(message.content)) { + if (message.role === "system") { + const systemMessage: CoreSystemMessage = { + role: "system", + content: message.content + .map((c) => ("text" in c ? c.text : "")) + .join("\n"), + }; + return systemMessage; + } + + const contentParts = message.content.map((content) => { + if ("image_url" in content) { + const imageContent: ImagePart = { + type: "image", + image: content.image_url.url, + }; + return imageContent; + } else { + const textContent: TextPart = { + type: "text", + text: content.text, + }; + return textContent; + } + }); + + if (message.role === "user") { + const userMessage: CoreUserMessage = { + role: "user", + content: contentParts, + }; + return userMessage; + } else { + const textOnlyParts = contentParts.map((part) => ({ + type: "text" as const, + text: part.type === "image" ? "[Image]" : part.text, + })); + const assistantMessage: CoreAssistantMessage = { + role: "assistant", + content: textOnlyParts, + }; + return assistantMessage; + } + } + + return { + role: message.role, + content: message.content, + }; + }); + + if (options.response_model) { + const response = await generateObject({ + model: this.model, + messages: formattedMessages, + schema: options.response_model.schema, + }); + + return response.object; + } + + const tools: Record = {}; + + for (const rawTool of options.tools || []) { + tools[rawTool.name] = { + description: rawTool.description, + parameters: rawTool.parameters, + }; + } + + const response = await generateText({ + model: this.model, + messages: formattedMessages, + tools, + }); + + return response as T; + } +} diff --git a/app/api/agent/route.ts b/app/api/agent/route.ts index 0cffea9..943dcc7 100644 --- a/app/api/agent/route.ts +++ b/app/api/agent/route.ts @@ -1,10 +1,8 @@ -import { NextResponse } from 'next/server'; -import { openai } from "@ai-sdk/openai"; +import { NextResponse } from "next/server"; import { CoreMessage, generateObject, UserContent } from "ai"; import { z } from "zod"; -import { ObserveResult, Stagehand } from "@browserbasehq/stagehand"; - -const LLMClient = openai("gpt-4o"); +import { ObserveResult, Page, Stagehand } from "@browserbasehq/stagehand"; +import StagehandConfig, { LLMClient } from "@/stagehand.config"; type Step = { text: string; @@ -19,13 +17,20 @@ async function runStagehand({ instruction, }: { sessionID: string; - method: "GOTO" | "ACT" | "EXTRACT" | "CLOSE" | "SCREENSHOT" | "OBSERVE" | "WAIT" | "NAVBACK"; + method: + | "GOTO" + | "ACT" + | "EXTRACT" + | "CLOSE" + | "SCREENSHOT" + | "OBSERVE" + | "WAIT" + | "NAVBACK"; instruction?: string; }) { const stagehand = new Stagehand({ + ...StagehandConfig, browserbaseSessionID: sessionID, - env: "BROWSERBASE", - logger: () => {}, }); await stagehand.init(); @@ -81,6 +86,62 @@ async function runStagehand({ } } +async function getSuggestions({ + page, + goal, + stepInstruction, + previousSteps, +}: { + page: Page; + goal?: string; + stepInstruction?: string; + previousSteps: { + method: string; + description: string; + result?: string; + }[]; +}) { + const suggestions = await page.observe( + ` + ${goal ? `You are trying to achieve the following goal: "${goal}"` : ""} + ${ + stepInstruction + ? `THE USER'S SPECIFIC STEP INSTRUCTION IS AS FOLLOWS: "${stepInstruction}"` + : "" + } + ${ + previousSteps.length > 0 + ? `THE PREVIOUS STEPS ARE AS FOLLOWS: ${previousSteps + .map( + (step, i) => + `[${i + 1}] ${step.method.toUpperCase()}: ${step.description}` + ) + .join("\n")}` + : "" + } + If there is data on the page, get the top 5 things that a user would want to do (take action) or read on this page, with the most likely first. Limit the suggestions to 5. + If the user is requesting text (NON-INTERACTABLE) information from the page, and you see the information in the current page, set the method to 'EXTRACT' and include the data + in the description. Make sure to select an element id pointing to the element to extract from, or its parent. + If the user wants to interact with an element on the page, or the page in general, such as clicking a button, filling a form, or typing into a search bar, DO NOT USE EXTRACT. + If the method is 'EXTRACT', set a description (think of it as an instruction) of the data to extract as the first argument. For the second argument, provide a JSON schema that matches the structure of the data to be extracted. The schema should be a valid JSON schema object with proper types and structure. THE JSON SCHEMA MUST BE A STRING. For example: + '{ + "type": "object", + "properties": { + "title": { "type": "string" }, + "description": { "type": "string" }, + "items": { + "type": "array", + "items": { "type": "string" } + } + }, + "required": ["title"] + }' + Do NOT include the result values in the argument, instead describe what the result should look like. Put the actual extracted values in the description. + Without a specific instruction, MAKE SURE to combine / alternate extract and non-extract suggestions such as click, fill, type, etc. DON'T PROVIDE ONLY ACT CALLS, COMBINE WITH EXTRACT. ON EXTRACT CALLS PROVIDE BOTH ARGUMENTS LIKE IN THE TEMPLATE: STICK TO ZOD SCHEMA AS A STRING. THE ZOD SCHEMA SHOULD BE AN OBJECT AT THE ROOT LEVEL, FOR EXAMPLE: '{"type": "object", "properties": {"example": {"type": "string"}}}. The first part of a zod schema should always be the object'` + ); + return suggestions; +} + async function sendPrompt({ goal, sessionID, @@ -96,21 +157,24 @@ async function sendPrompt({ try { const stagehand = new Stagehand({ + ...StagehandConfig, browserbaseSessionID: sessionID, - env: "BROWSERBASE" }); await stagehand.init(); currentUrl = await stagehand.page.url(); await stagehand.close(); } catch (error) { - console.error('Error getting page info:', error); + console.error("Error getting page info:", error); } const content: UserContent = [ { type: "text", - text: `Consider the following screenshot of a web page${currentUrl ? ` (URL: ${currentUrl})` : ''}, with the goal being "${goal}". -${previousSteps.length > 0 + text: `Consider the following screenshot of a web page${ + currentUrl ? ` (URL: ${currentUrl})` : "" + }, with the goal being "${goal}". +${ + previousSteps.length > 0 ? `Previous steps taken: ${previousSteps .map( @@ -141,7 +205,10 @@ If the goal has been achieved, return "close".`, ]; // Add screenshot if navigated to a page previously - if (previousSteps.length > 0 && previousSteps.some((step) => step.tool === "GOTO")) { + if ( + previousSteps.length > 0 && + previousSteps.some((step) => step.tool === "GOTO") + ) { content.push({ type: "image", image: (await runStagehand({ @@ -193,32 +260,34 @@ If the goal has been achieved, return "close".`, async function selectStartingUrl(goal: string) { const message: CoreMessage = { role: "user", - content: [{ - type: "text", - text: `Given the goal: "${goal}", determine the best URL to start from. + content: [ + { + type: "text", + text: `Given the goal: "${goal}", determine the best URL to start from. Choose from: 1. A relevant search engine (Google, Bing, etc.) 2. A direct URL if you're confident about the target website 3. Any other appropriate starting point -Return a URL that would be most effective for achieving this goal.` - }] +Return a URL that would be most effective for achieving this goal.`, + }, + ], }; const result = await generateObject({ model: LLMClient, schema: z.object({ url: z.string().url(), - reasoning: z.string() + reasoning: z.string(), }), - messages: [message] + messages: [message], }); return result.object; } export async function GET() { - return NextResponse.json({ message: 'Agent API endpoint ready' }); + return NextResponse.json({ message: "Agent API endpoint ready" }); } export async function POST(request: Request) { @@ -228,17 +297,17 @@ export async function POST(request: Request) { if (!sessionId) { return NextResponse.json( - { error: 'Missing sessionId in request body' }, + { error: "Missing sessionId in request body" }, { status: 400 } ); } // Handle different action types switch (action) { - case 'START': { + case "START": { if (!goal) { return NextResponse.json( - { error: 'Missing goal in request body' }, + { error: "Missing goal in request body" }, { status: 400 } ); } @@ -249,31 +318,52 @@ export async function POST(request: Request) { text: `Navigating to ${url}`, reasoning, tool: "GOTO" as const, - instruction: url + instruction: url, }; - + await runStagehand({ sessionID: sessionId, method: "GOTO", - instruction: url + instruction: url, }); - return NextResponse.json({ + return NextResponse.json({ success: true, result: firstStep, steps: [firstStep], - done: false + done: false, }); } - case 'GET_NEXT_STEP': { + case "GET_NEXT_STEP": { if (!goal) { return NextResponse.json( - { error: 'Missing goal in request body' }, + { error: "Missing goal in request body" }, { status: 400 } ); } + console.log("STARTING STAGEHAND"); + const startTime = performance.now(); + const stagehand = new Stagehand({ + ...StagehandConfig, + browserbaseSessionID: sessionId, + }); + await stagehand.init(); + const suggestions = await getSuggestions({ + page: stagehand.page, + goal, + previousSteps: previousSteps.map((step: Step) => ({ + method: step.tool, + description: step.text, + })), + // previousExtraction: previousSteps.find(step => step.tool === "EXTRACT")?.result, + }); + await stagehand.close(); + const endTime = performance.now(); + console.log(`Time taken: ${endTime - startTime}ms`); + console.log("SUGGESTIONS", suggestions); + // Get the next step from the LLM const { result, previousSteps: newPreviousSteps } = await sendPrompt({ goal, @@ -285,15 +375,15 @@ export async function POST(request: Request) { success: true, result, steps: newPreviousSteps, - done: result.tool === "CLOSE" + done: result.tool === "CLOSE", }); } - case 'EXECUTE_STEP': { + case "EXECUTE_STEP": { const { step } = body; if (!step) { return NextResponse.json( - { error: 'Missing step in request body' }, + { error: "Missing step in request body" }, { status: 400 } ); } @@ -308,21 +398,21 @@ export async function POST(request: Request) { return NextResponse.json({ success: true, extraction, - done: step.tool === "CLOSE" + done: step.tool === "CLOSE", }); } default: return NextResponse.json( - { error: 'Invalid action type' }, + { error: "Invalid action type" }, { status: 400 } ); } } catch (error) { - console.error('Error in agent endpoint:', error); + console.error("Error in agent endpoint:", error); return NextResponse.json( - { success: false, error: 'Failed to process request' }, + { success: false, error: "Failed to process request" }, { status: 500 } ); } -} \ No newline at end of file +} diff --git a/app/components/ChatFeed.tsx b/app/components/ChatFeed.tsx index 10b5323..203e14a 100644 --- a/app/components/ChatFeed.tsx +++ b/app/components/ChatFeed.tsx @@ -32,7 +32,6 @@ export default function ChatFeed({ initialMessage, onClose }: ChatFeedProps) { const [isLoading, setIsLoading] = useState(false); const { width } = useWindowSize(); const isMobile = width ? width < 768 : false; - const initializationRef = useRef(false); const chatContainerRef = useRef(null); const [isAgentFinished, setIsAgentFinished] = useState(false); const [contextId, setContextId] = useAtom(contextIdAtom); @@ -53,6 +52,11 @@ export default function ChatFeed({ initialMessage, onClose }: ChatFeedProps) { steps: [], }); + const [canStart, setCanStart] = useState(true); + + // Add new state for controlling next step button + const [canExecuteNextStep, setCanExecuteNextStep] = useState(false); + const scrollToBottom = useCallback(() => { if (chatContainerRef.current) { chatContainerRef.current.scrollTop = @@ -82,173 +86,175 @@ export default function ChatFeed({ initialMessage, onClose }: ChatFeedProps) { scrollToBottom(); }, [uiState.steps, scrollToBottom]); - useEffect(() => { - console.log("useEffect called"); - const initializeSession = async () => { - if (initializationRef.current) return; - initializationRef.current = true; - - if (initialMessage && !agentStateRef.current.sessionId) { - setIsLoading(true); - try { - const sessionResponse = await fetch("/api/session", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, - contextId: contextId, - }), - }); - const sessionData = await sessionResponse.json(); - - if (!sessionData.success) { - throw new Error(sessionData.error || "Failed to create session"); - } - - setContextId(sessionData.contextId); - - agentStateRef.current = { - ...agentStateRef.current, - sessionId: sessionData.sessionId, - sessionUrl: sessionData.sessionUrl.replace( - "https://www.browserbase.com/devtools-fullscreen/inspector.html", - "https://www.browserbase.com/devtools-internal-compiled/index.html" - ), - }; - - setUiState({ - sessionId: sessionData.sessionId, - sessionUrl: sessionData.sessionUrl.replace( - "https://www.browserbase.com/devtools-fullscreen/inspector.html", - "https://www.browserbase.com/devtools-internal-compiled/index.html" - ), - steps: [], - }); - - const response = await fetch("/api/agent", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - goal: initialMessage, - sessionId: sessionData.sessionId, - action: "START", - }), - }); - - const data = await response.json(); - posthog.capture("agent_start", { - goal: initialMessage, - sessionId: sessionData.sessionId, - contextId: sessionData.contextId, - }); - - if (data.success) { - const newStep = { - text: data.result.text, - reasoning: data.result.reasoning, - tool: data.result.tool, - instruction: data.result.instruction, - stepNumber: 1, - }; - - agentStateRef.current = { - ...agentStateRef.current, - steps: [newStep], - }; - - setUiState((prev) => ({ - ...prev, - steps: [newStep], - })); - - // Continue with subsequent steps - while (true) { - // Get next step from LLM - const nextStepResponse = await fetch("/api/agent", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - goal: initialMessage, - sessionId: sessionData.sessionId, - previousSteps: agentStateRef.current.steps, - action: "GET_NEXT_STEP", - }), - }); - - const nextStepData = await nextStepResponse.json(); - - if (!nextStepData.success) { - throw new Error("Failed to get next step"); - } - - // Add the next step to UI immediately after receiving it - const nextStep = { - ...nextStepData.result, - stepNumber: agentStateRef.current.steps.length + 1, - }; - - agentStateRef.current = { - ...agentStateRef.current, - steps: [...agentStateRef.current.steps, nextStep], - }; - - setUiState((prev) => ({ - ...prev, - steps: agentStateRef.current.steps, - })); - - // Break after adding the CLOSE step to UI - if (nextStepData.done || nextStepData.result.tool === "CLOSE") { - break; - } - - // Execute the step - const executeResponse = await fetch("/api/agent", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - sessionId: sessionData.sessionId, - step: nextStepData.result, - action: "EXECUTE_STEP", - }), - }); - - const executeData = await executeResponse.json(); - - posthog.capture("agent_execute_step", { - goal: initialMessage, - sessionId: sessionData.sessionId, - contextId: sessionData.contextId, - step: nextStepData.result, - }); - - if (!executeData.success) { - throw new Error("Failed to execute step"); - } - - if (executeData.done) { - break; - } - } - } - } catch (error) { - console.error("Session initialization error:", error); - } finally { - setIsLoading(false); - } + const handleStartAgent = async () => { + if (!initialMessage || !canStart) return; + setCanStart(false); + setIsLoading(true); + + try { + const sessionResponse = await fetch("/api/session", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, + contextId: contextId, + }), + }); + const sessionData = await sessionResponse.json(); + + if (!sessionData.success) { + throw new Error(sessionData.error || "Failed to create session"); } - }; - initializeSession(); - }, [initialMessage]); + setContextId(sessionData.contextId); + + agentStateRef.current = { + ...agentStateRef.current, + sessionId: sessionData.sessionId, + sessionUrl: sessionData.sessionUrl.replace( + "https://www.browserbase.com/devtools-fullscreen/inspector.html", + "https://www.browserbase.com/devtools-internal-compiled/index.html" + ), + }; + + setUiState({ + sessionId: sessionData.sessionId, + sessionUrl: sessionData.sessionUrl.replace( + "https://www.browserbase.com/devtools-fullscreen/inspector.html", + "https://www.browserbase.com/devtools-internal-compiled/index.html" + ), + steps: [], + }); + + const response = await fetch("/api/agent", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + goal: initialMessage, + sessionId: sessionData.sessionId, + action: "START", + }), + }); + + const data = await response.json(); + posthog.capture("agent_start", { + goal: initialMessage, + sessionId: sessionData.sessionId, + contextId: sessionData.contextId, + }); + + if (data.success) { + const newStep = { + text: data.result.text, + reasoning: data.result.reasoning, + tool: data.result.tool, + instruction: data.result.instruction, + stepNumber: 1, + }; + + agentStateRef.current = { + ...agentStateRef.current, + steps: [newStep], + }; + + setUiState((prev) => ({ + ...prev, + steps: [newStep], + })); + + // Enable the next step button + setCanExecuteNextStep(true); + } + } catch (error) { + console.error("Session initialization error:", error); + } finally { + setIsLoading(false); + } + }; + + // Add new handler for next step + const handleNextStep = async () => { + setIsLoading(true); + setCanExecuteNextStep(false); + + try { + // Get next step from LLM + const nextStepResponse = await fetch("/api/agent", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + goal: initialMessage, + sessionId: uiState.sessionId, + previousSteps: agentStateRef.current.steps, + action: "GET_NEXT_STEP", + }), + }); + + const nextStepData = await nextStepResponse.json(); + + if (!nextStepData.success) { + throw new Error("Failed to get next step"); + } + + // Add the next step to UI + const nextStep = { + ...nextStepData.result, + stepNumber: agentStateRef.current.steps.length + 1, + }; + + agentStateRef.current = { + ...agentStateRef.current, + steps: [...agentStateRef.current.steps, nextStep], + }; + + setUiState((prev) => ({ + ...prev, + steps: agentStateRef.current.steps, + })); + + // If not done, execute the step + if (!nextStepData.done && nextStepData.result.tool !== "CLOSE") { + const executeResponse = await fetch("/api/agent", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + sessionId: uiState.sessionId, + step: nextStepData.result, + action: "EXECUTE_STEP", + }), + }); + + const executeData = await executeResponse.json(); + + posthog.capture("agent_execute_step", { + goal: initialMessage, + sessionId: uiState.sessionId, + contextId: contextId, + step: nextStepData.result, + }); + + if (!executeData.success) { + throw new Error("Failed to execute step"); + } + + if (!executeData.done) { + setCanExecuteNextStep(true); + } + } + } catch (error) { + console.error("Error executing next step:", error); + } finally { + setIsLoading(false); + } + }; // Spring configuration for smoother animations const springConfig = { @@ -388,6 +394,16 @@ export default function ChatFeed({ initialMessage, onClose }: ChatFeedProps) { >

Goal:

{initialMessage}

+ {canStart && ( + + Start Agent + + )} )} @@ -412,6 +428,18 @@ export default function ChatFeed({ initialMessage, onClose }: ChatFeedProps) {

))} + + {canExecuteNextStep && !isLoading && ( + + Next Step + + )} + {isLoading && ( =18'} peerDependencies: zod: ^3.0.0 - '@ai-sdk/provider-utils@2.1.2': - resolution: {integrity: sha512-ezpQT6kzy/2O4yyn/2YigMqynBYjZIOam3/EMNVzju+Ogj+Z+pf27c/Th78ce0A2ltgrXx6xN14sal/HHZNOOw==} + '@ai-sdk/groq@1.1.11': + resolution: {integrity: sha512-Y5WUyWuxkQarl4AVGeIMbNSp4/XiwW/mxp9SKeagfDhflVnQHd2ggISVD6HiOBQhznusITjWYYC66DJeBn0v6A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai-compatible@0.1.12': + resolution: {integrity: sha512-2bMhAEeiRz4lbW5ixjGjbPhwyqjtujkjLVpqqtqWvvUDvtUM3cw1go9pqWFgaNKSBDaXRUfi8mkAVrn1yRuY2A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai@1.1.14': + resolution: {integrity: sha512-r5oD+Sz7z8kfxnXfqR53fYQ1xbT/BeUGhQ26FWzs5gO4j52pGUpzCt0SBm3SH1ZSjFY5O/zoKRnsbrPeBe1sNA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@2.1.10': + resolution: {integrity: sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -108,12 +138,12 @@ packages: zod: optional: true - '@ai-sdk/provider@1.0.6': - resolution: {integrity: sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA==} + '@ai-sdk/provider@1.0.9': + resolution: {integrity: sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA==} engines: {node: '>=18'} - '@ai-sdk/react@1.1.2': - resolution: {integrity: sha512-bBcRsDaNHzCKSIBbPngMeqbnwZ1RFadXQo9XzHoGrvLANYRwuphGNB8XTXYVLC/eXjoaGVGw2wWf/TYigEnCuA==} + '@ai-sdk/react@1.1.18': + resolution: {integrity: sha512-2wlWug6NVAc8zh3pgqtvwPkSNTdA6Q4x9CmrNXCeHcXfJkJ+MuHFQz/I7Wb7mLRajf0DAxsFLIhHyBCEuTkDNw==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -124,8 +154,8 @@ packages: zod: optional: true - '@ai-sdk/ui-utils@1.1.2': - resolution: {integrity: sha512-+0kfBF4Y9jmlg1KlbNKIxchmXx9PzuReSpgRNWhpU10vfl1eeer4xK/XL2qHnzAWhsMFe/SVZXJIQObk44zNEQ==} + '@ai-sdk/ui-utils@1.1.16': + resolution: {integrity: sha512-jfblR2yZVISmNK2zyNzJZFtkgX57WDAUQXcmn3XUBJyo8LFsADu+/vYMn5AOyBi9qJT0RBk11PEtIxIqvByw3Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -140,11 +170,11 @@ packages: '@anthropic-ai/sdk@0.27.3': resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} - '@browserbasehq/sdk@2.0.0': - resolution: {integrity: sha512-BdPlZyn0dpXlL70gNK4acpqWIRB+edo2z0/GalQdWghRq8iQjySd9fVIF3evKH1p2wCYekZJRK6tm29YfXB67g==} + '@browserbasehq/sdk@2.3.0': + resolution: {integrity: sha512-H2nu46C6ydWgHY+7yqaP8qpfRJMJFVGxVIgsuHe1cx9HkfJHqzkuIqaK/k8mU4ZeavQgV5ZrJa0UX6MDGYiT4w==} - '@browserbasehq/stagehand@1.10.1': - resolution: {integrity: sha512-A222TCseFvKNvBwav7ZrZmug0JnYvy1vFI1ReNOtcymjhrZQLfklq1gm/luUjr8aRTbTzsUV8iclt5r0kyaXbA==} + '@browserbasehq/stagehand@1.13.1': + resolution: {integrity: sha512-sty9bDiuuQJDOS+/uBfXpwYQY+mhFyqi6uT5wSOrazagZ5s8tgk3ryCIheB/BGS5iisc6ivAsKe9aC9n5WBTAg==} peerDependencies: '@playwright/test': ^1.42.1 deepmerge: ^4.3.1 @@ -165,28 +195,28 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -205,8 +235,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@img/sharp-darwin-arm64@0.33.5': @@ -414,11 +444,14 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.50.0': - resolution: {integrity: sha512-ZGNXbt+d65EGjBORQHuYKj+XhCewlwpnSd/EDuLPZGSiEWmgOJB5RmMCCYGy5aMfTs9wx61RivfDKi8H/hcMvw==} + '@playwright/test@1.50.1': + resolution: {integrity: sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==} engines: {node: '>=18'} hasBin: true + '@rrweb/types@2.0.0-alpha.17': + resolution: {integrity: sha512-AfDTVUuCyCaIG0lTSqYtrZqJX39ZEYzs4fYKnexhQ+id+kbZIpIJtaut5cto6dWZbB3SEe4fW0o90Po3LvTmfg==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -446,69 +479,69 @@ packages: '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - '@types/node@18.19.74': - resolution: {integrity: sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==} + '@types/node@18.19.76': + resolution: {integrity: sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==} - '@types/node@20.17.16': - resolution: {integrity: sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==} + '@types/node@20.17.19': + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} - '@types/react-dom@19.0.3': - resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.8': - resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} - '@typescript-eslint/eslint-plugin@8.21.0': - resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.21.0': - resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.21.0': - resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.21.0': - resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.21.0': - resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.21.0': - resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.21.0': - resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.21.0': - resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vercel/analytics@1.4.1': - resolution: {integrity: sha512-ekpL4ReX2TH3LnrRZTUKjHHNpNy9S1I7QmS+g/RQXoSUQ8ienzosuX7T9djZ/s8zPhBx1mpHP/Rw5875N+zQIQ==} + '@vercel/analytics@1.5.0': + resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==} peerDependencies: '@remix-run/react': ^2 '@sveltejs/kit': ^1 || ^2 @@ -551,8 +584,8 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} - ai@4.1.2: - resolution: {integrity: sha512-11efhPorWFphIpeCgjW6r/jk4wB5RWUGjxayHblBXCq6YEc7o5ki7vlmSnESprsDkMEfmONBWb/xM8pWjR5O2g==} + ai@4.1.46: + resolution: {integrity: sha512-VTvAktT69IN1qcNAv7OlcOuR0q4HqUlhkVacrWmMlEoprYykF9EL5RY8IECD5d036Wqg0walwbSKZlA2noHm1A==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -674,8 +707,8 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: @@ -694,8 +727,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001695: - resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -841,8 +874,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} es-abstract@1.23.9: @@ -869,8 +902,9 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} @@ -892,8 +926,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.7.0: - resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -966,8 +1000,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.18.0: - resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1021,8 +1055,16 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -1043,21 +1085,22 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} formdata-node@4.4.1: @@ -1078,8 +1121,8 @@ packages: react-dom: optional: true - framer-motion@12.0.3: - resolution: {integrity: sha512-5yy1sAqOjBUo+8O+kOa6/rIJ1AQLME8vEpUwwMf9Gv6YktaeeTd4bf0sb89AWwDVX7GwwuLebH94bakGOqWQ/g==} + framer-motion@12.4.7: + resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1112,8 +1155,8 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-proto@1.0.1: @@ -1191,8 +1234,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1222,8 +1265,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-bun-module@1.3.0: @@ -1305,8 +1348,8 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} is-weakset@2.0.4: @@ -1330,8 +1373,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jotai@2.11.1: - resolution: {integrity: sha512-41Su098mpHIX29hF/XOpDb0SqF6EES7+HXfrhuBqVSzRkxX48hD5i8nGsEewWZNAsBWJCTTmuz8M946Ih2PfcQ==} + jotai@2.12.1: + resolution: {integrity: sha512-VUW0nMPYIru5g89tdxwr9ftiVdc/nGV9jvHISN8Ucx+m1vI9dBeHemfqYzEuw5XSkmYjD/MEyApN9k6yrATsZQ==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -1449,8 +1492,8 @@ packages: motion-dom@11.18.1: resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} - motion-dom@12.0.0: - resolution: {integrity: sha512-CvYd15OeIR6kHgMdonCc1ihsaUG4MYh/wrkz8gZ3hBX/uamyZCXN9S9qJoYF03GqfTt7thTV/dxnHYX4+55vDg==} + motion-dom@12.4.5: + resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} motion-utils@11.18.1: resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} @@ -1458,8 +1501,8 @@ packages: motion-utils@12.0.0: resolution: {integrity: sha512-MNFiBKbbqnmvOjkPyOKgHUp3Q6oiokLkI1bEwm5QA28cxMZrv0CbbBGDNmhF6DIXsi1pCQBSs0dX8xjeER1tmA==} - motion@12.0.3: - resolution: {integrity: sha512-YGSC4jLQMmfIKafDHeK3E50hKF2YjGlrVuM94dwvT9IlSaIaoGe+K21G16TM9weIxjIEYc5l5mzYhuXXi1UN1A==} + motion@12.4.7: + resolution: {integrity: sha512-mhegHAbf1r80fr+ytC6OkjKvIUegRNXKLWNPrCN2+GnixlNSPwT03FtKqp9oDny1kNcLWZvwbmEr+JqVryFrcg==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1532,8 +1575,8 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -1560,8 +1603,8 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - openai@4.80.0: - resolution: {integrity: sha512-5TqdNQgjOMxo3CkCvtjzuSwuznO/o3q5aak0MTy6IjRvPtvVA1wAFGJU3eZT1JHzhs2wFb/xtDG0o6Y/2KGCfw==} + openai@4.85.4: + resolution: {integrity: sha512-Nki51PBSu+Aryo7WKbdXvfm0X/iKkQS2fq3O0Uqb/O3b4exOZFid2te1BZ52bbO5UwxQZ5eeHJDCTqtrJLPw0w==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -1617,6 +1660,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -1625,18 +1672,18 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - playwright-core@1.50.0: - resolution: {integrity: sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ==} + playwright-core@1.50.1: + resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} engines: {node: '>=18'} hasBin: true - playwright@1.50.0: - resolution: {integrity: sha512-+GinGfGTrd2IfX1TA4N2gNmeIksSb+IAe589ZH+FlmpV3MYTx6+buChGIuDLQwrGNCw2lWibqV50fU510N7S+w==} + playwright@1.50.1: + resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} engines: {node: '>=18'} hasBin: true - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss-import@15.1.0: @@ -1680,15 +1727,17 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.209.3: - resolution: {integrity: sha512-Q1VRWWfJ+k2lKV9UXBhyd5JkUJ+nf3LZHqvGF10XfC/jI/IEM1YgVXhbtMSo8cEgRJl7H+aFafoNcu82yNz0zw==} + posthog-js@1.223.4: + resolution: {integrity: sha512-dDyUcWJ+6gzaaVS0Ekjot30BeWb5EiWiU+RFI59/2PDoHsjcZ2RPyCb/TRh9b06WvNqJWvck7GdUJwwjhkSzRw==} + peerDependencies: + '@rrweb/types': 2.0.0-alpha.17 - preact@10.25.4: - resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} + preact@10.26.2: + resolution: {integrity: sha512-0gNmv4qpS9HaN3+40CLBAnKe0ZfyE4ZWo5xKlC1rVrr0ckkEvJvAQqKaHANdFKsGstoxrY4AItZ7kZSGVoVjgg==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -1747,10 +1796,13 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rrweb-snapshot@2.0.0-alpha.18: + resolution: {integrity: sha512-hBHZL/NfgQX6wO1D9mpwqFu1NJPpim+moIcKhFEjVTZVRUfCln+LOugRc4teVTCISYHN8Cw5e2iNTWCSm+SkoA==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1776,8 +1828,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -1912,8 +1964,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - swr@2.3.0: - resolution: {integrity: sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==} + swr@2.3.2: + resolution: {integrity: sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1937,6 +1989,10 @@ packages: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1944,8 +2000,8 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ts-api-utils@2.0.0: - resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2057,8 +2113,8 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2078,58 +2134,77 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod-to-json-schema@3.24.1: - resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + zod-to-json-schema@3.24.3: + resolution: {integrity: sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==} peerDependencies: zod: ^3.24.1 - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} snapshots: - '@ai-sdk/openai@1.1.2(zod@3.24.1)': + '@ai-sdk/cerebras@0.1.12(zod@3.24.2)': + dependencies: + '@ai-sdk/openai-compatible': 0.1.12(zod@3.24.2) + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + zod: 3.24.2 + + '@ai-sdk/groq@1.1.11(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + zod: 3.24.2 + + '@ai-sdk/openai-compatible@0.1.12(zod@3.24.2)': dependencies: - '@ai-sdk/provider': 1.0.6 - '@ai-sdk/provider-utils': 2.1.2(zod@3.24.1) - zod: 3.24.1 + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + zod: 3.24.2 - '@ai-sdk/provider-utils@2.1.2(zod@3.24.1)': + '@ai-sdk/openai@1.1.14(zod@3.24.2)': dependencies: - '@ai-sdk/provider': 1.0.6 + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + zod: 3.24.2 + + '@ai-sdk/provider-utils@2.1.10(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.0.9 eventsource-parser: 3.0.0 nanoid: 3.3.8 secure-json-parse: 2.7.0 optionalDependencies: - zod: 3.24.1 + zod: 3.24.2 - '@ai-sdk/provider@1.0.6': + '@ai-sdk/provider@1.0.9': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@1.1.2(react@19.0.0)(zod@3.24.1)': + '@ai-sdk/react@1.1.18(react@19.0.0)(zod@3.24.2)': dependencies: - '@ai-sdk/provider-utils': 2.1.2(zod@3.24.1) - '@ai-sdk/ui-utils': 1.1.2(zod@3.24.1) - swr: 2.3.0(react@19.0.0) + '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + '@ai-sdk/ui-utils': 1.1.16(zod@3.24.2) + swr: 2.3.2(react@19.0.0) throttleit: 2.1.0 optionalDependencies: react: 19.0.0 - zod: 3.24.1 + zod: 3.24.2 - '@ai-sdk/ui-utils@1.1.2(zod@3.24.1)': + '@ai-sdk/ui-utils@1.1.16(zod@3.24.2)': dependencies: - '@ai-sdk/provider': 1.0.6 - '@ai-sdk/provider-utils': 2.1.2(zod@3.24.1) - zod-to-json-schema: 3.24.1(zod@3.24.1) + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + zod-to-json-schema: 3.24.3(zod@3.24.2) optionalDependencies: - zod: 3.24.1 + zod: 3.24.2 '@alloc/quick-lru@5.2.0': {} '@anthropic-ai/sdk@0.27.3': dependencies: - '@types/node': 18.19.74 + '@types/node': 18.19.76 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.6.0 @@ -2139,9 +2214,9 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/sdk@2.0.0': + '@browserbasehq/sdk@2.3.0': dependencies: - '@types/node': 18.19.74 + '@types/node': 18.19.76 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.6.0 @@ -2151,18 +2226,17 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/stagehand@1.10.1(@playwright/test@1.50.0)(deepmerge@4.3.1)(dotenv@16.4.7)(openai@4.80.0(ws@8.18.0)(zod@3.24.1))(zod@3.24.1)': + '@browserbasehq/stagehand@1.13.1(@playwright/test@1.50.1)(deepmerge@4.3.1)(dotenv@16.4.7)(openai@4.85.4(ws@8.18.1)(zod@3.24.2))(zod@3.24.2)': dependencies: '@anthropic-ai/sdk': 0.27.3 - '@browserbasehq/sdk': 2.0.0 - '@playwright/test': 1.50.0 + '@browserbasehq/sdk': 2.3.0 + '@playwright/test': 1.50.1 deepmerge: 4.3.1 dotenv: 16.4.7 - openai: 4.80.0(ws@8.18.0)(zod@3.24.1) - sharp: 0.33.5 - ws: 8.18.0 - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) + openai: 4.85.4(ws@8.18.1)(zod@3.24.2) + ws: 8.18.1 + zod: 3.24.2 + zod-to-json-schema: 3.24.3(zod@3.24.2) transitivePeerDependencies: - bufferutil - encoding @@ -2173,46 +2247,46 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.2': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.21.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -2226,7 +2300,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -2369,7 +2443,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.0 '@nolyfill/is-core-module@1.0.39': {} @@ -2378,9 +2452,13 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.50.0': + '@playwright/test@1.50.1': + dependencies: + playwright: 1.50.1 + + '@rrweb/types@2.0.0-alpha.17': dependencies: - playwright: 1.50.0 + rrweb-snapshot: 2.0.0-alpha.18 '@rtsao/scc@1.1.0': {} @@ -2402,105 +2480,105 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.17.16 - form-data: 4.0.1 + '@types/node': 20.17.19 + form-data: 4.0.2 - '@types/node@18.19.74': + '@types/node@18.19.76': dependencies: undici-types: 5.26.5 - '@types/node@20.17.16': + '@types/node@20.17.19': dependencies: undici-types: 6.19.8 - '@types/react-dom@19.0.3(@types/react@19.0.8)': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 - '@types/react@19.0.8': + '@types/react@19.0.10': dependencies: csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.21.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.18.0(jiti@1.21.7) - ts-api-utils: 2.0.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.21.0': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.7.3) + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.21.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 - '@vercel/analytics@1.4.1(next@15.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': + '@vercel/analytics@1.5.0(next@15.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': optionalDependencies: - next: 15.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 abort-controller@3.0.0: @@ -2517,17 +2595,17 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@4.1.2(react@19.0.0)(zod@3.24.1): + ai@4.1.46(react@19.0.0)(zod@3.24.2): dependencies: - '@ai-sdk/provider': 1.0.6 - '@ai-sdk/provider-utils': 2.1.2(zod@3.24.1) - '@ai-sdk/react': 1.1.2(react@19.0.0)(zod@3.24.1) - '@ai-sdk/ui-utils': 1.1.2(zod@3.24.1) + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.24.2) + '@ai-sdk/react': 1.1.18(react@19.0.0)(zod@3.24.2) + '@ai-sdk/ui-utils': 1.1.16(zod@3.24.2) '@opentelemetry/api': 1.9.0 jsondiffpatch: 0.6.0 optionalDependencies: react: 19.0.0 - zod: 3.24.1 + zod: 3.24.2 ajv@6.12.6: dependencies: @@ -2570,7 +2648,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 array.prototype.findlast@1.2.5: @@ -2580,7 +2658,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: @@ -2589,21 +2667,21 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: @@ -2611,7 +2689,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -2620,7 +2698,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} @@ -2631,7 +2709,7 @@ snapshots: available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} @@ -2658,28 +2736,28 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001695: {} + caniuse-lite@1.0.30001700: {} chalk@4.1.2: dependencies: @@ -2802,7 +2880,7 @@ snapshots: dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -2812,7 +2890,7 @@ snapshots: emoji-regex@9.2.2: {} - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -2833,7 +2911,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -2850,9 +2928,9 @@ snapshots: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -2884,7 +2962,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -2901,11 +2979,11 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -2917,19 +2995,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.6(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3): + eslint-config-next@15.1.6(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 15.1.6 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-react: 7.37.4(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-react-hooks: 5.1.0(eslint@9.18.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react: 7.37.4(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.1.0(eslint@9.21.0(jiti@1.21.7)) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -2945,34 +3023,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.18.0 - eslint: 9.18.0(jiti@1.21.7) - fast-glob: 3.3.3 + enhanced-resolve: 5.18.1 + eslint: 9.21.0(jiti@1.21.7) get-tsconfig: 4.10.0 is-bun-module: 1.3.0 - is-glob: 4.0.3 stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -2981,9 +3058,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -2995,13 +3072,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -3011,7 +3088,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -3020,11 +3097,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-react-hooks@5.1.0(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) - eslint-plugin-react@7.37.4(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@1.21.7)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -3032,7 +3109,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -3055,18 +3132,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.18.0(jiti@1.21.7): + eslint@9.21.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -3140,9 +3217,13 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.18.0: + fastq@1.19.0: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 fflate@0.4.8: {} @@ -3161,26 +3242,27 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 form-data-encoder@1.7.2: {} - form-data@4.0.1: + form-data@4.0.2: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 mime-types: 2.1.35 formdata-node@4.4.1: @@ -3197,9 +3279,9 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - framer-motion@12.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - motion-dom: 12.0.0 + motion-dom: 12.4.5 motion-utils: 12.0.0 tslib: 2.8.1 optionalDependencies: @@ -3225,9 +3307,9 @@ snapshots: functions-have-names@1.2.3: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -3247,7 +3329,7 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-tsconfig@4.10.0: dependencies: @@ -3263,7 +3345,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -3311,7 +3393,7 @@ snapshots: ignore@5.3.2: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -3328,7 +3410,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.3.2: {} @@ -3348,14 +3430,14 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 is-bun-module@1.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} @@ -3366,7 +3448,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -3432,14 +3514,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 isarray@2.0.5: {} @@ -3449,7 +3531,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -3462,9 +3544,9 @@ snapshots: jiti@1.21.7: {} - jotai@2.11.1(@types/react@19.0.8)(react@19.0.0): + jotai@2.12.1(@types/react@19.0.10)(react@19.0.0): optionalDependencies: - '@types/react': 19.0.8 + '@types/react': 19.0.10 react: 19.0.0 js-tokens@4.0.0: {} @@ -3562,7 +3644,7 @@ snapshots: dependencies: motion-utils: 11.18.1 - motion-dom@12.0.0: + motion-dom@12.4.5: dependencies: motion-utils: 12.0.0 @@ -3570,9 +3652,9 @@ snapshots: motion-utils@12.0.0: {} - motion@12.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - framer-motion: 12.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + framer-motion: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tslib: 2.8.1 optionalDependencies: react: 19.0.0 @@ -3590,13 +3672,13 @@ snapshots: natural-compare@1.4.0: {} - next@15.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@next/env': 15.1.6 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001695 + caniuse-lite: 1.0.30001700 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -3611,7 +3693,7 @@ snapshots: '@next/swc-win32-arm64-msvc': 15.1.6 '@next/swc-win32-x64-msvc': 15.1.6 '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.50.0 + '@playwright/test': 1.50.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -3629,7 +3711,7 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -3668,9 +3750,9 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - openai@4.80.0(ws@8.18.0)(zod@3.24.1): + openai@4.85.4(ws@8.18.1)(zod@3.24.2): dependencies: - '@types/node': 18.19.74 + '@types/node': 18.19.76 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.6.0 @@ -3678,8 +3760,8 @@ snapshots: formdata-node: 4.4.1 node-fetch: 2.7.0 optionalDependencies: - ws: 8.18.0 - zod: 3.24.1 + ws: 8.18.1 + zod: 3.24.2 transitivePeerDependencies: - encoding @@ -3694,7 +3776,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -3727,42 +3809,44 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} pirates@4.0.6: {} - playwright-core@1.50.0: {} + playwright-core@1.50.1: {} - playwright@1.50.0: + playwright@1.50.1: dependencies: - playwright-core: 1.50.0 + playwright-core: 1.50.1 optionalDependencies: fsevents: 2.3.2 - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.1): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.1): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.1 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.1): + postcss-load-config@4.0.2(postcss@8.5.3): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.1 + postcss: 8.5.3 - postcss-nested@6.2.0(postcss@8.5.1): + postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -3778,20 +3862,21 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.1: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-js@1.209.3: + posthog-js@1.223.4(@rrweb/types@2.0.0-alpha.17): dependencies: + '@rrweb/types': 2.0.0-alpha.17 core-js: 3.40.0 fflate: 0.4.8 - preact: 10.25.4 + preact: 10.26.2 web-vitals: 4.2.4 - preact@10.25.4: {} + preact@10.26.2: {} prelude-ls@1.2.1: {} @@ -3829,7 +3914,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -3858,7 +3943,11 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} + + rrweb-snapshot@2.0.0-alpha.18: + dependencies: + postcss: 8.5.3 run-parallel@1.2.0: dependencies: @@ -3868,7 +3957,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -3889,14 +3978,14 @@ snapshots: semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.1: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -3917,7 +4006,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -3948,27 +4037,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -4011,7 +4100,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -4080,7 +4169,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swr@2.3.0(react@19.0.0): + swr@2.3.2(react@19.0.0): dependencies: dequal: 2.0.3 react: 19.0.0 @@ -4102,11 +4191,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.1 - postcss-import: 15.1.0(postcss@8.5.1) - postcss-js: 4.0.1(postcss@8.5.1) - postcss-load-config: 4.0.2(postcss@8.5.1) - postcss-nested: 6.2.0(postcss@8.5.1) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -4125,13 +4214,18 @@ snapshots: throttleit@2.1.0: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 tr46@0.0.3: {} - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -4159,7 +4253,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -4168,7 +4262,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -4177,10 +4271,10 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 typescript@5.7.3: {} @@ -4225,7 +4319,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -4240,7 +4334,7 @@ snapshots: is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 @@ -4258,7 +4352,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -4280,14 +4374,14 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - ws@8.18.0: {} + ws@8.18.1: {} yaml@2.7.0: {} yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.1(zod@3.24.1): + zod-to-json-schema@3.24.3(zod@3.24.2): dependencies: - zod: 3.24.1 + zod: 3.24.2 - zod@3.24.1: {} + zod@3.24.2: {} diff --git a/stagehand.config.ts b/stagehand.config.ts new file mode 100644 index 0000000..7d94d06 --- /dev/null +++ b/stagehand.config.ts @@ -0,0 +1,80 @@ +import { type ConstructorParams, type LogLine } from "@browserbasehq/stagehand"; +import { AISdkClient } from "./aisdk_client"; +import { cerebras } from "@ai-sdk/cerebras"; + +export const LLMClient = cerebras("llama-3.3-70b"); + +const StagehandConfig: ConstructorParams = { + env: "BROWSERBASE", + apiKey: process.env.BROWSERBASE_API_KEY /* API key for authentication */, + projectId: process.env.BROWSERBASE_PROJECT_ID /* Project identifier */, + debugDom: undefined /* Enable DOM debugging features */, + headless: false /* Run browser in headless mode */, + logger: () => {}, + domSettleTimeoutMs: 30_000 /* Timeout for DOM to settle in milliseconds */, + browserbaseSessionCreateParams: { + projectId: process.env.BROWSERBASE_PROJECT_ID!, + }, + enableCaching: undefined /* Enable caching functionality */, + browserbaseSessionID: + undefined /* Session ID for resuming Browserbase sessions */, + + /** + * Configure the Vercel AI SDK client here + */ + llmClient: new AISdkClient({ + model: LLMClient, + }), +}; + +export default StagehandConfig; + +/** + * Custom logging function that you can use to filter logs. + * + * General pattern here is that `message` will always be unique with no params + * Any param you would put in a log is in `auxiliary`. + * + * For example, an error log looks like this: + * + * ``` + * { + * category: "error", + * message: "Some specific error occurred", + * auxiliary: { + * message: { value: "Error message", type: "string" }, + * trace: { value: "Error trace", type: "string" } + * } + * } + * ``` + * + * You can then use `logLineToString` to filter for a specific log pattern like + * + * ``` + * if (logLine.message === "Some specific error occurred") { + * console.log(logLineToString(logLine)); + * } + * ``` + */ +export function logLineToString(logLine: LogLine): string { + // If you want more detail, set this to false. However, this will make the logs + // more verbose and harder to read. + const HIDE_AUXILIARY = true; + + try { + const timestamp = logLine.timestamp || new Date().toISOString(); + if (logLine.auxiliary?.error) { + return `${timestamp}::[stagehand:${logLine.category}] ${logLine.message}\n ${logLine.auxiliary.error.value}\n ${logLine.auxiliary.trace.value}`; + } + + // If we want to hide auxiliary information, we don't add it to the log + return `${timestamp}::[stagehand:${logLine.category}] ${logLine.message} ${ + logLine.auxiliary && !HIDE_AUXILIARY + ? JSON.stringify(logLine.auxiliary) + : "" + }`; + } catch (error) { + console.error(`Error logging line:`, error); + return "error logging line"; + } +}