From 22a72f2765be441d251f233dd06f99ed6b8aca60 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Thu, 26 Mar 2026 12:47:32 +0100 Subject: [PATCH 1/6] chore: Adjust lint rule for console logging --- js/eslint.config.ts | 108 ++-- .../auto-instrumentations/bundler/plugin.ts | 2 + .../bundler/webpack-loader.ts | 1 + .../auto-instrumentations/loader/cjs-patch.ts | 1 + js/src/cli/functions/infer-source.ts | 4 + js/src/cli/functions/upload.ts | 6 + js/src/cli/index.ts | 21 + js/src/cli/reporters/eval.ts | 2 + js/src/cli/util/bundle.ts | 1 + js/src/cli/util/debug-logging.ts | 1 + js/src/cli/util/pull.ts | 13 + js/src/debug-logger.ts | 5 + js/src/eval-parameters.ts | 3 +- js/src/framework.ts | 15 +- js/src/framework2.ts | 2 + .../instrumentation/core/channel-tracing.ts | 16 +- js/src/instrumentation/core/plugin.ts | 32 +- js/src/instrumentation/core/stream-patcher.ts | 26 +- .../plugins/claude-agent-sdk-plugin.ts | 13 +- js/src/instrumentation/registry.ts | 3 +- js/src/isomorph.ts | 1 + js/src/prompt-cache/disk-cache.ts | 5 +- js/src/reporters/progress.ts | 1 + js/src/template/registry.ts | 3 +- js/src/wrappers/ai-sdk/ai-sdk.ts | 13 +- .../ai-sdk/deprecated/wrapAISDKModel.ts | 3 +- js/src/wrappers/anthropic.ts | 3 +- .../claude-agent-sdk/claude-agent-sdk.ts | 3 +- js/src/wrappers/google-genai.ts | 5 +- js/src/wrappers/oai.ts | 5 +- js/src/wrappers/openrouter.ts | 3 +- js/src/wrappers/shared/flush.ts | 1 + js/src/wrappers/shared/scorers.ts | 3 +- js/src/wrappers/vitest/index.ts | 1 + pnpm-lock.yaml | 565 ++---------------- 35 files changed, 274 insertions(+), 616 deletions(-) diff --git a/js/eslint.config.ts b/js/eslint.config.ts index 22c71b817..f51facbce 100644 --- a/js/eslint.config.ts +++ b/js/eslint.config.ts @@ -18,6 +18,57 @@ const entryFiles = tsupConfig }) .filter((entry) => !entry.includes("cli")); +const consoleRestrictions = [ + { + object: "console", + property: "log", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "warn", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "error", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "debug", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "info", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "trace", + message: "Use debugLogger instead of console for SDK logging.", + }, +] as const; + +const consoleAllowedFiles = ["src/queue.bench.ts"]; + +const cliImportAllowedFiles = [ + "src/cli/**", + "src/debug-logger.ts", + "src/framework.ts", + "src/framework2.ts", + "src/isomorph.ts", + "src/sandbox.ts", + "src/template/**", + "src/reporters/**", + "src/prompt-cache/**", + "src/eval-parameters.ts", + "src/wrappers/**", + "src/instrumentation/**", + "src/auto-instrumentations/**", +]; + export default [ { ignores: [ @@ -82,63 +133,22 @@ export default [ "@typescript-eslint/no-empty-object-type": "error", "@typescript-eslint/no-unsafe-function-type": "error", "@typescript-eslint/prefer-as-const": "error", + "no-restricted-properties": ["error", ...consoleRestrictions], // Require node: protocol for Node.js built-in imports (for Deno compatibility) // This plugin automatically detects ALL Node.js built-ins - no manual list needed! "node-import/prefer-node-protocol": "error", }, }, + { + files: consoleAllowedFiles, + rules: { + "no-restricted-properties": "off", + }, + }, { files: ["src/**/*.ts", "src/**/*.tsx"], - ignores: [ - "src/cli/**", - "src/debug-logger.ts", - "src/framework.ts", - "src/framework2.ts", - "src/isomorph.ts", - "src/sandbox.ts", - "src/template/**", - "src/reporters/**", - "src/prompt-cache/**", - "src/eval-parameters.ts", - "src/wrappers/**", - "src/instrumentation/**", - "src/auto-instrumentations/**", - "src/queue.bench.ts", - ], + ignores: cliImportAllowedFiles, rules: { - "no-restricted-properties": [ - "error", - { - object: "console", - property: "log", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "warn", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "error", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "debug", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "info", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "trace", - message: "Use debugLogger instead of console for SDK logging.", - }, - ], "no-restricted-imports": [ "error", { diff --git a/js/src/auto-instrumentations/bundler/plugin.ts b/js/src/auto-instrumentations/bundler/plugin.ts index 29a25eec0..15593c571 100644 --- a/js/src/auto-instrumentations/bundler/plugin.ts +++ b/js/src/auto-instrumentations/bundler/plugin.ts @@ -118,6 +118,7 @@ export const unplugin = createUnplugin((options = {}) => { // If no version found if (!moduleVersion) { + // eslint-disable-next-line no-restricted-properties -- bundler warnings are intentionally user-facing. console.warn( `No 'package.json' version found for module ${moduleName} at ${moduleDetails.basedir}. Skipping transformation.`, ); @@ -149,6 +150,7 @@ export const unplugin = createUnplugin((options = {}) => { }; } catch (error) { // If transformation fails, warn and return original code + // eslint-disable-next-line no-restricted-properties -- bundler warnings are intentionally user-facing. console.warn(`Code transformation failed for ${id}: ${error}`); return null; } diff --git a/js/src/auto-instrumentations/bundler/webpack-loader.ts b/js/src/auto-instrumentations/bundler/webpack-loader.ts index 566d07597..79cf56aca 100644 --- a/js/src/auto-instrumentations/bundler/webpack-loader.ts +++ b/js/src/auto-instrumentations/bundler/webpack-loader.ts @@ -160,6 +160,7 @@ function codeTransformerLoader( const result = transformer.transform(code, moduleType); callback(null, result.code, result.map ?? undefined); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- bundler warnings are intentionally user-facing. console.warn( `[code-transformer-loader] Error transforming ${resourcePath}:`, error, diff --git a/js/src/auto-instrumentations/loader/cjs-patch.ts b/js/src/auto-instrumentations/loader/cjs-patch.ts index a29014e8e..d6a65549d 100644 --- a/js/src/auto-instrumentations/loader/cjs-patch.ts +++ b/js/src/auto-instrumentations/loader/cjs-patch.ts @@ -66,6 +66,7 @@ export class ModulePatch { const transformedCode = transformer.transform(content, "unknown"); args[0] = transformedCode?.code; } catch (error) { + // eslint-disable-next-line no-restricted-properties -- loader warnings are intentionally user-facing. console.warn(`Error transforming module ${filename}:`, error); } finally { transformer.free(); diff --git a/js/src/cli/functions/infer-source.ts b/js/src/cli/functions/infer-source.ts index 179b5c50d..36a8a2ad7 100644 --- a/js/src/cli/functions/infer-source.ts +++ b/js/src/cli/functions/infer-source.ts @@ -71,6 +71,7 @@ export async function findCodeDefinition({ if (location.type === "experiment" || location.type === "sandbox") { const evaluator = outFileModule.evaluators[location.eval_name]?.evaluator; if (!evaluator) { + // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( `Warning: failed to find evaluator for ${location.eval_name}. Will not display preview.`, @@ -94,6 +95,7 @@ export async function findCodeDefinition({ } if (!fn) { + // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( `Warning: failed to find ${locationToString(location)}. Will not display preview.`, @@ -118,6 +120,7 @@ export async function findCodeDefinition({ } if (columnNumber === -1) { + // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( `Warning: failed to find code definition for ${fn.name}. Will not display preview.`, @@ -195,6 +198,7 @@ async function getTsModule() { try { tsModule = require("typescript"); } catch { + // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( "Failed to load TypeScript module. Will not use TypeScript to derive preview.", diff --git a/js/src/cli/functions/upload.ts b/js/src/cli/functions/upload.ts index ce67f44d9..cadb77ead 100644 --- a/js/src/cli/functions/upload.ts +++ b/js/src/cli/functions/upload.ts @@ -82,6 +82,7 @@ export async function uploadHandleBundles({ setCurrent: boolean; defaultIfExists: IfExists; }) { + // eslint-disable-next-line no-restricted-properties -- CLI upload progress is intentionally user-facing. console.error( `Processing ${buildResults.length} ${pluralize("file", buildResults.length)}...`, ); @@ -276,6 +277,7 @@ export async function uploadHandleBundles({ const numUploaded = uploadResults.length; const numFailed = uploadResults.filter((result) => !result).length; + // eslint-disable-next-line no-restricted-properties -- CLI upload progress is intentionally user-facing. console.error( `${numUploaded} ${pluralize("file", numUploaded)} uploaded ${ numFailed > 0 @@ -344,12 +346,14 @@ async function uploadBundles({ ); } catch (e) { if (showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- CLI upload errors are intentionally user-facing. console.error(e); } const msg = e instanceof FailedHTTPResponse ? `Unable to upload your code. ${e.status} (${e.text}): ${e.data}` : `Unable to upload your code. You most likely need to update the API: ${e}`; + // eslint-disable-next-line no-restricted-properties -- CLI upload errors are intentionally user-facing. console.error(warning(msg)); return false; } @@ -422,12 +426,14 @@ async function uploadBundles({ }); } catch (e) { if (showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- CLI upload errors are intentionally user-facing. console.error(e); } const msg = e instanceof FailedHTTPResponse ? `Failed to save function definitions for '${sourceFile}'. ${e.status} (${e.text}): ${e.data}` : `Failed to save function definitions for '${sourceFile}'. You most likely need to update the API: ${e}`; + // eslint-disable-next-line no-restricted-properties -- CLI upload warnings are intentionally user-facing. console.warn(warning(msg)); return false; } diff --git a/js/src/cli/index.ts b/js/src/cli/index.ts index 48a38be3f..881dfe0c5 100755 --- a/js/src/cli/index.ts +++ b/js/src/cli/index.ts @@ -127,6 +127,7 @@ async function initExperiment( fallback: (_text: string, url: string) => url, }) : "locally"; + // eslint-disable-next-line no-restricted-properties -- CLI status output is intentionally user-facing. console.error( chalk.cyan("▶") + ` Experiment ${chalk.bold(info.experimentName)} is running at ${linkText}`, @@ -219,13 +220,17 @@ function buildWatchPluginForEvaluator( name: "run-evalutator-on-end", setup(build: esbuild.PluginBuild) { build.onEnd(async (result) => { + // eslint-disable-next-line no-restricted-properties -- CLI build status is intentionally user-facing. console.error(`Done building ${inFile}`); if (!result.outputFiles) { if (opts.showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(`Failed to compile ${inFile}`); + // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(result.errors); } else { + // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(`Failed to compile ${inFile}: ${result.errors}`); } return; @@ -306,6 +311,7 @@ function buildWatchPluginForEvaluator( )) { const success = await reporter.reportRun(await Promise.all(results)); if (!success) { + // eslint-disable-next-line no-restricted-properties -- CLI reporter errors are intentionally user-facing. console.error(error(`Reporter ${reporterName} failed.`)); } } @@ -421,9 +427,12 @@ export function handleBuildFailure({ if (terminateOnFailure) { throw result.error; } else if (showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(`Failed to compile ${result.sourceFile}`); + // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(result.error); } else { + // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn( `Failed to compile ${result.sourceFile}: ${result.error.message}`, ); @@ -466,6 +475,7 @@ function updateEvaluators( evaluators.reporters[reporterName] && evaluators.reporters[reporterName] !== reporter ) { + // eslint-disable-next-line no-restricted-properties -- CLI reporter warnings are intentionally user-facing. console.warn( warning( `Reporter '${reporterName}' already exists. Will skip '${reporterName}' from ${result.sourceFile}.`, @@ -486,12 +496,14 @@ async function runAndWatch({ onExit?: () => void; }) { const count = Object.keys(handles).length; + // eslint-disable-next-line no-restricted-properties -- CLI watch status is intentionally user-facing. console.error(`Watching ${pluralize("file", count, true)}...`); Object.values(handles).map((handle) => handle.watch()); ["SIGINT", "SIGTERM"].forEach((signal: string) => { process.on(signal, function () { + // eslint-disable-next-line no-restricted-properties -- CLI watch status is intentionally user-facing. console.error("Stopped watching."); for (const handle of Object.values(handles)) { handle.destroy(); @@ -540,6 +552,7 @@ async function runOnce( if (opts.list) { for (const evaluator of evaluators.evaluators) { + // eslint-disable-next-line no-restricted-properties -- CLI list output is intentionally user-facing. console.log(evaluator.evaluator.evalName); } return true; @@ -581,6 +594,7 @@ async function runOnce( } }); + // eslint-disable-next-line no-restricted-properties -- CLI summary output is intentionally user-facing. console.error( chalk.dim( `Processing ${chalk.bold(resultPromises.length)} evaluator${resultPromises.length === 1 ? "" : "s"}...`, @@ -588,6 +602,7 @@ async function runOnce( ); const allEvalsResults = await Promise.all(resultPromises); opts.progressReporter.stop(); + // eslint-disable-next-line no-restricted-properties -- CLI formatting output is intentionally user-facing. console.error(""); const evalReports: Record< @@ -685,6 +700,7 @@ async function collectFiles( try { pathStat = fs.lstatSync(inputPath); } catch (e) { + // eslint-disable-next-line no-restricted-properties -- CLI read errors are intentionally user-facing. console.error(error(`Error reading ${inputPath}: ${e}`)); process.exit(1); } @@ -699,6 +715,7 @@ async function collectFiles( ) ) { const prefix = mode === "eval" ? ".eval" : ""; + // eslint-disable-next-line no-restricted-properties -- CLI discovery warnings are intentionally user-facing. console.warn( warning( `Reading ${inputPath} because it was specified directly. Rename it to end in ${prefix}.ts or ` + @@ -848,6 +865,7 @@ export async function initializeHandles({ for (const inputPath of inputPaths) { const newFiles = await collectFiles(inputPath, mode); if (newFiles.length == 0) { + // eslint-disable-next-line no-restricted-properties -- CLI discovery warnings are intentionally user-facing. console.warn( warning( `Provided path ${inputPath} is not an eval file or a directory containing eval files, skipping...`, @@ -860,6 +878,7 @@ export async function initializeHandles({ } if (Object.keys(files).length == 0) { + // eslint-disable-next-line no-restricted-properties -- CLI discovery warnings are intentionally user-facing. console.warn( warning("No eval files were found in any of the provided paths."), ); @@ -906,6 +925,7 @@ async function run(args: RunArgs) { // Load via dotenv library const loaded = dotenv.config({ path: args.env_file }); if (loaded.error) { + // eslint-disable-next-line no-restricted-properties -- CLI env loading errors are intentionally user-facing. console.error(error(`Error loading ${args.env_file}: ${loaded.error}`)); process.exit(1); } @@ -930,6 +950,7 @@ async function run(args: RunArgs) { }; if (args.list && args.watch) { + // eslint-disable-next-line no-restricted-properties -- CLI argument errors are intentionally user-facing. console.error(error("Cannot specify both --list and --watch.")); process.exit(1); } diff --git a/js/src/cli/reporters/eval.ts b/js/src/cli/reporters/eval.ts index f10c1fc17..2f2ebf706 100644 --- a/js/src/cli/reporters/eval.ts +++ b/js/src/cli/reporters/eval.ts @@ -174,6 +174,7 @@ export const fancyReporter: ReporterDef = { ); if (failingResults.length > 0) { + // eslint-disable-next-line no-restricted-properties -- CLI reporters intentionally write to stderr. console.error( warning( `Evaluator ${evaluator.evalName} failed with ${pluralize("error", failingResults.length, true)}. This evaluation ("${evaluator.evalName}") will not be fully logged.`, @@ -186,6 +187,7 @@ export const fancyReporter: ReporterDef = { } } else if (verbose) { for (const result of failingResults) { + // eslint-disable-next-line no-restricted-properties -- CLI reporters intentionally write to stderr. console.error(result); } } diff --git a/js/src/cli/util/bundle.ts b/js/src/cli/util/bundle.ts index dfb2b01c2..f37adccdb 100644 --- a/js/src/cli/util/bundle.ts +++ b/js/src/cli/util/bundle.ts @@ -20,6 +20,7 @@ export async function loadCLIEnv(args: AuthArgs & CommonArgs) { // Load via dotenv library const loaded = dotenv.config({ path: args.env_file }); if (loaded.error) { + // eslint-disable-next-line no-restricted-properties -- CLI bundle errors are intentionally user-facing. console.error(error(`Error loading ${args.env_file}: ${loaded.error}`)); process.exit(1); } diff --git a/js/src/cli/util/debug-logging.ts b/js/src/cli/util/debug-logging.ts index 41b3bc8ba..c10d25bc7 100644 --- a/js/src/cli/util/debug-logging.ts +++ b/js/src/cli/util/debug-logging.ts @@ -21,6 +21,7 @@ export function normalizeDebugLoggingArgs< if (!hasWarnedAboutVerboseFlag) { hasWarnedAboutVerboseFlag = true; + // eslint-disable-next-line no-restricted-properties -- CLI deprecation warnings are intentionally user-facing. console.warn(warning(VERBOSE_DEPRECATION_MESSAGE)); } diff --git a/js/src/cli/util/pull.ts b/js/src/cli/util/pull.ts index a6e5e7a79..eb3a1a92d 100644 --- a/js/src/cli/util/pull.ts +++ b/js/src/cli/util/pull.ts @@ -46,6 +46,7 @@ export async function pullCommand(args: PullArgs) { typeof rawFunc === "object" && rawFunc && "id" in rawFunc ? ` ${rawFunc.id}` : ""; + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning(`Failed to parse function${id}: ${parsedFunc.error.message}`), ); @@ -60,8 +61,10 @@ export async function pullCommand(args: PullArgs) { projectNameToFunctions[projectName].push(func); } + // eslint-disable-next-line no-restricted-properties -- CLI pull output is intentionally user-facing. console.log("Found functions in the following projects:"); for (const projectName of Object.keys(projectNameToFunctions)) { + // eslint-disable-next-line no-restricted-properties -- CLI pull output is intentionally user-facing. console.log(` * ${projectName}`); } @@ -92,6 +95,7 @@ export async function pullCommand(args: PullArgs) { ); if (args.force) { if (fileExists) { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Overwriting ${doubleQuote(projectFile)} because --force is set.`, @@ -99,6 +103,7 @@ export async function pullCommand(args: PullArgs) { ); } } else if (dirtyFiles.has(resolvedProjectFile)) { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Skipping project ${projectName} because ${doubleQuote(projectFile)} has uncommitted changes.`, @@ -107,6 +112,7 @@ export async function pullCommand(args: PullArgs) { continue; } else if (fileExists) { if (!git) { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Project ${projectName} already exists in ${doubleQuote(projectFile)}. Skipping since this is not a git repository...`, @@ -114,6 +120,7 @@ export async function pullCommand(args: PullArgs) { ); continue; } else { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Project ${projectName} already exists in ${doubleQuote(projectFile)}. Overwriting...`, @@ -130,6 +137,7 @@ export async function pullCommand(args: PullArgs) { hasSpecifiedFunction: !!args.slug || !!args.id, }); await fs.writeFile(projectFile, projectFileContents || ""); + // eslint-disable-next-line no-restricted-properties -- CLI pull output is intentionally user-facing. console.log(`Wrote ${projectName} to ${doubleQuote(projectFile)}`); } } @@ -178,6 +186,7 @@ ${functionDefinitions.join("\n")} }); return formatted; } catch (error) { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Failed to format with prettier (${error instanceof Error ? error.message : error}). Using unformatted output.`, @@ -199,6 +208,7 @@ function makeFunctionDefinition({ }): string | null { if (func.function_data.type !== "prompt") { if (hasSpecifiedFunction) { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Skipping function ${doubleQuote(func.name)} because it is not a prompt.`, @@ -218,6 +228,7 @@ function makeFunctionDefinition({ varNames[varName] = func.slug; if (!func.prompt_data || !func.prompt_data.prompt) { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Prompt ${doubleQuote(func.name)} has an invalid (empty) prompt definition.`, @@ -240,6 +251,7 @@ function makeFunctionDefinition({ : undefined; if (rawToolsParsed && !rawToolsParsed.success) { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Prompt ${doubleQuote(func.name)} has an invalid tools definition: ${rawToolsParsed.error.message}. Skipping...`, @@ -348,6 +360,7 @@ async function getPrettierModule() { prettierModule = await importWithTimeout(); } catch { + // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( "Failed to load prettier module. Will not use prettier to format output.", diff --git a/js/src/debug-logger.ts b/js/src/debug-logger.ts index 91afecc7a..26695e8b8 100644 --- a/js/src/debug-logger.ts +++ b/js/src/debug-logger.ts @@ -34,6 +34,7 @@ function warnInvalidEnvValue(value: string) { return; } hasWarnedAboutInvalidEnvValue = true; + // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.warn( PREFIX, `Invalid BRAINTRUST_DEBUG_LOG_LEVEL value "${value}". Expected "error", "warn", "info", or "debug".`, @@ -135,12 +136,16 @@ function emit( } if (method === "info") { + // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.log(PREFIX, ...args); } else if (method === "debug") { + // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.debug(PREFIX, ...args); } else if (method === "warn") { + // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.warn(PREFIX, ...args); } else { + // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.error(PREFIX, ...args); } } diff --git a/js/src/eval-parameters.ts b/js/src/eval-parameters.ts index e33d5c911..2fac65332 100644 --- a/js/src/eval-parameters.ts +++ b/js/src/eval-parameters.ts @@ -1,6 +1,7 @@ import { z } from "zod/v3"; import Ajv from "ajv"; import { Prompt, RemoteEvalParameters } from "./logger"; +import { debugLogger } from "./debug-logger"; import { promptDefinitionWithToolsSchema, promptDefinitionToPromptData, @@ -124,7 +125,7 @@ function validateParametersWithZod< return [name, schemaCasted.parse(value)]; } } catch (e) { - console.error("Error validating parameter", name, e); + debugLogger.error("Error validating parameter", name, e); throw Error( `Invalid parameter '${name}': ${e instanceof Error ? e.message : String(e)}`, ); diff --git a/js/src/framework.ts b/js/src/framework.ts index cfdd62bde..1e069929b 100644 --- a/js/src/framework.ts +++ b/js/src/framework.ts @@ -773,9 +773,15 @@ export async function Eval< return ret; } finally { if (experiment) { - await experiment.flush().catch(console.error); + await experiment.flush().catch( + // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. + (error) => console.error(error), + ); } else if (options.parent) { - await flush({ state: evaluator.state }).catch(console.error); + await flush({ state: evaluator.state }).catch( + // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. + (error) => console.error(error), + ); } } } finally { @@ -1485,8 +1491,10 @@ export const warning = (text: string) => `Warning: ${text}`; export function logError(e: unknown, verbose: boolean) { if (!verbose) { + // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. console.error(`${e}`); } else { + // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. console.error(e); } } @@ -1562,12 +1570,14 @@ export function reportFailures< // TODO: We may want to support a non-strict mode (and make this the "strict" behavior), so that // users can still log imperfect evaluations. In the meantime, they should handle these cases inside // of their tasks. + // eslint-disable-next-line no-restricted-properties -- framework warnings are user-facing. console.error( warning( `Evaluator ${evaluator.evalName} failed with ${failingResults.length} error${failingResults.length === 1 ? "" : "s"}. This evaluation ("${evaluator.evalName}") will not be fully logged.`, ), ); if (jsonl) { + // eslint-disable-next-line no-restricted-properties -- JSONL mode writes reporter output to stdout. console.log( JSON.stringify({ evaluatorName: evaluator.evalName, @@ -1582,6 +1592,7 @@ export function reportFailures< } } if (!verbose && !jsonl) { + // eslint-disable-next-line no-restricted-properties -- framework warnings are user-facing. console.error( warning( "Use --debug-logging debug to see full stack traces and troubleshooting details.", diff --git a/js/src/framework2.ts b/js/src/framework2.ts index 9c15946d5..1686d2ae4 100644 --- a/js/src/framework2.ts +++ b/js/src/framework2.ts @@ -117,6 +117,7 @@ export class Project { async publish() { if (globalThis._lazy_load) { + // eslint-disable-next-line no-restricted-properties -- publish warnings are user-facing. console.warn("publish() is a no-op when running `braintrust push`."); return; } @@ -124,6 +125,7 @@ export class Project { const projectMap = new ProjectNameIdMap(); const functionDefinitions: FunctionEvent[] = []; if (this._publishableCodeFunctions.length > 0) { + // eslint-disable-next-line no-restricted-properties -- publish warnings are user-facing. console.warn( "Code functions cannot be published directly. Use `braintrust push` instead.", ); diff --git a/js/src/instrumentation/core/channel-tracing.ts b/js/src/instrumentation/core/channel-tracing.ts index 3b2aec4bf..794336846 100644 --- a/js/src/instrumentation/core/channel-tracing.ts +++ b/js/src/instrumentation/core/channel-tracing.ts @@ -3,6 +3,7 @@ import type { IsoChannelHandlers, IsoTracingChannel, } from "../../isomorph"; +import { debugLogger } from "../../debug-logger"; import { _internalGetGlobalState, BRAINTRUST_CURRENT_SPAN_STORE, @@ -198,7 +199,7 @@ function startSpanForEvent< metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - console.error(`Error extracting input for ${channelName}:`, error); + debugLogger.error(`Error extracting input for ${channelName}:`, error); } return { span, startTime }; @@ -351,7 +352,7 @@ export function traceAsyncChannel( metrics, }); } catch (error) { - console.error(`Error extracting output for ${channelName}:`, error); + debugLogger.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); states.delete(event as object); @@ -460,7 +461,7 @@ export function traceStreamingChannel( metrics, }); } catch (error) { - console.error( + debugLogger.error( `Error extracting output for ${channelName}:`, error, ); @@ -516,7 +517,7 @@ export function traceStreamingChannel( metrics, }); } catch (error) { - console.error(`Error extracting output for ${channelName}:`, error); + debugLogger.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); states.delete(event as object); @@ -610,7 +611,7 @@ export function traceSyncStreamChannel( }); } } catch (error) { - console.error( + debugLogger.error( `Error extracting chatCompletion for ${channelName}:`, error, ); @@ -637,7 +638,10 @@ export function traceSyncStreamChannel( span.log(extracted); } } catch (error) { - console.error(`Error extracting event for ${channelName}:`, error); + debugLogger.error( + `Error extracting event for ${channelName}:`, + error, + ); } }); diff --git a/js/src/instrumentation/core/plugin.ts b/js/src/instrumentation/core/plugin.ts index 7d1147c5a..268e7c014 100644 --- a/js/src/instrumentation/core/plugin.ts +++ b/js/src/instrumentation/core/plugin.ts @@ -2,6 +2,7 @@ import iso from "../../isomorph"; import type { IsoChannelHandlers } from "../../isomorph"; import { isAsyncIterable, patchStreamIfNeeded } from "./stream-patcher"; import type { StartEvent } from "./types"; +import { debugLogger } from "../../debug-logger"; import { startSpan } from "../../logger"; import type { Span } from "../../logger"; import { getCurrentUnixTimestamp } from "../../util"; @@ -109,7 +110,10 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - console.error(`Error extracting input for ${channelName}:`, error); + debugLogger.error( + `Error extracting input for ${channelName}:`, + error, + ); } }, @@ -132,7 +136,10 @@ export abstract class BasePlugin { metrics, }); } catch (error) { - console.error(`Error extracting output for ${channelName}:`, error); + debugLogger.error( + `Error extracting output for ${channelName}:`, + error, + ); } finally { span.end(); spans.delete(event); @@ -216,7 +223,10 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - console.error(`Error extracting input for ${channelName}:`, error); + debugLogger.error( + `Error extracting input for ${channelName}:`, + error, + ); } }, @@ -279,7 +289,7 @@ export abstract class BasePlugin { metrics, }); } catch (error) { - console.error( + debugLogger.error( `Error extracting output for ${channelName}:`, error, ); @@ -315,7 +325,10 @@ export abstract class BasePlugin { metrics, }); } catch (error) { - console.error(`Error extracting output for ${channelName}:`, error); + debugLogger.error( + `Error extracting output for ${channelName}:`, + error, + ); } finally { span.end(); spans.delete(event); @@ -389,7 +402,10 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - console.error(`Error extracting input for ${channelName}:`, error); + debugLogger.error( + `Error extracting input for ${channelName}:`, + error, + ); } }, @@ -430,7 +446,7 @@ export abstract class BasePlugin { output: completion.choices, }); } catch (error) { - console.error( + debugLogger.error( `Error extracting chatCompletion for ${channelName}:`, error, ); @@ -455,7 +471,7 @@ export abstract class BasePlugin { span.log(extracted); } } catch (error) { - console.error( + debugLogger.error( `Error extracting event for ${channelName}:`, error, ); diff --git a/js/src/instrumentation/core/stream-patcher.ts b/js/src/instrumentation/core/stream-patcher.ts index dc11a8460..527860faf 100644 --- a/js/src/instrumentation/core/stream-patcher.ts +++ b/js/src/instrumentation/core/stream-patcher.ts @@ -6,6 +6,8 @@ * even though they cannot replace return values. */ +import { debugLogger } from "../../debug-logger"; + /** * Check if a value is an async iterable (stream). */ @@ -101,7 +103,7 @@ export function patchStreamIfNeeded( // Check if object is extensible (can be patched) if (Object.isFrozen(stream) || Object.isSealed(stream)) { - console.warn( + debugLogger.warn( "Cannot patch frozen/sealed stream. Stream output will not be collected.", ); return stream; @@ -137,7 +139,7 @@ export function patchStreamIfNeeded( try { options.onComplete(chunks); } catch (error) { - console.error("Error in stream onComplete handler:", error); + debugLogger.error("Error in stream onComplete handler:", error); } } } else { @@ -157,7 +159,7 @@ export function patchStreamIfNeeded( try { options.onChunk(chunk); } catch (error) { - console.error("Error in stream onChunk handler:", error); + debugLogger.error("Error in stream onChunk handler:", error); } } } @@ -175,7 +177,10 @@ export function patchStreamIfNeeded( chunks, ); } catch (handlerError) { - console.error("Error in stream onError handler:", handlerError); + debugLogger.error( + "Error in stream onError handler:", + handlerError, + ); } } } @@ -193,7 +198,7 @@ export function patchStreamIfNeeded( try { options.onComplete(chunks); } catch (error) { - console.error("Error in stream onComplete handler:", error); + debugLogger.error("Error in stream onComplete handler:", error); } } return originalReturn(...args); @@ -215,7 +220,10 @@ export function patchStreamIfNeeded( try { options.onError(error, chunks); } catch (handlerError) { - console.error("Error in stream onError handler:", handlerError); + debugLogger.error( + "Error in stream onError handler:", + handlerError, + ); } } } @@ -237,7 +245,7 @@ export function patchStreamIfNeeded( return stream; } catch (error) { // If patching fails for any reason, log warning and return original - console.warn("Failed to patch stream:", error); + debugLogger.warn("Failed to patch stream:", error); return stream; } } @@ -305,7 +313,7 @@ export function wrapStreamResult( const processed = options.processChunks(chunks); options.onResult(processed); } catch (error) { - console.error("Error processing stream chunks:", error); + debugLogger.error("Error processing stream chunks:", error); if (options.onError) { options.onError( error instanceof Error ? error : new Error(String(error)), @@ -325,7 +333,7 @@ export function wrapStreamResult( : result; options.onResult(processed); } catch (error) { - console.error("Error processing non-stream result:", error); + debugLogger.error("Error processing non-stream result:", error); if (options.onError) { options.onError( error instanceof Error ? error : new Error(String(error)), diff --git a/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts b/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts index 46aa20856..8cb2e0278 100644 --- a/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts +++ b/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts @@ -2,6 +2,7 @@ import { BasePlugin } from "../core"; import type { ChannelMessage } from "../core/channel-definitions"; import { isAsyncIterable, patchStreamIfNeeded } from "../core/stream-patcher"; import type { IsoChannelHandlers } from "../../isomorph"; +import { debugLogger } from "../../debug-logger"; import { startSpan } from "../../logger"; import type { Span } from "../../logger"; import { SpanTypeAttribute } from "../../../util/index"; @@ -756,7 +757,10 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { metadata: filterSerializableOptions(options), }); } catch (error) { - console.error("Error extracting input for Claude Agent SDK:", error); + debugLogger.error( + "Error extracting input for Claude Agent SDK:", + error, + ); } const activeToolSpans = new Map(); @@ -828,7 +832,7 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { state.processing = state.processing .then(() => handleStreamMessage(state, message)) .catch((error) => { - console.error( + debugLogger.error( "Error processing Claude Agent SDK stream chunk:", error, ); @@ -861,7 +865,10 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { try { state.span.log({ output: eventResult }); } catch (error) { - console.error("Error extracting output for Claude Agent SDK:", error); + debugLogger.error( + "Error extracting output for Claude Agent SDK:", + error, + ); } finally { state.span.end(); spans.delete(event); diff --git a/js/src/instrumentation/registry.ts b/js/src/instrumentation/registry.ts index 844b9efd2..0cf8b11a0 100644 --- a/js/src/instrumentation/registry.ts +++ b/js/src/instrumentation/registry.ts @@ -6,6 +6,7 @@ */ import { BraintrustPlugin } from "./braintrust-plugin"; +import { debugLogger } from "../debug-logger"; import iso from "../isomorph"; export interface InstrumentationConfig { @@ -35,7 +36,7 @@ class PluginRegistry { */ configure(config: InstrumentationConfig): void { if (this.enabled) { - console.warn( + debugLogger.warn( "Braintrust: Cannot configure instrumentation after it has been enabled. " + "Call configureInstrumentation() before importing any AI SDKs.", ); diff --git a/js/src/isomorph.ts b/js/src/isomorph.ts index f977306ba..71ebd1f96 100644 --- a/js/src/isomorph.ts +++ b/js/src/isomorph.ts @@ -300,6 +300,7 @@ const iso: Common = { ) => new DefaultTracingChannel(nameOrChannels), processOn: (_0, _1) => {}, basename: (filepath: string) => filepath.split(/[\\/]/).pop() || filepath, + // eslint-disable-next-line no-restricted-properties -- iso.writeln intentionally maps to stdout. writeln: (text: string) => console.log(text), }; export default iso; diff --git a/js/src/prompt-cache/disk-cache.ts b/js/src/prompt-cache/disk-cache.ts index e99c7e7d9..29cc3e694 100644 --- a/js/src/prompt-cache/disk-cache.ts +++ b/js/src/prompt-cache/disk-cache.ts @@ -1,4 +1,5 @@ import iso from "../isomorph"; +import { debugLogger } from "../debug-logger"; export function canUseDiskCache(): boolean { return !!( @@ -96,7 +97,7 @@ export class DiskCache { return undefined; } if (this.logWarnings) { - console.warn("Failed to read from disk cache", e); + debugLogger.warn("Failed to read from disk cache", e); } return undefined; } @@ -121,7 +122,7 @@ export class DiskCache { await this.evictOldestIfFull(); } catch (e) { if (this.logWarnings) { - console.warn("Failed to write to disk cache", e); + debugLogger.warn("Failed to write to disk cache", e); } return; } diff --git a/js/src/reporters/progress.ts b/js/src/reporters/progress.ts index bf897e407..3c559cb7d 100644 --- a/js/src/reporters/progress.ts +++ b/js/src/reporters/progress.ts @@ -2,6 +2,7 @@ import type { ProgressReporter } from "./types"; export class SimpleProgressReporter implements ProgressReporter { public start(name: string, _total: number) { + // eslint-disable-next-line no-restricted-properties -- progress reporters intentionally write to stdout. console.log(`Running evaluator ${name}`); } public stop() {} diff --git a/js/src/template/registry.ts b/js/src/template/registry.ts index a0686eb10..d9744e8a4 100644 --- a/js/src/template/registry.ts +++ b/js/src/template/registry.ts @@ -1,3 +1,4 @@ +import { debugLogger } from "../debug-logger"; import { mustachePlugin } from "./plugins/mustache"; export type TemplateFormat = "mustache" | "nunjucks" | "none"; @@ -67,7 +68,7 @@ class TemplatePluginRegistry { register(plugin: TemplateRendererPlugin): void { if (this.plugins.has(plugin.name)) { - console.warn( + debugLogger.warn( `Template plugin '${plugin.name}' already registered, overwriting`, ); } diff --git a/js/src/wrappers/ai-sdk/ai-sdk.ts b/js/src/wrappers/ai-sdk/ai-sdk.ts index d65bf3e16..f190e965f 100644 --- a/js/src/wrappers/ai-sdk/ai-sdk.ts +++ b/js/src/wrappers/ai-sdk/ai-sdk.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { startSpan, traced, withCurrent, Attachment } from "../../logger"; +import { debugLogger } from "../../debug-logger"; import { SpanTypeAttribute } from "../../../util"; import { convertDataToBlob, @@ -1725,7 +1726,7 @@ const processContentPart = (part: any): any => { } } } catch (error) { - console.warn("Error processing content part:", error); + debugLogger.warn("Error processing content part:", error); } return part; @@ -1787,7 +1788,7 @@ const convertImageToAttachment = ( return image; } } catch (error) { - console.warn("Error converting image to attachment:", error); + debugLogger.warn("Error converting image to attachment:", error); } return null; @@ -1835,7 +1836,7 @@ const convertDataToAttachment = ( }); } } catch (error) { - console.warn("Error converting data to attachment:", error); + debugLogger.warn("Error converting data to attachment:", error); } return null; @@ -1898,7 +1899,7 @@ const processOutputAttachments = async (output: AISDKResult) => { try { return await doProcessOutputAttachments(output); } catch (error) { - console.error("Error processing output attachments:", error); + debugLogger.error("Error processing output attachments:", error); return output; } }; @@ -1955,7 +1956,7 @@ const convertFileToAttachment = ( } if (!blob) { - console.warn(`Failed to convert file at index ${index} to Blob`); + debugLogger.warn(`Failed to convert file at index ${index} to Blob`); return file; // Return original if conversion fails } @@ -1965,7 +1966,7 @@ const convertFileToAttachment = ( contentType: mediaType, }); } catch (error) { - console.warn(`Error processing file at index ${index}:`, error); + debugLogger.warn(`Error processing file at index ${index}:`, error); return file; // Return original on error } }; diff --git a/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts b/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts index 059a0ec22..c3b90a013 100644 --- a/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts +++ b/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/consistent-type-assertions */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { startSpan } from "../../../logger"; +import { debugLogger } from "../../../debug-logger"; import { getCurrentUnixTimestamp, isEmpty } from "../../../util"; import { LEGACY_CACHED_HEADER, @@ -25,7 +26,7 @@ export function wrapAISDKModel(model: T): T { ) { return new BraintrustLanguageModelWrapper(m) as any as T; } else { - console.warn("Unsupported AI SDK model. Not wrapping."); + debugLogger.warn("Unsupported AI SDK model. Not wrapping."); return model; } } diff --git a/js/src/wrappers/anthropic.ts b/js/src/wrappers/anthropic.ts index 7bd262ea1..cbfa9de56 100644 --- a/js/src/wrappers/anthropic.ts +++ b/js/src/wrappers/anthropic.ts @@ -1,4 +1,5 @@ import { Attachment, Span, startSpan } from "../logger"; +import { debugLogger } from "../debug-logger"; import { isObject, SpanTypeAttribute } from "../../util/index"; import { filterFrom, getCurrentUnixTimestamp } from "../util"; import { finalizeAnthropicTokens } from "./anthropic-tokens-util"; @@ -40,7 +41,7 @@ export function wrapAnthropic(anthropic: T): T { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return anthropicProxy(au as AnthropicClient) as unknown as T; } else { - console.warn("Unsupported Anthropic library. Not wrapping."); + debugLogger.warn("Unsupported Anthropic library. Not wrapping."); return anthropic; } } diff --git a/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts b/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts index 0b9a79136..47c0f0b5e 100644 --- a/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts +++ b/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts @@ -1,4 +1,5 @@ import { startSpan, traced, withCurrent } from "../../logger"; +import { debugLogger } from "../../debug-logger"; import { getCurrentUnixTimestamp } from "../../util"; import { SpanTypeAttribute } from "../../../util/index"; import { @@ -893,7 +894,7 @@ export function wrapClaudeAgentSDK(sdk: T): T { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return claudeAgentSDKProxy(s as ClaudeAgentSDKModule) as unknown as T; } else { - console.warn("Unsupported Claude Agent SDK. Not wrapping."); + debugLogger.warn("Unsupported Claude Agent SDK. Not wrapping."); return sdk; } } diff --git a/js/src/wrappers/google-genai.ts b/js/src/wrappers/google-genai.ts index 44737d5da..08b7ee021 100644 --- a/js/src/wrappers/google-genai.ts +++ b/js/src/wrappers/google-genai.ts @@ -1,4 +1,5 @@ import { Span, traced, Attachment, startSpan } from "../logger"; +import { debugLogger } from "../debug-logger"; import { SpanTypeAttribute } from "../../util/index"; import { getCurrentUnixTimestamp } from "../util"; import type { @@ -33,12 +34,12 @@ export function wrapGoogleGenAI>( googleGenAI: T, ): T { if (!googleGenAI || typeof googleGenAI !== "object") { - console.warn("Invalid Google GenAI module. Not wrapping."); + debugLogger.warn("Invalid Google GenAI module. Not wrapping."); return googleGenAI; } if (!("GoogleGenAI" in googleGenAI)) { - console.warn( + debugLogger.warn( "GoogleGenAI class not found in module. Not wrapping. Make sure you're passing the module itself (import * as googleGenAI from '@google/genai').", ); return googleGenAI; diff --git a/js/src/wrappers/oai.ts b/js/src/wrappers/oai.ts index 6411020b8..b510c8eb6 100644 --- a/js/src/wrappers/oai.ts +++ b/js/src/wrappers/oai.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { CompiledPrompt } from "../logger"; +import { debugLogger } from "../debug-logger"; import { LEGACY_CACHED_HEADER, parseCachedHeader, @@ -63,7 +64,9 @@ export function wrapOpenAI(openai: T): T { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return wrapOpenAIv4(typedOpenAI) as T; } else { - console.warn("Unsupported OpenAI library (potentially v3). Not wrapping."); + debugLogger.warn( + "Unsupported OpenAI library (potentially v3). Not wrapping.", + ); return openai; } } diff --git a/js/src/wrappers/openrouter.ts b/js/src/wrappers/openrouter.ts index 64b8057be..9c29cf5d5 100644 --- a/js/src/wrappers/openrouter.ts +++ b/js/src/wrappers/openrouter.ts @@ -1,4 +1,5 @@ import { openRouterChannels } from "../instrumentation/plugins/openrouter-channels"; +import { debugLogger } from "../debug-logger"; import { patchOpenRouterCallModelRequestTools, patchOpenRouterCallModelResult, @@ -41,7 +42,7 @@ export function wrapOpenRouter(openrouter: T): T { return openRouterProxy(or as OpenRouterClient) as T; } - console.warn("Unsupported OpenRouter library. Not wrapping."); + debugLogger.warn("Unsupported OpenRouter library. Not wrapping."); return openrouter; } diff --git a/js/src/wrappers/shared/flush.ts b/js/src/wrappers/shared/flush.ts index 907389d3b..64c61a69e 100644 --- a/js/src/wrappers/shared/flush.ts +++ b/js/src/wrappers/shared/flush.ts @@ -13,6 +13,7 @@ export async function summarizeAndFlush( const shouldDisplay = options.displaySummary ?? true; const summary = await experiment.summarize(); if (shouldDisplay) { + // eslint-disable-next-line no-restricted-properties -- summary output is intentionally written to stdout. console.log(formatExperimentSummary(summary)); } } diff --git a/js/src/wrappers/shared/scorers.ts b/js/src/wrappers/shared/scorers.ts index c5cb4619c..8a47b4646 100644 --- a/js/src/wrappers/shared/scorers.ts +++ b/js/src/wrappers/shared/scorers.ts @@ -1,4 +1,5 @@ import type { Span } from "../../logger"; +import { debugLogger } from "../../debug-logger"; import type { Score } from "../../../util/score"; import type { ScorerFunction } from "./types"; @@ -44,7 +45,7 @@ export async function runScorers(args: { } catch (scorerError) { // Log scorer error but don't fail the test — use metadata instead // of top-level error field to avoid marking the span as errored - console.warn("Braintrust: Scorer failed:", scorerError); + debugLogger.warn("Braintrust: Scorer failed:", scorerError); const errorStr = scorerError instanceof Error ? `${scorerError.message}\n\n${scorerError.stack || ""}` diff --git a/js/src/wrappers/vitest/index.ts b/js/src/wrappers/vitest/index.ts index 3671c8be9..89578f62b 100644 --- a/js/src/wrappers/vitest/index.ts +++ b/js/src/wrappers/vitest/index.ts @@ -102,6 +102,7 @@ export function wrapVitest< flushExperiment: async (options?: { displaySummary?: boolean }) => { const ctx = getExperimentContext(); if (!ctx) { + // eslint-disable-next-line no-restricted-properties -- flushExperiment warnings are user-facing. console.warn( "Braintrust: No experiment context found. Make sure you're using bt.describe() and calling flushExperiment() within an afterAll() hook.", ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d626388a8..b5a327668 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,25 +63,6 @@ importers: specifier: 4.3.6 version: 4.3.6 - e2e/scenarios/turbopack-auto-instrumentation: - dependencies: - next: - specifier: 16.2.1 - version: 16.2.1(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - openai: - specifier: 6.32.0 - version: 6.32.0(ws@8.18.3)(zod@4.2.1) - react: - specifier: 19.2.4 - version: 19.2.4 - react-dom: - specifier: 19.2.4 - version: 19.2.4(react@19.2.4) - devDependencies: - '@types/react': - specifier: 19.2.14 - version: 19.2.14 - integrations/browser-js: dependencies: als-browser: @@ -111,16 +92,16 @@ importers: devDependencies: '@langchain/anthropic': specifier: ^1.3.1 - version: 1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))) + version: 1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))) '@langchain/core': specifier: ^1.1.6 - version: 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + version: 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) '@langchain/langgraph': specifier: ^1.0.7 - version: 1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76) + version: 1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76) '@langchain/openai': specifier: ^1.2.0 - version: 1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + version: 1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) '@types/node': specifier: ^20.10.5 version: 20.10.5 @@ -275,7 +256,7 @@ importers: version: 0.0.11 ai: specifier: ^3.2.16 - version: 3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.1.1)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6) + version: 3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.2.4)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6) braintrust: specifier: workspace:* version: link:../../js @@ -463,7 +444,7 @@ importers: version: 6.25.0(ws@8.18.3)(zod@3.25.76) openapi-zod-client: specifier: ^1.18.3 - version: 1.18.3(react@19.1.1) + version: 1.18.3(react@19.2.4) rollup: specifier: ^4.28.1 version: 4.35.0 @@ -1601,204 +1582,67 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} - engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} - cpu: [ppc64] - os: [linux] - - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} - cpu: [riscv64] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} - cpu: [s390x] - os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} - cpu: [x64] - os: [linux] - '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [riscv64] - os: [linux] - - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@inquirer/confirm@5.0.2': resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} engines: {node: '>=18'} @@ -2055,57 +1899,6 @@ packages: '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} - '@next/env@16.2.1': - resolution: {integrity: sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==} - - '@next/swc-darwin-arm64@16.2.1': - resolution: {integrity: sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@16.2.1': - resolution: {integrity: sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@16.2.1': - resolution: {integrity: sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@16.2.1': - resolution: {integrity: sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@16.2.1': - resolution: {integrity: sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@16.2.1': - resolution: {integrity: sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@16.2.1': - resolution: {integrity: sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-x64-msvc@16.2.1': - resolution: {integrity: sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2560,9 +2353,6 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} @@ -2733,9 +2523,6 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -3196,11 +2983,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.10: - resolution: {integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==} - engines: {node: '>=6.0.0'} - hasBin: true - baseline-browser-mapping@2.9.14: resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} hasBin: true @@ -3370,9 +3152,6 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3559,10 +3338,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -4796,27 +4571,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@16.2.1: - resolution: {integrity: sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==} - 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 - nexus-rpc@0.0.1: resolution: {integrity: sha512-hAWn8Hh2eewpB5McXR5EW81R3pR/ziuGhKCF3wFyUVCklanPqrIgMNr7jKCbzXeNVad0nUDfWpFRqh2u+zxQtw==} engines: {node: '>= 18.0.0'} @@ -5105,10 +4859,6 @@ packages: yaml: optional: true - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} @@ -5201,10 +4951,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react@19.1.1: - resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} - engines: {node: '>=0.10.0'} - react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -5335,10 +5081,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5507,19 +5249,6 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -6314,13 +6043,13 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@0.0.16(react@19.1.1)(zod@4.3.6)': + '@ai-sdk/react@0.0.16(react@19.2.4)(zod@4.3.6)': dependencies: '@ai-sdk/provider-utils': 1.0.0(zod@4.3.6) '@ai-sdk/ui-utils': 0.0.9(zod@4.3.6) - swr: 2.2.0(react@19.1.1) + swr: 2.2.0(react@19.2.4) optionalDependencies: - react: 19.1.1 + react: 19.2.4 zod: 4.3.6 '@ai-sdk/solid@0.0.11(zod@4.3.6)': @@ -7365,146 +7094,49 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.1.0': - optional: true - '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 - optional: true - '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 - optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': - optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': - optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': - optional: true - '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': - optional: true - - '@img/sharp-libvips-linux-ppc64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-riscv64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-s390x@1.2.4': - optional: true - '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - optional: true - '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 - optional: true - '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 - optional: true - - '@img/sharp-linux-ppc64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 - optional: true - - '@img/sharp-linux-riscv64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 - optional: true - - '@img/sharp-linux-s390x@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 - optional: true - '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - optional: true - - '@img/sharp-wasm32@0.34.5': - dependencies: - '@emnapi/runtime': 1.8.1 - optional: true - - '@img/sharp-win32-arm64@0.34.5': - optional: true - - '@img/sharp-win32-ia32@0.34.5': - optional: true - '@img/sharp-win32-x64@0.33.5': optional: true - '@img/sharp-win32-x64@0.34.5': - optional: true - '@inquirer/confirm@5.0.2(@types/node@20.10.5)': dependencies: '@inquirer/core': 10.1.0(@types/node@20.10.5) @@ -7900,20 +7532,20 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@langchain/anthropic@1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/anthropic@1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))': dependencies: '@anthropic-ai/sdk': 0.71.2(zod@3.25.76) - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) zod: 3.25.76 - '@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))': + '@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))': dependencies: '@cfworker/json-schema': 4.0.3 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + langsmith: 0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) mustache: 4.2.0 p-queue: 6.6.2 uuid: 10.0.0 @@ -7924,25 +7556,26 @@ snapshots: - '@opentelemetry/sdk-trace-base' - openai - '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) uuid: 10.0.0 - '@langchain/langgraph-sdk@1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)': + '@langchain/langgraph-sdk@1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) - react: 19.1.1 + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - '@langchain/langgraph@1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76)': + '@langchain/langgraph@1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76)': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))) - '@langchain/langgraph-sdk': 1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))) + '@langchain/langgraph-sdk': 1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) uuid: 10.0.0 zod: 3.25.76 optionalDependencies: @@ -7951,9 +7584,9 @@ snapshots: - react - react-dom - '@langchain/openai@1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.21 openai: 6.25.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 @@ -8001,32 +7634,6 @@ snapshots: '@next/env@14.2.3': {} - '@next/env@16.2.1': {} - - '@next/swc-darwin-arm64@16.2.1': - optional: true - - '@next/swc-darwin-x64@16.2.1': - optional: true - - '@next/swc-linux-arm64-gnu@16.2.1': - optional: true - - '@next/swc-linux-arm64-musl@16.2.1': - optional: true - - '@next/swc-linux-x64-gnu@16.2.1': - optional: true - - '@next/swc-linux-x64-musl@16.2.1': - optional: true - - '@next/swc-win32-arm64-msvc@16.2.1': - optional: true - - '@next/swc-win32-x64-msvc@16.2.1': - optional: true - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8446,10 +8053,6 @@ snapshots: '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 - '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -8691,10 +8294,6 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react@19.2.14': - dependencies: - csstype: 3.2.3 - '@types/retry@0.12.0': {} '@types/send@0.17.4': @@ -9100,11 +8699,11 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.1.1)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6): + ai@3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.2.4)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6): dependencies: '@ai-sdk/provider': 0.0.11 '@ai-sdk/provider-utils': 1.0.0(zod@4.3.6) - '@ai-sdk/react': 0.0.16(react@19.1.1)(zod@4.3.6) + '@ai-sdk/react': 0.0.16(react@19.2.4)(zod@4.3.6) '@ai-sdk/solid': 0.0.11(zod@4.3.6) '@ai-sdk/svelte': 0.0.12(svelte@5.39.0)(zod@4.3.6) '@ai-sdk/ui-utils': 0.0.9(zod@4.3.6) @@ -9118,7 +8717,7 @@ snapshots: zod-to-json-schema: 3.22.5(zod@4.3.6) optionalDependencies: openai: 4.104.0(ws@8.18.3)(zod@4.3.6) - react: 19.1.1 + react: 19.2.4 svelte: 5.39.0 zod: 4.3.6 transitivePeerDependencies: @@ -9376,8 +8975,6 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.10: {} - baseline-browser-mapping@2.9.14: {} bignumber.js@9.3.1: {} @@ -9584,8 +9181,6 @@ snapshots: cli-width@4.1.0: {} - client-only@0.0.1: {} - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -9736,9 +9331,6 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.1.2: - optional: true - detect-newline@3.1.0: {} diff-match-patch@1.0.5: {} @@ -11044,7 +10636,7 @@ snapshots: typescript: 5.5.4 zod: 4.3.6 - langsmith@0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)): + langsmith@0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -11055,7 +10647,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - openai: 6.25.0(ws@8.18.3)(zod@3.25.76) + openai: 6.32.0(ws@8.18.3)(zod@3.25.76) leven@3.1.0: {} @@ -11472,31 +11064,6 @@ snapshots: neo-async@2.6.2: {} - next@16.2.1(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@next/env': 16.2.1 - '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.10.10 - caniuse-lite: 1.0.30001764 - postcss: 8.4.31 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(react@19.2.4) - optionalDependencies: - '@next/swc-darwin-arm64': 16.2.1 - '@next/swc-darwin-x64': 16.2.1 - '@next/swc-linux-arm64-gnu': 16.2.1 - '@next/swc-linux-arm64-musl': 16.2.1 - '@next/swc-linux-x64-gnu': 16.2.1 - '@next/swc-linux-x64-musl': 16.2.1 - '@next/swc-win32-arm64-msvc': 16.2.1 - '@next/swc-win32-x64-msvc': 16.2.1 - '@opentelemetry/api': 1.9.0 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - nexus-rpc@0.0.1: {} node-domexception@1.0.0: {} @@ -11584,14 +11151,15 @@ snapshots: ws: 8.18.3 zod: 3.25.76 - openai@6.32.0(ws@8.18.3)(zod@4.2.1): + openai@6.32.0(ws@8.18.3)(zod@3.25.76): optionalDependencies: ws: 8.18.3 - zod: 4.2.1 + zod: 3.25.76 + optional: true openapi-types@12.1.3: {} - openapi-zod-client@1.18.3(react@19.1.1): + openapi-zod-client@1.18.3(react@19.2.4): dependencies: '@apidevtools/swagger-parser': 10.1.1(openapi-types@12.1.3) '@liuli-util/fs-extra': 0.1.0 @@ -11601,7 +11169,7 @@ snapshots: handlebars: 4.7.8 openapi-types: 12.1.3 openapi3-ts: 3.1.0 - pastable: 2.2.1(react@19.1.1) + pastable: 2.2.1(react@19.2.4) prettier: 2.8.8 tanu: 0.1.13 ts-pattern: 5.8.0 @@ -11700,13 +11268,13 @@ snapshots: parseurl@1.3.3: {} - pastable@2.2.1(react@19.1.1): + pastable@2.2.1(react@19.2.4): dependencies: '@babel/core': 7.28.0 ts-toolbelt: 9.6.0 type-fest: 3.13.1 optionalDependencies: - react: 19.1.1 + react: 19.2.4 transitivePeerDependencies: - supports-color @@ -11768,12 +11336,6 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - postcss@8.4.31: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.8: dependencies: nanoid: 3.3.11 @@ -11871,11 +11433,10 @@ snapshots: dependencies: react: 19.2.4 scheduler: 0.27.0 + optional: true react-is@18.3.1: {} - react@19.1.1: {} - react@19.2.4: {} readdirp@4.1.2: {} @@ -11963,7 +11524,8 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.27.0: {} + scheduler@0.27.0: + optional: true schema-utils@4.3.3: dependencies: @@ -12042,38 +11604,6 @@ snapshots: setprototypeof@1.2.0: {} - sharp@0.34.5: - dependencies: - '@img/colour': 1.1.0 - detect-libc: 2.1.2 - semver: 7.7.4 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@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@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -12239,11 +11769,6 @@ snapshots: strip-json-comments@5.0.3: {} - styled-jsx@5.1.6(react@19.2.4): - dependencies: - client-only: 0.0.1 - react: 19.2.4 - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -12291,10 +11816,10 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.104.1(@swc/core@1.15.8) - swr@2.2.0(react@19.1.1): + swr@2.2.0(react@19.2.4): dependencies: - react: 19.1.1 - use-sync-external-store: 1.2.2(react@19.1.1) + react: 19.2.4 + use-sync-external-store: 1.2.2(react@19.2.4) swrev@4.0.0: {} @@ -12727,9 +12252,9 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-sync-external-store@1.2.2(react@19.1.1): + use-sync-external-store@1.2.2(react@19.2.4): dependencies: - react: 19.1.1 + react: 19.2.4 utils-merge@1.0.1: {} From c8e021dcba6ff891c6899c19051ef0040528933a Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 27 Mar 2026 14:04:58 +0100 Subject: [PATCH 2/6] Revert "chore: Adjust lint rule for console logging" This reverts commit 22a72f2765be441d251f233dd06f99ed6b8aca60. --- js/eslint.config.ts | 108 ++-- .../auto-instrumentations/bundler/plugin.ts | 2 - .../bundler/webpack-loader.ts | 1 - .../auto-instrumentations/loader/cjs-patch.ts | 1 - js/src/cli/functions/infer-source.ts | 4 - js/src/cli/functions/upload.ts | 6 - js/src/cli/index.ts | 21 - js/src/cli/reporters/eval.ts | 2 - js/src/cli/util/bundle.ts | 1 - js/src/cli/util/debug-logging.ts | 1 - js/src/cli/util/pull.ts | 13 - js/src/debug-logger.ts | 5 - js/src/eval-parameters.ts | 3 +- js/src/framework.ts | 15 +- js/src/framework2.ts | 2 - .../instrumentation/core/channel-tracing.ts | 16 +- js/src/instrumentation/core/plugin.ts | 32 +- js/src/instrumentation/core/stream-patcher.ts | 26 +- .../plugins/claude-agent-sdk-plugin.ts | 13 +- js/src/instrumentation/registry.ts | 3 +- js/src/isomorph.ts | 1 - js/src/prompt-cache/disk-cache.ts | 5 +- js/src/reporters/progress.ts | 1 - js/src/template/registry.ts | 3 +- js/src/wrappers/ai-sdk/ai-sdk.ts | 13 +- .../ai-sdk/deprecated/wrapAISDKModel.ts | 3 +- js/src/wrappers/anthropic.ts | 3 +- .../claude-agent-sdk/claude-agent-sdk.ts | 3 +- js/src/wrappers/google-genai.ts | 5 +- js/src/wrappers/oai.ts | 5 +- js/src/wrappers/openrouter.ts | 3 +- js/src/wrappers/shared/flush.ts | 1 - js/src/wrappers/shared/scorers.ts | 3 +- js/src/wrappers/vitest/index.ts | 1 - pnpm-lock.yaml | 565 ++++++++++++++++-- 35 files changed, 616 insertions(+), 274 deletions(-) diff --git a/js/eslint.config.ts b/js/eslint.config.ts index f51facbce..22c71b817 100644 --- a/js/eslint.config.ts +++ b/js/eslint.config.ts @@ -18,57 +18,6 @@ const entryFiles = tsupConfig }) .filter((entry) => !entry.includes("cli")); -const consoleRestrictions = [ - { - object: "console", - property: "log", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "warn", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "error", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "debug", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "info", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "trace", - message: "Use debugLogger instead of console for SDK logging.", - }, -] as const; - -const consoleAllowedFiles = ["src/queue.bench.ts"]; - -const cliImportAllowedFiles = [ - "src/cli/**", - "src/debug-logger.ts", - "src/framework.ts", - "src/framework2.ts", - "src/isomorph.ts", - "src/sandbox.ts", - "src/template/**", - "src/reporters/**", - "src/prompt-cache/**", - "src/eval-parameters.ts", - "src/wrappers/**", - "src/instrumentation/**", - "src/auto-instrumentations/**", -]; - export default [ { ignores: [ @@ -133,22 +82,63 @@ export default [ "@typescript-eslint/no-empty-object-type": "error", "@typescript-eslint/no-unsafe-function-type": "error", "@typescript-eslint/prefer-as-const": "error", - "no-restricted-properties": ["error", ...consoleRestrictions], // Require node: protocol for Node.js built-in imports (for Deno compatibility) // This plugin automatically detects ALL Node.js built-ins - no manual list needed! "node-import/prefer-node-protocol": "error", }, }, - { - files: consoleAllowedFiles, - rules: { - "no-restricted-properties": "off", - }, - }, { files: ["src/**/*.ts", "src/**/*.tsx"], - ignores: cliImportAllowedFiles, + ignores: [ + "src/cli/**", + "src/debug-logger.ts", + "src/framework.ts", + "src/framework2.ts", + "src/isomorph.ts", + "src/sandbox.ts", + "src/template/**", + "src/reporters/**", + "src/prompt-cache/**", + "src/eval-parameters.ts", + "src/wrappers/**", + "src/instrumentation/**", + "src/auto-instrumentations/**", + "src/queue.bench.ts", + ], rules: { + "no-restricted-properties": [ + "error", + { + object: "console", + property: "log", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "warn", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "error", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "debug", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "info", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "trace", + message: "Use debugLogger instead of console for SDK logging.", + }, + ], "no-restricted-imports": [ "error", { diff --git a/js/src/auto-instrumentations/bundler/plugin.ts b/js/src/auto-instrumentations/bundler/plugin.ts index 15593c571..29a25eec0 100644 --- a/js/src/auto-instrumentations/bundler/plugin.ts +++ b/js/src/auto-instrumentations/bundler/plugin.ts @@ -118,7 +118,6 @@ export const unplugin = createUnplugin((options = {}) => { // If no version found if (!moduleVersion) { - // eslint-disable-next-line no-restricted-properties -- bundler warnings are intentionally user-facing. console.warn( `No 'package.json' version found for module ${moduleName} at ${moduleDetails.basedir}. Skipping transformation.`, ); @@ -150,7 +149,6 @@ export const unplugin = createUnplugin((options = {}) => { }; } catch (error) { // If transformation fails, warn and return original code - // eslint-disable-next-line no-restricted-properties -- bundler warnings are intentionally user-facing. console.warn(`Code transformation failed for ${id}: ${error}`); return null; } diff --git a/js/src/auto-instrumentations/bundler/webpack-loader.ts b/js/src/auto-instrumentations/bundler/webpack-loader.ts index 79cf56aca..566d07597 100644 --- a/js/src/auto-instrumentations/bundler/webpack-loader.ts +++ b/js/src/auto-instrumentations/bundler/webpack-loader.ts @@ -160,7 +160,6 @@ function codeTransformerLoader( const result = transformer.transform(code, moduleType); callback(null, result.code, result.map ?? undefined); } catch (error) { - // eslint-disable-next-line no-restricted-properties -- bundler warnings are intentionally user-facing. console.warn( `[code-transformer-loader] Error transforming ${resourcePath}:`, error, diff --git a/js/src/auto-instrumentations/loader/cjs-patch.ts b/js/src/auto-instrumentations/loader/cjs-patch.ts index d6a65549d..a29014e8e 100644 --- a/js/src/auto-instrumentations/loader/cjs-patch.ts +++ b/js/src/auto-instrumentations/loader/cjs-patch.ts @@ -66,7 +66,6 @@ export class ModulePatch { const transformedCode = transformer.transform(content, "unknown"); args[0] = transformedCode?.code; } catch (error) { - // eslint-disable-next-line no-restricted-properties -- loader warnings are intentionally user-facing. console.warn(`Error transforming module ${filename}:`, error); } finally { transformer.free(); diff --git a/js/src/cli/functions/infer-source.ts b/js/src/cli/functions/infer-source.ts index 36a8a2ad7..179b5c50d 100644 --- a/js/src/cli/functions/infer-source.ts +++ b/js/src/cli/functions/infer-source.ts @@ -71,7 +71,6 @@ export async function findCodeDefinition({ if (location.type === "experiment" || location.type === "sandbox") { const evaluator = outFileModule.evaluators[location.eval_name]?.evaluator; if (!evaluator) { - // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( `Warning: failed to find evaluator for ${location.eval_name}. Will not display preview.`, @@ -95,7 +94,6 @@ export async function findCodeDefinition({ } if (!fn) { - // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( `Warning: failed to find ${locationToString(location)}. Will not display preview.`, @@ -120,7 +118,6 @@ export async function findCodeDefinition({ } if (columnNumber === -1) { - // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( `Warning: failed to find code definition for ${fn.name}. Will not display preview.`, @@ -198,7 +195,6 @@ async function getTsModule() { try { tsModule = require("typescript"); } catch { - // eslint-disable-next-line no-restricted-properties -- CLI warnings are intentionally user-facing. console.warn( warning( "Failed to load TypeScript module. Will not use TypeScript to derive preview.", diff --git a/js/src/cli/functions/upload.ts b/js/src/cli/functions/upload.ts index cadb77ead..ce67f44d9 100644 --- a/js/src/cli/functions/upload.ts +++ b/js/src/cli/functions/upload.ts @@ -82,7 +82,6 @@ export async function uploadHandleBundles({ setCurrent: boolean; defaultIfExists: IfExists; }) { - // eslint-disable-next-line no-restricted-properties -- CLI upload progress is intentionally user-facing. console.error( `Processing ${buildResults.length} ${pluralize("file", buildResults.length)}...`, ); @@ -277,7 +276,6 @@ export async function uploadHandleBundles({ const numUploaded = uploadResults.length; const numFailed = uploadResults.filter((result) => !result).length; - // eslint-disable-next-line no-restricted-properties -- CLI upload progress is intentionally user-facing. console.error( `${numUploaded} ${pluralize("file", numUploaded)} uploaded ${ numFailed > 0 @@ -346,14 +344,12 @@ async function uploadBundles({ ); } catch (e) { if (showDetailedErrors) { - // eslint-disable-next-line no-restricted-properties -- CLI upload errors are intentionally user-facing. console.error(e); } const msg = e instanceof FailedHTTPResponse ? `Unable to upload your code. ${e.status} (${e.text}): ${e.data}` : `Unable to upload your code. You most likely need to update the API: ${e}`; - // eslint-disable-next-line no-restricted-properties -- CLI upload errors are intentionally user-facing. console.error(warning(msg)); return false; } @@ -426,14 +422,12 @@ async function uploadBundles({ }); } catch (e) { if (showDetailedErrors) { - // eslint-disable-next-line no-restricted-properties -- CLI upload errors are intentionally user-facing. console.error(e); } const msg = e instanceof FailedHTTPResponse ? `Failed to save function definitions for '${sourceFile}'. ${e.status} (${e.text}): ${e.data}` : `Failed to save function definitions for '${sourceFile}'. You most likely need to update the API: ${e}`; - // eslint-disable-next-line no-restricted-properties -- CLI upload warnings are intentionally user-facing. console.warn(warning(msg)); return false; } diff --git a/js/src/cli/index.ts b/js/src/cli/index.ts index 881dfe0c5..48a38be3f 100755 --- a/js/src/cli/index.ts +++ b/js/src/cli/index.ts @@ -127,7 +127,6 @@ async function initExperiment( fallback: (_text: string, url: string) => url, }) : "locally"; - // eslint-disable-next-line no-restricted-properties -- CLI status output is intentionally user-facing. console.error( chalk.cyan("▶") + ` Experiment ${chalk.bold(info.experimentName)} is running at ${linkText}`, @@ -220,17 +219,13 @@ function buildWatchPluginForEvaluator( name: "run-evalutator-on-end", setup(build: esbuild.PluginBuild) { build.onEnd(async (result) => { - // eslint-disable-next-line no-restricted-properties -- CLI build status is intentionally user-facing. console.error(`Done building ${inFile}`); if (!result.outputFiles) { if (opts.showDetailedErrors) { - // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(`Failed to compile ${inFile}`); - // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(result.errors); } else { - // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(`Failed to compile ${inFile}: ${result.errors}`); } return; @@ -311,7 +306,6 @@ function buildWatchPluginForEvaluator( )) { const success = await reporter.reportRun(await Promise.all(results)); if (!success) { - // eslint-disable-next-line no-restricted-properties -- CLI reporter errors are intentionally user-facing. console.error(error(`Reporter ${reporterName} failed.`)); } } @@ -427,12 +421,9 @@ export function handleBuildFailure({ if (terminateOnFailure) { throw result.error; } else if (showDetailedErrors) { - // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(`Failed to compile ${result.sourceFile}`); - // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn(result.error); } else { - // eslint-disable-next-line no-restricted-properties -- CLI build warnings are intentionally user-facing. console.warn( `Failed to compile ${result.sourceFile}: ${result.error.message}`, ); @@ -475,7 +466,6 @@ function updateEvaluators( evaluators.reporters[reporterName] && evaluators.reporters[reporterName] !== reporter ) { - // eslint-disable-next-line no-restricted-properties -- CLI reporter warnings are intentionally user-facing. console.warn( warning( `Reporter '${reporterName}' already exists. Will skip '${reporterName}' from ${result.sourceFile}.`, @@ -496,14 +486,12 @@ async function runAndWatch({ onExit?: () => void; }) { const count = Object.keys(handles).length; - // eslint-disable-next-line no-restricted-properties -- CLI watch status is intentionally user-facing. console.error(`Watching ${pluralize("file", count, true)}...`); Object.values(handles).map((handle) => handle.watch()); ["SIGINT", "SIGTERM"].forEach((signal: string) => { process.on(signal, function () { - // eslint-disable-next-line no-restricted-properties -- CLI watch status is intentionally user-facing. console.error("Stopped watching."); for (const handle of Object.values(handles)) { handle.destroy(); @@ -552,7 +540,6 @@ async function runOnce( if (opts.list) { for (const evaluator of evaluators.evaluators) { - // eslint-disable-next-line no-restricted-properties -- CLI list output is intentionally user-facing. console.log(evaluator.evaluator.evalName); } return true; @@ -594,7 +581,6 @@ async function runOnce( } }); - // eslint-disable-next-line no-restricted-properties -- CLI summary output is intentionally user-facing. console.error( chalk.dim( `Processing ${chalk.bold(resultPromises.length)} evaluator${resultPromises.length === 1 ? "" : "s"}...`, @@ -602,7 +588,6 @@ async function runOnce( ); const allEvalsResults = await Promise.all(resultPromises); opts.progressReporter.stop(); - // eslint-disable-next-line no-restricted-properties -- CLI formatting output is intentionally user-facing. console.error(""); const evalReports: Record< @@ -700,7 +685,6 @@ async function collectFiles( try { pathStat = fs.lstatSync(inputPath); } catch (e) { - // eslint-disable-next-line no-restricted-properties -- CLI read errors are intentionally user-facing. console.error(error(`Error reading ${inputPath}: ${e}`)); process.exit(1); } @@ -715,7 +699,6 @@ async function collectFiles( ) ) { const prefix = mode === "eval" ? ".eval" : ""; - // eslint-disable-next-line no-restricted-properties -- CLI discovery warnings are intentionally user-facing. console.warn( warning( `Reading ${inputPath} because it was specified directly. Rename it to end in ${prefix}.ts or ` + @@ -865,7 +848,6 @@ export async function initializeHandles({ for (const inputPath of inputPaths) { const newFiles = await collectFiles(inputPath, mode); if (newFiles.length == 0) { - // eslint-disable-next-line no-restricted-properties -- CLI discovery warnings are intentionally user-facing. console.warn( warning( `Provided path ${inputPath} is not an eval file or a directory containing eval files, skipping...`, @@ -878,7 +860,6 @@ export async function initializeHandles({ } if (Object.keys(files).length == 0) { - // eslint-disable-next-line no-restricted-properties -- CLI discovery warnings are intentionally user-facing. console.warn( warning("No eval files were found in any of the provided paths."), ); @@ -925,7 +906,6 @@ async function run(args: RunArgs) { // Load via dotenv library const loaded = dotenv.config({ path: args.env_file }); if (loaded.error) { - // eslint-disable-next-line no-restricted-properties -- CLI env loading errors are intentionally user-facing. console.error(error(`Error loading ${args.env_file}: ${loaded.error}`)); process.exit(1); } @@ -950,7 +930,6 @@ async function run(args: RunArgs) { }; if (args.list && args.watch) { - // eslint-disable-next-line no-restricted-properties -- CLI argument errors are intentionally user-facing. console.error(error("Cannot specify both --list and --watch.")); process.exit(1); } diff --git a/js/src/cli/reporters/eval.ts b/js/src/cli/reporters/eval.ts index 2f2ebf706..f10c1fc17 100644 --- a/js/src/cli/reporters/eval.ts +++ b/js/src/cli/reporters/eval.ts @@ -174,7 +174,6 @@ export const fancyReporter: ReporterDef = { ); if (failingResults.length > 0) { - // eslint-disable-next-line no-restricted-properties -- CLI reporters intentionally write to stderr. console.error( warning( `Evaluator ${evaluator.evalName} failed with ${pluralize("error", failingResults.length, true)}. This evaluation ("${evaluator.evalName}") will not be fully logged.`, @@ -187,7 +186,6 @@ export const fancyReporter: ReporterDef = { } } else if (verbose) { for (const result of failingResults) { - // eslint-disable-next-line no-restricted-properties -- CLI reporters intentionally write to stderr. console.error(result); } } diff --git a/js/src/cli/util/bundle.ts b/js/src/cli/util/bundle.ts index f37adccdb..dfb2b01c2 100644 --- a/js/src/cli/util/bundle.ts +++ b/js/src/cli/util/bundle.ts @@ -20,7 +20,6 @@ export async function loadCLIEnv(args: AuthArgs & CommonArgs) { // Load via dotenv library const loaded = dotenv.config({ path: args.env_file }); if (loaded.error) { - // eslint-disable-next-line no-restricted-properties -- CLI bundle errors are intentionally user-facing. console.error(error(`Error loading ${args.env_file}: ${loaded.error}`)); process.exit(1); } diff --git a/js/src/cli/util/debug-logging.ts b/js/src/cli/util/debug-logging.ts index c10d25bc7..41b3bc8ba 100644 --- a/js/src/cli/util/debug-logging.ts +++ b/js/src/cli/util/debug-logging.ts @@ -21,7 +21,6 @@ export function normalizeDebugLoggingArgs< if (!hasWarnedAboutVerboseFlag) { hasWarnedAboutVerboseFlag = true; - // eslint-disable-next-line no-restricted-properties -- CLI deprecation warnings are intentionally user-facing. console.warn(warning(VERBOSE_DEPRECATION_MESSAGE)); } diff --git a/js/src/cli/util/pull.ts b/js/src/cli/util/pull.ts index eb3a1a92d..a6e5e7a79 100644 --- a/js/src/cli/util/pull.ts +++ b/js/src/cli/util/pull.ts @@ -46,7 +46,6 @@ export async function pullCommand(args: PullArgs) { typeof rawFunc === "object" && rawFunc && "id" in rawFunc ? ` ${rawFunc.id}` : ""; - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning(`Failed to parse function${id}: ${parsedFunc.error.message}`), ); @@ -61,10 +60,8 @@ export async function pullCommand(args: PullArgs) { projectNameToFunctions[projectName].push(func); } - // eslint-disable-next-line no-restricted-properties -- CLI pull output is intentionally user-facing. console.log("Found functions in the following projects:"); for (const projectName of Object.keys(projectNameToFunctions)) { - // eslint-disable-next-line no-restricted-properties -- CLI pull output is intentionally user-facing. console.log(` * ${projectName}`); } @@ -95,7 +92,6 @@ export async function pullCommand(args: PullArgs) { ); if (args.force) { if (fileExists) { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Overwriting ${doubleQuote(projectFile)} because --force is set.`, @@ -103,7 +99,6 @@ export async function pullCommand(args: PullArgs) { ); } } else if (dirtyFiles.has(resolvedProjectFile)) { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Skipping project ${projectName} because ${doubleQuote(projectFile)} has uncommitted changes.`, @@ -112,7 +107,6 @@ export async function pullCommand(args: PullArgs) { continue; } else if (fileExists) { if (!git) { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Project ${projectName} already exists in ${doubleQuote(projectFile)}. Skipping since this is not a git repository...`, @@ -120,7 +114,6 @@ export async function pullCommand(args: PullArgs) { ); continue; } else { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Project ${projectName} already exists in ${doubleQuote(projectFile)}. Overwriting...`, @@ -137,7 +130,6 @@ export async function pullCommand(args: PullArgs) { hasSpecifiedFunction: !!args.slug || !!args.id, }); await fs.writeFile(projectFile, projectFileContents || ""); - // eslint-disable-next-line no-restricted-properties -- CLI pull output is intentionally user-facing. console.log(`Wrote ${projectName} to ${doubleQuote(projectFile)}`); } } @@ -186,7 +178,6 @@ ${functionDefinitions.join("\n")} }); return formatted; } catch (error) { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Failed to format with prettier (${error instanceof Error ? error.message : error}). Using unformatted output.`, @@ -208,7 +199,6 @@ function makeFunctionDefinition({ }): string | null { if (func.function_data.type !== "prompt") { if (hasSpecifiedFunction) { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Skipping function ${doubleQuote(func.name)} because it is not a prompt.`, @@ -228,7 +218,6 @@ function makeFunctionDefinition({ varNames[varName] = func.slug; if (!func.prompt_data || !func.prompt_data.prompt) { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Prompt ${doubleQuote(func.name)} has an invalid (empty) prompt definition.`, @@ -251,7 +240,6 @@ function makeFunctionDefinition({ : undefined; if (rawToolsParsed && !rawToolsParsed.success) { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( `Prompt ${doubleQuote(func.name)} has an invalid tools definition: ${rawToolsParsed.error.message}. Skipping...`, @@ -360,7 +348,6 @@ async function getPrettierModule() { prettierModule = await importWithTimeout(); } catch { - // eslint-disable-next-line no-restricted-properties -- CLI pull warnings are intentionally user-facing. console.warn( warning( "Failed to load prettier module. Will not use prettier to format output.", diff --git a/js/src/debug-logger.ts b/js/src/debug-logger.ts index 26695e8b8..91afecc7a 100644 --- a/js/src/debug-logger.ts +++ b/js/src/debug-logger.ts @@ -34,7 +34,6 @@ function warnInvalidEnvValue(value: string) { return; } hasWarnedAboutInvalidEnvValue = true; - // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.warn( PREFIX, `Invalid BRAINTRUST_DEBUG_LOG_LEVEL value "${value}". Expected "error", "warn", "info", or "debug".`, @@ -136,16 +135,12 @@ function emit( } if (method === "info") { - // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.log(PREFIX, ...args); } else if (method === "debug") { - // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.debug(PREFIX, ...args); } else if (method === "warn") { - // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.warn(PREFIX, ...args); } else { - // eslint-disable-next-line no-restricted-properties -- debugLogger intentionally wraps console primitives. console.error(PREFIX, ...args); } } diff --git a/js/src/eval-parameters.ts b/js/src/eval-parameters.ts index 2fac65332..e33d5c911 100644 --- a/js/src/eval-parameters.ts +++ b/js/src/eval-parameters.ts @@ -1,7 +1,6 @@ import { z } from "zod/v3"; import Ajv from "ajv"; import { Prompt, RemoteEvalParameters } from "./logger"; -import { debugLogger } from "./debug-logger"; import { promptDefinitionWithToolsSchema, promptDefinitionToPromptData, @@ -125,7 +124,7 @@ function validateParametersWithZod< return [name, schemaCasted.parse(value)]; } } catch (e) { - debugLogger.error("Error validating parameter", name, e); + console.error("Error validating parameter", name, e); throw Error( `Invalid parameter '${name}': ${e instanceof Error ? e.message : String(e)}`, ); diff --git a/js/src/framework.ts b/js/src/framework.ts index 1e069929b..cfdd62bde 100644 --- a/js/src/framework.ts +++ b/js/src/framework.ts @@ -773,15 +773,9 @@ export async function Eval< return ret; } finally { if (experiment) { - await experiment.flush().catch( - // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. - (error) => console.error(error), - ); + await experiment.flush().catch(console.error); } else if (options.parent) { - await flush({ state: evaluator.state }).catch( - // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. - (error) => console.error(error), - ); + await flush({ state: evaluator.state }).catch(console.error); } } } finally { @@ -1491,10 +1485,8 @@ export const warning = (text: string) => `Warning: ${text}`; export function logError(e: unknown, verbose: boolean) { if (!verbose) { - // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. console.error(`${e}`); } else { - // eslint-disable-next-line no-restricted-properties -- framework errors must reach stderr. console.error(e); } } @@ -1570,14 +1562,12 @@ export function reportFailures< // TODO: We may want to support a non-strict mode (and make this the "strict" behavior), so that // users can still log imperfect evaluations. In the meantime, they should handle these cases inside // of their tasks. - // eslint-disable-next-line no-restricted-properties -- framework warnings are user-facing. console.error( warning( `Evaluator ${evaluator.evalName} failed with ${failingResults.length} error${failingResults.length === 1 ? "" : "s"}. This evaluation ("${evaluator.evalName}") will not be fully logged.`, ), ); if (jsonl) { - // eslint-disable-next-line no-restricted-properties -- JSONL mode writes reporter output to stdout. console.log( JSON.stringify({ evaluatorName: evaluator.evalName, @@ -1592,7 +1582,6 @@ export function reportFailures< } } if (!verbose && !jsonl) { - // eslint-disable-next-line no-restricted-properties -- framework warnings are user-facing. console.error( warning( "Use --debug-logging debug to see full stack traces and troubleshooting details.", diff --git a/js/src/framework2.ts b/js/src/framework2.ts index 1686d2ae4..9c15946d5 100644 --- a/js/src/framework2.ts +++ b/js/src/framework2.ts @@ -117,7 +117,6 @@ export class Project { async publish() { if (globalThis._lazy_load) { - // eslint-disable-next-line no-restricted-properties -- publish warnings are user-facing. console.warn("publish() is a no-op when running `braintrust push`."); return; } @@ -125,7 +124,6 @@ export class Project { const projectMap = new ProjectNameIdMap(); const functionDefinitions: FunctionEvent[] = []; if (this._publishableCodeFunctions.length > 0) { - // eslint-disable-next-line no-restricted-properties -- publish warnings are user-facing. console.warn( "Code functions cannot be published directly. Use `braintrust push` instead.", ); diff --git a/js/src/instrumentation/core/channel-tracing.ts b/js/src/instrumentation/core/channel-tracing.ts index f0b4ba3b9..96a64a472 100644 --- a/js/src/instrumentation/core/channel-tracing.ts +++ b/js/src/instrumentation/core/channel-tracing.ts @@ -3,7 +3,6 @@ import type { IsoChannelHandlers, IsoTracingChannel, } from "../../isomorph"; -import { debugLogger } from "../../debug-logger"; import { _internalGetGlobalState, BRAINTRUST_CURRENT_SPAN_STORE, @@ -199,7 +198,7 @@ function startSpanForEvent< metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - debugLogger.error(`Error extracting input for ${channelName}:`, error); + console.error(`Error extracting input for ${channelName}:`, error); } return { span, startTime }; @@ -352,7 +351,7 @@ export function traceAsyncChannel( metrics, }); } catch (error) { - debugLogger.error(`Error extracting output for ${channelName}:`, error); + console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); states.delete(event as object); @@ -461,7 +460,7 @@ export function traceStreamingChannel( metrics, }); } catch (error) { - debugLogger.error( + console.error( `Error extracting output for ${channelName}:`, error, ); @@ -517,7 +516,7 @@ export function traceStreamingChannel( metrics, }); } catch (error) { - debugLogger.error(`Error extracting output for ${channelName}:`, error); + console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); states.delete(event as object); @@ -611,7 +610,7 @@ export function traceSyncStreamChannel( }); } } catch (error) { - debugLogger.error( + console.error( `Error extracting chatCompletion for ${channelName}:`, error, ); @@ -638,10 +637,7 @@ export function traceSyncStreamChannel( span.log(extracted); } } catch (error) { - debugLogger.error( - `Error extracting event for ${channelName}:`, - error, - ); + console.error(`Error extracting event for ${channelName}:`, error); } }); diff --git a/js/src/instrumentation/core/plugin.ts b/js/src/instrumentation/core/plugin.ts index 268e7c014..7d1147c5a 100644 --- a/js/src/instrumentation/core/plugin.ts +++ b/js/src/instrumentation/core/plugin.ts @@ -2,7 +2,6 @@ import iso from "../../isomorph"; import type { IsoChannelHandlers } from "../../isomorph"; import { isAsyncIterable, patchStreamIfNeeded } from "./stream-patcher"; import type { StartEvent } from "./types"; -import { debugLogger } from "../../debug-logger"; import { startSpan } from "../../logger"; import type { Span } from "../../logger"; import { getCurrentUnixTimestamp } from "../../util"; @@ -110,10 +109,7 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - debugLogger.error( - `Error extracting input for ${channelName}:`, - error, - ); + console.error(`Error extracting input for ${channelName}:`, error); } }, @@ -136,10 +132,7 @@ export abstract class BasePlugin { metrics, }); } catch (error) { - debugLogger.error( - `Error extracting output for ${channelName}:`, - error, - ); + console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); spans.delete(event); @@ -223,10 +216,7 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - debugLogger.error( - `Error extracting input for ${channelName}:`, - error, - ); + console.error(`Error extracting input for ${channelName}:`, error); } }, @@ -289,7 +279,7 @@ export abstract class BasePlugin { metrics, }); } catch (error) { - debugLogger.error( + console.error( `Error extracting output for ${channelName}:`, error, ); @@ -325,10 +315,7 @@ export abstract class BasePlugin { metrics, }); } catch (error) { - debugLogger.error( - `Error extracting output for ${channelName}:`, - error, - ); + console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); spans.delete(event); @@ -402,10 +389,7 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { - debugLogger.error( - `Error extracting input for ${channelName}:`, - error, - ); + console.error(`Error extracting input for ${channelName}:`, error); } }, @@ -446,7 +430,7 @@ export abstract class BasePlugin { output: completion.choices, }); } catch (error) { - debugLogger.error( + console.error( `Error extracting chatCompletion for ${channelName}:`, error, ); @@ -471,7 +455,7 @@ export abstract class BasePlugin { span.log(extracted); } } catch (error) { - debugLogger.error( + console.error( `Error extracting event for ${channelName}:`, error, ); diff --git a/js/src/instrumentation/core/stream-patcher.ts b/js/src/instrumentation/core/stream-patcher.ts index a2cc0e5a5..efdd379de 100644 --- a/js/src/instrumentation/core/stream-patcher.ts +++ b/js/src/instrumentation/core/stream-patcher.ts @@ -6,8 +6,6 @@ * even though they cannot replace return values. */ -import { debugLogger } from "../../debug-logger"; - /** * Check if a value is an async iterable (stream). */ @@ -103,7 +101,7 @@ export function patchStreamIfNeeded( // Check if object is extensible (can be patched) if (Object.isFrozen(stream) || Object.isSealed(stream)) { - debugLogger.warn( + console.warn( "Cannot patch frozen/sealed stream. Stream output will not be collected.", ); return stream; @@ -139,7 +137,7 @@ export function patchStreamIfNeeded( try { await options.onComplete(chunks); } catch (error) { - debugLogger.error("Error in stream onComplete handler:", error); + console.error("Error in stream onComplete handler:", error); } } } else { @@ -159,7 +157,7 @@ export function patchStreamIfNeeded( try { await options.onChunk(chunk); } catch (error) { - debugLogger.error("Error in stream onChunk handler:", error); + console.error("Error in stream onChunk handler:", error); } } } @@ -177,10 +175,7 @@ export function patchStreamIfNeeded( chunks, ); } catch (handlerError) { - debugLogger.error( - "Error in stream onError handler:", - handlerError, - ); + console.error("Error in stream onError handler:", handlerError); } } } @@ -198,7 +193,7 @@ export function patchStreamIfNeeded( try { await options.onComplete(chunks); } catch (error) { - debugLogger.error("Error in stream onComplete handler:", error); + console.error("Error in stream onComplete handler:", error); } } return originalReturn(...args); @@ -220,10 +215,7 @@ export function patchStreamIfNeeded( try { await options.onError(error, chunks); } catch (handlerError) { - debugLogger.error( - "Error in stream onError handler:", - handlerError, - ); + console.error("Error in stream onError handler:", handlerError); } } } @@ -245,7 +237,7 @@ export function patchStreamIfNeeded( return stream; } catch (error) { // If patching fails for any reason, log warning and return original - debugLogger.warn("Failed to patch stream:", error); + console.warn("Failed to patch stream:", error); return stream; } } @@ -313,7 +305,7 @@ export function wrapStreamResult( const processed = options.processChunks(chunks); options.onResult(processed); } catch (error) { - debugLogger.error("Error processing stream chunks:", error); + console.error("Error processing stream chunks:", error); if (options.onError) { options.onError( error instanceof Error ? error : new Error(String(error)), @@ -333,7 +325,7 @@ export function wrapStreamResult( : result; options.onResult(processed); } catch (error) { - debugLogger.error("Error processing non-stream result:", error); + console.error("Error processing non-stream result:", error); if (options.onError) { options.onError( error instanceof Error ? error : new Error(String(error)), diff --git a/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts b/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts index ca33e7250..c6f5aeb8a 100644 --- a/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts +++ b/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts @@ -2,7 +2,6 @@ import { BasePlugin } from "../core"; import type { ChannelMessage } from "../core/channel-definitions"; import { isAsyncIterable, patchStreamIfNeeded } from "../core/stream-patcher"; import type { IsoChannelHandlers } from "../../isomorph"; -import { debugLogger } from "../../debug-logger"; import { startSpan } from "../../logger"; import type { Span } from "../../logger"; import { SpanTypeAttribute } from "../../../util/index"; @@ -757,10 +756,7 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { metadata: filterSerializableOptions(options), }); } catch (error) { - debugLogger.error( - "Error extracting input for Claude Agent SDK:", - error, - ); + console.error("Error extracting input for Claude Agent SDK:", error); } const activeToolSpans = new Map(); @@ -832,7 +828,7 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { state.processing = state.processing .then(() => handleStreamMessage(state, message)) .catch((error) => { - debugLogger.error( + console.error( "Error processing Claude Agent SDK stream chunk:", error, ); @@ -863,10 +859,7 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { try { state.span.log({ output: eventResult }); } catch (error) { - debugLogger.error( - "Error extracting output for Claude Agent SDK:", - error, - ); + console.error("Error extracting output for Claude Agent SDK:", error); } finally { state.span.end(); spans.delete(event); diff --git a/js/src/instrumentation/registry.ts b/js/src/instrumentation/registry.ts index 0cf8b11a0..844b9efd2 100644 --- a/js/src/instrumentation/registry.ts +++ b/js/src/instrumentation/registry.ts @@ -6,7 +6,6 @@ */ import { BraintrustPlugin } from "./braintrust-plugin"; -import { debugLogger } from "../debug-logger"; import iso from "../isomorph"; export interface InstrumentationConfig { @@ -36,7 +35,7 @@ class PluginRegistry { */ configure(config: InstrumentationConfig): void { if (this.enabled) { - debugLogger.warn( + console.warn( "Braintrust: Cannot configure instrumentation after it has been enabled. " + "Call configureInstrumentation() before importing any AI SDKs.", ); diff --git a/js/src/isomorph.ts b/js/src/isomorph.ts index 48db027fb..4091ba206 100644 --- a/js/src/isomorph.ts +++ b/js/src/isomorph.ts @@ -301,7 +301,6 @@ const iso: Common = { ) => new DefaultTracingChannel(nameOrChannels), processOn: (_0, _1) => {}, basename: (filepath: string) => filepath.split(/[\\/]/).pop() || filepath, - // eslint-disable-next-line no-restricted-properties -- iso.writeln intentionally maps to stdout. writeln: (text: string) => console.log(text), }; export default iso; diff --git a/js/src/prompt-cache/disk-cache.ts b/js/src/prompt-cache/disk-cache.ts index 29cc3e694..e99c7e7d9 100644 --- a/js/src/prompt-cache/disk-cache.ts +++ b/js/src/prompt-cache/disk-cache.ts @@ -1,5 +1,4 @@ import iso from "../isomorph"; -import { debugLogger } from "../debug-logger"; export function canUseDiskCache(): boolean { return !!( @@ -97,7 +96,7 @@ export class DiskCache { return undefined; } if (this.logWarnings) { - debugLogger.warn("Failed to read from disk cache", e); + console.warn("Failed to read from disk cache", e); } return undefined; } @@ -122,7 +121,7 @@ export class DiskCache { await this.evictOldestIfFull(); } catch (e) { if (this.logWarnings) { - debugLogger.warn("Failed to write to disk cache", e); + console.warn("Failed to write to disk cache", e); } return; } diff --git a/js/src/reporters/progress.ts b/js/src/reporters/progress.ts index 3c559cb7d..bf897e407 100644 --- a/js/src/reporters/progress.ts +++ b/js/src/reporters/progress.ts @@ -2,7 +2,6 @@ import type { ProgressReporter } from "./types"; export class SimpleProgressReporter implements ProgressReporter { public start(name: string, _total: number) { - // eslint-disable-next-line no-restricted-properties -- progress reporters intentionally write to stdout. console.log(`Running evaluator ${name}`); } public stop() {} diff --git a/js/src/template/registry.ts b/js/src/template/registry.ts index d9744e8a4..a0686eb10 100644 --- a/js/src/template/registry.ts +++ b/js/src/template/registry.ts @@ -1,4 +1,3 @@ -import { debugLogger } from "../debug-logger"; import { mustachePlugin } from "./plugins/mustache"; export type TemplateFormat = "mustache" | "nunjucks" | "none"; @@ -68,7 +67,7 @@ class TemplatePluginRegistry { register(plugin: TemplateRendererPlugin): void { if (this.plugins.has(plugin.name)) { - debugLogger.warn( + console.warn( `Template plugin '${plugin.name}' already registered, overwriting`, ); } diff --git a/js/src/wrappers/ai-sdk/ai-sdk.ts b/js/src/wrappers/ai-sdk/ai-sdk.ts index f190e965f..d65bf3e16 100644 --- a/js/src/wrappers/ai-sdk/ai-sdk.ts +++ b/js/src/wrappers/ai-sdk/ai-sdk.ts @@ -1,7 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { startSpan, traced, withCurrent, Attachment } from "../../logger"; -import { debugLogger } from "../../debug-logger"; import { SpanTypeAttribute } from "../../../util"; import { convertDataToBlob, @@ -1726,7 +1725,7 @@ const processContentPart = (part: any): any => { } } } catch (error) { - debugLogger.warn("Error processing content part:", error); + console.warn("Error processing content part:", error); } return part; @@ -1788,7 +1787,7 @@ const convertImageToAttachment = ( return image; } } catch (error) { - debugLogger.warn("Error converting image to attachment:", error); + console.warn("Error converting image to attachment:", error); } return null; @@ -1836,7 +1835,7 @@ const convertDataToAttachment = ( }); } } catch (error) { - debugLogger.warn("Error converting data to attachment:", error); + console.warn("Error converting data to attachment:", error); } return null; @@ -1899,7 +1898,7 @@ const processOutputAttachments = async (output: AISDKResult) => { try { return await doProcessOutputAttachments(output); } catch (error) { - debugLogger.error("Error processing output attachments:", error); + console.error("Error processing output attachments:", error); return output; } }; @@ -1956,7 +1955,7 @@ const convertFileToAttachment = ( } if (!blob) { - debugLogger.warn(`Failed to convert file at index ${index} to Blob`); + console.warn(`Failed to convert file at index ${index} to Blob`); return file; // Return original if conversion fails } @@ -1966,7 +1965,7 @@ const convertFileToAttachment = ( contentType: mediaType, }); } catch (error) { - debugLogger.warn(`Error processing file at index ${index}:`, error); + console.warn(`Error processing file at index ${index}:`, error); return file; // Return original on error } }; diff --git a/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts b/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts index c3b90a013..059a0ec22 100644 --- a/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts +++ b/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts @@ -1,7 +1,6 @@ /* eslint-disable @typescript-eslint/consistent-type-assertions */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { startSpan } from "../../../logger"; -import { debugLogger } from "../../../debug-logger"; import { getCurrentUnixTimestamp, isEmpty } from "../../../util"; import { LEGACY_CACHED_HEADER, @@ -26,7 +25,7 @@ export function wrapAISDKModel(model: T): T { ) { return new BraintrustLanguageModelWrapper(m) as any as T; } else { - debugLogger.warn("Unsupported AI SDK model. Not wrapping."); + console.warn("Unsupported AI SDK model. Not wrapping."); return model; } } diff --git a/js/src/wrappers/anthropic.ts b/js/src/wrappers/anthropic.ts index d8f1ac0f6..7048e5f40 100644 --- a/js/src/wrappers/anthropic.ts +++ b/js/src/wrappers/anthropic.ts @@ -1,4 +1,3 @@ -import { debugLogger } from "../debug-logger"; import { anthropicChannels } from "../instrumentation/plugins/anthropic-channels"; import { TypedApplyProxy } from "../typed-instrumentation-helpers"; import type { @@ -29,7 +28,7 @@ export function wrapAnthropic(anthropic: T): T { return anthropicProxy(au as AnthropicClient) as T; } - debugLogger.warn("Unsupported Anthropic library. Not wrapping."); + console.warn("Unsupported Anthropic library. Not wrapping."); return anthropic; } diff --git a/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts b/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts index 7c69be85f..66c9f01b1 100644 --- a/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts +++ b/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts @@ -1,4 +1,3 @@ -import { debugLogger } from "../../debug-logger"; import { claudeAgentSDKChannels } from "../../instrumentation/plugins/claude-agent-sdk-channels"; import type { ClaudeAgentSDKModule, @@ -25,7 +24,7 @@ export function wrapClaudeAgentSDK(sdk: T): T { return claudeAgentSDKProxy(s as ClaudeAgentSDKModule) as unknown as T; } - debugLogger.warn("Unsupported Claude Agent SDK. Not wrapping."); + console.warn("Unsupported Claude Agent SDK. Not wrapping."); return sdk; } diff --git a/js/src/wrappers/google-genai.ts b/js/src/wrappers/google-genai.ts index 30527b0f0..88c69eb0c 100644 --- a/js/src/wrappers/google-genai.ts +++ b/js/src/wrappers/google-genai.ts @@ -1,4 +1,3 @@ -import { debugLogger } from "../debug-logger"; import { googleGenAIChannels } from "../instrumentation/plugins/google-genai-channels"; import type { GoogleGenAIClient, @@ -28,12 +27,12 @@ export function wrapGoogleGenAI>( googleGenAI: T, ): T { if (!googleGenAI || typeof googleGenAI !== "object") { - debugLogger.warn("Invalid Google GenAI module. Not wrapping."); + console.warn("Invalid Google GenAI module. Not wrapping."); return googleGenAI; } if (!("GoogleGenAI" in googleGenAI)) { - debugLogger.warn( + console.warn( "GoogleGenAI class not found in module. Not wrapping. Make sure you're passing the module itself (import * as googleGenAI from '@google/genai').", ); return googleGenAI; diff --git a/js/src/wrappers/oai.ts b/js/src/wrappers/oai.ts index b510c8eb6..6411020b8 100644 --- a/js/src/wrappers/oai.ts +++ b/js/src/wrappers/oai.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { CompiledPrompt } from "../logger"; -import { debugLogger } from "../debug-logger"; import { LEGACY_CACHED_HEADER, parseCachedHeader, @@ -64,9 +63,7 @@ export function wrapOpenAI(openai: T): T { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return wrapOpenAIv4(typedOpenAI) as T; } else { - debugLogger.warn( - "Unsupported OpenAI library (potentially v3). Not wrapping.", - ); + console.warn("Unsupported OpenAI library (potentially v3). Not wrapping."); return openai; } } diff --git a/js/src/wrappers/openrouter.ts b/js/src/wrappers/openrouter.ts index 83e4f8c09..70228c964 100644 --- a/js/src/wrappers/openrouter.ts +++ b/js/src/wrappers/openrouter.ts @@ -1,5 +1,4 @@ import { openRouterChannels } from "../instrumentation/plugins/openrouter-channels"; -import { debugLogger } from "../debug-logger"; import type { OpenRouterBeta, OpenRouterCallModelRequest, @@ -37,7 +36,7 @@ export function wrapOpenRouter(openrouter: T): T { return openRouterProxy(or as OpenRouterClient) as T; } - debugLogger.warn("Unsupported OpenRouter library. Not wrapping."); + console.warn("Unsupported OpenRouter library. Not wrapping."); return openrouter; } diff --git a/js/src/wrappers/shared/flush.ts b/js/src/wrappers/shared/flush.ts index 64c61a69e..907389d3b 100644 --- a/js/src/wrappers/shared/flush.ts +++ b/js/src/wrappers/shared/flush.ts @@ -13,7 +13,6 @@ export async function summarizeAndFlush( const shouldDisplay = options.displaySummary ?? true; const summary = await experiment.summarize(); if (shouldDisplay) { - // eslint-disable-next-line no-restricted-properties -- summary output is intentionally written to stdout. console.log(formatExperimentSummary(summary)); } } diff --git a/js/src/wrappers/shared/scorers.ts b/js/src/wrappers/shared/scorers.ts index 8a47b4646..c5cb4619c 100644 --- a/js/src/wrappers/shared/scorers.ts +++ b/js/src/wrappers/shared/scorers.ts @@ -1,5 +1,4 @@ import type { Span } from "../../logger"; -import { debugLogger } from "../../debug-logger"; import type { Score } from "../../../util/score"; import type { ScorerFunction } from "./types"; @@ -45,7 +44,7 @@ export async function runScorers(args: { } catch (scorerError) { // Log scorer error but don't fail the test — use metadata instead // of top-level error field to avoid marking the span as errored - debugLogger.warn("Braintrust: Scorer failed:", scorerError); + console.warn("Braintrust: Scorer failed:", scorerError); const errorStr = scorerError instanceof Error ? `${scorerError.message}\n\n${scorerError.stack || ""}` diff --git a/js/src/wrappers/vitest/index.ts b/js/src/wrappers/vitest/index.ts index 89578f62b..3671c8be9 100644 --- a/js/src/wrappers/vitest/index.ts +++ b/js/src/wrappers/vitest/index.ts @@ -102,7 +102,6 @@ export function wrapVitest< flushExperiment: async (options?: { displaySummary?: boolean }) => { const ctx = getExperimentContext(); if (!ctx) { - // eslint-disable-next-line no-restricted-properties -- flushExperiment warnings are user-facing. console.warn( "Braintrust: No experiment context found. Make sure you're using bt.describe() and calling flushExperiment() within an afterAll() hook.", ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97da0fe47..ff4768390 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,6 +63,25 @@ importers: specifier: 4.3.6 version: 4.3.6 + e2e/scenarios/turbopack-auto-instrumentation: + dependencies: + next: + specifier: 16.2.1 + version: 16.2.1(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + openai: + specifier: 6.32.0 + version: 6.32.0(ws@8.18.3)(zod@4.2.1) + react: + specifier: 19.2.4 + version: 19.2.4 + react-dom: + specifier: 19.2.4 + version: 19.2.4(react@19.2.4) + devDependencies: + '@types/react': + specifier: 19.2.14 + version: 19.2.14 + integrations/browser-js: dependencies: als-browser: @@ -92,16 +111,16 @@ importers: devDependencies: '@langchain/anthropic': specifier: ^1.3.1 - version: 1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))) + version: 1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))) '@langchain/core': specifier: ^1.1.6 - version: 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + version: 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) '@langchain/langgraph': specifier: ^1.0.7 - version: 1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76) + version: 1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76) '@langchain/openai': specifier: ^1.2.0 - version: 1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + version: 1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) '@types/node': specifier: ^20.10.5 version: 20.10.5 @@ -256,7 +275,7 @@ importers: version: 0.0.11 ai: specifier: ^3.2.16 - version: 3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.2.4)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6) + version: 3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.1.1)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6) braintrust: specifier: workspace:* version: link:../../js @@ -444,7 +463,7 @@ importers: version: 6.25.0(ws@8.18.3)(zod@3.25.76) openapi-zod-client: specifier: ^1.18.3 - version: 1.18.3(react@19.2.4) + version: 1.18.3(react@19.1.1) rollup: specifier: ^4.28.1 version: 4.35.0 @@ -1582,67 +1601,204 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/confirm@5.0.2': resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} engines: {node: '>=18'} @@ -1896,6 +2052,57 @@ packages: '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + '@next/env@16.2.1': + resolution: {integrity: sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==} + + '@next/swc-darwin-arm64@16.2.1': + resolution: {integrity: sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@16.2.1': + resolution: {integrity: sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@16.2.1': + resolution: {integrity: sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@16.2.1': + resolution: {integrity: sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@16.2.1': + resolution: {integrity: sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@16.2.1': + resolution: {integrity: sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@16.2.1': + resolution: {integrity: sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@16.2.1': + resolution: {integrity: sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2350,6 +2557,9 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} @@ -2520,6 +2730,9 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -2980,6 +3193,11 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.10: + resolution: {integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==} + engines: {node: '>=6.0.0'} + hasBin: true + baseline-browser-mapping@2.9.14: resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} hasBin: true @@ -3149,6 +3367,9 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3335,6 +3556,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -4565,6 +4790,27 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next@16.2.1: + resolution: {integrity: sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==} + 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 + nexus-rpc@0.0.1: resolution: {integrity: sha512-hAWn8Hh2eewpB5McXR5EW81R3pR/ziuGhKCF3wFyUVCklanPqrIgMNr7jKCbzXeNVad0nUDfWpFRqh2u+zxQtw==} engines: {node: '>= 18.0.0'} @@ -4849,6 +5095,10 @@ packages: yaml: optional: true + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} @@ -4941,6 +5191,10 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react@19.1.1: + resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} + engines: {node: '>=0.10.0'} + react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -5071,6 +5325,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5239,6 +5497,19 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -6033,13 +6304,13 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@0.0.16(react@19.2.4)(zod@4.3.6)': + '@ai-sdk/react@0.0.16(react@19.1.1)(zod@4.3.6)': dependencies: '@ai-sdk/provider-utils': 1.0.0(zod@4.3.6) '@ai-sdk/ui-utils': 0.0.9(zod@4.3.6) - swr: 2.2.0(react@19.2.4) + swr: 2.2.0(react@19.1.1) optionalDependencies: - react: 19.2.4 + react: 19.1.1 zod: 4.3.6 '@ai-sdk/solid@0.0.11(zod@4.3.6)': @@ -7084,49 +7355,146 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@img/colour@1.1.0': + optional: true + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/confirm@5.0.2(@types/node@20.10.5)': dependencies: '@inquirer/core': 10.1.0(@types/node@20.10.5) @@ -7520,20 +7888,20 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@langchain/anthropic@1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/anthropic@1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))': dependencies: '@anthropic-ai/sdk': 0.71.2(zod@3.25.76) - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) zod: 3.25.76 - '@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))': + '@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))': dependencies: '@cfworker/json-schema': 4.0.3 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + langsmith: 0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) mustache: 4.2.0 p-queue: 6.6.2 uuid: 10.0.0 @@ -7544,26 +7912,25 @@ snapshots: - '@opentelemetry/sdk-trace-base' - openai - '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) uuid: 10.0.0 - '@langchain/langgraph-sdk@1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@langchain/langgraph-sdk@1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)': dependencies: p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + react: 19.1.1 - '@langchain/langgraph@1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76)': + '@langchain/langgraph@1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76)': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))) - '@langchain/langgraph-sdk': 1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))) + '@langchain/langgraph-sdk': 1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1) uuid: 10.0.0 zod: 3.25.76 optionalDependencies: @@ -7572,9 +7939,9 @@ snapshots: - react - react-dom - '@langchain/openai@1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.21 openai: 6.25.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 @@ -7622,6 +7989,32 @@ snapshots: '@next/env@14.2.3': {} + '@next/env@16.2.1': {} + + '@next/swc-darwin-arm64@16.2.1': + optional: true + + '@next/swc-darwin-x64@16.2.1': + optional: true + + '@next/swc-linux-arm64-gnu@16.2.1': + optional: true + + '@next/swc-linux-arm64-musl@16.2.1': + optional: true + + '@next/swc-linux-x64-gnu@16.2.1': + optional: true + + '@next/swc-linux-x64-musl@16.2.1': + optional: true + + '@next/swc-win32-arm64-msvc@16.2.1': + optional: true + + '@next/swc-win32-x64-msvc@16.2.1': + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8041,6 +8434,10 @@ snapshots: '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -8282,6 +8679,10 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + '@types/retry@0.12.0': {} '@types/send@0.17.4': @@ -8687,11 +9088,11 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.2.4)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6): + ai@3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.1.1)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6): dependencies: '@ai-sdk/provider': 0.0.11 '@ai-sdk/provider-utils': 1.0.0(zod@4.3.6) - '@ai-sdk/react': 0.0.16(react@19.2.4)(zod@4.3.6) + '@ai-sdk/react': 0.0.16(react@19.1.1)(zod@4.3.6) '@ai-sdk/solid': 0.0.11(zod@4.3.6) '@ai-sdk/svelte': 0.0.12(svelte@5.39.0)(zod@4.3.6) '@ai-sdk/ui-utils': 0.0.9(zod@4.3.6) @@ -8705,7 +9106,7 @@ snapshots: zod-to-json-schema: 3.22.5(zod@4.3.6) optionalDependencies: openai: 4.104.0(ws@8.18.3)(zod@4.3.6) - react: 19.2.4 + react: 19.1.1 svelte: 5.39.0 zod: 4.3.6 transitivePeerDependencies: @@ -8963,6 +9364,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.10.10: {} + baseline-browser-mapping@2.9.14: {} bignumber.js@9.3.1: {} @@ -9169,6 +9572,8 @@ snapshots: cli-width@4.1.0: {} + client-only@0.0.1: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -9319,6 +9724,9 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.1.2: + optional: true + detect-newline@3.1.0: {} diff-match-patch@1.0.5: {} @@ -10624,7 +11032,7 @@ snapshots: typescript: 5.5.4 zod: 4.3.6 - langsmith@0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)): + langsmith@0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -10635,7 +11043,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - openai: 6.32.0(ws@8.18.3)(zod@3.25.76) + openai: 6.25.0(ws@8.18.3)(zod@3.25.76) leven@3.1.0: {} @@ -11048,6 +11456,31 @@ snapshots: neo-async@2.6.2: {} + next@16.2.1(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@next/env': 16.2.1 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.10 + caniuse-lite: 1.0.30001764 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.2.1 + '@next/swc-darwin-x64': 16.2.1 + '@next/swc-linux-arm64-gnu': 16.2.1 + '@next/swc-linux-arm64-musl': 16.2.1 + '@next/swc-linux-x64-gnu': 16.2.1 + '@next/swc-linux-x64-musl': 16.2.1 + '@next/swc-win32-arm64-msvc': 16.2.1 + '@next/swc-win32-x64-msvc': 16.2.1 + '@opentelemetry/api': 1.9.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nexus-rpc@0.0.1: {} node-domexception@1.0.0: {} @@ -11135,15 +11568,14 @@ snapshots: ws: 8.18.3 zod: 3.25.76 - openai@6.32.0(ws@8.18.3)(zod@3.25.76): + openai@6.32.0(ws@8.18.3)(zod@4.2.1): optionalDependencies: ws: 8.18.3 - zod: 3.25.76 - optional: true + zod: 4.2.1 openapi-types@12.1.3: {} - openapi-zod-client@1.18.3(react@19.2.4): + openapi-zod-client@1.18.3(react@19.1.1): dependencies: '@apidevtools/swagger-parser': 10.1.1(openapi-types@12.1.3) '@liuli-util/fs-extra': 0.1.0 @@ -11153,7 +11585,7 @@ snapshots: handlebars: 4.7.8 openapi-types: 12.1.3 openapi3-ts: 3.1.0 - pastable: 2.2.1(react@19.2.4) + pastable: 2.2.1(react@19.1.1) prettier: 2.8.8 tanu: 0.1.13 ts-pattern: 5.8.0 @@ -11252,13 +11684,13 @@ snapshots: parseurl@1.3.3: {} - pastable@2.2.1(react@19.2.4): + pastable@2.2.1(react@19.1.1): dependencies: '@babel/core': 7.28.0 ts-toolbelt: 9.6.0 type-fest: 3.13.1 optionalDependencies: - react: 19.2.4 + react: 19.1.1 transitivePeerDependencies: - supports-color @@ -11318,6 +11750,12 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.8: dependencies: nanoid: 3.3.11 @@ -11415,10 +11853,11 @@ snapshots: dependencies: react: 19.2.4 scheduler: 0.27.0 - optional: true react-is@18.3.1: {} + react@19.1.1: {} + react@19.2.4: {} readdirp@4.1.2: {} @@ -11506,8 +11945,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.27.0: - optional: true + scheduler@0.27.0: {} schema-utils@4.3.3: dependencies: @@ -11586,6 +12024,38 @@ snapshots: setprototypeof@1.2.0: {} + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@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@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -11751,6 +12221,11 @@ snapshots: strip-json-comments@5.0.3: {} + styled-jsx@5.1.6(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -11798,10 +12273,10 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.104.1(@swc/core@1.15.8) - swr@2.2.0(react@19.2.4): + swr@2.2.0(react@19.1.1): dependencies: - react: 19.2.4 - use-sync-external-store: 1.2.2(react@19.2.4) + react: 19.1.1 + use-sync-external-store: 1.2.2(react@19.1.1) swrev@4.0.0: {} @@ -12234,9 +12709,9 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-sync-external-store@1.2.2(react@19.2.4): + use-sync-external-store@1.2.2(react@19.1.1): dependencies: - react: 19.2.4 + react: 19.1.1 utils-merge@1.0.1: {} From 5f6c6478e672239e2ea078bf1676df0c05ca1e47 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 27 Mar 2026 14:05:25 +0100 Subject: [PATCH 3/6] chore: keep eslint config adjustments --- js/eslint.config.ts | 108 ++++++++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/js/eslint.config.ts b/js/eslint.config.ts index 22c71b817..f51facbce 100644 --- a/js/eslint.config.ts +++ b/js/eslint.config.ts @@ -18,6 +18,57 @@ const entryFiles = tsupConfig }) .filter((entry) => !entry.includes("cli")); +const consoleRestrictions = [ + { + object: "console", + property: "log", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "warn", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "error", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "debug", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "info", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "trace", + message: "Use debugLogger instead of console for SDK logging.", + }, +] as const; + +const consoleAllowedFiles = ["src/queue.bench.ts"]; + +const cliImportAllowedFiles = [ + "src/cli/**", + "src/debug-logger.ts", + "src/framework.ts", + "src/framework2.ts", + "src/isomorph.ts", + "src/sandbox.ts", + "src/template/**", + "src/reporters/**", + "src/prompt-cache/**", + "src/eval-parameters.ts", + "src/wrappers/**", + "src/instrumentation/**", + "src/auto-instrumentations/**", +]; + export default [ { ignores: [ @@ -82,63 +133,22 @@ export default [ "@typescript-eslint/no-empty-object-type": "error", "@typescript-eslint/no-unsafe-function-type": "error", "@typescript-eslint/prefer-as-const": "error", + "no-restricted-properties": ["error", ...consoleRestrictions], // Require node: protocol for Node.js built-in imports (for Deno compatibility) // This plugin automatically detects ALL Node.js built-ins - no manual list needed! "node-import/prefer-node-protocol": "error", }, }, + { + files: consoleAllowedFiles, + rules: { + "no-restricted-properties": "off", + }, + }, { files: ["src/**/*.ts", "src/**/*.tsx"], - ignores: [ - "src/cli/**", - "src/debug-logger.ts", - "src/framework.ts", - "src/framework2.ts", - "src/isomorph.ts", - "src/sandbox.ts", - "src/template/**", - "src/reporters/**", - "src/prompt-cache/**", - "src/eval-parameters.ts", - "src/wrappers/**", - "src/instrumentation/**", - "src/auto-instrumentations/**", - "src/queue.bench.ts", - ], + ignores: cliImportAllowedFiles, rules: { - "no-restricted-properties": [ - "error", - { - object: "console", - property: "log", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "warn", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "error", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "debug", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "info", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "trace", - message: "Use debugLogger instead of console for SDK logging.", - }, - ], "no-restricted-imports": [ "error", { From 5b25e0a3481334f1f7b9fbf57ed695aeb78f9607 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 27 Mar 2026 14:08:36 +0100 Subject: [PATCH 4/6] test: restore console warn assertion in openrouter wrapper test --- js/src/wrappers/openrouter.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/src/wrappers/openrouter.test.ts b/js/src/wrappers/openrouter.test.ts index d1b23ab9a..ae38232a0 100644 --- a/js/src/wrappers/openrouter.test.ts +++ b/js/src/wrappers/openrouter.test.ts @@ -7,7 +7,6 @@ import { test, vi, } from "vitest"; -import { debugLogger } from "../debug-logger"; import { configureNode } from "../node/config"; import { _exportsForTestingOnly, initLogger } from "../logger"; import { wrapOpenRouter } from "./openrouter"; @@ -47,7 +46,7 @@ describe("openrouter wrapper", () => { }); test("returns the original object for unsupported clients", () => { - const warnSpy = vi.spyOn(debugLogger, "warn").mockImplementation(() => {}); + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); const invalid = { foo: "bar" }; expect(wrapOpenRouter(invalid)).toBe(invalid); From f367941e2c8601009ac467507876a09924c6d7fb Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 27 Mar 2026 14:21:29 +0100 Subject: [PATCH 5/6] . --- js/eslint.config.ts | 103 ++++---- pnpm-lock.yaml | 565 ++++---------------------------------------- 2 files changed, 94 insertions(+), 574 deletions(-) diff --git a/js/eslint.config.ts b/js/eslint.config.ts index f51facbce..6cf54f8c3 100644 --- a/js/eslint.config.ts +++ b/js/eslint.config.ts @@ -18,57 +18,6 @@ const entryFiles = tsupConfig }) .filter((entry) => !entry.includes("cli")); -const consoleRestrictions = [ - { - object: "console", - property: "log", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "warn", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "error", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "debug", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "info", - message: "Use debugLogger instead of console for SDK logging.", - }, - { - object: "console", - property: "trace", - message: "Use debugLogger instead of console for SDK logging.", - }, -] as const; - -const consoleAllowedFiles = ["src/queue.bench.ts"]; - -const cliImportAllowedFiles = [ - "src/cli/**", - "src/debug-logger.ts", - "src/framework.ts", - "src/framework2.ts", - "src/isomorph.ts", - "src/sandbox.ts", - "src/template/**", - "src/reporters/**", - "src/prompt-cache/**", - "src/eval-parameters.ts", - "src/wrappers/**", - "src/instrumentation/**", - "src/auto-instrumentations/**", -]; - export default [ { ignores: [ @@ -133,21 +82,67 @@ export default [ "@typescript-eslint/no-empty-object-type": "error", "@typescript-eslint/no-unsafe-function-type": "error", "@typescript-eslint/prefer-as-const": "error", - "no-restricted-properties": ["error", ...consoleRestrictions], + "no-restricted-properties": [ + "error", + { + object: "console", + property: "log", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "warn", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "error", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "debug", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "info", + message: "Use debugLogger instead of console for SDK logging.", + }, + { + object: "console", + property: "trace", + message: "Use debugLogger instead of console for SDK logging.", + }, + ], // Require node: protocol for Node.js built-in imports (for Deno compatibility) // This plugin automatically detects ALL Node.js built-ins - no manual list needed! "node-import/prefer-node-protocol": "error", }, }, { - files: consoleAllowedFiles, + files: ["src/queue.bench.ts"], rules: { "no-restricted-properties": "off", }, }, { files: ["src/**/*.ts", "src/**/*.tsx"], - ignores: cliImportAllowedFiles, + ignores: [ + "src/cli/**", + "src/debug-logger.ts", + "src/framework.ts", + "src/framework2.ts", + "src/isomorph.ts", + "src/sandbox.ts", + "src/template/**", + "src/reporters/**", + "src/prompt-cache/**", + "src/eval-parameters.ts", + "src/wrappers/**", + "src/instrumentation/**", + "src/auto-instrumentations/**", + ], rules: { "no-restricted-imports": [ "error", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff4768390..97da0fe47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,25 +63,6 @@ importers: specifier: 4.3.6 version: 4.3.6 - e2e/scenarios/turbopack-auto-instrumentation: - dependencies: - next: - specifier: 16.2.1 - version: 16.2.1(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - openai: - specifier: 6.32.0 - version: 6.32.0(ws@8.18.3)(zod@4.2.1) - react: - specifier: 19.2.4 - version: 19.2.4 - react-dom: - specifier: 19.2.4 - version: 19.2.4(react@19.2.4) - devDependencies: - '@types/react': - specifier: 19.2.14 - version: 19.2.14 - integrations/browser-js: dependencies: als-browser: @@ -111,16 +92,16 @@ importers: devDependencies: '@langchain/anthropic': specifier: ^1.3.1 - version: 1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))) + version: 1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))) '@langchain/core': specifier: ^1.1.6 - version: 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + version: 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) '@langchain/langgraph': specifier: ^1.0.7 - version: 1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76) + version: 1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76) '@langchain/openai': specifier: ^1.2.0 - version: 1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + version: 1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) '@types/node': specifier: ^20.10.5 version: 20.10.5 @@ -275,7 +256,7 @@ importers: version: 0.0.11 ai: specifier: ^3.2.16 - version: 3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.1.1)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6) + version: 3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.2.4)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6) braintrust: specifier: workspace:* version: link:../../js @@ -463,7 +444,7 @@ importers: version: 6.25.0(ws@8.18.3)(zod@3.25.76) openapi-zod-client: specifier: ^1.18.3 - version: 1.18.3(react@19.1.1) + version: 1.18.3(react@19.2.4) rollup: specifier: ^4.28.1 version: 4.35.0 @@ -1601,204 +1582,67 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/colour@1.1.0': - resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} - engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-arm64@0.34.5': - resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-darwin-x64@0.34.5': - resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.4': - resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.4': - resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm64@1.2.4': - resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} - cpu: [ppc64] - os: [linux] - - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} - cpu: [riscv64] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} - cpu: [s390x] - os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} - cpu: [x64] - os: [linux] - '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm64@0.34.5': - resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-arm@0.34.5': - resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - - '@img/sharp-linux-ppc64@0.34.5': - resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - - '@img/sharp-linux-riscv64@0.34.5': - resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [riscv64] - os: [linux] - - '@img/sharp-linux-s390x@0.34.5': - resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linux-x64@0.34.5': - resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-linuxmusl-arm64@0.34.5': - resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linuxmusl-x64@0.34.5': - resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-arm64@0.34.5': - resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - - '@img/sharp-win32-ia32@0.34.5': - resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - '@img/sharp-win32-x64@0.34.5': - resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@inquirer/confirm@5.0.2': resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} engines: {node: '>=18'} @@ -2052,57 +1896,6 @@ packages: '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} - '@next/env@16.2.1': - resolution: {integrity: sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==} - - '@next/swc-darwin-arm64@16.2.1': - resolution: {integrity: sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@16.2.1': - resolution: {integrity: sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@16.2.1': - resolution: {integrity: sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@16.2.1': - resolution: {integrity: sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@16.2.1': - resolution: {integrity: sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@16.2.1': - resolution: {integrity: sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@16.2.1': - resolution: {integrity: sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-x64-msvc@16.2.1': - resolution: {integrity: sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2557,9 +2350,6 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} @@ -2730,9 +2520,6 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -3193,11 +2980,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.10: - resolution: {integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==} - engines: {node: '>=6.0.0'} - hasBin: true - baseline-browser-mapping@2.9.14: resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} hasBin: true @@ -3367,9 +3149,6 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3556,10 +3335,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -4790,27 +4565,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@16.2.1: - resolution: {integrity: sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==} - 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 - nexus-rpc@0.0.1: resolution: {integrity: sha512-hAWn8Hh2eewpB5McXR5EW81R3pR/ziuGhKCF3wFyUVCklanPqrIgMNr7jKCbzXeNVad0nUDfWpFRqh2u+zxQtw==} engines: {node: '>= 18.0.0'} @@ -5095,10 +4849,6 @@ packages: yaml: optional: true - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} @@ -5191,10 +4941,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react@19.1.1: - resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} - engines: {node: '>=0.10.0'} - react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -5325,10 +5071,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5497,19 +5239,6 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -6304,13 +6033,13 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@0.0.16(react@19.1.1)(zod@4.3.6)': + '@ai-sdk/react@0.0.16(react@19.2.4)(zod@4.3.6)': dependencies: '@ai-sdk/provider-utils': 1.0.0(zod@4.3.6) '@ai-sdk/ui-utils': 0.0.9(zod@4.3.6) - swr: 2.2.0(react@19.1.1) + swr: 2.2.0(react@19.2.4) optionalDependencies: - react: 19.1.1 + react: 19.2.4 zod: 4.3.6 '@ai-sdk/solid@0.0.11(zod@4.3.6)': @@ -7355,146 +7084,49 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.1.0': - optional: true - '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.4 - optional: true - '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.4 - optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.4': - optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.4': - optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.4': - optional: true - '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-arm@1.2.4': - optional: true - - '@img/sharp-libvips-linux-ppc64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-riscv64@1.2.4': - optional: true - - '@img/sharp-libvips-linux-s390x@1.2.4': - optional: true - '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - optional: true - '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.4 - optional: true - '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-arm@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.4 - optional: true - - '@img/sharp-linux-ppc64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.4 - optional: true - - '@img/sharp-linux-riscv64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-riscv64': 1.2.4 - optional: true - - '@img/sharp-linux-s390x@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.4 - optional: true - '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linux-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.34.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - optional: true - - '@img/sharp-wasm32@0.34.5': - dependencies: - '@emnapi/runtime': 1.8.1 - optional: true - - '@img/sharp-win32-arm64@0.34.5': - optional: true - - '@img/sharp-win32-ia32@0.34.5': - optional: true - '@img/sharp-win32-x64@0.33.5': optional: true - '@img/sharp-win32-x64@0.34.5': - optional: true - '@inquirer/confirm@5.0.2(@types/node@20.10.5)': dependencies: '@inquirer/core': 10.1.0(@types/node@20.10.5) @@ -7888,20 +7520,20 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@langchain/anthropic@1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/anthropic@1.3.5(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))': dependencies: '@anthropic-ai/sdk': 0.71.2(zod@3.25.76) - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) zod: 3.25.76 - '@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))': + '@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))': dependencies: '@cfworker/json-schema': 4.0.3 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + langsmith: 0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) mustache: 4.2.0 p-queue: 6.6.2 uuid: 10.0.0 @@ -7912,25 +7544,26 @@ snapshots: - '@opentelemetry/sdk-trace-base' - openai - '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) uuid: 10.0.0 - '@langchain/langgraph-sdk@1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)': + '@langchain/langgraph-sdk@1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) - react: 19.1.1 + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - '@langchain/langgraph@1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76)': + '@langchain/langgraph@1.0.7(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.22.5(zod@3.25.76))(zod@3.25.76)': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76))) - '@langchain/langgraph-sdk': 1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(react@19.1.1) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76))) + '@langchain/langgraph-sdk': 1.3.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) uuid: 10.0.0 zod: 3.25.76 optionalDependencies: @@ -7939,9 +7572,9 @@ snapshots: - react - react-dom - '@langchain/openai@1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@1.2.1(@langchain/core@1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 1.1.10(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.21 openai: 6.25.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 @@ -7989,32 +7622,6 @@ snapshots: '@next/env@14.2.3': {} - '@next/env@16.2.1': {} - - '@next/swc-darwin-arm64@16.2.1': - optional: true - - '@next/swc-darwin-x64@16.2.1': - optional: true - - '@next/swc-linux-arm64-gnu@16.2.1': - optional: true - - '@next/swc-linux-arm64-musl@16.2.1': - optional: true - - '@next/swc-linux-x64-gnu@16.2.1': - optional: true - - '@next/swc-linux-x64-musl@16.2.1': - optional: true - - '@next/swc-win32-arm64-msvc@16.2.1': - optional: true - - '@next/swc-win32-x64-msvc@16.2.1': - optional: true - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8434,10 +8041,6 @@ snapshots: '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 - '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -8679,10 +8282,6 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react@19.2.14': - dependencies: - csstype: 3.2.3 - '@types/retry@0.12.0': {} '@types/send@0.17.4': @@ -9088,11 +8687,11 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.1.1)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6): + ai@3.2.16(openai@4.104.0(ws@8.18.3)(zod@4.3.6))(react@19.2.4)(svelte@5.39.0)(vue@3.5.21(typescript@5.3.3))(zod@4.3.6): dependencies: '@ai-sdk/provider': 0.0.11 '@ai-sdk/provider-utils': 1.0.0(zod@4.3.6) - '@ai-sdk/react': 0.0.16(react@19.1.1)(zod@4.3.6) + '@ai-sdk/react': 0.0.16(react@19.2.4)(zod@4.3.6) '@ai-sdk/solid': 0.0.11(zod@4.3.6) '@ai-sdk/svelte': 0.0.12(svelte@5.39.0)(zod@4.3.6) '@ai-sdk/ui-utils': 0.0.9(zod@4.3.6) @@ -9106,7 +8705,7 @@ snapshots: zod-to-json-schema: 3.22.5(zod@4.3.6) optionalDependencies: openai: 4.104.0(ws@8.18.3)(zod@4.3.6) - react: 19.1.1 + react: 19.2.4 svelte: 5.39.0 zod: 4.3.6 transitivePeerDependencies: @@ -9364,8 +8963,6 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.10: {} - baseline-browser-mapping@2.9.14: {} bignumber.js@9.3.1: {} @@ -9572,8 +9169,6 @@ snapshots: cli-width@4.1.0: {} - client-only@0.0.1: {} - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -9724,9 +9319,6 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.1.2: - optional: true - detect-newline@3.1.0: {} diff-match-patch@1.0.5: {} @@ -11032,7 +10624,7 @@ snapshots: typescript: 5.5.4 zod: 4.3.6 - langsmith@0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.25.0(ws@8.18.3)(zod@3.25.76)): + langsmith@0.4.5(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.32.0(ws@8.18.3)(zod@3.25.76)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -11043,7 +10635,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - openai: 6.25.0(ws@8.18.3)(zod@3.25.76) + openai: 6.32.0(ws@8.18.3)(zod@3.25.76) leven@3.1.0: {} @@ -11456,31 +11048,6 @@ snapshots: neo-async@2.6.2: {} - next@16.2.1(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@next/env': 16.2.1 - '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.10.10 - caniuse-lite: 1.0.30001764 - postcss: 8.4.31 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(react@19.2.4) - optionalDependencies: - '@next/swc-darwin-arm64': 16.2.1 - '@next/swc-darwin-x64': 16.2.1 - '@next/swc-linux-arm64-gnu': 16.2.1 - '@next/swc-linux-arm64-musl': 16.2.1 - '@next/swc-linux-x64-gnu': 16.2.1 - '@next/swc-linux-x64-musl': 16.2.1 - '@next/swc-win32-arm64-msvc': 16.2.1 - '@next/swc-win32-x64-msvc': 16.2.1 - '@opentelemetry/api': 1.9.0 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - nexus-rpc@0.0.1: {} node-domexception@1.0.0: {} @@ -11568,14 +11135,15 @@ snapshots: ws: 8.18.3 zod: 3.25.76 - openai@6.32.0(ws@8.18.3)(zod@4.2.1): + openai@6.32.0(ws@8.18.3)(zod@3.25.76): optionalDependencies: ws: 8.18.3 - zod: 4.2.1 + zod: 3.25.76 + optional: true openapi-types@12.1.3: {} - openapi-zod-client@1.18.3(react@19.1.1): + openapi-zod-client@1.18.3(react@19.2.4): dependencies: '@apidevtools/swagger-parser': 10.1.1(openapi-types@12.1.3) '@liuli-util/fs-extra': 0.1.0 @@ -11585,7 +11153,7 @@ snapshots: handlebars: 4.7.8 openapi-types: 12.1.3 openapi3-ts: 3.1.0 - pastable: 2.2.1(react@19.1.1) + pastable: 2.2.1(react@19.2.4) prettier: 2.8.8 tanu: 0.1.13 ts-pattern: 5.8.0 @@ -11684,13 +11252,13 @@ snapshots: parseurl@1.3.3: {} - pastable@2.2.1(react@19.1.1): + pastable@2.2.1(react@19.2.4): dependencies: '@babel/core': 7.28.0 ts-toolbelt: 9.6.0 type-fest: 3.13.1 optionalDependencies: - react: 19.1.1 + react: 19.2.4 transitivePeerDependencies: - supports-color @@ -11750,12 +11318,6 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - postcss@8.4.31: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.8: dependencies: nanoid: 3.3.11 @@ -11853,11 +11415,10 @@ snapshots: dependencies: react: 19.2.4 scheduler: 0.27.0 + optional: true react-is@18.3.1: {} - react@19.1.1: {} - react@19.2.4: {} readdirp@4.1.2: {} @@ -11945,7 +11506,8 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.27.0: {} + scheduler@0.27.0: + optional: true schema-utils@4.3.3: dependencies: @@ -12024,38 +11586,6 @@ snapshots: setprototypeof@1.2.0: {} - sharp@0.34.5: - dependencies: - '@img/colour': 1.1.0 - detect-libc: 2.1.2 - semver: 7.7.4 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.5 - '@img/sharp-darwin-x64': 0.34.5 - '@img/sharp-libvips-darwin-arm64': 1.2.4 - '@img/sharp-libvips-darwin-x64': 1.2.4 - '@img/sharp-libvips-linux-arm': 1.2.4 - '@img/sharp-libvips-linux-arm64': 1.2.4 - '@img/sharp-libvips-linux-ppc64': 1.2.4 - '@img/sharp-libvips-linux-riscv64': 1.2.4 - '@img/sharp-libvips-linux-s390x': 1.2.4 - '@img/sharp-libvips-linux-x64': 1.2.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 - '@img/sharp-libvips-linuxmusl-x64': 1.2.4 - '@img/sharp-linux-arm': 0.34.5 - '@img/sharp-linux-arm64': 0.34.5 - '@img/sharp-linux-ppc64': 0.34.5 - '@img/sharp-linux-riscv64': 0.34.5 - '@img/sharp-linux-s390x': 0.34.5 - '@img/sharp-linux-x64': 0.34.5 - '@img/sharp-linuxmusl-arm64': 0.34.5 - '@img/sharp-linuxmusl-x64': 0.34.5 - '@img/sharp-wasm32': 0.34.5 - '@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@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -12221,11 +11751,6 @@ snapshots: strip-json-comments@5.0.3: {} - styled-jsx@5.1.6(react@19.2.4): - dependencies: - client-only: 0.0.1 - react: 19.2.4 - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -12273,10 +11798,10 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.104.1(@swc/core@1.15.8) - swr@2.2.0(react@19.1.1): + swr@2.2.0(react@19.2.4): dependencies: - react: 19.1.1 - use-sync-external-store: 1.2.2(react@19.1.1) + react: 19.2.4 + use-sync-external-store: 1.2.2(react@19.2.4) swrev@4.0.0: {} @@ -12709,9 +12234,9 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-sync-external-store@1.2.2(react@19.1.1): + use-sync-external-store@1.2.2(react@19.2.4): dependencies: - react: 19.1.1 + react: 19.2.4 utils-merge@1.0.1: {} From 393cb4fdcdc789f6bd080dcea482bfdbdb2fe883 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 27 Mar 2026 14:27:57 +0100 Subject: [PATCH 6/6] ignore --- js/src/cli/functions/infer-source.ts | 4 ++++ js/src/cli/functions/upload.ts | 6 ++++++ js/src/cli/index.ts | 21 +++++++++++++++++++ js/src/cli/reporters/eval.ts | 2 ++ js/src/cli/util/bundle.ts | 1 + js/src/cli/util/debug-logging.ts | 1 + js/src/cli/util/pull.ts | 13 ++++++++++++ js/src/debug-logger.ts | 5 +++++ js/src/eval-parameters.ts | 1 + js/src/framework.ts | 7 +++++++ js/src/framework2.ts | 2 ++ .../instrumentation/core/channel-tracing.ts | 6 ++++++ js/src/instrumentation/core/plugin.ts | 8 +++++++ js/src/instrumentation/core/stream-patcher.ts | 9 ++++++++ .../plugins/claude-agent-sdk-plugin.ts | 3 +++ js/src/instrumentation/registry.ts | 1 + js/src/isomorph.ts | 1 + js/src/prompt-cache/disk-cache.ts | 2 ++ js/src/reporters/progress.ts | 1 + js/src/template/registry.ts | 1 + js/src/wrappers/ai-sdk/ai-sdk.ts | 6 ++++++ .../ai-sdk/deprecated/wrapAISDKModel.ts | 1 + js/src/wrappers/anthropic.ts | 1 + .../claude-agent-sdk/claude-agent-sdk.ts | 1 + js/src/wrappers/google-genai.ts | 2 ++ js/src/wrappers/oai.ts | 1 + js/src/wrappers/openrouter.ts | 1 + js/src/wrappers/shared/flush.ts | 1 + js/src/wrappers/shared/scorers.ts | 1 + js/src/wrappers/vitest/index.ts | 1 + 30 files changed, 111 insertions(+) diff --git a/js/src/cli/functions/infer-source.ts b/js/src/cli/functions/infer-source.ts index 179b5c50d..73d6a977c 100644 --- a/js/src/cli/functions/infer-source.ts +++ b/js/src/cli/functions/infer-source.ts @@ -71,6 +71,7 @@ export async function findCodeDefinition({ if (location.type === "experiment" || location.type === "sandbox") { const evaluator = outFileModule.evaluators[location.eval_name]?.evaluator; if (!evaluator) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Warning: failed to find evaluator for ${location.eval_name}. Will not display preview.`, @@ -94,6 +95,7 @@ export async function findCodeDefinition({ } if (!fn) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Warning: failed to find ${locationToString(location)}. Will not display preview.`, @@ -118,6 +120,7 @@ export async function findCodeDefinition({ } if (columnNumber === -1) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Warning: failed to find code definition for ${fn.name}. Will not display preview.`, @@ -195,6 +198,7 @@ async function getTsModule() { try { tsModule = require("typescript"); } catch { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( "Failed to load TypeScript module. Will not use TypeScript to derive preview.", diff --git a/js/src/cli/functions/upload.ts b/js/src/cli/functions/upload.ts index ce67f44d9..b1ce0f429 100644 --- a/js/src/cli/functions/upload.ts +++ b/js/src/cli/functions/upload.ts @@ -82,6 +82,7 @@ export async function uploadHandleBundles({ setCurrent: boolean; defaultIfExists: IfExists; }) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( `Processing ${buildResults.length} ${pluralize("file", buildResults.length)}...`, ); @@ -276,6 +277,7 @@ export async function uploadHandleBundles({ const numUploaded = uploadResults.length; const numFailed = uploadResults.filter((result) => !result).length; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( `${numUploaded} ${pluralize("file", numUploaded)} uploaded ${ numFailed > 0 @@ -344,12 +346,14 @@ async function uploadBundles({ ); } catch (e) { if (showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(e); } const msg = e instanceof FailedHTTPResponse ? `Unable to upload your code. ${e.status} (${e.text}): ${e.data}` : `Unable to upload your code. You most likely need to update the API: ${e}`; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(warning(msg)); return false; } @@ -422,12 +426,14 @@ async function uploadBundles({ }); } catch (e) { if (showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(e); } const msg = e instanceof FailedHTTPResponse ? `Failed to save function definitions for '${sourceFile}'. ${e.status} (${e.text}): ${e.data}` : `Failed to save function definitions for '${sourceFile}'. You most likely need to update the API: ${e}`; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(warning(msg)); return false; } diff --git a/js/src/cli/index.ts b/js/src/cli/index.ts index 48a38be3f..863f19987 100755 --- a/js/src/cli/index.ts +++ b/js/src/cli/index.ts @@ -127,6 +127,7 @@ async function initExperiment( fallback: (_text: string, url: string) => url, }) : "locally"; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( chalk.cyan("▶") + ` Experiment ${chalk.bold(info.experimentName)} is running at ${linkText}`, @@ -219,13 +220,17 @@ function buildWatchPluginForEvaluator( name: "run-evalutator-on-end", setup(build: esbuild.PluginBuild) { build.onEnd(async (result) => { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Done building ${inFile}`); if (!result.outputFiles) { if (opts.showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(`Failed to compile ${inFile}`); + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(result.errors); } else { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(`Failed to compile ${inFile}: ${result.errors}`); } return; @@ -306,6 +311,7 @@ function buildWatchPluginForEvaluator( )) { const success = await reporter.reportRun(await Promise.all(results)); if (!success) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(error(`Reporter ${reporterName} failed.`)); } } @@ -421,9 +427,12 @@ export function handleBuildFailure({ if (terminateOnFailure) { throw result.error; } else if (showDetailedErrors) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(`Failed to compile ${result.sourceFile}`); + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(result.error); } else { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( `Failed to compile ${result.sourceFile}: ${result.error.message}`, ); @@ -466,6 +475,7 @@ function updateEvaluators( evaluators.reporters[reporterName] && evaluators.reporters[reporterName] !== reporter ) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Reporter '${reporterName}' already exists. Will skip '${reporterName}' from ${result.sourceFile}.`, @@ -486,12 +496,14 @@ async function runAndWatch({ onExit?: () => void; }) { const count = Object.keys(handles).length; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Watching ${pluralize("file", count, true)}...`); Object.values(handles).map((handle) => handle.watch()); ["SIGINT", "SIGTERM"].forEach((signal: string) => { process.on(signal, function () { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Stopped watching."); for (const handle of Object.values(handles)) { handle.destroy(); @@ -540,6 +552,7 @@ async function runOnce( if (opts.list) { for (const evaluator of evaluators.evaluators) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log(evaluator.evaluator.evalName); } return true; @@ -581,6 +594,7 @@ async function runOnce( } }); + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( chalk.dim( `Processing ${chalk.bold(resultPromises.length)} evaluator${resultPromises.length === 1 ? "" : "s"}...`, @@ -588,6 +602,7 @@ async function runOnce( ); const allEvalsResults = await Promise.all(resultPromises); opts.progressReporter.stop(); + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(""); const evalReports: Record< @@ -685,6 +700,7 @@ async function collectFiles( try { pathStat = fs.lstatSync(inputPath); } catch (e) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(error(`Error reading ${inputPath}: ${e}`)); process.exit(1); } @@ -699,6 +715,7 @@ async function collectFiles( ) ) { const prefix = mode === "eval" ? ".eval" : ""; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Reading ${inputPath} because it was specified directly. Rename it to end in ${prefix}.ts or ` + @@ -848,6 +865,7 @@ export async function initializeHandles({ for (const inputPath of inputPaths) { const newFiles = await collectFiles(inputPath, mode); if (newFiles.length == 0) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Provided path ${inputPath} is not an eval file or a directory containing eval files, skipping...`, @@ -860,6 +878,7 @@ export async function initializeHandles({ } if (Object.keys(files).length == 0) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning("No eval files were found in any of the provided paths."), ); @@ -906,6 +925,7 @@ async function run(args: RunArgs) { // Load via dotenv library const loaded = dotenv.config({ path: args.env_file }); if (loaded.error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(error(`Error loading ${args.env_file}: ${loaded.error}`)); process.exit(1); } @@ -930,6 +950,7 @@ async function run(args: RunArgs) { }; if (args.list && args.watch) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(error("Cannot specify both --list and --watch.")); process.exit(1); } diff --git a/js/src/cli/reporters/eval.ts b/js/src/cli/reporters/eval.ts index f10c1fc17..5093bd464 100644 --- a/js/src/cli/reporters/eval.ts +++ b/js/src/cli/reporters/eval.ts @@ -174,6 +174,7 @@ export const fancyReporter: ReporterDef = { ); if (failingResults.length > 0) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( warning( `Evaluator ${evaluator.evalName} failed with ${pluralize("error", failingResults.length, true)}. This evaluation ("${evaluator.evalName}") will not be fully logged.`, @@ -186,6 +187,7 @@ export const fancyReporter: ReporterDef = { } } else if (verbose) { for (const result of failingResults) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(result); } } diff --git a/js/src/cli/util/bundle.ts b/js/src/cli/util/bundle.ts index dfb2b01c2..9eb18bced 100644 --- a/js/src/cli/util/bundle.ts +++ b/js/src/cli/util/bundle.ts @@ -20,6 +20,7 @@ export async function loadCLIEnv(args: AuthArgs & CommonArgs) { // Load via dotenv library const loaded = dotenv.config({ path: args.env_file }); if (loaded.error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(error(`Error loading ${args.env_file}: ${loaded.error}`)); process.exit(1); } diff --git a/js/src/cli/util/debug-logging.ts b/js/src/cli/util/debug-logging.ts index 41b3bc8ba..544514a11 100644 --- a/js/src/cli/util/debug-logging.ts +++ b/js/src/cli/util/debug-logging.ts @@ -21,6 +21,7 @@ export function normalizeDebugLoggingArgs< if (!hasWarnedAboutVerboseFlag) { hasWarnedAboutVerboseFlag = true; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(warning(VERBOSE_DEPRECATION_MESSAGE)); } diff --git a/js/src/cli/util/pull.ts b/js/src/cli/util/pull.ts index a6e5e7a79..a25eff17c 100644 --- a/js/src/cli/util/pull.ts +++ b/js/src/cli/util/pull.ts @@ -46,6 +46,7 @@ export async function pullCommand(args: PullArgs) { typeof rawFunc === "object" && rawFunc && "id" in rawFunc ? ` ${rawFunc.id}` : ""; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning(`Failed to parse function${id}: ${parsedFunc.error.message}`), ); @@ -60,8 +61,10 @@ export async function pullCommand(args: PullArgs) { projectNameToFunctions[projectName].push(func); } + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log("Found functions in the following projects:"); for (const projectName of Object.keys(projectNameToFunctions)) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log(` * ${projectName}`); } @@ -92,6 +95,7 @@ export async function pullCommand(args: PullArgs) { ); if (args.force) { if (fileExists) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Overwriting ${doubleQuote(projectFile)} because --force is set.`, @@ -99,6 +103,7 @@ export async function pullCommand(args: PullArgs) { ); } } else if (dirtyFiles.has(resolvedProjectFile)) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Skipping project ${projectName} because ${doubleQuote(projectFile)} has uncommitted changes.`, @@ -107,6 +112,7 @@ export async function pullCommand(args: PullArgs) { continue; } else if (fileExists) { if (!git) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Project ${projectName} already exists in ${doubleQuote(projectFile)}. Skipping since this is not a git repository...`, @@ -114,6 +120,7 @@ export async function pullCommand(args: PullArgs) { ); continue; } else { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Project ${projectName} already exists in ${doubleQuote(projectFile)}. Overwriting...`, @@ -130,6 +137,7 @@ export async function pullCommand(args: PullArgs) { hasSpecifiedFunction: !!args.slug || !!args.id, }); await fs.writeFile(projectFile, projectFileContents || ""); + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log(`Wrote ${projectName} to ${doubleQuote(projectFile)}`); } } @@ -178,6 +186,7 @@ ${functionDefinitions.join("\n")} }); return formatted; } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Failed to format with prettier (${error instanceof Error ? error.message : error}). Using unformatted output.`, @@ -199,6 +208,7 @@ function makeFunctionDefinition({ }): string | null { if (func.function_data.type !== "prompt") { if (hasSpecifiedFunction) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Skipping function ${doubleQuote(func.name)} because it is not a prompt.`, @@ -218,6 +228,7 @@ function makeFunctionDefinition({ varNames[varName] = func.slug; if (!func.prompt_data || !func.prompt_data.prompt) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Prompt ${doubleQuote(func.name)} has an invalid (empty) prompt definition.`, @@ -240,6 +251,7 @@ function makeFunctionDefinition({ : undefined; if (rawToolsParsed && !rawToolsParsed.success) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( `Prompt ${doubleQuote(func.name)} has an invalid tools definition: ${rawToolsParsed.error.message}. Skipping...`, @@ -348,6 +360,7 @@ async function getPrettierModule() { prettierModule = await importWithTimeout(); } catch { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( warning( "Failed to load prettier module. Will not use prettier to format output.", diff --git a/js/src/debug-logger.ts b/js/src/debug-logger.ts index 91afecc7a..5b21bde4a 100644 --- a/js/src/debug-logger.ts +++ b/js/src/debug-logger.ts @@ -34,6 +34,7 @@ function warnInvalidEnvValue(value: string) { return; } hasWarnedAboutInvalidEnvValue = true; + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( PREFIX, `Invalid BRAINTRUST_DEBUG_LOG_LEVEL value "${value}". Expected "error", "warn", "info", or "debug".`, @@ -135,12 +136,16 @@ function emit( } if (method === "info") { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log(PREFIX, ...args); } else if (method === "debug") { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.debug(PREFIX, ...args); } else if (method === "warn") { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(PREFIX, ...args); } else { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(PREFIX, ...args); } } diff --git a/js/src/eval-parameters.ts b/js/src/eval-parameters.ts index e33d5c911..80ebff257 100644 --- a/js/src/eval-parameters.ts +++ b/js/src/eval-parameters.ts @@ -124,6 +124,7 @@ function validateParametersWithZod< return [name, schemaCasted.parse(value)]; } } catch (e) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error validating parameter", name, e); throw Error( `Invalid parameter '${name}': ${e instanceof Error ? e.message : String(e)}`, diff --git a/js/src/framework.ts b/js/src/framework.ts index cfdd62bde..6388bd900 100644 --- a/js/src/framework.ts +++ b/js/src/framework.ts @@ -773,8 +773,10 @@ export async function Eval< return ret; } finally { if (experiment) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. await experiment.flush().catch(console.error); } else if (options.parent) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. await flush({ state: evaluator.state }).catch(console.error); } } @@ -1485,8 +1487,10 @@ export const warning = (text: string) => `Warning: ${text}`; export function logError(e: unknown, verbose: boolean) { if (!verbose) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`${e}`); } else { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(e); } } @@ -1562,12 +1566,14 @@ export function reportFailures< // TODO: We may want to support a non-strict mode (and make this the "strict" behavior), so that // users can still log imperfect evaluations. In the meantime, they should handle these cases inside // of their tasks. + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( warning( `Evaluator ${evaluator.evalName} failed with ${failingResults.length} error${failingResults.length === 1 ? "" : "s"}. This evaluation ("${evaluator.evalName}") will not be fully logged.`, ), ); if (jsonl) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log( JSON.stringify({ evaluatorName: evaluator.evalName, @@ -1582,6 +1588,7 @@ export function reportFailures< } } if (!verbose && !jsonl) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( warning( "Use --debug-logging debug to see full stack traces and troubleshooting details.", diff --git a/js/src/framework2.ts b/js/src/framework2.ts index 9c15946d5..14aff18af 100644 --- a/js/src/framework2.ts +++ b/js/src/framework2.ts @@ -117,6 +117,7 @@ export class Project { async publish() { if (globalThis._lazy_load) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("publish() is a no-op when running `braintrust push`."); return; } @@ -124,6 +125,7 @@ export class Project { const projectMap = new ProjectNameIdMap(); const functionDefinitions: FunctionEvent[] = []; if (this._publishableCodeFunctions.length > 0) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( "Code functions cannot be published directly. Use `braintrust push` instead.", ); diff --git a/js/src/instrumentation/core/channel-tracing.ts b/js/src/instrumentation/core/channel-tracing.ts index 96a64a472..2d1f70c94 100644 --- a/js/src/instrumentation/core/channel-tracing.ts +++ b/js/src/instrumentation/core/channel-tracing.ts @@ -198,6 +198,7 @@ function startSpanForEvent< metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting input for ${channelName}:`, error); } @@ -351,6 +352,7 @@ export function traceAsyncChannel( metrics, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); @@ -460,6 +462,7 @@ export function traceStreamingChannel( metrics, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( `Error extracting output for ${channelName}:`, error, @@ -516,6 +519,7 @@ export function traceStreamingChannel( metrics, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); @@ -610,6 +614,7 @@ export function traceSyncStreamChannel( }); } } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( `Error extracting chatCompletion for ${channelName}:`, error, @@ -637,6 +642,7 @@ export function traceSyncStreamChannel( span.log(extracted); } } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting event for ${channelName}:`, error); } }); diff --git a/js/src/instrumentation/core/plugin.ts b/js/src/instrumentation/core/plugin.ts index 7d1147c5a..41e1d7c3d 100644 --- a/js/src/instrumentation/core/plugin.ts +++ b/js/src/instrumentation/core/plugin.ts @@ -109,6 +109,7 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting input for ${channelName}:`, error); } }, @@ -132,6 +133,7 @@ export abstract class BasePlugin { metrics, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); @@ -216,6 +218,7 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting input for ${channelName}:`, error); } }, @@ -279,6 +282,7 @@ export abstract class BasePlugin { metrics, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( `Error extracting output for ${channelName}:`, error, @@ -315,6 +319,7 @@ export abstract class BasePlugin { metrics, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting output for ${channelName}:`, error); } finally { span.end(); @@ -389,6 +394,7 @@ export abstract class BasePlugin { metadata: mergeInputMetadata(metadata, spanInfoMetadata), }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error(`Error extracting input for ${channelName}:`, error); } }, @@ -430,6 +436,7 @@ export abstract class BasePlugin { output: completion.choices, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( `Error extracting chatCompletion for ${channelName}:`, error, @@ -455,6 +462,7 @@ export abstract class BasePlugin { span.log(extracted); } } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( `Error extracting event for ${channelName}:`, error, diff --git a/js/src/instrumentation/core/stream-patcher.ts b/js/src/instrumentation/core/stream-patcher.ts index efdd379de..3ecfc8aa6 100644 --- a/js/src/instrumentation/core/stream-patcher.ts +++ b/js/src/instrumentation/core/stream-patcher.ts @@ -101,6 +101,7 @@ export function patchStreamIfNeeded( // Check if object is extensible (can be patched) if (Object.isFrozen(stream) || Object.isSealed(stream)) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( "Cannot patch frozen/sealed stream. Stream output will not be collected.", ); @@ -137,6 +138,7 @@ export function patchStreamIfNeeded( try { await options.onComplete(chunks); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error in stream onComplete handler:", error); } } @@ -157,6 +159,7 @@ export function patchStreamIfNeeded( try { await options.onChunk(chunk); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error in stream onChunk handler:", error); } } @@ -175,6 +178,7 @@ export function patchStreamIfNeeded( chunks, ); } catch (handlerError) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error in stream onError handler:", handlerError); } } @@ -193,6 +197,7 @@ export function patchStreamIfNeeded( try { await options.onComplete(chunks); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error in stream onComplete handler:", error); } } @@ -215,6 +220,7 @@ export function patchStreamIfNeeded( try { await options.onError(error, chunks); } catch (handlerError) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error in stream onError handler:", handlerError); } } @@ -237,6 +243,7 @@ export function patchStreamIfNeeded( return stream; } catch (error) { // If patching fails for any reason, log warning and return original + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Failed to patch stream:", error); return stream; } @@ -305,6 +312,7 @@ export function wrapStreamResult( const processed = options.processChunks(chunks); options.onResult(processed); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error processing stream chunks:", error); if (options.onError) { options.onError( @@ -325,6 +333,7 @@ export function wrapStreamResult( : result; options.onResult(processed); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error processing non-stream result:", error); if (options.onError) { options.onError( diff --git a/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts b/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts index c6f5aeb8a..e7c1fa8da 100644 --- a/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts +++ b/js/src/instrumentation/plugins/claude-agent-sdk-plugin.ts @@ -756,6 +756,7 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { metadata: filterSerializableOptions(options), }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error extracting input for Claude Agent SDK:", error); } @@ -828,6 +829,7 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { state.processing = state.processing .then(() => handleStreamMessage(state, message)) .catch((error) => { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error( "Error processing Claude Agent SDK stream chunk:", error, @@ -859,6 +861,7 @@ export class ClaudeAgentSDKPlugin extends BasePlugin { try { state.span.log({ output: eventResult }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error extracting output for Claude Agent SDK:", error); } finally { state.span.end(); diff --git a/js/src/instrumentation/registry.ts b/js/src/instrumentation/registry.ts index 844b9efd2..79825abeb 100644 --- a/js/src/instrumentation/registry.ts +++ b/js/src/instrumentation/registry.ts @@ -35,6 +35,7 @@ class PluginRegistry { */ configure(config: InstrumentationConfig): void { if (this.enabled) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( "Braintrust: Cannot configure instrumentation after it has been enabled. " + "Call configureInstrumentation() before importing any AI SDKs.", diff --git a/js/src/isomorph.ts b/js/src/isomorph.ts index 4091ba206..130793ae2 100644 --- a/js/src/isomorph.ts +++ b/js/src/isomorph.ts @@ -301,6 +301,7 @@ const iso: Common = { ) => new DefaultTracingChannel(nameOrChannels), processOn: (_0, _1) => {}, basename: (filepath: string) => filepath.split(/[\\/]/).pop() || filepath, + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. writeln: (text: string) => console.log(text), }; export default iso; diff --git a/js/src/prompt-cache/disk-cache.ts b/js/src/prompt-cache/disk-cache.ts index e99c7e7d9..8d5dc256c 100644 --- a/js/src/prompt-cache/disk-cache.ts +++ b/js/src/prompt-cache/disk-cache.ts @@ -96,6 +96,7 @@ export class DiskCache { return undefined; } if (this.logWarnings) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Failed to read from disk cache", e); } return undefined; @@ -121,6 +122,7 @@ export class DiskCache { await this.evictOldestIfFull(); } catch (e) { if (this.logWarnings) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Failed to write to disk cache", e); } return; diff --git a/js/src/reporters/progress.ts b/js/src/reporters/progress.ts index bf897e407..d1a8e5303 100644 --- a/js/src/reporters/progress.ts +++ b/js/src/reporters/progress.ts @@ -2,6 +2,7 @@ import type { ProgressReporter } from "./types"; export class SimpleProgressReporter implements ProgressReporter { public start(name: string, _total: number) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log(`Running evaluator ${name}`); } public stop() {} diff --git a/js/src/template/registry.ts b/js/src/template/registry.ts index a0686eb10..6ebcace61 100644 --- a/js/src/template/registry.ts +++ b/js/src/template/registry.ts @@ -67,6 +67,7 @@ class TemplatePluginRegistry { register(plugin: TemplateRendererPlugin): void { if (this.plugins.has(plugin.name)) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( `Template plugin '${plugin.name}' already registered, overwriting`, ); diff --git a/js/src/wrappers/ai-sdk/ai-sdk.ts b/js/src/wrappers/ai-sdk/ai-sdk.ts index d65bf3e16..7572e823f 100644 --- a/js/src/wrappers/ai-sdk/ai-sdk.ts +++ b/js/src/wrappers/ai-sdk/ai-sdk.ts @@ -1725,6 +1725,7 @@ const processContentPart = (part: any): any => { } } } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Error processing content part:", error); } @@ -1787,6 +1788,7 @@ const convertImageToAttachment = ( return image; } } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Error converting image to attachment:", error); } @@ -1835,6 +1837,7 @@ const convertDataToAttachment = ( }); } } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Error converting data to attachment:", error); } @@ -1898,6 +1901,7 @@ const processOutputAttachments = async (output: AISDKResult) => { try { return await doProcessOutputAttachments(output); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.error("Error processing output attachments:", error); return output; } @@ -1955,6 +1959,7 @@ const convertFileToAttachment = ( } if (!blob) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(`Failed to convert file at index ${index} to Blob`); return file; // Return original if conversion fails } @@ -1965,6 +1970,7 @@ const convertFileToAttachment = ( contentType: mediaType, }); } catch (error) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn(`Error processing file at index ${index}:`, error); return file; // Return original on error } diff --git a/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts b/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts index 059a0ec22..c3f928d84 100644 --- a/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts +++ b/js/src/wrappers/ai-sdk/deprecated/wrapAISDKModel.ts @@ -25,6 +25,7 @@ export function wrapAISDKModel(model: T): T { ) { return new BraintrustLanguageModelWrapper(m) as any as T; } else { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Unsupported AI SDK model. Not wrapping."); return model; } diff --git a/js/src/wrappers/anthropic.ts b/js/src/wrappers/anthropic.ts index 7048e5f40..c3135320b 100644 --- a/js/src/wrappers/anthropic.ts +++ b/js/src/wrappers/anthropic.ts @@ -28,6 +28,7 @@ export function wrapAnthropic(anthropic: T): T { return anthropicProxy(au as AnthropicClient) as T; } + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Unsupported Anthropic library. Not wrapping."); return anthropic; } diff --git a/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts b/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts index 66c9f01b1..28f2af611 100644 --- a/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts +++ b/js/src/wrappers/claude-agent-sdk/claude-agent-sdk.ts @@ -24,6 +24,7 @@ export function wrapClaudeAgentSDK(sdk: T): T { return claudeAgentSDKProxy(s as ClaudeAgentSDKModule) as unknown as T; } + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Unsupported Claude Agent SDK. Not wrapping."); return sdk; } diff --git a/js/src/wrappers/google-genai.ts b/js/src/wrappers/google-genai.ts index 88c69eb0c..8a7e5fc61 100644 --- a/js/src/wrappers/google-genai.ts +++ b/js/src/wrappers/google-genai.ts @@ -27,11 +27,13 @@ export function wrapGoogleGenAI>( googleGenAI: T, ): T { if (!googleGenAI || typeof googleGenAI !== "object") { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Invalid Google GenAI module. Not wrapping."); return googleGenAI; } if (!("GoogleGenAI" in googleGenAI)) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( "GoogleGenAI class not found in module. Not wrapping. Make sure you're passing the module itself (import * as googleGenAI from '@google/genai').", ); diff --git a/js/src/wrappers/oai.ts b/js/src/wrappers/oai.ts index 6411020b8..c57143faf 100644 --- a/js/src/wrappers/oai.ts +++ b/js/src/wrappers/oai.ts @@ -63,6 +63,7 @@ export function wrapOpenAI(openai: T): T { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return wrapOpenAIv4(typedOpenAI) as T; } else { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Unsupported OpenAI library (potentially v3). Not wrapping."); return openai; } diff --git a/js/src/wrappers/openrouter.ts b/js/src/wrappers/openrouter.ts index 70228c964..69d38873a 100644 --- a/js/src/wrappers/openrouter.ts +++ b/js/src/wrappers/openrouter.ts @@ -36,6 +36,7 @@ export function wrapOpenRouter(openrouter: T): T { return openRouterProxy(or as OpenRouterClient) as T; } + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Unsupported OpenRouter library. Not wrapping."); return openrouter; } diff --git a/js/src/wrappers/shared/flush.ts b/js/src/wrappers/shared/flush.ts index 907389d3b..e7e009d70 100644 --- a/js/src/wrappers/shared/flush.ts +++ b/js/src/wrappers/shared/flush.ts @@ -13,6 +13,7 @@ export async function summarizeAndFlush( const shouldDisplay = options.displaySummary ?? true; const summary = await experiment.summarize(); if (shouldDisplay) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.log(formatExperimentSummary(summary)); } } diff --git a/js/src/wrappers/shared/scorers.ts b/js/src/wrappers/shared/scorers.ts index c5cb4619c..43080027f 100644 --- a/js/src/wrappers/shared/scorers.ts +++ b/js/src/wrappers/shared/scorers.ts @@ -44,6 +44,7 @@ export async function runScorers(args: { } catch (scorerError) { // Log scorer error but don't fail the test — use metadata instead // of top-level error field to avoid marking the span as errored + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn("Braintrust: Scorer failed:", scorerError); const errorStr = scorerError instanceof Error diff --git a/js/src/wrappers/vitest/index.ts b/js/src/wrappers/vitest/index.ts index 3671c8be9..5ff41b157 100644 --- a/js/src/wrappers/vitest/index.ts +++ b/js/src/wrappers/vitest/index.ts @@ -102,6 +102,7 @@ export function wrapVitest< flushExperiment: async (options?: { displaySummary?: boolean }) => { const ctx = getExperimentContext(); if (!ctx) { + // eslint-disable-next-line no-restricted-properties -- preserving intentional console usage. console.warn( "Braintrust: No experiment context found. Make sure you're using bt.describe() and calling flushExperiment() within an afterAll() hook.", );