pr changes

This commit is contained in:
Aadesh Kheria 2026-04-14 11:16:20 -07:00
parent fa4c814ad8
commit a4c33068f4
13 changed files with 181 additions and 77 deletions

View File

@ -8,10 +8,10 @@ import { getVerifiedQaContext } from "@/lib/ai/verified-qa";
import { listManagedProjectIds } from "@/lib/projects";
import { SmartResponse } from "@/route-handlers/smart-response";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { runAsynchronouslyAndWaitUntil } from "@/utils/background-tasks";
import { yupMixed, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { StatusError } from "@stackframe/stack-shared/dist/utils/errors";
import { Json } from "@stackframe/stack-shared/dist/utils/json";
import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
import { generateText, ModelMessage, stepCountIs, streamText } from "ai";
export const POST = createSmartRouteHandler({
@ -149,9 +149,9 @@ export const POST = createSmartRouteHandler({
modelId: String(model.modelId),
errorMessage: undefined,
});
runAsynchronously(logPromise);
runAsynchronouslyAndWaitUntil(logPromise);
runAsynchronously(reviewMcpCall({
runAsynchronouslyAndWaitUntil(reviewMcpCall({
logPromise,
correlationId,
question,

View File

@ -1,4 +1,4 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { getConnectionOrThrow } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable, getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env";
@ -26,23 +26,16 @@ export const POST = createSmartRouteHandler({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
handler: async ({ auth, body }) => {
const user = auth.user;
if (getNodeEnvironment() !== "development") {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
const metadata = user.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "isAiChatReviewer" in metadata && metadata.isAiChatReviewer === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}
}
const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}
const authUser = fullReq.auth?.user;
if (!authUser) {
throw new StatusError(StatusError.Unauthorized, "Authentication required");
}
const conn = await getConnectionOrThrow();
const token = getEnvVariable("STACK_MCP_LOG_TOKEN");
await conn.reducers.addManualQa({
@ -50,7 +43,7 @@ export const POST = createSmartRouteHandler({
question: body.question,
answer: body.answer,
publish: body.publish,
reviewedBy: authUser.display_name ?? authUser.primary_email ?? authUser.id,
reviewedBy: user.display_name ?? user.primary_email ?? user.id,
});
return {

View File

@ -1,4 +1,4 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { getConnectionOrThrow } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable, getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env";
@ -24,18 +24,15 @@ export const POST = createSmartRouteHandler({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
handler: async ({ auth, body }) => {
if (getNodeEnvironment() !== "development") {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
const metadata = auth.user.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "isAiChatReviewer" in metadata && metadata.isAiChatReviewer === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}
}
const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}
const conn = await getConnectionOrThrow();
const token = getEnvVariable("STACK_MCP_LOG_TOKEN");
await conn.reducers.deleteQaEntry({

View File

@ -1,4 +1,4 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { getConnectionOrThrow } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable, getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env";
@ -24,29 +24,22 @@ export const POST = createSmartRouteHandler({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
handler: async ({ auth, body }) => {
const user = auth.user;
if (getNodeEnvironment() !== "development") {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
const metadata = user.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "isAiChatReviewer" in metadata && metadata.isAiChatReviewer === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}
}
const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}
const authUser = fullReq.auth?.user;
if (!authUser) {
throw new StatusError(StatusError.Unauthorized, "Authentication required");
}
const conn = await getConnectionOrThrow();
const token = getEnvVariable("STACK_MCP_LOG_TOKEN");
await conn.reducers.markHumanReviewed({
token,
correlationId: body.correlationId,
reviewedBy: authUser.display_name ?? authUser.primary_email ?? authUser.id,
reviewedBy: user.display_name ?? user.primary_email ?? user.id,
});
return {

View File

@ -1,4 +1,4 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { getConnectionOrThrow } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable, getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env";
@ -27,23 +27,16 @@ export const POST = createSmartRouteHandler({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
handler: async ({ auth, body }) => {
const user = auth.user;
if (getNodeEnvironment() !== "development") {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
const metadata = user.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "isAiChatReviewer" in metadata && metadata.isAiChatReviewer === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}
}
const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}
const authUser = fullReq.auth?.user;
if (!authUser) {
throw new StatusError(StatusError.Unauthorized, "Authentication required");
}
const conn = await getConnectionOrThrow();
const token = getEnvVariable("STACK_MCP_LOG_TOKEN");
await conn.reducers.updateHumanCorrection({
@ -52,7 +45,7 @@ export const POST = createSmartRouteHandler({
correctedQuestion: body.correctedQuestion,
correctedAnswer: body.correctedAnswer,
publish: body.publish,
reviewedBy: authUser.display_name ?? authUser.primary_email ?? authUser.id,
reviewedBy: user.display_name ?? user.primary_email ?? user.id,
});
return {

View File

@ -1,5 +1,5 @@
import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env";
import { captureError } from "@stackframe/stack-shared/dist/utils/errors";
import { StackAssertionError, captureError } from "@stackframe/stack-shared/dist/utils/errors";
import { DbConnection } from "./spacetimedb-bindings";
import type { LogMcpCallParams } from "./spacetimedb-bindings/types/reducers";
@ -37,6 +37,14 @@ export async function getConnection(): Promise<DbConnection | null> {
return await connectionPromise;
}
export async function getConnectionOrThrow(): Promise<DbConnection> {
const conn = await getConnection();
if (!conn) {
throw new StackAssertionError("SpacetimeDB connection unavailable");
}
return conn;
}
export async function logMcpCall(entry: McpLogEntry): Promise<void> {
const conn = await getConnection();
if (!conn) {

View File

@ -33,7 +33,7 @@ async function postDocsToolAction(action: Record<string, unknown>): Promise<stri
if (!res.ok) {
const errBody = await res.text();
captureError("docs-tools-http-error", new Error(`Stack Auth docs tools error (${res.status}): ${errBody}`));
return `Stack Auth docs tools error (${res.status}): ${errBody}`;
return "Stack Auth docs tools returned an error. Please try again later.";
}
const data = (await res.json()) as DocsToolHttpResult;
@ -49,7 +49,7 @@ async function postDocsToolAction(action: Record<string, unknown>): Promise<stri
return text;
} catch (err) {
captureError("docs-tools-transport-error", err instanceof Error ? err : new Error(String(err)));
return `Stack Auth docs tools error: ${err instanceof Error ? err.message : String(err)}`;
return "Stack Auth docs tools are temporarily unavailable. Please try again later.";
}
}

View File

@ -17,7 +17,7 @@
"spacetime:publish:prod": "node scripts/spacetime-publish.mjs prod"
},
"dependencies": {
"@stackframe/react": "workspace:*",
"@stackframe/stack": "workspace:*",
"@stackframe/stack-shared": "workspace:*",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",

View File

@ -1,4 +1,4 @@
import { useUser } from "@stackframe/react";
import { useUser } from "@stackframe/stack";
import { clsx } from "clsx";
import { useState } from "react";
import { AddManualQa } from "../components/AddManualQa";
@ -44,7 +44,7 @@ export default function App() {
if (process.env.NODE_ENV !== "development") {
const metadata = user.clientReadOnlyMetadata as Record<string, unknown> | null;
if (!metadata?.approved) {
if (!metadata?.isAiChatReviewer) {
return (
<div className="flex items-center justify-center h-screen bg-gray-50">
<div className="text-center">

View File

@ -1,6 +1,6 @@
"use client";
import { StackHandler } from "@stackframe/react";
import { StackHandler } from "@stackframe/stack";
import { useEffect, useState } from "react";
export default function Handler() {

View File

@ -1,7 +1,7 @@
"use client";
import { Suspense } from "react";
import { StackProvider, StackTheme } from "@stackframe/react";
import { StackProvider, StackTheme } from "@stackframe/stack";
import { stackClientApp } from "../stack";
import Loading from "./loading";
import "./globals.css";

View File

@ -1,4 +1,4 @@
import { StackClientApp } from "@stackframe/react";
import { StackClientApp } from "@stackframe/stack";
const IS_DEV = process.env.NODE_ENV === "development";
const PLACEHOLDER = "REPLACE_ME";

View File

@ -772,9 +772,9 @@ importers:
apps/internal-tool:
dependencies:
'@stackframe/react':
'@stackframe/stack':
specifier: workspace:*
version: link:../../packages/react
version: link:../../packages/stack
'@stackframe/stack-shared':
specifier: workspace:*
version: link:../../packages/stack-shared
@ -5651,6 +5651,9 @@ packages:
'@next/env@15.5.10':
resolution: {integrity: sha512-plg+9A/KoZcTS26fe15LHg+QxReTazrIOoKKUC3Uz4leGGeNPgLHdevVraAAOX0snnUs3WkRx3eUQpj9mreG6A==}
'@next/env@16.1.5':
resolution: {integrity: sha512-CRSCPJiSZoi4Pn69RYBDI9R7YK2g59vLexPQFXY0eyw+ILevIenCywzg+DqmlBik9zszEnw2HLFOUlLAcJbL7g==}
'@next/env@16.2.2':
resolution: {integrity: sha512-LqSGz5+xGk9EL/iBDr2yo/CgNQV6cFsNhRR2xhSXYh7B/hb4nePCxlmDvGEKG30NMHDFf0raqSyOZiQrO7BkHQ==}
@ -5678,6 +5681,12 @@ packages:
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-arm64@16.1.5':
resolution: {integrity: sha512-eK7Wdm3Hjy/SCL7TevlH0C9chrpeOYWx2iR7guJDaz4zEQKWcS1IMVfMb9UKBFMg1XgzcPTYPIp1Vcpukkjg6Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-arm64@16.2.2':
resolution: {integrity: sha512-B92G3ulrwmkDSEJEp9+XzGLex5wC1knrmCSIylyVeiAtCIfvEJYiN3v5kXPlYt5R4RFlsfO/v++aKV63Acrugg==}
engines: {node: '>= 10'}
@ -5696,6 +5705,12 @@ packages:
cpu: [x64]
os: [darwin]
'@next/swc-darwin-x64@16.1.5':
resolution: {integrity: sha512-foQscSHD1dCuxBmGkbIr6ScAUF6pRoDZP6czajyvmXPAOFNnQUJu2Os1SGELODjKp/ULa4fulnBWoHV3XdPLfA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-darwin-x64@16.2.2':
resolution: {integrity: sha512-7ZwSgNKJNQiwW0CKhNm9B1WS2L1Olc4B2XY0hPYCAL3epFnugMhuw5TMWzMilQ3QCZcCHoYm9NGWTHbr5REFxw==}
engines: {node: '>= 10'}
@ -5716,6 +5731,13 @@ packages:
os: [linux]
libc: [glibc]
'@next/swc-linux-arm64-gnu@16.1.5':
resolution: {integrity: sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@next/swc-linux-arm64-gnu@16.2.2':
resolution: {integrity: sha512-c3m8kBHMziMgo2fICOP/cd/5YlrxDU5YYjAJeQLyFsCqVF8xjOTH/QYG4a2u48CvvZZSj1eHQfBCbyh7kBr30Q==}
engines: {node: '>= 10'}
@ -5737,6 +5759,13 @@ packages:
os: [linux]
libc: [musl]
'@next/swc-linux-arm64-musl@16.1.5':
resolution: {integrity: sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@next/swc-linux-arm64-musl@16.2.2':
resolution: {integrity: sha512-VKLuscm0P/mIfzt+SDdn2+8TNNJ7f0qfEkA+az7OqQbjzKdBxAHs0UvuiVoCtbwX+dqMEL9U54b5wQ/aN3dHeg==}
engines: {node: '>= 10'}
@ -5758,6 +5787,13 @@ packages:
os: [linux]
libc: [glibc]
'@next/swc-linux-x64-gnu@16.1.5':
resolution: {integrity: sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@next/swc-linux-x64-gnu@16.2.2':
resolution: {integrity: sha512-kU3OPHJq6sBUjOk7wc5zJ7/lipn8yGldMoAv4z67j6ov6Xo/JvzA7L7LCsyzzsXmgLEhk3Qkpwqaq/1+XpNR3g==}
engines: {node: '>= 10'}
@ -5779,6 +5815,13 @@ packages:
os: [linux]
libc: [musl]
'@next/swc-linux-x64-musl@16.1.5':
resolution: {integrity: sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@next/swc-linux-x64-musl@16.2.2':
resolution: {integrity: sha512-CKXRILyErMtUftp+coGcZ38ZwE/Aqq45VMCcRLr2I4OXKrgxIBDXHnBgeX/UMil0S09i2JXaDL3Q+TN8D/cKmg==}
engines: {node: '>= 10'}
@ -5798,6 +5841,12 @@ packages:
cpu: [arm64]
os: [win32]
'@next/swc-win32-arm64-msvc@16.1.5':
resolution: {integrity: sha512-LZli0anutkIllMtTAWZlDqdfvjWX/ch8AFK5WgkNTvaqwlouiD1oHM+WW8RXMiL0+vAkAJyAGEzPPjO+hnrSNQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-arm64-msvc@16.2.2':
resolution: {integrity: sha512-sS/jSk5VUoShUqINJFvNjVT7JfR5ORYj/+/ZpOYbbIohv/lQfduWnGAycq2wlknbOql2xOR0DoV0s6Xfcy49+g==}
engines: {node: '>= 10'}
@ -5822,6 +5871,12 @@ packages:
cpu: [x64]
os: [win32]
'@next/swc-win32-x64-msvc@16.1.5':
resolution: {integrity: sha512-7is37HJTNQGhjPpQbkKjKEboHYQnCgpVt/4rBrrln0D9nderNxZ8ZWs8w1fAtzUx7wEyYjQ+/13myFgFj6K2Ng==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@next/swc-win32-x64-msvc@16.2.2':
resolution: {integrity: sha512-aHaKceJgdySReT7qeck5oShucxWRiiEuwCGK8HHALe6yZga8uyFpLkPgaRw3kkF04U7ROogL/suYCNt/+CuXGA==}
engines: {node: '>= 10'}
@ -11269,10 +11324,6 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
baseline-browser-mapping@2.8.21:
resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==}
hasBin: true
basic-auth@2.0.1:
resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
engines: {node: '>= 0.8'}
@ -15584,6 +15635,27 @@ packages:
sass:
optional: true
next@16.1.5:
resolution: {integrity: sha512-f+wE+NSbiQgh3DSAlTaw2FwY5yGdVViAtp8TotNQj4kk4Q8Bh1sC/aL9aH+Rg1YAVn18OYXsRDT7U/079jgP7w==}
engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
'@playwright/test': ^1.51.1
babel-plugin-react-compiler: '*'
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
optional: true
'@playwright/test':
optional: true
babel-plugin-react-compiler:
optional: true
sass:
optional: true
next@16.2.2:
resolution: {integrity: sha512-i6AJdyVa4oQjyvX/6GeER8dpY/xlIV+4NMv/svykcLtURJSy/WzDnnUk/TM4d0uewFHK7xSQz4TbIwPgjky+3A==}
engines: {node: '>=20.9.0'}
@ -23377,6 +23449,8 @@ snapshots:
'@next/env@15.5.10': {}
'@next/env@16.1.5': {}
'@next/env@16.2.2': {}
'@next/eslint-plugin-next@14.2.17':
@ -23401,6 +23475,9 @@ snapshots:
'@next/swc-darwin-arm64@15.5.7':
optional: true
'@next/swc-darwin-arm64@16.1.5':
optional: true
'@next/swc-darwin-arm64@16.2.2':
optional: true
@ -23410,6 +23487,9 @@ snapshots:
'@next/swc-darwin-x64@15.5.7':
optional: true
'@next/swc-darwin-x64@16.1.5':
optional: true
'@next/swc-darwin-x64@16.2.2':
optional: true
@ -23419,6 +23499,9 @@ snapshots:
'@next/swc-linux-arm64-gnu@15.5.7':
optional: true
'@next/swc-linux-arm64-gnu@16.1.5':
optional: true
'@next/swc-linux-arm64-gnu@16.2.2':
optional: true
@ -23428,6 +23511,9 @@ snapshots:
'@next/swc-linux-arm64-musl@15.5.7':
optional: true
'@next/swc-linux-arm64-musl@16.1.5':
optional: true
'@next/swc-linux-arm64-musl@16.2.2':
optional: true
@ -23437,6 +23523,9 @@ snapshots:
'@next/swc-linux-x64-gnu@15.5.7':
optional: true
'@next/swc-linux-x64-gnu@16.1.5':
optional: true
'@next/swc-linux-x64-gnu@16.2.2':
optional: true
@ -23446,6 +23535,9 @@ snapshots:
'@next/swc-linux-x64-musl@15.5.7':
optional: true
'@next/swc-linux-x64-musl@16.1.5':
optional: true
'@next/swc-linux-x64-musl@16.2.2':
optional: true
@ -23455,6 +23547,9 @@ snapshots:
'@next/swc-win32-arm64-msvc@15.5.7':
optional: true
'@next/swc-win32-arm64-msvc@16.1.5':
optional: true
'@next/swc-win32-arm64-msvc@16.2.2':
optional: true
@ -23467,6 +23562,9 @@ snapshots:
'@next/swc-win32-x64-msvc@15.5.7':
optional: true
'@next/swc-win32-x64-msvc@16.1.5':
optional: true
'@next/swc-win32-x64-msvc@16.2.2':
optional: true
@ -31132,8 +31230,6 @@ snapshots:
baseline-browser-mapping@2.10.16: {}
baseline-browser-mapping@2.8.21: {}
basic-auth@2.0.1:
dependencies:
safe-buffer: 5.1.2
@ -31287,7 +31383,7 @@ snapshots:
browserslist@4.23.1:
dependencies:
caniuse-lite: 1.0.30001696
caniuse-lite: 1.0.30001751
electron-to-chromium: 1.4.803
node-releases: 2.0.14
update-browserslist-db: 1.0.16(browserslist@4.23.1)
@ -31301,7 +31397,7 @@ snapshots:
browserslist@4.27.0:
dependencies:
baseline-browser-mapping: 2.8.21
baseline-browser-mapping: 2.10.16
caniuse-lite: 1.0.30001751
electron-to-chromium: 1.5.244
node-releases: 2.0.27
@ -33129,7 +33225,7 @@ snapshots:
debug: 4.4.3
enhanced-resolve: 5.17.0
eslint: 8.57.1
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1)
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1)
fast-glob: 3.3.2
get-tsconfig: 4.8.1
@ -33179,7 +33275,7 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1):
eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
@ -33239,7 +33335,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1)
eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@ -36962,6 +37058,31 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
next@16.1.5(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies:
'@next/env': 16.1.5
'@swc/helpers': 0.5.15
baseline-browser-mapping: 2.10.16
caniuse-lite: 1.0.30001751
postcss: 8.4.31
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.2.3)
optionalDependencies:
'@next/swc-darwin-arm64': 16.1.5
'@next/swc-darwin-x64': 16.1.5
'@next/swc-linux-arm64-gnu': 16.1.5
'@next/swc-linux-arm64-musl': 16.1.5
'@next/swc-linux-x64-gnu': 16.1.5
'@next/swc-linux-x64-musl': 16.1.5
'@next/swc-win32-arm64-msvc': 16.1.5
'@next/swc-win32-x64-msvc': 16.1.5
'@opentelemetry/api': 1.9.0
sharp: 0.34.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
next@16.2.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
dependencies:
'@next/env': 16.2.2
@ -39490,7 +39611,7 @@ snapshots:
dependencies:
decode-ico: 0.4.1
ico-endec: 0.1.6
sharp: 0.34.4
sharp: 0.34.5
sharp@0.33.5:
dependencies:
@ -39577,7 +39698,6 @@ snapshots:
'@img/sharp-win32-arm64': 0.34.5
'@img/sharp-win32-ia32': 0.34.5
'@img/sharp-win32-x64': 0.34.5
optional: true
shebang-command@1.2.0:
dependencies: