axiom 0.51.1 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +6 -6
- package/dist/{chunk-63VQQCZB.js → chunk-2RCYBZZC.js} +2 -2
- package/dist/{chunk-7PROY4ZA.js → chunk-4CHGZ4WT.js} +2 -2
- package/dist/{chunk-72PVEOMF.js → chunk-I5OOMUQJ.js} +8 -6
- package/dist/{chunk-72PVEOMF.js.map → chunk-I5OOMUQJ.js.map} +1 -1
- package/dist/{chunk-PU64TWX4.js → chunk-QMM7KCYZ.js} +2 -2
- package/dist/{chunk-PU64TWX4.js.map → chunk-QMM7KCYZ.js.map} +1 -1
- package/dist/{chunk-SQJ53C2N.js → chunk-SD3TFRJI.js} +7 -7
- package/dist/{chunk-3VKWOZAQ.js → chunk-YM4B3UES.js} +7 -2
- package/dist/chunk-YM4B3UES.js.map +1 -0
- package/dist/{config-6PyyriW8.d.ts → config-B_4bFL7j.d.ts} +10 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/docs/README.md +2 -2
- package/dist/docs/config/README.md +1 -1
- package/dist/docs/config/functions/defineConfig.md +1 -1
- package/dist/docs/config/interfaces/AxiomConfig.md +22 -1
- package/dist/docs/config/type-aliases/AxiomEvalInstrumentationHook.md +1 -1
- package/dist/docs/evals/README.md +1 -1
- package/dist/docs/evals/classes/AxiomReporter.md +1 -1
- package/dist/docs/evals/functions/Eval.md +1 -1
- package/dist/docs/evals/interfaces/EvalBuilder.md +1 -1
- package/dist/docs/evals/interfaces/EvalContextData.md +1 -1
- package/dist/docs/evals/online/README.md +1 -1
- package/dist/docs/evals/online/functions/onlineEval.md +1 -1
- package/dist/docs/evals/online/type-aliases/OnlineEvalParams.md +1 -1
- package/dist/docs/evals/online/type-aliases/OnlineEvalScorerEntry.md +1 -1
- package/dist/docs/evals/online/type-aliases/OnlineEvalScorerInput.md +1 -1
- package/dist/docs/evals/online/type-aliases/SampledOnlineEvalScorer.md +1 -1
- package/dist/docs/evals/online/type-aliases/ScorerSampling.md +1 -1
- package/dist/docs/evals/type-aliases/Case.md +1 -1
- package/dist/docs/evals/type-aliases/Chat.md +1 -1
- package/dist/docs/evals/type-aliases/EvalParams.md +1 -1
- package/dist/docs/evals/type-aliases/EvalTask.md +1 -1
- package/dist/docs/evals/type-aliases/Evaluation.md +1 -1
- package/dist/docs/evals/type-aliases/Task.md +1 -1
- package/dist/docs/feedback/README.md +1 -1
- package/dist/docs/feedback/functions/createFeedbackClient.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackClient.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackConfig.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackErrorContext.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackEvent.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackInput.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackLinks.md +1 -1
- package/dist/docs/feedback/type-aliases/FeedbackSettings.md +1 -1
- package/dist/docs/feedback/type-aliases/SendFeedbackFn.md +1 -1
- package/dist/docs/feedback/variables/Feedback.md +1 -1
- package/dist/docs/index/README.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddleware.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddlewareV1.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddlewareV2.md +1 -1
- package/dist/docs/index/functions/axiomAIMiddlewareV3.md +1 -1
- package/dist/docs/index/functions/createAppScope.md +1 -1
- package/dist/docs/index/functions/experimental_parse.md +1 -1
- package/dist/docs/index/functions/getGlobalTracer.md +1 -1
- package/dist/docs/index/functions/initAxiomAI.md +1 -1
- package/dist/docs/index/functions/resetAxiomAI.md +1 -1
- package/dist/docs/index/functions/withSpan.md +1 -1
- package/dist/docs/index/functions/wrapAISDKModel.md +1 -1
- package/dist/docs/index/functions/wrapTool.md +1 -1
- package/dist/docs/index/functions/wrapTools.md +1 -1
- package/dist/docs/index/interfaces/AxiomTelemetryConfig.md +1 -1
- package/dist/docs/index/interfaces/experimental_AxiomPromptMetadata.md +1 -1
- package/dist/docs/index/interfaces/experimental_ParsedMessage.md +1 -1
- package/dist/docs/index/type-aliases/AxiomAIRedactionPolicy.md +1 -1
- package/dist/docs/index/type-aliases/WithSpanOptions.md +1 -1
- package/dist/docs/index/type-aliases/experimental_InferContext.md +1 -1
- package/dist/docs/index/type-aliases/experimental_InferSchema.md +1 -1
- package/dist/docs/index/type-aliases/experimental_ParsedMessagesArray.md +1 -1
- package/dist/docs/index/type-aliases/experimental_Prompt.md +1 -1
- package/dist/docs/index/type-aliases/experimental_TSchema.md +1 -1
- package/dist/docs/index/variables/RedactionPolicy.md +1 -1
- package/dist/docs/index/variables/experimental_Type.md +1 -1
- package/dist/docs/index/variables/onlineEval.md +1 -1
- package/dist/docs/scorers/aggregations/README.md +1 -1
- package/dist/docs/scorers/aggregations/functions/Mean.md +1 -1
- package/dist/docs/scorers/aggregations/functions/Median.md +1 -1
- package/dist/docs/scorers/aggregations/functions/PassAtK.md +1 -1
- package/dist/docs/scorers/aggregations/functions/PassHatK.md +1 -1
- package/dist/docs/scorers/aggregations/type-aliases/Aggregation.md +1 -1
- package/dist/docs/scorers/aggregations/variables/AllTrialsPass.md +1 -1
- package/dist/docs/scorers/aggregations/variables/AtLeastOneTrialPasses.md +1 -1
- package/dist/docs/scorers/scorers/README.md +1 -1
- package/dist/docs/scorers/scorers/functions/Scorer.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/Score.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScoreWithName.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScorerLike.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScorerOptions.md +1 -1
- package/dist/docs/scorers/scorers/type-aliases/ScorerType.md +1 -1
- package/dist/evals/online.js +2 -2
- package/dist/evals.d.ts +1 -1
- package/dist/evals.js +5 -5
- package/dist/index.js +3 -3
- package/dist/{run-vitest-SA4SZBNK.js → run-vitest-53XCD77T.js} +18 -10
- package/dist/run-vitest-53XCD77T.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-3VKWOZAQ.js.map +0 -1
- package/dist/run-vitest-SA4SZBNK.js.map +0 -1
- /package/dist/{chunk-63VQQCZB.js.map → chunk-2RCYBZZC.js.map} +0 -0
- /package/dist/{chunk-7PROY4ZA.js.map → chunk-4CHGZ4WT.js.map} +0 -0
- /package/dist/{chunk-SQJ53C2N.js.map → chunk-SD3TFRJI.js.map} +0 -0
package/dist/bin.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
extractOverrides,
|
|
4
4
|
loadEvalCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-I5OOMUQJ.js";
|
|
6
6
|
import {
|
|
7
7
|
OAuth,
|
|
8
8
|
fetchOrganizations,
|
|
@@ -14,12 +14,12 @@ import {
|
|
|
14
14
|
startCallbackServer,
|
|
15
15
|
verifyToken,
|
|
16
16
|
waitForCallback
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-YM4B3UES.js";
|
|
18
|
+
import "./chunk-2RCYBZZC.js";
|
|
19
19
|
import {
|
|
20
20
|
AxiomCLIError
|
|
21
21
|
} from "./chunk-ISSDOC43.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-QMM7KCYZ.js";
|
|
23
23
|
import "./chunk-MM5FFQJT.js";
|
|
24
24
|
import "./chunk-4TKUTT24.js";
|
|
25
25
|
import "./chunk-KEXKKQVW.js";
|
|
@@ -389,7 +389,7 @@ import { Command } from "commander";
|
|
|
389
389
|
var loadVersionCommand = (program2) => {
|
|
390
390
|
return program2.addCommand(
|
|
391
391
|
new Command("version").description("cli version").action(() => {
|
|
392
|
-
console.log("0.
|
|
392
|
+
console.log("0.52.0");
|
|
393
393
|
})
|
|
394
394
|
);
|
|
395
395
|
};
|
|
@@ -399,7 +399,7 @@ var { loadEnvConfig } = pkg;
|
|
|
399
399
|
loadEnvConfig(process.cwd());
|
|
400
400
|
var { cleanedArgv, overrides } = extractOverrides(process.argv.slice(2));
|
|
401
401
|
var program = new Command2();
|
|
402
|
-
program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.
|
|
402
|
+
program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.52.0");
|
|
403
403
|
program.hook("preAction", async (_, actionCommand) => {
|
|
404
404
|
const commandName = actionCommand.name();
|
|
405
405
|
const parentCommand = actionCommand.parent;
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
getRedactionPolicy,
|
|
6
6
|
handleMaybeRedactedAttribute,
|
|
7
7
|
package_default
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-QMM7KCYZ.js";
|
|
9
9
|
import {
|
|
10
10
|
isValidName
|
|
11
11
|
} from "./chunk-MM5FFQJT.js";
|
|
@@ -3140,4 +3140,4 @@ export {
|
|
|
3140
3140
|
withEvalContext,
|
|
3141
3141
|
getConfigScope
|
|
3142
3142
|
};
|
|
3143
|
-
//# sourceMappingURL=chunk-
|
|
3143
|
+
//# sourceMappingURL=chunk-2RCYBZZC.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getGlobalTracer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QMM7KCYZ.js";
|
|
4
4
|
import {
|
|
5
5
|
isValidName
|
|
6
6
|
} from "./chunk-MM5FFQJT.js";
|
|
@@ -280,4 +280,4 @@ async function executeOnlineEvalInternal(name, params, linkContexts) {
|
|
|
280
280
|
export {
|
|
281
281
|
onlineEval
|
|
282
282
|
};
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
283
|
+
//# sourceMappingURL=chunk-4CHGZ4WT.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
createPartialDefaults,
|
|
3
3
|
getAuthContext,
|
|
4
4
|
validateConfig
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-YM4B3UES.js";
|
|
6
6
|
import {
|
|
7
7
|
EVAL_CONTEXT,
|
|
8
8
|
assertZodV4,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
putOnSpan,
|
|
17
17
|
setGlobalFlagOverrides,
|
|
18
18
|
withEvalContext
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-2RCYBZZC.js";
|
|
20
20
|
import {
|
|
21
21
|
AxiomCLIError,
|
|
22
22
|
errorToString
|
|
@@ -329,7 +329,8 @@ async function loadConfig(cwd = process.cwd()) {
|
|
|
329
329
|
const mergedConfig = customMerger(defaults, result.config);
|
|
330
330
|
const validatedConfig = validateConfig(mergedConfig);
|
|
331
331
|
return {
|
|
332
|
-
config: validatedConfig
|
|
332
|
+
config: validatedConfig,
|
|
333
|
+
configPath: result._configFile
|
|
333
334
|
};
|
|
334
335
|
} catch (error) {
|
|
335
336
|
if (error instanceof AxiomCLIError) {
|
|
@@ -382,7 +383,7 @@ var loadEvalCommand = (program, flagOverrides = {}) => {
|
|
|
382
383
|
let exclude;
|
|
383
384
|
let testNamePattern;
|
|
384
385
|
const isGlobPattern = isGlob(target);
|
|
385
|
-
const { config: loadedConfig } = await loadConfig(".");
|
|
386
|
+
const { config: loadedConfig, configPath } = await loadConfig(".");
|
|
386
387
|
validateFlagOverrides(flagOverrides, loadedConfig.eval.flagSchema);
|
|
387
388
|
const config = {
|
|
388
389
|
...loadedConfig,
|
|
@@ -422,7 +423,7 @@ var loadEvalCommand = (program, flagOverrides = {}) => {
|
|
|
422
423
|
consoleUrl = options.consoleUrl;
|
|
423
424
|
let runVitestModule;
|
|
424
425
|
try {
|
|
425
|
-
runVitestModule = await import("./run-vitest-
|
|
426
|
+
runVitestModule = await import("./run-vitest-53XCD77T.js");
|
|
426
427
|
} catch (err) {
|
|
427
428
|
if (err && typeof err === "object" && "code" in err && (err.code === "ERR_MODULE_NOT_FOUND" || err.code === "MODULE_NOT_FOUND")) {
|
|
428
429
|
throw new AxiomCLIError("Failed to load vitest.");
|
|
@@ -441,6 +442,7 @@ var loadEvalCommand = (program, flagOverrides = {}) => {
|
|
|
441
442
|
list: options.list,
|
|
442
443
|
overrides: flagOverrides,
|
|
443
444
|
config,
|
|
445
|
+
configPath,
|
|
444
446
|
runId,
|
|
445
447
|
consoleUrl: options.consoleUrl
|
|
446
448
|
});
|
|
@@ -465,4 +467,4 @@ export {
|
|
|
465
467
|
getConsoleUrl,
|
|
466
468
|
loadEvalCommand
|
|
467
469
|
};
|
|
468
|
-
//# sourceMappingURL=chunk-
|
|
470
|
+
//# sourceMappingURL=chunk-I5OOMUQJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/utils/parse-flag-overrides.ts","../../../node_modules/.pnpm/tinyrainbow@2.0.0/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.js","../../../node_modules/.pnpm/tinyrainbow@2.0.0/node_modules/tinyrainbow/dist/node.js","../src/cli/commands/eval.command.ts","../src/context.ts","../src/cli/utils/eval-context-runner.ts","../src/cli/utils/glob-utils.ts","../src/config/loader.ts"],"sourcesContent":["import { type ZodError, type ZodObject, type z } from 'zod';\nimport { formatZodErrors, generateFlagExamples } from './format-zod-errors.js';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { dotNotationToNested, isValidPath, parsePath } from '../../util/dot-path.js';\nimport { makeDeepPartial } from '../../util/deep-partial-schema.js';\nimport { assertZodV4 } from '../../util/zod-internals.js';\n\nexport interface FlagOverrides {\n [key: string]: any;\n}\n\nconst FLAG_RE = /^--flag\\.([^=]+)(?:=(.*))?$/;\nconst CONFIG_RE = /^--flags-config(?:=(.*))?$/;\n\nfunction ensureNoSpaceSeparatedSyntax(\n flagName: string,\n value: string | undefined,\n nextToken: string | undefined,\n flagType: 'flag' | 'config',\n): void {\n if (value === undefined && nextToken !== undefined) {\n if (\n flagType === 'flag' &&\n !nextToken.startsWith('-') &&\n nextToken !== 'true' &&\n nextToken !== 'false'\n ) {\n console.error(`❌ Invalid syntax: --flag.${flagName} ${nextToken}`);\n console.error(`💡 Use: --flag.${flagName}=${nextToken}`);\n process.exit(1);\n } else if (flagType === 'config' && !nextToken.startsWith('-')) {\n console.error(`❌ Invalid syntax: --flags-config ${nextToken}`);\n console.error(`💡 Use: --flags-config=${nextToken}`);\n process.exit(1);\n }\n }\n}\n\n/**\n * Extract and validate flag overrides using a Zod schema\n */\nexport function extractAndValidateFlagOverrides<S extends z.ZodObject<any>>(\n argv: string[],\n flagSchema?: S,\n): {\n cleanedArgv: string[];\n overrides: S extends ZodObject<any> ? z.output<S> : FlagOverrides;\n} {\n if (flagSchema) {\n assertZodV4(flagSchema, 'flagSchema');\n }\n\n const { cleanedArgv, overrides } = extractOverrides(argv);\n\n if (flagSchema && Object.keys(overrides).length > 0) {\n // Use deep partial schema - allows partial nested objects\n const deepPartialSchema = makeDeepPartial(flagSchema as ZodObject<any>);\n const result = deepPartialSchema.safeParse(overrides);\n\n if (!result.success) {\n console.error('❌ Invalid flags:');\n console.error(formatZodErrors(result.error));\n\n const examples = generateFlagExamples(result.error);\n if (examples.length > 0) {\n console.error('\\n💡 Examples:');\n examples.forEach((example) => console.error(` ${example}`));\n }\n\n process.exit(1);\n }\n\n return { cleanedArgv, overrides: result.data as any };\n }\n\n return { cleanedArgv, overrides: overrides as any };\n}\n\nexport type FlagValidationError =\n | { type: 'invalid_path'; path: string }\n | { type: 'invalid_value'; zodError: ZodError };\n\nexport interface FlagValidationResult {\n success: boolean;\n errors: FlagValidationError[];\n}\n\n/**\n * Validate already-parsed flag overrides against a Zod schema.\n * Returns validation result without side effects (no console output, no process.exit).\n *\n * @param overrides - Flag overrides in dot-notation form (e.g., { 'model.temperature': 0.7 })\n * @param flagSchema - Zod schema to validate against\n * @returns Validation result with any errors found\n */\nexport function collectFlagValidationErrors(\n overrides: FlagOverrides,\n flagSchema?: unknown,\n): FlagValidationResult {\n // No schema provided = no validation, any flags allowed\n if (!flagSchema || Object.keys(overrides).length === 0) {\n return { success: true, errors: [] };\n }\n\n assertZodV4(flagSchema, 'flagSchema');\n\n const schema = flagSchema as any;\n const errors: FlagValidationError[] = [];\n\n // First pass: check all paths exist in schema\n for (const dotPath of Object.keys(overrides)) {\n const segments = parsePath(dotPath);\n if (!isValidPath(schema, segments)) {\n errors.push({ type: 'invalid_path', path: dotPath });\n }\n }\n\n // If there are invalid paths, don't proceed to value validation\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n // Second pass: validate values using nested object approach with deep partial\n // This allows providing only some flags without requiring all nested objects\n const nestedObject = dotNotationToNested(overrides);\n const deepPartialSchema = makeDeepPartial(schema);\n const result = deepPartialSchema.safeParse(nestedObject);\n\n if (!result.success) {\n errors.push({ type: 'invalid_value', zodError: result.error });\n }\n\n return { success: errors.length === 0, errors };\n}\n\n/**\n * Print flag validation errors to console and exit.\n */\nexport function printFlagValidationErrorsAndExit(errors: FlagValidationError[]): never {\n console.error('❌ Invalid CLI flags:');\n\n for (const error of errors) {\n if (error.type === 'invalid_path') {\n console.error(` • flag '${error.path}': Invalid flag path`);\n } else {\n console.error(formatZodErrors(error.zodError));\n\n const examples = generateFlagExamples(error.zodError);\n if (examples.length > 0) {\n console.error('\\n💡 Valid examples:');\n examples.forEach((example) => console.error(` ${example}`));\n }\n }\n }\n\n process.exit(1);\n}\n\n/**\n * Validate already-parsed flag overrides against a Zod schema.\n * Use this when you have flag overrides in dot-notation form (e.g., { 'model.temperature': 0.7 })\n * and want to validate them against a schema before running evals.\n *\n * @param overrides - Flag overrides in dot-notation form\n * @param flagSchema - Zod schema to validate against\n */\nexport function validateFlagOverrides(overrides: FlagOverrides, flagSchema?: unknown): void {\n const result = collectFlagValidationErrors(overrides, flagSchema);\n if (!result.success) {\n printFlagValidationErrorsAndExit(result.errors);\n }\n}\n\n/**\n * Coerce string values to appropriate types.\n * Priority: boolean -> number -> JSON -> string\n */\nfunction coerceValue(raw: string): any {\n // Handle explicit boolean strings\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n\n // Try number conversion\n const num = Number(raw);\n if (!Number.isNaN(num) && raw.trim() === num.toString()) {\n return num;\n }\n\n // Try JSON parsing (for objects/arrays)\n try {\n return JSON.parse(raw);\n } catch {\n // Fallback to string\n return raw;\n }\n}\n\n/**\n * Load and parse a JSON config file\n */\nfunction loadConfigFile(path: string): any {\n const abs = resolve(process.cwd(), path);\n try {\n const contents = readFileSync(abs, 'utf8');\n const parsed = JSON.parse(contents);\n\n if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) {\n console.error(\n `❌ Flags config must be a JSON object, got ${Array.isArray(parsed) ? 'array' : typeof parsed}`,\n );\n process.exit(1);\n }\n\n return parsed;\n } catch (err: any) {\n console.error(`❌ Could not read or parse flags config \"${path}\": ${err.message}`);\n process.exit(1);\n }\n}\n\n/**\n * Extract flag overrides with support for both CLI flags and config files.\n *\n * Supports CLI flags:\n * - --flag.temperature=0.9\n * - --flag.dryRun=true | false\n * - --flag.foo={\"bar\":1} (JSON literal)\n * - --flag.bare (interpreted as true)\n *\n * Or config file:\n * - --flags-config=path/to/config.json\n *\n * Enforces exclusive mode - cannot use both --flags-config and --flag.* together.\n */\nexport function extractOverrides(argv: string[]): {\n cleanedArgv: string[];\n overrides: FlagOverrides;\n} {\n const cleanedArgv: string[] = [];\n const overrides: FlagOverrides = {};\n let configPath: string | null = null;\n let hasCliFlags = false;\n let configPathCount = 0;\n\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i];\n const configMatch = token.match(CONFIG_RE);\n const flagMatch = token.match(FLAG_RE);\n\n if (configMatch) {\n // Handle --flags-config\n configPathCount++;\n if (configPathCount > 1) {\n console.error('❌ Only one --flags-config can be supplied.');\n process.exit(1);\n }\n\n const value = configMatch[1]; // undefined means no equals sign\n const nextToken = argv.length > i + 1 ? argv[i + 1] : undefined;\n\n ensureNoSpaceSeparatedSyntax('flags-config', value, nextToken, 'config');\n\n if (!value) {\n console.error('❌ --flags-config requires a file path');\n console.error('💡 Use: --flags-config=path/to/config.json');\n process.exit(1);\n }\n\n configPath = value;\n\n // Don't add to cleanedArgv\n } else if (flagMatch) {\n // Handle --flag.*\n hasCliFlags = true;\n\n const key = flagMatch[1];\n const value = flagMatch[2]; // undefined means bare flag (boolean true)\n const nextToken = argv.length > i + 1 ? argv[i + 1] : undefined;\n\n ensureNoSpaceSeparatedSyntax(key, value, nextToken, 'flag');\n\n // If no value, treat as boolean true\n const finalValue = value === undefined ? 'true' : value;\n overrides[key] = coerceValue(finalValue);\n\n // Don't add to cleanedArgv\n } else {\n cleanedArgv.push(token);\n }\n }\n\n if (configPath && hasCliFlags) {\n console.error('❌ Cannot use both --flags-config and --flag.* arguments together.');\n console.error('Choose one approach:');\n console.error(' • Config file: --flags-config=my-flags.json');\n console.error(' • CLI flags: --flag.temperature=0.9 --flag.model=gpt-4o');\n process.exit(1);\n }\n\n if (configPath) {\n const configOverrides = loadConfigFile(configPath);\n return { cleanedArgv, overrides: configOverrides };\n }\n\n return { cleanedArgv, overrides };\n}\n","// src/index.ts\nvar f = {\n reset: [0, 0],\n bold: [1, 22, \"\\x1B[22m\\x1B[1m\"],\n dim: [2, 22, \"\\x1B[22m\\x1B[2m\"],\n italic: [3, 23],\n underline: [4, 24],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n black: [30, 39],\n red: [31, 39],\n green: [32, 39],\n yellow: [33, 39],\n blue: [34, 39],\n magenta: [35, 39],\n cyan: [36, 39],\n white: [37, 39],\n gray: [90, 39],\n bgBlack: [40, 49],\n bgRed: [41, 49],\n bgGreen: [42, 49],\n bgYellow: [43, 49],\n bgBlue: [44, 49],\n bgMagenta: [45, 49],\n bgCyan: [46, 49],\n bgWhite: [47, 49],\n blackBright: [90, 39],\n redBright: [91, 39],\n greenBright: [92, 39],\n yellowBright: [93, 39],\n blueBright: [94, 39],\n magentaBright: [95, 39],\n cyanBright: [96, 39],\n whiteBright: [97, 39],\n bgBlackBright: [100, 49],\n bgRedBright: [101, 49],\n bgGreenBright: [102, 49],\n bgYellowBright: [103, 49],\n bgBlueBright: [104, 49],\n bgMagentaBright: [105, 49],\n bgCyanBright: [106, 49],\n bgWhiteBright: [107, 49]\n}, h = Object.entries(f);\nfunction a(n) {\n return String(n);\n}\na.open = \"\";\na.close = \"\";\nvar B = /* @__PURE__ */ h.reduce(\n (n, [e]) => (n[e] = a, n),\n { isColorSupported: !1 }\n);\nfunction m() {\n return { ...B };\n}\nfunction C(n = !1) {\n let e = typeof process != \"undefined\" ? process : void 0, i = (e == null ? void 0 : e.env) || {}, g = (e == null ? void 0 : e.argv) || [];\n return !(\"NO_COLOR\" in i || g.includes(\"--no-color\")) && (\"FORCE_COLOR\" in i || g.includes(\"--color\") || (e == null ? void 0 : e.platform) === \"win32\" || n && i.TERM !== \"dumb\" || \"CI\" in i) || typeof window != \"undefined\" && !!window.chrome;\n}\nfunction p(n = !1) {\n let e = C(n), i = (r, t, c, o) => {\n let l = \"\", s = 0;\n do\n l += r.substring(s, o) + c, s = o + t.length, o = r.indexOf(t, s);\n while (~o);\n return l + r.substring(s);\n }, g = (r, t, c = r) => {\n let o = (l) => {\n let s = String(l), b = s.indexOf(t, r.length);\n return ~b ? r + i(s, t, c, b) + t : r + s + t;\n };\n return o.open = r, o.close = t, o;\n }, u = {\n isColorSupported: e\n }, d = (r) => `\\x1B[${r}m`;\n for (let [r, t] of h)\n u[r] = e ? g(\n d(t[0]),\n d(t[1]),\n t[2]\n ) : a;\n return u;\n}\n\nexport {\n m as a,\n C as b,\n p as c\n};\n","import {\n a as e,\n b as t,\n c as o\n} from \"./chunk-BVHSVHOK.js\";\n\n// src/node.ts\nimport { isatty as s } from \"tty\";\nvar r = process.env.FORCE_TTY !== void 0 || s(1);\nfunction n() {\n return t(r);\n}\nfunction a() {\n return o(r);\n}\nvar u = o(r);\nexport {\n a as createColors,\n u as default,\n e as getDefaultColors,\n n as isSupported\n};\n","import { Command, Argument, Option } from 'commander';\nimport { customAlphabet } from 'nanoid';\nimport { lstatSync } from 'node:fs';\nimport { runEvalWithContext } from '../utils/eval-context-runner';\nimport { validateFlagOverrides, type FlagOverrides } from '../utils/parse-flag-overrides';\nimport { isGlob } from '../utils/glob-utils';\nimport { loadConfig } from '../../config/loader';\nimport { AxiomCLIError } from '../../util/errors';\nimport { getAuthContext } from '../auth/global-auth';\nimport c from 'tinyrainbow';\n\nconst createRunId = customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 10);\n\n// Module-level storage for console URL override\nlet consoleUrl: string | undefined;\nexport function getConsoleUrl(): string | undefined {\n return consoleUrl;\n}\n/**\n * Gets default token from auth context or falls back to env var\n */\nfunction getDefaultToken(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n const authContext = getAuthContext();\n return authContext?.token || process.env.AXIOM_TOKEN;\n}\n\n/**\n * Gets default URL from auth context or falls back to env var\n */\nfunction getDefaultUrl(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n const authContext = getAuthContext();\n return authContext?.url || process.env.AXIOM_URL || 'https://api.axiom.co';\n}\n\n/**\n * Gets default organization id from auth context or falls back to env var\n */\nfunction getDefaultOrgId(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n const authContext = getAuthContext();\n return authContext?.orgId ?? process.env.AXIOM_ORG_ID;\n}\n\nexport const loadEvalCommand = (program: Command, flagOverrides: FlagOverrides = {}) => {\n return program.addCommand(\n new Command('eval')\n .description('run evals locally')\n .addArgument(\n new Argument('[target]', 'file, directory, glob pattern, or eval name').default(\n '.',\n 'any *.eval.ts file in current directory',\n ),\n )\n .option('-w, --watch true', 'keep server running and watch for changes', false)\n .option('-t, --token <TOKEN>', 'axiom token', getDefaultToken)\n .option('-d, --dataset <DATASET>', 'axiom dataset name')\n .option('-u, --url <AXIOM URL>', 'axiom url', getDefaultUrl)\n .option('-o, --org-id <ORG ID>', 'axiom organization id', getDefaultOrgId)\n .option('-b, --baseline <BASELINE ID>', 'id of baseline evaluation to compare against')\n .option('--debug', 'run locally without any network operations', false)\n .option('--list', 'list evaluations and test cases without running them', false)\n /** Hides the option from the help output, but still allows it to be passed */\n .addOption(new Option('-c, --console-url <URL>', 'console url override').hideHelp())\n .action(async (target: string, options) => {\n try {\n // Propagate debug mode to processes that we can't reach otherwise (e.g., reporter, app instrumentation)\n if (options.debug) {\n process.env.AXIOM_DEBUG = 'true';\n }\n\n let include: string[] = [];\n let exclude: string[] | undefined;\n let testNamePattern: RegExp | undefined;\n\n const isGlobPattern = isGlob(target);\n\n // Load config file first to get defaults\n const { config: loadedConfig } = await loadConfig('.');\n\n // Validate CLI flags against schema\n validateFlagOverrides(flagOverrides, loadedConfig.eval.flagSchema);\n\n // Override config with CLI options if provided\n const config = {\n ...loadedConfig,\n eval: {\n ...loadedConfig.eval,\n ...(options.token && { token: options.token }),\n ...(options.url && { url: options.url }),\n ...(options.dataset && { dataset: options.dataset }),\n ...(options.orgId && { orgId: options.orgId }),\n },\n };\n\n if (isGlobPattern) {\n // Handle glob patterns like \"**/*.eval.ts\" or \"**/my-feature/*\"\n include = [target];\n } else {\n try {\n // Try to treat as file/directory path\n const stat = lstatSync(target);\n if (stat.isDirectory()) {\n include = config?.eval?.include || [];\n } else {\n // Single file\n include = [target];\n }\n } catch {\n // Path doesn't exist, treat as eval name\n testNamePattern = new RegExp(target, 'i');\n // Use config include patterns when searching by name\n include = config?.eval?.include || [];\n }\n }\n\n exclude = config?.eval?.exclude;\n\n if (!config?.eval?.instrumentation) {\n console.warn(\n c.yellow(\n '⚠ App instrumentation (`eval.instrumentation` in `axiom.config.ts`) not configured. Using default provider.',\n ),\n );\n console.log('');\n }\n\n const runId = createRunId();\n\n consoleUrl = options.consoleUrl;\n\n // Dynamic import to avoid loading vitest at CLI startup (breaks `npx axiom login`)\n let runVitestModule;\n try {\n runVitestModule = await import('../../evals/run-vitest');\n } catch (err: unknown) {\n if (\n err &&\n typeof err === 'object' &&\n 'code' in err &&\n (err.code === 'ERR_MODULE_NOT_FOUND' || err.code === 'MODULE_NOT_FOUND')\n ) {\n throw new AxiomCLIError('Failed to load vitest.');\n }\n throw err;\n }\n const { runVitest } = runVitestModule;\n\n await runEvalWithContext(flagOverrides, async () => {\n return runVitest('.', {\n watch: options.watch,\n baseline: options.baseline,\n include,\n exclude,\n testNamePattern,\n debug: options.debug,\n list: options.list,\n overrides: flagOverrides,\n config,\n runId,\n consoleUrl: options.consoleUrl,\n });\n });\n } catch (error) {\n if (error instanceof AxiomCLIError) {\n console.error(`\\n❌ ${error.message}\\n`);\n process.exit(1);\n }\n throw error;\n }\n }),\n );\n};\n","import { getEvalContext, putOnSpan, EVAL_CONTEXT } from './evals/context/storage';\n\n/**\n * Override flag values for the current evaluation context with trace-specific isolation.\n * Now creates overlay contexts to prevent overrides from leaking to sibling operations.\n *\n * @internal - For framework use only. Use scope.overrideFlags() for typed flag access.\n * @param partial - Partial flag overrides\n */\nexport function overrideFlags(partial: Record<string, any>): void {\n const current = getEvalContext();\n\n if (!current) {\n if (process.env.NODE_ENV !== 'test') {\n console.warn('overrideFlags called outside of evaluation context');\n }\n return;\n }\n\n // Create overlay context instead of mutating the current one\n const overlayContext = {\n ...current,\n flags: { ...current.flags, ...partial }, // Merge for backwards compatibility\n parent: current,\n overrides: { ...partial },\n };\n\n // We need to update the current ALS context in place\n const currentCtx = EVAL_CONTEXT.get();\n if (currentCtx) {\n // Update current context to overlay\n Object.assign(currentCtx, overlayContext);\n }\n\n // Write all overridden flags to span\n for (const [key, value] of Object.entries(partial)) {\n putOnSpan('flag', key, value);\n }\n}\n","import { overrideFlags } from '../../context';\nimport { withEvalContext } from '../../evals/context/storage';\nimport { setGlobalFlagOverrides } from '../../evals/context/global-flags';\nimport type { FlagOverrides } from './parse-flag-overrides';\n\n/**\n * Run evaluation with flag overrides applied to the context.\n * This ensures flag overrides are established before any test files load.\n *\n * @param overrides - Flag overrides from CLI parsing\n * @param runFn - Function that runs the evaluation (typically runVitest)\n */\nexport async function runEvalWithContext<T>(\n overrides: FlagOverrides,\n runFn: () => Promise<T>,\n): Promise<T> {\n setGlobalFlagOverrides(overrides);\n\n return withEvalContext({ initialFlags: overrides }, async () => {\n // TODO: is this necessary? given the `setGlobalFlagOverrides` call above?\n if (Object.keys(overrides).length > 0) {\n overrideFlags(overrides);\n }\n\n return runFn();\n });\n}\n","/**\n * Simple glob detection utility\n * Detects if a string contains glob pattern characters\n */\nexport function isGlob(str: string): boolean {\n // Check for glob characters: * ? [ ] { } !\n return /[*?[\\]{}!]/.test(str);\n}\n","import { loadConfig as c12LoadConfig } from 'c12';\nimport { defu } from 'defu';\nimport {\n createPartialDefaults,\n validateConfig,\n type AxiomConfig,\n type ResolvedAxiomConfig,\n} from './index';\nimport { AxiomCLIError, errorToString } from '../util/errors';\n\n/**\n * Custom merger that uses defu but overrides include/exclude arrays instead of merging them\n */\nfunction customMerger(target: any, source: any): any {\n const merged = defu(source, target);\n\n // If source explicitly has eval.include, override it instead of merging\n if (source?.eval && 'include' in source.eval) {\n merged.eval.include = source.eval.include;\n }\n\n // If source explicitly has eval.flagSchema, use it directly (defu mangles Zod objects)\n if (source?.eval && 'flagSchema' in source.eval) {\n merged.eval.flagSchema = source.eval.flagSchema;\n }\n\n return merged;\n}\n\n/**\n * Result of loading a config file\n */\nexport interface LoadConfigResult {\n config: ResolvedAxiomConfig;\n}\n\n/**\n * Load Axiom configuration from axiom.config.ts (or .js, .mjs, etc.)\n *\n * @param cwd - The directory to search for config file (defaults to process.cwd())\n * @returns The loaded config and the path to the config file (if found)\n *\n * @example\n * ```typescript\n * const { config } = await loadConfig();\n * ```\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<LoadConfigResult> {\n try {\n const defaults = createPartialDefaults();\n\n const result = await c12LoadConfig<AxiomConfig>({\n name: 'axiom',\n cwd,\n // Support common config file extensions\n configFile: 'axiom.config',\n // Don't use defaultConfig - we'll merge manually to control array behavior\n // Disable configs other than .ts/.js/.mts/.mjs/.cts/.cjs\n rcFile: false,\n globalRc: false,\n packageJson: false,\n giget: false,\n });\n\n // Manually merge with defaults, overriding `include` instead of merging\n const mergedConfig = customMerger(defaults, result.config);\n const validatedConfig = validateConfig(mergedConfig);\n\n return {\n config: validatedConfig,\n };\n } catch (error) {\n if (error instanceof AxiomCLIError) {\n throw error;\n }\n // c12 throws if config file has errors\n throw new AxiomCLIError(`Failed to load config file: ${errorToString(error)}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAsD;AAEtD,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AASxB,IAAM,UAAU;AAChB,IAAM,YAAY;AAElB,SAAS,6BACP,UACA,OACA,WACA,UACM;AACN,MAAI,UAAU,UAAa,cAAc,QAAW;AAClD,QACE,aAAa,UACb,CAAC,UAAU,WAAW,GAAG,KACzB,cAAc,UACd,cAAc,SACd;AACA,cAAQ,MAAM,iCAA4B,QAAQ,IAAI,SAAS,EAAE;AACjE,cAAQ,MAAM,yBAAkB,QAAQ,IAAI,SAAS,EAAE;AACvD,cAAQ,KAAK,CAAC;AAAA,IAChB,WAAW,aAAa,YAAY,CAAC,UAAU,WAAW,GAAG,GAAG;AAC9D,cAAQ,MAAM,yCAAoC,SAAS,EAAE;AAC7D,cAAQ,MAAM,iCAA0B,SAAS,EAAE;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AA2DO,SAAS,4BACd,WACA,YACsB;AAEtB,MAAI,CAAC,cAAc,OAAO,KAAK,SAAS,EAAE,WAAW,GAAG;AACtD,WAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,EACrC;AAEA,cAAY,YAAY,YAAY;AAEpC,QAAM,SAAS;AACf,QAAM,SAAgC,CAAC;AAGvC,aAAW,WAAW,OAAO,KAAK,SAAS,GAAG;AAC5C,UAAM,WAAW,UAAU,OAAO;AAClC,QAAI,CAAC,YAAY,QAAQ,QAAQ,GAAG;AAClC,aAAO,KAAK,EAAE,MAAM,gBAAgB,MAAM,QAAQ,CAAC;AAAA,IACrD;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,SAAS,OAAO,OAAO;AAAA,EAClC;AAIA,QAAM,eAAe,oBAAoB,SAAS;AAClD,QAAM,oBAAoB,gBAAgB,MAAM;AAChD,QAAM,SAAS,kBAAkB,UAAU,YAAY;AAEvD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,KAAK,EAAE,MAAM,iBAAiB,UAAU,OAAO,MAAM,CAAC;AAAA,EAC/D;AAEA,SAAO,EAAE,SAAS,OAAO,WAAW,GAAG,OAAO;AAChD;AAKO,SAAS,iCAAiC,QAAsC;AACrF,UAAQ,MAAM,2BAAsB;AAEpC,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,gBAAgB;AACjC,cAAQ,MAAM,kBAAa,MAAM,IAAI,sBAAsB;AAAA,IAC7D,OAAO;AACL,cAAQ,MAAM,gBAAgB,MAAM,QAAQ,CAAC;AAE7C,YAAM,WAAW,qBAAqB,MAAM,QAAQ;AACpD,UAAI,SAAS,SAAS,GAAG;AACvB,gBAAQ,MAAM,6BAAsB;AACpC,iBAAS,QAAQ,CAAC,YAAY,QAAQ,MAAM,KAAK,OAAO,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,KAAK,CAAC;AAChB;AAUO,SAAS,sBAAsB,WAA0B,YAA4B;AAC1F,QAAM,SAAS,4BAA4B,WAAW,UAAU;AAChE,MAAI,CAAC,OAAO,SAAS;AACnB,qCAAiC,OAAO,MAAM;AAAA,EAChD;AACF;AAMA,SAAS,YAAY,KAAkB;AAErC,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,QAAS,QAAO;AAG5B,QAAM,MAAM,OAAO,GAAG;AACtB,MAAI,CAAC,OAAO,MAAM,GAAG,KAAK,IAAI,KAAK,MAAM,IAAI,SAAS,GAAG;AACvD,WAAO;AAAA,EACT;AAGA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,eAAe,MAAmB;AACzC,QAAM,MAAM,QAAQ,QAAQ,IAAI,GAAG,IAAI;AACvC,MAAI;AACF,UAAM,WAAW,aAAa,KAAK,MAAM;AACzC,UAAM,SAAS,KAAK,MAAM,QAAQ;AAElC,QAAI,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,KAAK,WAAW,MAAM;AAC1E,cAAQ;AAAA,QACN,kDAA6C,MAAM,QAAQ,MAAM,IAAI,UAAU,OAAO,MAAM;AAAA,MAC9F;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,WAAO;AAAA,EACT,SAAS,KAAU;AACjB,YAAQ,MAAM,gDAA2C,IAAI,MAAM,IAAI,OAAO,EAAE;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAgBO,SAAS,iBAAiB,MAG/B;AACA,QAAM,cAAwB,CAAC;AAC/B,QAAM,YAA2B,CAAC;AAClC,MAAI,aAA4B;AAChC,MAAI,cAAc;AAClB,MAAI,kBAAkB;AAEtB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,cAAc,MAAM,MAAM,SAAS;AACzC,UAAM,YAAY,MAAM,MAAM,OAAO;AAErC,QAAI,aAAa;AAEf;AACA,UAAI,kBAAkB,GAAG;AACvB,gBAAQ,MAAM,iDAA4C;AAC1D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,QAAQ,YAAY,CAAC;AAC3B,YAAM,YAAY,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;AAEtD,mCAA6B,gBAAgB,OAAO,WAAW,QAAQ;AAEvE,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,4CAAuC;AACrD,gBAAQ,MAAM,mDAA4C;AAC1D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,mBAAa;AAAA,IAGf,WAAW,WAAW;AAEpB,oBAAc;AAEd,YAAM,MAAM,UAAU,CAAC;AACvB,YAAM,QAAQ,UAAU,CAAC;AACzB,YAAM,YAAY,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;AAEtD,mCAA6B,KAAK,OAAO,WAAW,MAAM;AAG1D,YAAM,aAAa,UAAU,SAAY,SAAS;AAClD,gBAAU,GAAG,IAAI,YAAY,UAAU;AAAA,IAGzC,OAAO;AACL,kBAAY,KAAK,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,cAAc,aAAa;AAC7B,YAAQ,MAAM,wEAAmE;AACjF,YAAQ,MAAM,sBAAsB;AACpC,YAAQ,MAAM,oDAA+C;AAC7D,YAAQ,MAAM,gEAA2D;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,YAAY;AACd,UAAM,kBAAkB,eAAe,UAAU;AACjD,WAAO,EAAE,aAAa,WAAW,gBAAgB;AAAA,EACnD;AAEA,SAAO,EAAE,aAAa,UAAU;AAClC;;;ACjTA,IAAI,IAAI;AAAA,EACN,OAAO,CAAC,GAAG,CAAC;AAAA,EACZ,MAAM,CAAC,GAAG,IAAI,iBAAiB;AAAA,EAC/B,KAAK,CAAC,GAAG,IAAI,iBAAiB;AAAA,EAC9B,QAAQ,CAAC,GAAG,EAAE;AAAA,EACd,WAAW,CAAC,GAAG,EAAE;AAAA,EACjB,SAAS,CAAC,GAAG,EAAE;AAAA,EACf,QAAQ,CAAC,GAAG,EAAE;AAAA,EACd,eAAe,CAAC,GAAG,EAAE;AAAA,EACrB,OAAO,CAAC,IAAI,EAAE;AAAA,EACd,KAAK,CAAC,IAAI,EAAE;AAAA,EACZ,OAAO,CAAC,IAAI,EAAE;AAAA,EACd,QAAQ,CAAC,IAAI,EAAE;AAAA,EACf,MAAM,CAAC,IAAI,EAAE;AAAA,EACb,SAAS,CAAC,IAAI,EAAE;AAAA,EAChB,MAAM,CAAC,IAAI,EAAE;AAAA,EACb,OAAO,CAAC,IAAI,EAAE;AAAA,EACd,MAAM,CAAC,IAAI,EAAE;AAAA,EACb,SAAS,CAAC,IAAI,EAAE;AAAA,EAChB,OAAO,CAAC,IAAI,EAAE;AAAA,EACd,SAAS,CAAC,IAAI,EAAE;AAAA,EAChB,UAAU,CAAC,IAAI,EAAE;AAAA,EACjB,QAAQ,CAAC,IAAI,EAAE;AAAA,EACf,WAAW,CAAC,IAAI,EAAE;AAAA,EAClB,QAAQ,CAAC,IAAI,EAAE;AAAA,EACf,SAAS,CAAC,IAAI,EAAE;AAAA,EAChB,aAAa,CAAC,IAAI,EAAE;AAAA,EACpB,WAAW,CAAC,IAAI,EAAE;AAAA,EAClB,aAAa,CAAC,IAAI,EAAE;AAAA,EACpB,cAAc,CAAC,IAAI,EAAE;AAAA,EACrB,YAAY,CAAC,IAAI,EAAE;AAAA,EACnB,eAAe,CAAC,IAAI,EAAE;AAAA,EACtB,YAAY,CAAC,IAAI,EAAE;AAAA,EACnB,aAAa,CAAC,IAAI,EAAE;AAAA,EACpB,eAAe,CAAC,KAAK,EAAE;AAAA,EACvB,aAAa,CAAC,KAAK,EAAE;AAAA,EACrB,eAAe,CAAC,KAAK,EAAE;AAAA,EACvB,gBAAgB,CAAC,KAAK,EAAE;AAAA,EACxB,cAAc,CAAC,KAAK,EAAE;AAAA,EACtB,iBAAiB,CAAC,KAAK,EAAE;AAAA,EACzB,cAAc,CAAC,KAAK,EAAE;AAAA,EACtB,eAAe,CAAC,KAAK,EAAE;AACzB;AA1CA,IA0CG,IAAI,OAAO,QAAQ,CAAC;AACvB,SAAS,EAAE,GAAG;AACZ,SAAO,OAAO,CAAC;AACjB;AACA,EAAE,OAAO;AACT,EAAE,QAAQ;AAQV,SAAS,EAAE,IAAI,OAAI;AACjB,MAAI,IAAI,OAAO,WAAW,cAAc,UAAU,QAAQ,KAAK,KAAK,OAAO,SAAS,EAAE,QAAQ,CAAC,GAAG,KAAK,KAAK,OAAO,SAAS,EAAE,SAAS,CAAC;AACxI,SAAO,EAAE,cAAc,KAAK,EAAE,SAAS,YAAY,OAAO,iBAAiB,KAAK,EAAE,SAAS,SAAS,MAAM,KAAK,OAAO,SAAS,EAAE,cAAc,WAAW,KAAK,EAAE,SAAS,UAAU,QAAQ,MAAM,OAAO,UAAU,eAAe,CAAC,CAAC,OAAO;AAC7O;AACA,SAAS,EAAE,IAAI,OAAI;AACjB,MAAI,IAAI,EAAE,CAAC,GAAG,IAAI,CAACA,IAAG,GAAG,GAAG,MAAM;AAChC,QAAI,IAAI,IAAIC,KAAI;AAChB;AACE,WAAKD,GAAE,UAAUC,IAAG,CAAC,IAAI,GAAGA,KAAI,IAAI,EAAE,QAAQ,IAAID,GAAE,QAAQ,GAAGC,EAAC;AAAA,WAC3D,CAAC;AACR,WAAO,IAAID,GAAE,UAAUC,EAAC;AAAA,EAC1B,GAAG,IAAI,CAACD,IAAG,GAAG,IAAIA,OAAM;AACtB,QAAI,IAAI,CAAC,MAAM;AACb,UAAIC,KAAI,OAAO,CAAC,GAAG,IAAIA,GAAE,QAAQ,GAAGD,GAAE,MAAM;AAC5C,aAAO,CAAC,IAAIA,KAAI,EAAEC,IAAG,GAAG,GAAG,CAAC,IAAI,IAAID,KAAIC,KAAI;AAAA,IAC9C;AACA,WAAO,EAAE,OAAOD,IAAG,EAAE,QAAQ,GAAG;AAAA,EAClC,GAAGE,KAAI;AAAA,IACL,kBAAkB;AAAA,EACpB,GAAG,IAAI,CAACF,OAAM,QAAQA,EAAC;AACvB,WAAS,CAACA,IAAG,CAAC,KAAK;AACjB,IAAAE,GAAEF,EAAC,IAAI,IAAI;AAAA,MACT,EAAE,EAAE,CAAC,CAAC;AAAA,MACN,EAAE,EAAE,CAAC,CAAC;AAAA,MACN,EAAE,CAAC;AAAA,IACL,IAAI;AACN,SAAOE;AACT;;;AC5EA,SAAS,UAAU,SAAS;AAC5B,IAAI,IAAI,QAAQ,IAAI,cAAc,UAAU,EAAE,CAAC;AAO/C,IAAI,IAAI,EAAE,CAAC;;;ACfX,SAAS,SAAS,UAAU,cAAc;AAC1C,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;;;ACOnB,SAAS,cAAc,SAAoC;AAChE,QAAM,UAAU,eAAe;AAE/B,MAAI,CAAC,SAAS;AACZ,QAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,cAAQ,KAAK,oDAAoD;AAAA,IACnE;AACA;AAAA,EACF;AAGA,QAAM,iBAAiB;AAAA,IACrB,GAAG;AAAA,IACH,OAAO,EAAE,GAAG,QAAQ,OAAO,GAAG,QAAQ;AAAA;AAAA,IACtC,QAAQ;AAAA,IACR,WAAW,EAAE,GAAG,QAAQ;AAAA,EAC1B;AAGA,QAAM,aAAa,aAAa,IAAI;AACpC,MAAI,YAAY;AAEd,WAAO,OAAO,YAAY,cAAc;AAAA,EAC1C;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,cAAU,QAAQ,KAAK,KAAK;AAAA,EAC9B;AACF;;;AC1BA,eAAsB,mBACpB,WACA,OACY;AACZ,yBAAuB,SAAS;AAEhC,SAAO,gBAAgB,EAAE,cAAc,UAAU,GAAG,YAAY;AAE9D,QAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACrC,oBAAc,SAAS;AAAA,IACzB;AAEA,WAAO,MAAM;AAAA,EACf,CAAC;AACH;;;ACtBO,SAAS,OAAO,KAAsB;AAE3C,SAAO,aAAa,KAAK,GAAG;AAC9B;;;ACPA,SAAS,cAAc,qBAAqB;AAC5C,SAAS,YAAY;AAYrB,SAAS,aAAa,QAAa,QAAkB;AACnD,QAAM,SAAS,KAAK,QAAQ,MAAM;AAGlC,MAAI,QAAQ,QAAQ,aAAa,OAAO,MAAM;AAC5C,WAAO,KAAK,UAAU,OAAO,KAAK;AAAA,EACpC;AAGA,MAAI,QAAQ,QAAQ,gBAAgB,OAAO,MAAM;AAC/C,WAAO,KAAK,aAAa,OAAO,KAAK;AAAA,EACvC;AAEA,SAAO;AACT;AAoBA,eAAsB,WAAW,MAAc,QAAQ,IAAI,GAA8B;AACvF,MAAI;AACF,UAAM,WAAW,sBAAsB;AAEvC,UAAM,SAAS,MAAM,cAA2B;AAAA,MAC9C,MAAM;AAAA,MACN;AAAA;AAAA,MAEA,YAAY;AAAA;AAAA;AAAA,MAGZ,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AAGD,UAAM,eAAe,aAAa,UAAU,OAAO,MAAM;AACzD,UAAM,kBAAkB,eAAe,YAAY;AAEnD,WAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,eAAe;AAClC,YAAM;AAAA,IACR;AAEA,UAAM,IAAI,cAAc,+BAA+B,cAAc,KAAK,CAAC,EAAE;AAAA,EAC/E;AACF;;;AJnEA,IAAM,cAAc,eAAe,wCAAwC,EAAE;AAG7E,IAAI;AACG,SAAS,gBAAoC;AAClD,SAAO;AACT;AAIA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,cAAc,eAAe;AACnC,SAAO,aAAa,SAAS,QAAQ,IAAI;AAC3C;AAKA,SAAS,cAAc,OAAwB;AAC7C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,cAAc,eAAe;AACnC,SAAO,aAAa,OAAO,QAAQ,IAAI,aAAa;AACtD;AAKA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,cAAc,eAAe;AACnC,SAAO,aAAa,SAAS,QAAQ,IAAI;AAC3C;AAEO,IAAM,kBAAkB,CAAC,SAAkB,gBAA+B,CAAC,MAAM;AACtF,SAAO,QAAQ;AAAA,IACb,IAAI,QAAQ,MAAM,EACf,YAAY,mBAAmB,EAC/B;AAAA,MACC,IAAI,SAAS,YAAY,6CAA6C,EAAE;AAAA,QACtE;AAAA,QACA;AAAA,MACF;AAAA,IACF,EACC,OAAO,oBAAoB,6CAA6C,KAAK,EAC7E,OAAO,uBAAuB,eAAe,eAAe,EAC5D,OAAO,2BAA2B,oBAAoB,EACtD,OAAO,yBAAyB,aAAa,aAAa,EAC1D,OAAO,yBAAyB,yBAAyB,eAAe,EACxE,OAAO,gCAAgC,8CAA8C,EACrF,OAAO,WAAW,8CAA8C,KAAK,EACrE,OAAO,UAAU,wDAAwD,KAAK,EAE9E,UAAU,IAAI,OAAO,2BAA2B,sBAAsB,EAAE,SAAS,CAAC,EAClF,OAAO,OAAO,QAAgB,YAAY;AACzC,UAAI;AAEF,YAAI,QAAQ,OAAO;AACjB,kBAAQ,IAAI,cAAc;AAAA,QAC5B;AAEA,YAAI,UAAoB,CAAC;AACzB,YAAI;AACJ,YAAI;AAEJ,cAAM,gBAAgB,OAAO,MAAM;AAGnC,cAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,WAAW,GAAG;AAGrD,8BAAsB,eAAe,aAAa,KAAK,UAAU;AAGjE,cAAM,SAAS;AAAA,UACb,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,GAAG,aAAa;AAAA,YAChB,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,YAC5C,GAAI,QAAQ,OAAO,EAAE,KAAK,QAAQ,IAAI;AAAA,YACtC,GAAI,QAAQ,WAAW,EAAE,SAAS,QAAQ,QAAQ;AAAA,YAClD,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,UAC9C;AAAA,QACF;AAEA,YAAI,eAAe;AAEjB,oBAAU,CAAC,MAAM;AAAA,QACnB,OAAO;AACL,cAAI;AAEF,kBAAM,OAAO,UAAU,MAAM;AAC7B,gBAAI,KAAK,YAAY,GAAG;AACtB,wBAAU,QAAQ,MAAM,WAAW,CAAC;AAAA,YACtC,OAAO;AAEL,wBAAU,CAAC,MAAM;AAAA,YACnB;AAAA,UACF,QAAQ;AAEN,8BAAkB,IAAI,OAAO,QAAQ,GAAG;AAExC,sBAAU,QAAQ,MAAM,WAAW,CAAC;AAAA,UACtC;AAAA,QACF;AAEA,kBAAU,QAAQ,MAAM;AAExB,YAAI,CAAC,QAAQ,MAAM,iBAAiB;AAClC,kBAAQ;AAAA,YACN,EAAE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AACA,kBAAQ,IAAI,EAAE;AAAA,QAChB;AAEA,cAAM,QAAQ,YAAY;AAE1B,qBAAa,QAAQ;AAGrB,YAAI;AACJ,YAAI;AACF,4BAAkB,MAAM,OAAO,0BAAwB;AAAA,QACzD,SAAS,KAAc;AACrB,cACE,OACA,OAAO,QAAQ,YACf,UAAU,QACT,IAAI,SAAS,0BAA0B,IAAI,SAAS,qBACrD;AACA,kBAAM,IAAI,cAAc,wBAAwB;AAAA,UAClD;AACA,gBAAM;AAAA,QACR;AACA,cAAM,EAAE,UAAU,IAAI;AAEtB,cAAM,mBAAmB,eAAe,YAAY;AAClD,iBAAO,UAAU,KAAK;AAAA,YACpB,OAAO,QAAQ;AAAA,YACf,UAAU,QAAQ;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO,QAAQ;AAAA,YACf,MAAM,QAAQ;AAAA,YACd,WAAW;AAAA,YACX;AAAA,YACA;AAAA,YACA,YAAY,QAAQ;AAAA,UACtB,CAAC;AAAA,QACH,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,iBAAiB,eAAe;AAClC,kBAAQ,MAAM;AAAA,SAAO,MAAM,OAAO;AAAA,CAAI;AACtC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACL;AACF;","names":["r","s","u"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/utils/parse-flag-overrides.ts","../../../node_modules/.pnpm/tinyrainbow@2.0.0/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.js","../../../node_modules/.pnpm/tinyrainbow@2.0.0/node_modules/tinyrainbow/dist/node.js","../src/cli/commands/eval.command.ts","../src/context.ts","../src/cli/utils/eval-context-runner.ts","../src/cli/utils/glob-utils.ts","../src/config/loader.ts"],"sourcesContent":["import { type ZodError, type ZodObject, type z } from 'zod';\nimport { formatZodErrors, generateFlagExamples } from './format-zod-errors.js';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { dotNotationToNested, isValidPath, parsePath } from '../../util/dot-path.js';\nimport { makeDeepPartial } from '../../util/deep-partial-schema.js';\nimport { assertZodV4 } from '../../util/zod-internals.js';\n\nexport interface FlagOverrides {\n [key: string]: any;\n}\n\nconst FLAG_RE = /^--flag\\.([^=]+)(?:=(.*))?$/;\nconst CONFIG_RE = /^--flags-config(?:=(.*))?$/;\n\nfunction ensureNoSpaceSeparatedSyntax(\n flagName: string,\n value: string | undefined,\n nextToken: string | undefined,\n flagType: 'flag' | 'config',\n): void {\n if (value === undefined && nextToken !== undefined) {\n if (\n flagType === 'flag' &&\n !nextToken.startsWith('-') &&\n nextToken !== 'true' &&\n nextToken !== 'false'\n ) {\n console.error(`❌ Invalid syntax: --flag.${flagName} ${nextToken}`);\n console.error(`💡 Use: --flag.${flagName}=${nextToken}`);\n process.exit(1);\n } else if (flagType === 'config' && !nextToken.startsWith('-')) {\n console.error(`❌ Invalid syntax: --flags-config ${nextToken}`);\n console.error(`💡 Use: --flags-config=${nextToken}`);\n process.exit(1);\n }\n }\n}\n\n/**\n * Extract and validate flag overrides using a Zod schema\n */\nexport function extractAndValidateFlagOverrides<S extends z.ZodObject<any>>(\n argv: string[],\n flagSchema?: S,\n): {\n cleanedArgv: string[];\n overrides: S extends ZodObject<any> ? z.output<S> : FlagOverrides;\n} {\n if (flagSchema) {\n assertZodV4(flagSchema, 'flagSchema');\n }\n\n const { cleanedArgv, overrides } = extractOverrides(argv);\n\n if (flagSchema && Object.keys(overrides).length > 0) {\n // Use deep partial schema - allows partial nested objects\n const deepPartialSchema = makeDeepPartial(flagSchema as ZodObject<any>);\n const result = deepPartialSchema.safeParse(overrides);\n\n if (!result.success) {\n console.error('❌ Invalid flags:');\n console.error(formatZodErrors(result.error));\n\n const examples = generateFlagExamples(result.error);\n if (examples.length > 0) {\n console.error('\\n💡 Examples:');\n examples.forEach((example) => console.error(` ${example}`));\n }\n\n process.exit(1);\n }\n\n return { cleanedArgv, overrides: result.data as any };\n }\n\n return { cleanedArgv, overrides: overrides as any };\n}\n\nexport type FlagValidationError =\n | { type: 'invalid_path'; path: string }\n | { type: 'invalid_value'; zodError: ZodError };\n\nexport interface FlagValidationResult {\n success: boolean;\n errors: FlagValidationError[];\n}\n\n/**\n * Validate already-parsed flag overrides against a Zod schema.\n * Returns validation result without side effects (no console output, no process.exit).\n *\n * @param overrides - Flag overrides in dot-notation form (e.g., { 'model.temperature': 0.7 })\n * @param flagSchema - Zod schema to validate against\n * @returns Validation result with any errors found\n */\nexport function collectFlagValidationErrors(\n overrides: FlagOverrides,\n flagSchema?: unknown,\n): FlagValidationResult {\n // No schema provided = no validation, any flags allowed\n if (!flagSchema || Object.keys(overrides).length === 0) {\n return { success: true, errors: [] };\n }\n\n assertZodV4(flagSchema, 'flagSchema');\n\n const schema = flagSchema as any;\n const errors: FlagValidationError[] = [];\n\n // First pass: check all paths exist in schema\n for (const dotPath of Object.keys(overrides)) {\n const segments = parsePath(dotPath);\n if (!isValidPath(schema, segments)) {\n errors.push({ type: 'invalid_path', path: dotPath });\n }\n }\n\n // If there are invalid paths, don't proceed to value validation\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n // Second pass: validate values using nested object approach with deep partial\n // This allows providing only some flags without requiring all nested objects\n const nestedObject = dotNotationToNested(overrides);\n const deepPartialSchema = makeDeepPartial(schema);\n const result = deepPartialSchema.safeParse(nestedObject);\n\n if (!result.success) {\n errors.push({ type: 'invalid_value', zodError: result.error });\n }\n\n return { success: errors.length === 0, errors };\n}\n\n/**\n * Print flag validation errors to console and exit.\n */\nexport function printFlagValidationErrorsAndExit(errors: FlagValidationError[]): never {\n console.error('❌ Invalid CLI flags:');\n\n for (const error of errors) {\n if (error.type === 'invalid_path') {\n console.error(` • flag '${error.path}': Invalid flag path`);\n } else {\n console.error(formatZodErrors(error.zodError));\n\n const examples = generateFlagExamples(error.zodError);\n if (examples.length > 0) {\n console.error('\\n💡 Valid examples:');\n examples.forEach((example) => console.error(` ${example}`));\n }\n }\n }\n\n process.exit(1);\n}\n\n/**\n * Validate already-parsed flag overrides against a Zod schema.\n * Use this when you have flag overrides in dot-notation form (e.g., { 'model.temperature': 0.7 })\n * and want to validate them against a schema before running evals.\n *\n * @param overrides - Flag overrides in dot-notation form\n * @param flagSchema - Zod schema to validate against\n */\nexport function validateFlagOverrides(overrides: FlagOverrides, flagSchema?: unknown): void {\n const result = collectFlagValidationErrors(overrides, flagSchema);\n if (!result.success) {\n printFlagValidationErrorsAndExit(result.errors);\n }\n}\n\n/**\n * Coerce string values to appropriate types.\n * Priority: boolean -> number -> JSON -> string\n */\nfunction coerceValue(raw: string): any {\n // Handle explicit boolean strings\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n\n // Try number conversion\n const num = Number(raw);\n if (!Number.isNaN(num) && raw.trim() === num.toString()) {\n return num;\n }\n\n // Try JSON parsing (for objects/arrays)\n try {\n return JSON.parse(raw);\n } catch {\n // Fallback to string\n return raw;\n }\n}\n\n/**\n * Load and parse a JSON config file\n */\nfunction loadConfigFile(path: string): any {\n const abs = resolve(process.cwd(), path);\n try {\n const contents = readFileSync(abs, 'utf8');\n const parsed = JSON.parse(contents);\n\n if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) {\n console.error(\n `❌ Flags config must be a JSON object, got ${Array.isArray(parsed) ? 'array' : typeof parsed}`,\n );\n process.exit(1);\n }\n\n return parsed;\n } catch (err: any) {\n console.error(`❌ Could not read or parse flags config \"${path}\": ${err.message}`);\n process.exit(1);\n }\n}\n\n/**\n * Extract flag overrides with support for both CLI flags and config files.\n *\n * Supports CLI flags:\n * - --flag.temperature=0.9\n * - --flag.dryRun=true | false\n * - --flag.foo={\"bar\":1} (JSON literal)\n * - --flag.bare (interpreted as true)\n *\n * Or config file:\n * - --flags-config=path/to/config.json\n *\n * Enforces exclusive mode - cannot use both --flags-config and --flag.* together.\n */\nexport function extractOverrides(argv: string[]): {\n cleanedArgv: string[];\n overrides: FlagOverrides;\n} {\n const cleanedArgv: string[] = [];\n const overrides: FlagOverrides = {};\n let configPath: string | null = null;\n let hasCliFlags = false;\n let configPathCount = 0;\n\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i];\n const configMatch = token.match(CONFIG_RE);\n const flagMatch = token.match(FLAG_RE);\n\n if (configMatch) {\n // Handle --flags-config\n configPathCount++;\n if (configPathCount > 1) {\n console.error('❌ Only one --flags-config can be supplied.');\n process.exit(1);\n }\n\n const value = configMatch[1]; // undefined means no equals sign\n const nextToken = argv.length > i + 1 ? argv[i + 1] : undefined;\n\n ensureNoSpaceSeparatedSyntax('flags-config', value, nextToken, 'config');\n\n if (!value) {\n console.error('❌ --flags-config requires a file path');\n console.error('💡 Use: --flags-config=path/to/config.json');\n process.exit(1);\n }\n\n configPath = value;\n\n // Don't add to cleanedArgv\n } else if (flagMatch) {\n // Handle --flag.*\n hasCliFlags = true;\n\n const key = flagMatch[1];\n const value = flagMatch[2]; // undefined means bare flag (boolean true)\n const nextToken = argv.length > i + 1 ? argv[i + 1] : undefined;\n\n ensureNoSpaceSeparatedSyntax(key, value, nextToken, 'flag');\n\n // If no value, treat as boolean true\n const finalValue = value === undefined ? 'true' : value;\n overrides[key] = coerceValue(finalValue);\n\n // Don't add to cleanedArgv\n } else {\n cleanedArgv.push(token);\n }\n }\n\n if (configPath && hasCliFlags) {\n console.error('❌ Cannot use both --flags-config and --flag.* arguments together.');\n console.error('Choose one approach:');\n console.error(' • Config file: --flags-config=my-flags.json');\n console.error(' • CLI flags: --flag.temperature=0.9 --flag.model=gpt-4o');\n process.exit(1);\n }\n\n if (configPath) {\n const configOverrides = loadConfigFile(configPath);\n return { cleanedArgv, overrides: configOverrides };\n }\n\n return { cleanedArgv, overrides };\n}\n","// src/index.ts\nvar f = {\n reset: [0, 0],\n bold: [1, 22, \"\\x1B[22m\\x1B[1m\"],\n dim: [2, 22, \"\\x1B[22m\\x1B[2m\"],\n italic: [3, 23],\n underline: [4, 24],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n black: [30, 39],\n red: [31, 39],\n green: [32, 39],\n yellow: [33, 39],\n blue: [34, 39],\n magenta: [35, 39],\n cyan: [36, 39],\n white: [37, 39],\n gray: [90, 39],\n bgBlack: [40, 49],\n bgRed: [41, 49],\n bgGreen: [42, 49],\n bgYellow: [43, 49],\n bgBlue: [44, 49],\n bgMagenta: [45, 49],\n bgCyan: [46, 49],\n bgWhite: [47, 49],\n blackBright: [90, 39],\n redBright: [91, 39],\n greenBright: [92, 39],\n yellowBright: [93, 39],\n blueBright: [94, 39],\n magentaBright: [95, 39],\n cyanBright: [96, 39],\n whiteBright: [97, 39],\n bgBlackBright: [100, 49],\n bgRedBright: [101, 49],\n bgGreenBright: [102, 49],\n bgYellowBright: [103, 49],\n bgBlueBright: [104, 49],\n bgMagentaBright: [105, 49],\n bgCyanBright: [106, 49],\n bgWhiteBright: [107, 49]\n}, h = Object.entries(f);\nfunction a(n) {\n return String(n);\n}\na.open = \"\";\na.close = \"\";\nvar B = /* @__PURE__ */ h.reduce(\n (n, [e]) => (n[e] = a, n),\n { isColorSupported: !1 }\n);\nfunction m() {\n return { ...B };\n}\nfunction C(n = !1) {\n let e = typeof process != \"undefined\" ? process : void 0, i = (e == null ? void 0 : e.env) || {}, g = (e == null ? void 0 : e.argv) || [];\n return !(\"NO_COLOR\" in i || g.includes(\"--no-color\")) && (\"FORCE_COLOR\" in i || g.includes(\"--color\") || (e == null ? void 0 : e.platform) === \"win32\" || n && i.TERM !== \"dumb\" || \"CI\" in i) || typeof window != \"undefined\" && !!window.chrome;\n}\nfunction p(n = !1) {\n let e = C(n), i = (r, t, c, o) => {\n let l = \"\", s = 0;\n do\n l += r.substring(s, o) + c, s = o + t.length, o = r.indexOf(t, s);\n while (~o);\n return l + r.substring(s);\n }, g = (r, t, c = r) => {\n let o = (l) => {\n let s = String(l), b = s.indexOf(t, r.length);\n return ~b ? r + i(s, t, c, b) + t : r + s + t;\n };\n return o.open = r, o.close = t, o;\n }, u = {\n isColorSupported: e\n }, d = (r) => `\\x1B[${r}m`;\n for (let [r, t] of h)\n u[r] = e ? g(\n d(t[0]),\n d(t[1]),\n t[2]\n ) : a;\n return u;\n}\n\nexport {\n m as a,\n C as b,\n p as c\n};\n","import {\n a as e,\n b as t,\n c as o\n} from \"./chunk-BVHSVHOK.js\";\n\n// src/node.ts\nimport { isatty as s } from \"tty\";\nvar r = process.env.FORCE_TTY !== void 0 || s(1);\nfunction n() {\n return t(r);\n}\nfunction a() {\n return o(r);\n}\nvar u = o(r);\nexport {\n a as createColors,\n u as default,\n e as getDefaultColors,\n n as isSupported\n};\n","import { Command, Argument, Option } from 'commander';\nimport { customAlphabet } from 'nanoid';\nimport { lstatSync } from 'node:fs';\nimport { runEvalWithContext } from '../utils/eval-context-runner';\nimport { validateFlagOverrides, type FlagOverrides } from '../utils/parse-flag-overrides';\nimport { isGlob } from '../utils/glob-utils';\nimport { loadConfig } from '../../config/loader';\nimport { AxiomCLIError } from '../../util/errors';\nimport { getAuthContext } from '../auth/global-auth';\nimport c from 'tinyrainbow';\n\nconst createRunId = customAlphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 10);\n\n// Module-level storage for console URL override\nlet consoleUrl: string | undefined;\nexport function getConsoleUrl(): string | undefined {\n return consoleUrl;\n}\n/**\n * Gets default token from auth context or falls back to env var\n */\nfunction getDefaultToken(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n const authContext = getAuthContext();\n return authContext?.token || process.env.AXIOM_TOKEN;\n}\n\n/**\n * Gets default URL from auth context or falls back to env var\n */\nfunction getDefaultUrl(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n const authContext = getAuthContext();\n return authContext?.url || process.env.AXIOM_URL || 'https://api.axiom.co';\n}\n\n/**\n * Gets default organization id from auth context or falls back to env var\n */\nfunction getDefaultOrgId(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n const authContext = getAuthContext();\n return authContext?.orgId ?? process.env.AXIOM_ORG_ID;\n}\n\nexport const loadEvalCommand = (program: Command, flagOverrides: FlagOverrides = {}) => {\n return program.addCommand(\n new Command('eval')\n .description('run evals locally')\n .addArgument(\n new Argument('[target]', 'file, directory, glob pattern, or eval name').default(\n '.',\n 'any *.eval.ts file in current directory',\n ),\n )\n .option('-w, --watch true', 'keep server running and watch for changes', false)\n .option('-t, --token <TOKEN>', 'axiom token', getDefaultToken)\n .option('-d, --dataset <DATASET>', 'axiom dataset name')\n .option('-u, --url <AXIOM URL>', 'axiom url', getDefaultUrl)\n .option('-o, --org-id <ORG ID>', 'axiom organization id', getDefaultOrgId)\n .option('-b, --baseline <BASELINE ID>', 'id of baseline evaluation to compare against')\n .option('--debug', 'run locally without any network operations', false)\n .option('--list', 'list evaluations and test cases without running them', false)\n /** Hides the option from the help output, but still allows it to be passed */\n .addOption(new Option('-c, --console-url <URL>', 'console url override').hideHelp())\n .action(async (target: string, options) => {\n try {\n // Propagate debug mode to processes that we can't reach otherwise (e.g., reporter, app instrumentation)\n if (options.debug) {\n process.env.AXIOM_DEBUG = 'true';\n }\n\n let include: string[] = [];\n let exclude: string[] | undefined;\n let testNamePattern: RegExp | undefined;\n\n const isGlobPattern = isGlob(target);\n\n // Load config file first to get defaults\n const { config: loadedConfig, configPath } = await loadConfig('.');\n\n // Validate CLI flags against schema\n validateFlagOverrides(flagOverrides, loadedConfig.eval.flagSchema);\n\n // Override config with CLI options if provided\n const config = {\n ...loadedConfig,\n eval: {\n ...loadedConfig.eval,\n ...(options.token && { token: options.token }),\n ...(options.url && { url: options.url }),\n ...(options.dataset && { dataset: options.dataset }),\n ...(options.orgId && { orgId: options.orgId }),\n },\n };\n\n if (isGlobPattern) {\n // Handle glob patterns like \"**/*.eval.ts\" or \"**/my-feature/*\"\n include = [target];\n } else {\n try {\n // Try to treat as file/directory path\n const stat = lstatSync(target);\n if (stat.isDirectory()) {\n include = config?.eval?.include || [];\n } else {\n // Single file\n include = [target];\n }\n } catch {\n // Path doesn't exist, treat as eval name\n testNamePattern = new RegExp(target, 'i');\n // Use config include patterns when searching by name\n include = config?.eval?.include || [];\n }\n }\n\n exclude = config?.eval?.exclude;\n\n if (!config?.eval?.instrumentation) {\n console.warn(\n c.yellow(\n '⚠ App instrumentation (`eval.instrumentation` in `axiom.config.ts`) not configured. Using default provider.',\n ),\n );\n console.log('');\n }\n\n const runId = createRunId();\n\n consoleUrl = options.consoleUrl;\n\n // Dynamic import to avoid loading vitest at CLI startup (breaks `npx axiom login`)\n let runVitestModule;\n try {\n runVitestModule = await import('../../evals/run-vitest');\n } catch (err: unknown) {\n if (\n err &&\n typeof err === 'object' &&\n 'code' in err &&\n (err.code === 'ERR_MODULE_NOT_FOUND' || err.code === 'MODULE_NOT_FOUND')\n ) {\n throw new AxiomCLIError('Failed to load vitest.');\n }\n throw err;\n }\n const { runVitest } = runVitestModule;\n\n await runEvalWithContext(flagOverrides, async () => {\n return runVitest('.', {\n watch: options.watch,\n baseline: options.baseline,\n include,\n exclude,\n testNamePattern,\n debug: options.debug,\n list: options.list,\n overrides: flagOverrides,\n config,\n configPath,\n runId,\n consoleUrl: options.consoleUrl,\n });\n });\n } catch (error) {\n if (error instanceof AxiomCLIError) {\n console.error(`\\n❌ ${error.message}\\n`);\n process.exit(1);\n }\n throw error;\n }\n }),\n );\n};\n","import { getEvalContext, putOnSpan, EVAL_CONTEXT } from './evals/context/storage';\n\n/**\n * Override flag values for the current evaluation context with trace-specific isolation.\n * Now creates overlay contexts to prevent overrides from leaking to sibling operations.\n *\n * @internal - For framework use only. Use scope.overrideFlags() for typed flag access.\n * @param partial - Partial flag overrides\n */\nexport function overrideFlags(partial: Record<string, any>): void {\n const current = getEvalContext();\n\n if (!current) {\n if (process.env.NODE_ENV !== 'test') {\n console.warn('overrideFlags called outside of evaluation context');\n }\n return;\n }\n\n // Create overlay context instead of mutating the current one\n const overlayContext = {\n ...current,\n flags: { ...current.flags, ...partial }, // Merge for backwards compatibility\n parent: current,\n overrides: { ...partial },\n };\n\n // We need to update the current ALS context in place\n const currentCtx = EVAL_CONTEXT.get();\n if (currentCtx) {\n // Update current context to overlay\n Object.assign(currentCtx, overlayContext);\n }\n\n // Write all overridden flags to span\n for (const [key, value] of Object.entries(partial)) {\n putOnSpan('flag', key, value);\n }\n}\n","import { overrideFlags } from '../../context';\nimport { withEvalContext } from '../../evals/context/storage';\nimport { setGlobalFlagOverrides } from '../../evals/context/global-flags';\nimport type { FlagOverrides } from './parse-flag-overrides';\n\n/**\n * Run evaluation with flag overrides applied to the context.\n * This ensures flag overrides are established before any test files load.\n *\n * @param overrides - Flag overrides from CLI parsing\n * @param runFn - Function that runs the evaluation (typically runVitest)\n */\nexport async function runEvalWithContext<T>(\n overrides: FlagOverrides,\n runFn: () => Promise<T>,\n): Promise<T> {\n setGlobalFlagOverrides(overrides);\n\n return withEvalContext({ initialFlags: overrides }, async () => {\n // TODO: is this necessary? given the `setGlobalFlagOverrides` call above?\n if (Object.keys(overrides).length > 0) {\n overrideFlags(overrides);\n }\n\n return runFn();\n });\n}\n","/**\n * Simple glob detection utility\n * Detects if a string contains glob pattern characters\n */\nexport function isGlob(str: string): boolean {\n // Check for glob characters: * ? [ ] { } !\n return /[*?[\\]{}!]/.test(str);\n}\n","import { loadConfig as c12LoadConfig } from 'c12';\nimport { defu } from 'defu';\nimport {\n createPartialDefaults,\n validateConfig,\n type AxiomConfig,\n type ResolvedAxiomConfig,\n} from './index';\nimport { AxiomCLIError, errorToString } from '../util/errors';\n\n/**\n * Custom merger that uses defu but overrides include/exclude arrays instead of merging them\n */\nfunction customMerger(target: any, source: any): any {\n const merged = defu(source, target);\n\n // If source explicitly has eval.include, override it instead of merging\n if (source?.eval && 'include' in source.eval) {\n merged.eval.include = source.eval.include;\n }\n\n // If source explicitly has eval.flagSchema, use it directly (defu mangles Zod objects)\n if (source?.eval && 'flagSchema' in source.eval) {\n merged.eval.flagSchema = source.eval.flagSchema;\n }\n\n return merged;\n}\n\n/**\n * Result of loading a config file\n */\nexport interface LoadConfigResult {\n config: ResolvedAxiomConfig;\n configPath?: string;\n}\n\n/**\n * Load Axiom configuration from axiom.config.ts (or .js, .mjs, etc.)\n *\n * @param cwd - The directory to search for config file (defaults to process.cwd())\n * @returns The loaded config and the path to the config file (if found)\n *\n * @example\n * ```typescript\n * const { config } = await loadConfig();\n * ```\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<LoadConfigResult> {\n try {\n const defaults = createPartialDefaults();\n\n const result = await c12LoadConfig<AxiomConfig>({\n name: 'axiom',\n cwd,\n // Support common config file extensions\n configFile: 'axiom.config',\n // Don't use defaultConfig - we'll merge manually to control array behavior\n // Disable configs other than .ts/.js/.mts/.mjs/.cts/.cjs\n rcFile: false,\n globalRc: false,\n packageJson: false,\n giget: false,\n });\n\n // Manually merge with defaults, overriding `include` instead of merging\n const mergedConfig = customMerger(defaults, result.config);\n const validatedConfig = validateConfig(mergedConfig);\n\n return {\n config: validatedConfig,\n configPath: result._configFile,\n };\n } catch (error) {\n if (error instanceof AxiomCLIError) {\n throw error;\n }\n // c12 throws if config file has errors\n throw new AxiomCLIError(`Failed to load config file: ${errorToString(error)}`);\n }\n}\n"],"mappings":"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","names":["r","s","u"]}
|
|
@@ -62,7 +62,7 @@ import { trace } from "@opentelemetry/api";
|
|
|
62
62
|
// package.json
|
|
63
63
|
var package_default = {
|
|
64
64
|
name: "axiom",
|
|
65
|
-
version: "0.
|
|
65
|
+
version: "0.52.0",
|
|
66
66
|
type: "module",
|
|
67
67
|
author: "Axiom, Inc.",
|
|
68
68
|
contributors: [
|
|
@@ -259,4 +259,4 @@ export {
|
|
|
259
259
|
getGlobalTracer,
|
|
260
260
|
resetAxiomAI
|
|
261
261
|
};
|
|
262
|
-
//# sourceMappingURL=chunk-
|
|
262
|
+
//# sourceMappingURL=chunk-QMM7KCYZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/otel/utils/redaction.ts","../src/otel/withSpanBaggageKey.ts","../src/otel/initAxiomAI.ts","../package.json"],"sourcesContent":["import { context, propagation, type Baggage, type Span } from '@opentelemetry/api';\nimport { WITHSPAN_REDACTION_POLICY_KEY } from '../withSpanBaggageKey';\n\ntype CaptureMessageContent = 'full' | 'off';\n\nexport type AxiomAIRedactionPolicy = {\n captureMessageContent?: CaptureMessageContent;\n mirrorToolPayloadOnToolSpan?: boolean;\n};\n\nexport const RedactionPolicy = {\n /**\n * Includes message content on chat spans, and mirrors tool\n * payload on tool spans for more convenient querying.\n */\n AxiomDefault: {\n captureMessageContent: 'full',\n mirrorToolPayloadOnToolSpan: true,\n },\n /**\n * Redacts message content on chat spans, and does not put\n * tool payload on tool spans.\n */\n OpenTelemetryDefault: {\n captureMessageContent: 'off',\n mirrorToolPayloadOnToolSpan: false,\n },\n} as const satisfies Record<string, AxiomAIRedactionPolicy>;\n\n// Global key to store redaction policy across all execution contexts\nexport const AXIOM_AI_REDACTION_KEY = Symbol.for('__axiom_ai_redaction__');\n\n/**\n * Get the globally stored redaction policy\n * @returns The global redaction policy or undefined if not set\n */\nfunction getGlobalRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n return (globalThis as any)[AXIOM_AI_REDACTION_KEY];\n}\n\n/**\n * Resolves the effective redaction policy by merging global and per-call policies.\n * Per-call policies take precedence over global policies.\n *\n * @param globalPolicy - The global redaction policy from initAxiomAI\n * @param localPolicy - The per-call redaction policy from withSpan or middleware\n * @returns The effective redaction policy with all fields resolved\n */\nfunction getEffectiveRedactionPolicy(\n globalPolicy?: AxiomAIRedactionPolicy,\n localPolicy?: AxiomAIRedactionPolicy,\n): AxiomAIRedactionPolicy {\n // Per-call policy overrides global policy, with defaults\n return {\n captureMessageContent:\n localPolicy?.captureMessageContent ??\n globalPolicy?.captureMessageContent ??\n RedactionPolicy.AxiomDefault.captureMessageContent,\n mirrorToolPayloadOnToolSpan:\n localPolicy?.mirrorToolPayloadOnToolSpan ??\n globalPolicy?.mirrorToolPayloadOnToolSpan ??\n RedactionPolicy.AxiomDefault.mirrorToolPayloadOnToolSpan,\n };\n}\n\n/**\n * Get the active redaction policy\n */\nexport function getRedactionPolicy() {\n return getEffectiveRedactionPolicy(getGlobalRedactionPolicy(), getPerCallRedactionPolicy());\n}\n\n/**\n * Conditionally sets a span attribute based on the capture message content policy.\n * When policy is 'off', the attribute is not set at all.\n *\n * @param span - The OpenTelemetry span to set the attribute on\n * @param attribute - The attribute name/key\n * @param value - The attribute value\n * @param captureMessageContent - The capture policy ('full' sets attribute, 'off' skips it)\n */\nexport function handleMaybeRedactedAttribute(\n span: Span,\n attribute: string,\n value: any,\n captureMessageContent?: CaptureMessageContent,\n): void {\n if (captureMessageContent === 'full') {\n span.setAttribute(attribute, value);\n }\n\n // For 'off', don't set the attribute at all\n // Future: Could add callback-based redaction here\n}\n\n/**\n * Extracts the per-call redaction policy from OpenTelemetry baggage context.\n * This allows middleware and tools to access redaction policies passed via withSpan.\n *\n * @returns The per-call redaction policy or undefined if not set\n */\nfunction getPerCallRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n const baggage: Baggage = propagation.getBaggage(context.active()) || propagation.createBaggage();\n const serializedPolicy = baggage.getEntry(WITHSPAN_REDACTION_POLICY_KEY)?.value;\n\n if (!serializedPolicy) {\n return undefined;\n }\n\n try {\n return JSON.parse(serializedPolicy) as AxiomAIRedactionPolicy;\n } catch (error) {\n console.warn('[AxiomAI] Failed to parse redaction policy from baggage:', error);\n return undefined;\n }\n}\n","/**\n * We need a way to know that we're inside `withSpan`\n * Because we don't own `generateText` and similar functions,\n * we use OTel Baggage to propagate this information. Another\n * consideration might be to use AsyncLocalStorage in Node and\n * some kind of KV in workerd.\n */\nexport const WITHSPAN_BAGGAGE_KEY = '__withspan_gen_ai_call';\nexport const WITHSPAN_REDACTION_POLICY_KEY = '__withspan_redaction_policy';\n","import type { Tracer } from '@opentelemetry/api';\nimport { trace } from '@opentelemetry/api';\nimport packageJson from '../../package.json';\nimport { AXIOM_AI_REDACTION_KEY, type AxiomAIRedactionPolicy } from './utils/redaction';\n\n// Global key to store tracer scope information across all execution contexts\nconst AXIOM_AI_SCOPE_KEY = Symbol.for('__axiom_ai_scope__');\n\ninterface TracerScope {\n name: string;\n version?: string;\n}\n\n/**\n * Extract scope information from a tracer, with fallback to package.json\n */\nfunction extractTracerScope(tracer: Tracer): TracerScope {\n const tracerAny = tracer as any;\n\n // Guard access to private fields with optional chaining\n // Note: These are internal OTEL fields that may change in future versions\n // _instrumentationScope is modern, instrumentationLibrary is legacy (<1.16)\n const name =\n tracerAny._instrumentationScope?.name ||\n tracerAny.instrumentationLibrary?.name ||\n packageJson.name;\n\n const version =\n tracerAny._instrumentationScope?.version ||\n tracerAny.instrumentationLibrary?.version ||\n packageJson.version;\n\n return { name, version };\n}\n\n/**\n * Register this in your `instrumentation.ts` to set up axiom.\n * This function stores the tracer's scope information globally to enable Context Propagation\n * and Instrumentation Scope. The tracer will be available across all execution contexts including Next.js.\n *\n * This function is idempotent - calling it multiple times with the same scope has no additional cost.\n *\n * @param config\n * @param config.tracer - The tracer that you are using in your application.\n * @param config.redactionPolicy - Optional redaction policy to control what data is captured in spans.\n */\nexport function initAxiomAI(config: { tracer: Tracer; redactionPolicy?: AxiomAIRedactionPolicy }) {\n const newScope = extractTracerScope(config.tracer);\n const existingScope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Check if already initialized with same scope (idempotent behavior)\n if (\n existingScope &&\n existingScope.name === newScope.name &&\n existingScope.version === newScope.version\n ) {\n return;\n }\n\n // Warn about double initialization with different scopes\n if (existingScope) {\n console.warn(\n '[AxiomAI] initAxiomAI() called multiple times with different scopes. ' +\n `Previous: ${existingScope.name}@${existingScope.version}, ` +\n `New: ${newScope.name}@${newScope.version}`,\n );\n }\n\n // Store scope information globally (works across Next.js contexts)\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = newScope;\n\n // Store redaction policy globally if provided\n if (config.redactionPolicy) {\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = config.redactionPolicy;\n }\n}\n\n/**\n * Get a tracer using the globally stored scope information\n * Fall back to package.json defaults if not set\n */\nexport function getGlobalTracer(): Tracer {\n // Get stored scope information or fall back to package defaults\n const scope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Warn if initAxiomAI was never called\n if (!scope) {\n const isDebug = process.env.AXIOM_DEBUG === 'true';\n if (!isDebug) {\n console.warn(\n '[AxiomAI] AXIOM_AI_SCOPE_KEY is undefined. This probably means that ' +\n 'initAxiomAI() was never called. ' +\n 'Make sure to call initAxiomAI({ tracer }) in your instrumentation setup.',\n );\n }\n }\n\n let { name, version } = scope || { name: packageJson.name, version: packageJson.version };\n\n if (!name || !version) {\n name = packageJson.name;\n version = packageJson.version;\n if (!name || !version) {\n name = 'axiom';\n version = 'unknown';\n }\n }\n\n // Use OpenTelemetry's standard global provider mechanism\n return trace.getTracer(name, version);\n}\n\n/**\n * Reset AxiomAI configuration (useful for testing)\n */\nexport function resetAxiomAI() {\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = undefined;\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = undefined;\n}\n","{\n \"name\": \"axiom\",\n \"version\": \"0.51.1\",\n \"type\": \"module\",\n \"author\": \"Axiom, Inc.\",\n \"contributors\": [\n \"Islam Shehata <islam@axiom.co>\",\n \"Chris Ehrlich <chris@axiom.co>\",\n \"Gabriel de Andrade <gabriel@axiom.co>\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup && chmod +x dist/bin.js && typedoc && pnpm check:vitest-entrypoints\",\n \"check:vitest-entrypoints\": \"node ./scripts/check-vitest-entrypoints.mjs\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint './**/*.{js,ts}'\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest --watch\",\n \"test:wrangler-smoke\": \"pnpm build && vitest run --config vitest.smoke.config.ts\",\n \"publint\": \"npx publint\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"bin\": {\n \"axiom\": \"./dist/bin.js\"\n },\n \"exports\": {\n \"./ai\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./ai/evals\": {\n \"types\": \"./dist/evals.d.ts\",\n \"default\": \"./dist/evals.js\"\n },\n \"./ai/evals/online\": {\n \"types\": \"./dist/evals/online.d.ts\",\n \"default\": \"./dist/evals/online.js\"\n },\n \"./ai/scorers\": {\n \"types\": \"./dist/scorers/scorers.d.ts\",\n \"default\": \"./dist/scorers/scorers.js\"\n },\n \"./ai/scorers/aggregations\": {\n \"types\": \"./dist/scorers/aggregations.d.ts\",\n \"default\": \"./dist/scorers/aggregations.js\"\n },\n \"./ai/config\": {\n \"types\": \"./dist/config.d.ts\",\n \"default\": \"./dist/config.js\"\n },\n \"./ai/feedback\": {\n \"types\": \"./dist/feedback.d.ts\",\n \"default\": \"./dist/feedback.js\"\n }\n },\n \"keywords\": [\n \"axiom\",\n \"logging\",\n \"ai\",\n \"otel\",\n \"opentelemetry\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/axiomhq/ai.git\",\n \"directory\": \"packages/ai\"\n },\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@next/env\": \"^15.4.2\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.60.1\",\n \"@opentelemetry/context-async-hooks\": \"^2.0.1\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.202.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.38.0\",\n \"@sinclair/typebox\": \"^0.34.37\",\n \"c12\": \"^3.3.3\",\n \"commander\": \"^14.0.0\",\n \"defu\": \"^6.1.4\",\n \"handlebars\": \"^4.7.8\",\n \"nanoid\": \"^5.1.5\",\n \"open\": \"^10.1.0\",\n \"vite-tsconfig-paths\": \"^5.1.4\",\n \"vitest\": \"^4.0.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"typescript\": \">=5.4\",\n \"zod\": \"^3.25.0 || ^4.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@ai-sdk/anthropicv1\": \"npm:@ai-sdk/anthropic@^1.2.12\",\n \"@ai-sdk/anthropicv2\": \"npm:@ai-sdk/anthropic@^2.0.57\",\n \"@ai-sdk/anthropicv3\": \"npm:@ai-sdk/anthropic@^3.0.9\",\n \"@ai-sdk/openaiv1\": \"npm:@ai-sdk/openai@^1.3.24\",\n \"@ai-sdk/openaiv2\": \"npm:@ai-sdk/openai@^2.0.88\",\n \"@ai-sdk/openaiv3\": \"npm:@ai-sdk/openai@^3.0.7\",\n \"@ai-sdk/providerv1\": \"npm:@ai-sdk/provider@^1.1.3\",\n \"@ai-sdk/providerv2\": \"npm:@ai-sdk/provider@^2.0.1\",\n \"@ai-sdk/providerv3\": \"npm:@ai-sdk/provider@^3.0.2\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@repo/eslint-config\": \"workspace:*\",\n \"@types/node\": \"^22.15.29\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"aiv4\": \"npm:ai@^4.3.19\",\n \"aiv5\": \"npm:ai@^5.0.118\",\n \"aiv6\": \"npm:ai@^6.0.6\",\n \"esbuild\": \"^0.25.8\",\n \"eslint\": \"catalog:\",\n \"msw\": \"^2.12.2\",\n \"prettier\": \"catalog:\",\n \"tinyrainbow\": \"^2.0.0\",\n \"tsup\": \"catalog:\",\n \"typedoc\": \"^0.28.17\",\n \"typedoc-plugin-markdown\": \"^4.10.0\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"zod\": \"catalog:\"\n },\n \"files\": [\n \"dist\"\n ],\n \"packageManager\": \"pnpm@10.16.1\"\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/otel/utils/redaction.ts","../src/otel/withSpanBaggageKey.ts","../src/otel/initAxiomAI.ts","../package.json"],"sourcesContent":["import { context, propagation, type Baggage, type Span } from '@opentelemetry/api';\nimport { WITHSPAN_REDACTION_POLICY_KEY } from '../withSpanBaggageKey';\n\ntype CaptureMessageContent = 'full' | 'off';\n\nexport type AxiomAIRedactionPolicy = {\n captureMessageContent?: CaptureMessageContent;\n mirrorToolPayloadOnToolSpan?: boolean;\n};\n\nexport const RedactionPolicy = {\n /**\n * Includes message content on chat spans, and mirrors tool\n * payload on tool spans for more convenient querying.\n */\n AxiomDefault: {\n captureMessageContent: 'full',\n mirrorToolPayloadOnToolSpan: true,\n },\n /**\n * Redacts message content on chat spans, and does not put\n * tool payload on tool spans.\n */\n OpenTelemetryDefault: {\n captureMessageContent: 'off',\n mirrorToolPayloadOnToolSpan: false,\n },\n} as const satisfies Record<string, AxiomAIRedactionPolicy>;\n\n// Global key to store redaction policy across all execution contexts\nexport const AXIOM_AI_REDACTION_KEY = Symbol.for('__axiom_ai_redaction__');\n\n/**\n * Get the globally stored redaction policy\n * @returns The global redaction policy or undefined if not set\n */\nfunction getGlobalRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n return (globalThis as any)[AXIOM_AI_REDACTION_KEY];\n}\n\n/**\n * Resolves the effective redaction policy by merging global and per-call policies.\n * Per-call policies take precedence over global policies.\n *\n * @param globalPolicy - The global redaction policy from initAxiomAI\n * @param localPolicy - The per-call redaction policy from withSpan or middleware\n * @returns The effective redaction policy with all fields resolved\n */\nfunction getEffectiveRedactionPolicy(\n globalPolicy?: AxiomAIRedactionPolicy,\n localPolicy?: AxiomAIRedactionPolicy,\n): AxiomAIRedactionPolicy {\n // Per-call policy overrides global policy, with defaults\n return {\n captureMessageContent:\n localPolicy?.captureMessageContent ??\n globalPolicy?.captureMessageContent ??\n RedactionPolicy.AxiomDefault.captureMessageContent,\n mirrorToolPayloadOnToolSpan:\n localPolicy?.mirrorToolPayloadOnToolSpan ??\n globalPolicy?.mirrorToolPayloadOnToolSpan ??\n RedactionPolicy.AxiomDefault.mirrorToolPayloadOnToolSpan,\n };\n}\n\n/**\n * Get the active redaction policy\n */\nexport function getRedactionPolicy() {\n return getEffectiveRedactionPolicy(getGlobalRedactionPolicy(), getPerCallRedactionPolicy());\n}\n\n/**\n * Conditionally sets a span attribute based on the capture message content policy.\n * When policy is 'off', the attribute is not set at all.\n *\n * @param span - The OpenTelemetry span to set the attribute on\n * @param attribute - The attribute name/key\n * @param value - The attribute value\n * @param captureMessageContent - The capture policy ('full' sets attribute, 'off' skips it)\n */\nexport function handleMaybeRedactedAttribute(\n span: Span,\n attribute: string,\n value: any,\n captureMessageContent?: CaptureMessageContent,\n): void {\n if (captureMessageContent === 'full') {\n span.setAttribute(attribute, value);\n }\n\n // For 'off', don't set the attribute at all\n // Future: Could add callback-based redaction here\n}\n\n/**\n * Extracts the per-call redaction policy from OpenTelemetry baggage context.\n * This allows middleware and tools to access redaction policies passed via withSpan.\n *\n * @returns The per-call redaction policy or undefined if not set\n */\nfunction getPerCallRedactionPolicy(): AxiomAIRedactionPolicy | undefined {\n const baggage: Baggage = propagation.getBaggage(context.active()) || propagation.createBaggage();\n const serializedPolicy = baggage.getEntry(WITHSPAN_REDACTION_POLICY_KEY)?.value;\n\n if (!serializedPolicy) {\n return undefined;\n }\n\n try {\n return JSON.parse(serializedPolicy) as AxiomAIRedactionPolicy;\n } catch (error) {\n console.warn('[AxiomAI] Failed to parse redaction policy from baggage:', error);\n return undefined;\n }\n}\n","/**\n * We need a way to know that we're inside `withSpan`\n * Because we don't own `generateText` and similar functions,\n * we use OTel Baggage to propagate this information. Another\n * consideration might be to use AsyncLocalStorage in Node and\n * some kind of KV in workerd.\n */\nexport const WITHSPAN_BAGGAGE_KEY = '__withspan_gen_ai_call';\nexport const WITHSPAN_REDACTION_POLICY_KEY = '__withspan_redaction_policy';\n","import type { Tracer } from '@opentelemetry/api';\nimport { trace } from '@opentelemetry/api';\nimport packageJson from '../../package.json';\nimport { AXIOM_AI_REDACTION_KEY, type AxiomAIRedactionPolicy } from './utils/redaction';\n\n// Global key to store tracer scope information across all execution contexts\nconst AXIOM_AI_SCOPE_KEY = Symbol.for('__axiom_ai_scope__');\n\ninterface TracerScope {\n name: string;\n version?: string;\n}\n\n/**\n * Extract scope information from a tracer, with fallback to package.json\n */\nfunction extractTracerScope(tracer: Tracer): TracerScope {\n const tracerAny = tracer as any;\n\n // Guard access to private fields with optional chaining\n // Note: These are internal OTEL fields that may change in future versions\n // _instrumentationScope is modern, instrumentationLibrary is legacy (<1.16)\n const name =\n tracerAny._instrumentationScope?.name ||\n tracerAny.instrumentationLibrary?.name ||\n packageJson.name;\n\n const version =\n tracerAny._instrumentationScope?.version ||\n tracerAny.instrumentationLibrary?.version ||\n packageJson.version;\n\n return { name, version };\n}\n\n/**\n * Register this in your `instrumentation.ts` to set up axiom.\n * This function stores the tracer's scope information globally to enable Context Propagation\n * and Instrumentation Scope. The tracer will be available across all execution contexts including Next.js.\n *\n * This function is idempotent - calling it multiple times with the same scope has no additional cost.\n *\n * @param config\n * @param config.tracer - The tracer that you are using in your application.\n * @param config.redactionPolicy - Optional redaction policy to control what data is captured in spans.\n */\nexport function initAxiomAI(config: { tracer: Tracer; redactionPolicy?: AxiomAIRedactionPolicy }) {\n const newScope = extractTracerScope(config.tracer);\n const existingScope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Check if already initialized with same scope (idempotent behavior)\n if (\n existingScope &&\n existingScope.name === newScope.name &&\n existingScope.version === newScope.version\n ) {\n return;\n }\n\n // Warn about double initialization with different scopes\n if (existingScope) {\n console.warn(\n '[AxiomAI] initAxiomAI() called multiple times with different scopes. ' +\n `Previous: ${existingScope.name}@${existingScope.version}, ` +\n `New: ${newScope.name}@${newScope.version}`,\n );\n }\n\n // Store scope information globally (works across Next.js contexts)\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = newScope;\n\n // Store redaction policy globally if provided\n if (config.redactionPolicy) {\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = config.redactionPolicy;\n }\n}\n\n/**\n * Get a tracer using the globally stored scope information\n * Fall back to package.json defaults if not set\n */\nexport function getGlobalTracer(): Tracer {\n // Get stored scope information or fall back to package defaults\n const scope = (globalThis as any)[AXIOM_AI_SCOPE_KEY] as TracerScope | undefined;\n\n // Warn if initAxiomAI was never called\n if (!scope) {\n const isDebug = process.env.AXIOM_DEBUG === 'true';\n if (!isDebug) {\n console.warn(\n '[AxiomAI] AXIOM_AI_SCOPE_KEY is undefined. This probably means that ' +\n 'initAxiomAI() was never called. ' +\n 'Make sure to call initAxiomAI({ tracer }) in your instrumentation setup.',\n );\n }\n }\n\n let { name, version } = scope || { name: packageJson.name, version: packageJson.version };\n\n if (!name || !version) {\n name = packageJson.name;\n version = packageJson.version;\n if (!name || !version) {\n name = 'axiom';\n version = 'unknown';\n }\n }\n\n // Use OpenTelemetry's standard global provider mechanism\n return trace.getTracer(name, version);\n}\n\n/**\n * Reset AxiomAI configuration (useful for testing)\n */\nexport function resetAxiomAI() {\n (globalThis as any)[AXIOM_AI_SCOPE_KEY] = undefined;\n (globalThis as any)[AXIOM_AI_REDACTION_KEY] = undefined;\n}\n","{\n \"name\": \"axiom\",\n \"version\": \"0.52.0\",\n \"type\": \"module\",\n \"author\": \"Axiom, Inc.\",\n \"contributors\": [\n \"Islam Shehata <islam@axiom.co>\",\n \"Chris Ehrlich <chris@axiom.co>\",\n \"Gabriel de Andrade <gabriel@axiom.co>\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup && chmod +x dist/bin.js && typedoc && pnpm check:vitest-entrypoints\",\n \"check:vitest-entrypoints\": \"node ./scripts/check-vitest-entrypoints.mjs\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint './**/*.{js,ts}'\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest --watch\",\n \"test:wrangler-smoke\": \"pnpm build && vitest run --config vitest.smoke.config.ts\",\n \"publint\": \"npx publint\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"bin\": {\n \"axiom\": \"./dist/bin.js\"\n },\n \"exports\": {\n \"./ai\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./ai/evals\": {\n \"types\": \"./dist/evals.d.ts\",\n \"default\": \"./dist/evals.js\"\n },\n \"./ai/evals/online\": {\n \"types\": \"./dist/evals/online.d.ts\",\n \"default\": \"./dist/evals/online.js\"\n },\n \"./ai/scorers\": {\n \"types\": \"./dist/scorers/scorers.d.ts\",\n \"default\": \"./dist/scorers/scorers.js\"\n },\n \"./ai/scorers/aggregations\": {\n \"types\": \"./dist/scorers/aggregations.d.ts\",\n \"default\": \"./dist/scorers/aggregations.js\"\n },\n \"./ai/config\": {\n \"types\": \"./dist/config.d.ts\",\n \"default\": \"./dist/config.js\"\n },\n \"./ai/feedback\": {\n \"types\": \"./dist/feedback.d.ts\",\n \"default\": \"./dist/feedback.js\"\n }\n },\n \"keywords\": [\n \"axiom\",\n \"logging\",\n \"ai\",\n \"otel\",\n \"opentelemetry\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/axiomhq/ai.git\",\n \"directory\": \"packages/ai\"\n },\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@next/env\": \"^15.4.2\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.60.1\",\n \"@opentelemetry/context-async-hooks\": \"^2.0.1\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.202.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.38.0\",\n \"@sinclair/typebox\": \"^0.34.37\",\n \"c12\": \"^3.3.3\",\n \"commander\": \"^14.0.0\",\n \"defu\": \"^6.1.4\",\n \"handlebars\": \"^4.7.8\",\n \"nanoid\": \"^5.1.5\",\n \"open\": \"^10.1.0\",\n \"vite-tsconfig-paths\": \"^5.1.4\",\n \"vitest\": \"^4.0.0\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"typescript\": \">=5.4\",\n \"zod\": \"^3.25.0 || ^4.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@ai-sdk/anthropicv1\": \"npm:@ai-sdk/anthropic@^1.2.12\",\n \"@ai-sdk/anthropicv2\": \"npm:@ai-sdk/anthropic@^2.0.57\",\n \"@ai-sdk/anthropicv3\": \"npm:@ai-sdk/anthropic@^3.0.9\",\n \"@ai-sdk/openaiv1\": \"npm:@ai-sdk/openai@^1.3.24\",\n \"@ai-sdk/openaiv2\": \"npm:@ai-sdk/openai@^2.0.88\",\n \"@ai-sdk/openaiv3\": \"npm:@ai-sdk/openai@^3.0.7\",\n \"@ai-sdk/providerv1\": \"npm:@ai-sdk/provider@^1.1.3\",\n \"@ai-sdk/providerv2\": \"npm:@ai-sdk/provider@^2.0.1\",\n \"@ai-sdk/providerv3\": \"npm:@ai-sdk/provider@^3.0.2\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/core\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.1\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@repo/eslint-config\": \"workspace:*\",\n \"@types/node\": \"^22.15.29\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"aiv4\": \"npm:ai@^4.3.19\",\n \"aiv5\": \"npm:ai@^5.0.118\",\n \"aiv6\": \"npm:ai@^6.0.6\",\n \"esbuild\": \"^0.25.8\",\n \"eslint\": \"catalog:\",\n \"msw\": \"^2.12.2\",\n \"prettier\": \"catalog:\",\n \"tinyrainbow\": \"^2.0.0\",\n \"tsup\": \"catalog:\",\n \"typedoc\": \"^0.28.17\",\n \"typedoc-plugin-markdown\": \"^4.10.0\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"zod\": \"catalog:\"\n },\n \"files\": [\n \"dist\"\n ],\n \"packageManager\": \"pnpm@10.16.1\"\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,19 +2,19 @@ import {
|
|
|
2
2
|
getConsoleUrl,
|
|
3
3
|
loadConfig,
|
|
4
4
|
u
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-I5OOMUQJ.js";
|
|
6
6
|
import {
|
|
7
7
|
dotNotationToNested,
|
|
8
8
|
flattenObject,
|
|
9
9
|
getAxiomConfig
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2RCYBZZC.js";
|
|
11
11
|
import {
|
|
12
12
|
AxiomCLIError,
|
|
13
13
|
errorToString
|
|
14
14
|
} from "./chunk-ISSDOC43.js";
|
|
15
15
|
import {
|
|
16
16
|
initAxiomAI
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-QMM7KCYZ.js";
|
|
18
18
|
import {
|
|
19
19
|
__publicField
|
|
20
20
|
} from "./chunk-KEXKKQVW.js";
|
|
@@ -649,11 +649,11 @@ function setupEvalProvider(connection) {
|
|
|
649
649
|
axiomProvider = new NodeTracerProvider({
|
|
650
650
|
resource: resourceFromAttributes({
|
|
651
651
|
["service.name"]: "axiom",
|
|
652
|
-
["service.version"]: "0.
|
|
652
|
+
["service.version"]: "0.52.0"
|
|
653
653
|
}),
|
|
654
654
|
spanProcessors: [processor]
|
|
655
655
|
});
|
|
656
|
-
axiomTracer = axiomProvider.getTracer("axiom", "0.
|
|
656
|
+
axiomTracer = axiomProvider.getTracer("axiom", "0.52.0");
|
|
657
657
|
}
|
|
658
658
|
async function initInstrumentation(config) {
|
|
659
659
|
if (initialized) {
|
|
@@ -665,7 +665,7 @@ async function initInstrumentation(config) {
|
|
|
665
665
|
}
|
|
666
666
|
initializationPromise = (async () => {
|
|
667
667
|
if (!config.enabled) {
|
|
668
|
-
axiomTracer = trace.getTracer("axiom", "0.
|
|
668
|
+
axiomTracer = trace.getTracer("axiom", "0.52.0");
|
|
669
669
|
initialized = true;
|
|
670
670
|
return;
|
|
671
671
|
}
|
|
@@ -780,4 +780,4 @@ export {
|
|
|
780
780
|
startSpan,
|
|
781
781
|
startActiveSpan
|
|
782
782
|
};
|
|
783
|
-
//# sourceMappingURL=chunk-
|
|
783
|
+
//# sourceMappingURL=chunk-SD3TFRJI.js.map
|
|
@@ -353,7 +353,8 @@ function createPartialDefaults() {
|
|
|
353
353
|
instrumentation: null,
|
|
354
354
|
include: [...DEFAULT_EVAL_INCLUDE],
|
|
355
355
|
exclude: [],
|
|
356
|
-
timeoutMs: 6e4
|
|
356
|
+
timeoutMs: 6e4,
|
|
357
|
+
vitestConfig: false
|
|
357
358
|
}
|
|
358
359
|
};
|
|
359
360
|
}
|
|
@@ -383,6 +384,10 @@ function validateConfig(config) {
|
|
|
383
384
|
"eval.instrumentation must be a function returning OTEL setup information or null."
|
|
384
385
|
);
|
|
385
386
|
}
|
|
387
|
+
const vitestConfig = config.eval?.vitestConfig;
|
|
388
|
+
if (vitestConfig !== void 0 && vitestConfig !== false && typeof vitestConfig !== "string") {
|
|
389
|
+
errors.push("eval.vitestConfig must be a string path or false.");
|
|
390
|
+
}
|
|
386
391
|
if (errors.length > 0) {
|
|
387
392
|
throw new AxiomCLIError(`Invalid Axiom configuration:
|
|
388
393
|
- ${errors.join("\n - ")}`);
|
|
@@ -406,4 +411,4 @@ export {
|
|
|
406
411
|
createPartialDefaults,
|
|
407
412
|
validateConfig
|
|
408
413
|
};
|
|
409
|
-
//# sourceMappingURL=chunk-
|
|
414
|
+
//# sourceMappingURL=chunk-YM4B3UES.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/auth/config.ts","../src/cli/auth/global-auth.ts","../src/config/index.ts","../src/cli/auth/oauth.ts","../src/cli/auth/api.ts","../src/cli/auth/callback-server.ts"],"sourcesContent":["import { promises as fs } from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport type { Config, Profile } from './types';\n\nconst CONFIG_FILENAME = 'config.json';\nconst CONFIG_DIR_NAME = 'axiom';\n\n/**\n * Gets the OS-appropriate config directory path.\n * - Linux/Unix: ~/.config/axiom\n * - macOS: ~/Library/Application Support/axiom\n * - Windows: %APPDATA%\\axiom\n */\nexport function getConfigDir(): string {\n const platform = process.platform;\n const homeDir = os.homedir();\n\n // Linux/Unix: ~/.config/axiom (or $XDG_CONFIG_HOME/axiom if set)\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return path.join(xdgConfigHome, CONFIG_DIR_NAME);\n }\n\n if (platform === 'win32') {\n // Windows: %APPDATA%\\axiom\n const appData = process.env.APPDATA;\n if (appData) {\n return path.join(appData, CONFIG_DIR_NAME);\n }\n // Fallback to home directory if APPDATA is not set\n return path.join(homeDir, 'AppData', 'Roaming', CONFIG_DIR_NAME);\n }\n\n return path.join(homeDir, '.config', CONFIG_DIR_NAME);\n}\n\n/**\n * Gets the full path to the config file.\n */\nexport function getGlobalConfigPath(): string {\n return path.join(getConfigDir(), CONFIG_FILENAME);\n}\n\nexport async function loadGlobalConfig(): Promise<Config> {\n const configPath = getGlobalConfigPath();\n try {\n const content = await fs.readFile(configPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { profiles: {} };\n }\n throw error;\n }\n}\n\nexport async function saveGlobalConfig(config: Config): Promise<void> {\n const configPath = getGlobalConfigPath();\n const configDir = path.dirname(configPath);\n const content = JSON.stringify(config, null, 2);\n\n // Ensure config directory exists\n await fs.mkdir(configDir, { recursive: true, mode: 0o700 });\n\n // Write config file\n await fs.writeFile(configPath, content, 'utf-8');\n\n // Set restrictive permissions (read/write for owner only)\n // Note: chmod is a no-op on Windows, but that's fine\n await fs.chmod(configPath, 0o600);\n}\n\nexport function getActiveProfile(config: Config): Profile | null {\n // Get from config\n const profileName = config.active_profile;\n if (!profileName) return null;\n\n const profile = config.profiles[profileName];\n if (!profile) return null;\n\n return profile;\n}\n","import { loadGlobalConfig, getActiveProfile } from './config';\n\nexport interface AuthContext {\n readonly token: string;\n readonly url: string;\n readonly orgId: string;\n}\n\n/**\n * Module-level store for auth context.\n * This provides explicit, type-safe access to auth credentials.\n */\nlet authContext: AuthContext | null = null;\n\n/**\n * Gets the current auth context.\n * Returns null if auth hasn't been set up yet.\n */\nexport function getAuthContext(): AuthContext | null {\n return authContext;\n}\n\n/**\n * Sets up authentication context by loading config and storing it.\n *\n * @throws {AxiomCLIError} If no active profile is found\n */\nexport async function setupGlobalAuth(): Promise<AuthContext | null> {\n const config = await loadGlobalConfig();\n const profile = getActiveProfile(config);\n if (profile) {\n // Store in module-level context for explicit access\n authContext = {\n token: profile.token,\n url: profile.url,\n orgId: profile.org_id,\n };\n }\n\n return authContext;\n}\n\n/**\n * Resets the auth context (useful for testing).\n */\nexport function resetAuthContext(): void {\n authContext = null;\n}\n","import type { TracerProvider } from '@opentelemetry/api';\nimport { type z } from 'zod';\nimport { AxiomCLIError } from '../util/errors';\nimport { getAuthContext } from '../cli/auth';\n\n/**\n * Utility type to make all properties in T required recursively.\n * Keeps the types as-is but removes the optionality.\n */\ntype DeepRequired<T> =\n T extends Array<infer U>\n ? Array<U>\n : T extends (...args: any[]) => any\n ? T\n : T extends object\n ? {\n [P in keyof T]-?: DeepRequired<T[P]>;\n }\n : T;\n\n/**\n * Axiom API connection configuration\n */\nexport interface AxiomConnectionConfig {\n /**\n * Axiom API URL\n * @default 'https://api.axiom.co'\n * @example 'https://api.axiom.co'\n */\n url?: string;\n\n /**\n * Axiom Edge URL for ingest and query operations.\n * When set, this URL is used for sending traces and querying data,\n * while the regular `url` is used for API/console operations.\n * Falls back to `url` if not specified.\n * @example 'https://eu-central-1.aws.edge.axiom.co'\n */\n edgeUrl?: string;\n\n /**\n * Axiom API token (can be undefined if not set)\n * @example process.env.AXIOM_TOKEN\n */\n token?: string | undefined;\n\n /**\n * Axiom dataset name\n * @example process.env.AXIOM_DATASET\n */\n dataset?: string;\n\n /**\n * Axiom organization ID\n * @example process.env.AXIOM_ORG_ID\n */\n orgId?: string;\n}\n\n/**\n * Options passed to the instrumentation hook\n * - url: string\n * - token: string\n * - dataset: string\n */\nexport interface AxiomEvalInstrumentationOptions {\n url: string;\n edgeUrl: string;\n token: string;\n dataset: string;\n orgId?: string;\n}\n\n/**\n * Result returned from the instrumentation hook\n */\nexport interface AxiomEvalInstrumentationResult {\n /**\n * TracerProvider to be flushed when eval finishes.\n *\n * If you use the NodeSDK or register your provider globally, you don't need to return it\n * here as the NodeSDK automatically flushes the global provider.\n *\n * Only return a provider if you want Axiom to explicitly flush it for you and it's not\n * registered as the global tracer provider.\n */\n provider?: TracerProvider;\n}\n\nexport type SyncAxiomEvalInstrumentationHook = (\n options: AxiomEvalInstrumentationOptions,\n) => AxiomEvalInstrumentationResult;\n\nexport type AsyncAxiomEvalInstrumentationHook = (\n options: AxiomEvalInstrumentationOptions,\n) => Promise<AxiomEvalInstrumentationResult>;\n\n/**\n * Hook function to initialize application OpenTelemetry instrumentation.\n * Called before eval execution with resolved Axiom connection details.\n *\n * @param options - Configuration options\n * @param options.url - Axiom API URL\n * @param options.token - Axiom API token\n * @param options.dataset - Axiom dataset name\n * @returns TracerProvider or Promise resolving to TracerProvider\n *\n * @example\n * ```typescript\n * instrumentation: ({ url, token, dataset }) => {\n * return setupAppInstrumentation({ url, token, dataset });\n * }\n * ```\n */\nexport type AxiomEvalInstrumentationHook = (\n options: AxiomEvalInstrumentationOptions,\n) => AxiomEvalInstrumentationResult | Promise<AxiomEvalInstrumentationResult>;\n\n/**\n * Axiom AI SDK base configuration (user-facing, all optional)\n */\nexport const DEFAULT_EVAL_INCLUDE = ['**/*.eval.{ts,js,mts,mjs,cts,cjs}'] as const;\n\nexport interface AxiomConfigBase {\n /**\n * Eval configuration settings\n *\n * @example\n * ```typescript\n * eval: {\n * url: process.env.AXIOM_URL,\n * token: process.env.AXIOM_TOKEN,\n * dataset: process.env.AXIOM_DATASET\n * }\n * ```\n */\n eval?: AxiomConnectionConfig & {\n /**\n * Zod schema for flag validation.\n * When provided, CLI flags (--flag.*) are validated against this schema\n * before eval execution begins.\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n *\n * export default defineConfig({\n * eval: {\n * flagSchema: z.object({\n * model: z.object({\n * temperature: z.number().min(0).max(2).default(0.7),\n * name: z.string().default('gpt-4o'),\n * }),\n * }),\n * }\n * });\n * ```\n */\n flagSchema?: z.ZodObject<any> | null;\n /**\n * Optional hook to initialize application OpenTelemetry instrumentation.\n * Called before eval execution with resolved Axiom connection details.\n * Return your configured tracer provider/tracer (or void) after registering them.\n */\n instrumentation?: AxiomEvalInstrumentationHook | null;\n /**\n * Timeout for eval execution in milliseconds\n * @default 60000\n */\n timeoutMs?: number;\n /**\n * Glob patterns to include when running evals\n * @default ['**\\/*.eval.{ts,js,mts,mjs,cts,cjs}']\n * @example ['**\\/*.eval.ts', 'tests/**\\/*.test.ts']\n */\n include?: string[];\n /**\n * Glob patterns to exclude when running evals\n * @default ['**\\/node_modules/**', '**\\/dist/**', '**\\/build/**']\n * @example ['**\\/node_modules/**', '**\\/.next/**']\n */\n exclude?: string[];\n /**\n * Optional Vitest config file to load for eval runs.\n *\n * When omitted or set to false, evals run without loading any Vitest config,\n * keeping them isolated from the application's Vite/Vitest plugin graph.\n *\n * @default false\n * @example './vitest.eval.config.ts'\n */\n vitestConfig?: string | false;\n };\n}\n\n/**\n * Resolved Axiom AI SDK configuration with all required keys.\n * This is the type returned after merging user config with defaults.\n *\n * Uses DeepRequired to ensure all optional properties from AxiomConfigBase\n * become required, preventing missing properties in the resolved config.\n */\nexport type ResolvedAxiomConfig = DeepRequired<AxiomConfigBase>;\n\n/**\n * Axiom AI SDK configuration with optional environment-specific overrides.\n *\n * Supports c12 environment overrides using $development, $production, etc.\n *\n * @example\n * ```typescript\n * export default defineConfig({\n * eval: {\n * url: process.env.AXIOM_URL,\n * token: process.env.AXIOM_TOKEN,\n * dataset: process.env.AXIOM_DATASET,\n * },\n * })\n * ```\n */\nexport interface AxiomConfig extends AxiomConfigBase {\n /**\n * Allow c12 environment-specific overrides ($development, $production, $test etc.)\n * but don't show them in autocomplete for now\n */\n [key: `$${string}`]: Partial<AxiomConfigBase> | undefined;\n}\n\n/**\n * Type-safe helper for defining Axiom configuration.\n *\n * @param config - The configuration object\n * @returns The same configuration object with type checking\n *\n * @example\n * ```typescript\n * import { defineConfig } from 'axiom/ai/config';\n *\n * export default defineConfig({\n * eval: {\n * url: process.env.AXIOM_URL,\n * token: process.env.AXIOM_TOKEN,\n * dataset: process.env.AXIOM_DATASET,\n * include: ['**\\/*.eval.{ts,js}'],\n * instrumentation: ({ url, token, dataset }) => setupAppInstrumentation({ url, token, dataset }),\n * },\n * });\n * ```\n */\nexport function defineConfig(config: AxiomConfig): AxiomConfig {\n return config;\n}\n\n/**\n * Create partial default configuration from auth context or environment variables.\n * Does not throw if required values are missing - validation happens after merge.\n *\n * @returns Partial configuration with defaults and auth/env var values\n * @internal\n */\nexport function createPartialDefaults(): Partial<AxiomConfigBase> {\n // Try to get auth context first (available when running via CLI)\n // Fall back to process.env for backward compatibility (e.g., when used outside CLI)\n let token: string | undefined;\n let url: string | undefined;\n let orgId: string | undefined;\n\n try {\n const authContext = getAuthContext();\n if (authContext) {\n token = authContext.token;\n url = authContext.url;\n orgId = authContext.orgId;\n }\n } catch {\n // Auth context not available, fall back to env vars\n }\n\n // Fall back to process.env if auth context not available\n token = token || process.env.AXIOM_TOKEN;\n url = url || process.env.AXIOM_URL;\n orgId = orgId || process.env.AXIOM_ORG_ID;\n\n // Edge URL for ingest and query operations\n const edgeUrl = process.env.AXIOM_EDGE_URL;\n\n return {\n eval: {\n url: url || 'https://api.axiom.co',\n edgeUrl: edgeUrl,\n orgId,\n token,\n dataset: process.env.AXIOM_DATASET,\n flagSchema: undefined,\n instrumentation: null,\n include: [...DEFAULT_EVAL_INCLUDE],\n exclude: [],\n timeoutMs: 60_000,\n vitestConfig: false,\n },\n };\n}\n\n/**\n * Validates and returns a fully resolved Axiom configuration.\n *\n * @param config - Partial configuration to validate\n * @returns Fully resolved configuration with all required fields\n * @throws {AxiomCLIError} If required fields are missing or invalid\n * @internal\n */\nexport function validateConfig(config: Partial<AxiomConfigBase>): ResolvedAxiomConfig {\n const errors: string[] = [];\n const isDebug = process.env.AXIOM_DEBUG === 'true';\n\n if (!isDebug) {\n if (!config.eval?.token) {\n errors.push(\n 'eval.token is required (set in axiom.config.ts or AXIOM_TOKEN environment variable)',\n );\n }\n if (!config.eval?.dataset) {\n errors.push(\n 'eval.dataset is required (set in axiom.config.ts or AXIOM_DATASET environment variable)',\n );\n }\n\n if (!config.eval?.url) {\n console.log(\n 'eval.url was not specified. Defaulting to `https://api.axiom.co`. Please set it in axiom.config.ts or AXIOM_URL environment variable if you want to use a different endpoint.',\n );\n }\n }\n\n const instrumentation = config.eval?.instrumentation;\n if (\n instrumentation !== null &&\n instrumentation !== undefined &&\n typeof instrumentation !== 'function'\n ) {\n errors.push(\n 'eval.instrumentation must be a function returning OTEL setup information or null.',\n );\n }\n\n const vitestConfig = config.eval?.vitestConfig;\n if (vitestConfig !== undefined && vitestConfig !== false && typeof vitestConfig !== 'string') {\n errors.push('eval.vitestConfig must be a string path or false.');\n }\n\n if (errors.length > 0) {\n throw new AxiomCLIError(`Invalid Axiom configuration:\\n - ${errors.join('\\n - ')}`);\n }\n\n return config as ResolvedAxiomConfig;\n}\n","import { randomBytes, createHash } from 'crypto';\nimport type { OAuthTokenResponse } from './types';\n\nconst OAUTH_CLIENT_ID = '264d906a404efc209b027f6595e6b616';\nconst OAUTH_AUTH_PATH = '/oauth/authorize';\nconst OAUTH_TOKEN_PATH = '/oauth/token';\n\nexport interface BuildAuthUrlParams {\n redirectUri: string;\n state: string;\n codeChallenge: string;\n}\n\nexport interface ExchangeCodeParams {\n code: string;\n redirectUri: string;\n codeVerifier: string;\n}\n\nexport class OAuth {\n constructor(private readonly oauthBaseUrl: string) {}\n\n static generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url');\n }\n\n static generateCodeChallenge(verifier: string): string {\n return createHash('sha256').update(verifier).digest('base64url');\n }\n\n static generateState(): string {\n return randomBytes(16).toString('hex');\n }\n\n public buildAuthUrl(params: BuildAuthUrlParams): string {\n const url = new URL(OAUTH_AUTH_PATH, this.oauthBaseUrl);\n url.searchParams.set('client_id', OAUTH_CLIENT_ID);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('state', params.state);\n url.searchParams.set('code_challenge', params.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('scope', '*');\n return url.toString();\n }\n\n public async exchangeCodeForToken(params: ExchangeCodeParams): Promise<string> {\n const tokenUrl = new URL(OAUTH_TOKEN_PATH, this.oauthBaseUrl);\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: OAUTH_CLIENT_ID,\n code: params.code,\n redirect_uri: params.redirectUri,\n code_verifier: params.codeVerifier,\n });\n\n const response = await fetch(tokenUrl.toString(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Token exchange failed: ${response.status} ${errorText}`);\n }\n\n const data: OAuthTokenResponse = await response.json();\n return data.access_token;\n }\n}\n","import { AxiomCLIError } from '../../util/errors';\nimport type { Organization } from './types';\n\nexport async function fetchOrganizations(\n token: string,\n apiBaseUrl: string,\n): Promise<Organization[]> {\n const response = await fetch(`${apiBaseUrl}/v2/orgs`, {\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new AxiomCLIError(\n `Failed to fetch organizations: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data as Organization[];\n}\n\nexport async function verifyToken(\n token: string,\n orgId: string,\n apiBaseUrl: string,\n): Promise<boolean> {\n const response = await fetch(`${apiBaseUrl}/v2/user`, {\n headers: {\n Authorization: `Bearer ${token}`,\n 'X-Axiom-Org-Id': orgId,\n 'Content-Type': 'application/json',\n },\n });\n\n return response.ok;\n}\n","import http, { type IncomingMessage, type ServerResponse } from 'http';\nimport type { AddressInfo } from 'net';\n\nfunction escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n };\n return text.replace(/[&<>\"']/g, (m) => map[m] || m);\n}\n\nconst SVG_LOGO = `<svg width=\"124\" height=\"24\" viewBox=\"0 0 124 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"logo\">\n<path d=\"M42.9919 16.8116H36.3696L35.5537 19.1572C35.4209 19.539 34.9714 19.8513 34.5548 19.8513H30.9779C30.5614 19.8513 30.3459 19.5449 30.499 19.1703L36.9816 3.31644C37.1346 2.9419 37.6009 2.63546 38.0174 2.63546H41.3718C41.7883 2.63546 42.2541 2.94207 42.4067 3.3168L48.8634 19.17C49.016 19.5447 48.8 19.8513 48.3835 19.8513H44.8067C44.3901 19.8513 43.9406 19.539 43.8078 19.1572L42.9919 16.8116ZM41.8232 13.4223L39.6807 7.18148L37.5383 13.4223H41.8232ZM64.1105 19.8513C63.694 19.8513 63.1767 19.5694 62.9611 19.2247L59.9029 14.3369L56.8447 19.2247C56.6291 19.5694 56.1119 19.8513 55.6953 19.8513H51.3392C50.9227 19.8513 50.7754 19.5801 51.0119 19.2486L56.8978 11.0013L51.5315 3.24414C51.2999 2.90937 51.4513 2.63546 51.8679 2.63546H55.89C56.3066 2.63546 56.8268 2.91563 57.0461 3.25807L59.9029 7.71959L62.7343 3.25955C62.9522 2.9163 63.4713 2.63546 63.8879 2.63546H67.938C68.3545 2.63546 68.5048 2.90868 68.272 3.24261L62.8801 10.9743L68.7935 19.2489C69.0303 19.5802 68.8832 19.8513 68.4666 19.8513H64.1105ZM76.525 19.119C76.525 19.5218 76.1841 19.8513 75.7675 19.8513H72.5522C72.1356 19.8513 71.7947 19.5218 71.7947 19.119V3.36771C71.7947 2.96498 72.1356 2.63546 72.5522 2.63546H75.7675C76.1841 2.63546 76.525 2.96498 76.525 3.36771V19.119ZM79.3736 11.1896C79.3736 6.18625 83.2688 2.15134 89.2511 2.15134C95.2334 2.15134 99.1289 6.18625 99.1289 11.1896C99.1289 16.2199 95.2334 20.2548 89.2511 20.2548C83.2688 20.2548 79.3736 16.2199 79.3736 11.1896ZM94.2873 11.1896C94.2873 8.58038 92.3953 6.21307 89.2511 6.21307C86.1349 6.21307 84.2149 8.58038 84.2149 11.1896C84.2149 13.7989 86.1349 16.2199 89.2511 16.2199C92.3675 16.2199 94.2873 13.7989 94.2873 11.1896ZM119.318 19.8513C118.902 19.8513 118.517 19.5245 118.463 19.1251L117.225 9.89847L113.65 19.1652C113.505 19.5426 113.045 19.8513 112.628 19.8513H111.055C110.638 19.8513 110.179 19.5423 110.034 19.1645L106.457 9.81766L105.218 19.125C105.165 19.5245 104.781 19.8513 104.364 19.8513H101.344C100.927 19.8513 100.633 19.5249 100.69 19.1259L102.932 3.3609C102.988 2.96191 103.376 2.63546 103.792 2.63546H106.59C107.007 2.63546 107.469 2.94351 107.617 3.32002L111.827 14.041L116.064 3.31949C116.213 2.94327 116.676 2.63546 117.092 2.63546H119.89C120.307 2.63546 120.694 2.96191 120.751 3.3609L122.993 19.1259C123.05 19.5249 122.755 19.8513 122.339 19.8513H119.318ZM23.9616 15.6531L18.8054 6.97021C18.5689 6.57115 17.9863 6.24465 17.5106 6.24465H14.2915C13.5433 6.24465 13.2365 5.73171 13.6097 5.1048L15.375 2.13986C15.5151 1.90455 15.5148 1.61487 15.3743 1.37981C15.2337 1.14476 14.9741 1 14.6933 1H10.2025C9.72681 1 9.14291 1.32577 8.90491 1.72395L0.17865 16.3217C-0.0594434 16.7199 -0.0595348 17.3715 0.178285 17.7698L2.42362 21.5297C2.79777 22.1561 3.41129 22.1569 3.78699 21.5313L5.54143 18.6103C5.91722 17.9847 6.53065 17.9854 6.9048 18.6119L8.49538 21.2754C8.7332 21.6737 9.317 21.9995 9.79273 21.9995H20.1698C20.6455 21.9995 21.2293 21.6737 21.4672 21.2754L23.959 17.1028C24.1968 16.7045 24.198 16.0521 23.9616 15.6531ZM16.9981 15.2352C17.3699 15.8629 17.0619 16.3765 16.3136 16.3765H8.24192C7.49372 16.3765 7.1876 15.864 7.56175 15.2375L11.6007 8.47417C11.9748 7.84772 12.5869 7.84774 12.9611 8.47421L16.9981 15.2352Z\" fill=\"#121224\"/>\n</svg>`;\n\nfunction renderCallbackPage(error?: string): string {\n const errorClass = error ? ' class=\"error\"' : '';\n const errorMessage = error ? escapeHtml(error) : '';\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <title>Axiom</title>\n <link rel=\"icon\" href=\"https://app.axiom.co/static/favicon.ico\">\n <meta name=\"description\" content=\"Axiom CLI\">\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n <style>\n html,\n body,\n .root {\n width: 100%;\n height: 100%;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n }\n body {\n color: #334155;\n font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;\n font-size: 14px;\n font-weight: 500;\n font-variant: tabular-nums;\n line-height: 1.5;\n background-color: #fff;\n font-feature-settings: \"tnum\";\n margin: 0;\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 0;\n margin-bottom: .5em;\n font-weight: 500;\n }\n p {\n margin-top: 0;\n margin-bottom: 1em;\n }\n h2 {\n font-size: 16px;\n font-weight: 600;\n }\n .root {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .logo {\n width: 92px;\n float: left;\n position: absolute;\n top: 16px;\n left: 16px;\n }\n .center p {\n padding: 8px 0;\n }\n .error .center {\n color: #bf0e08;\n }\n </style>\n</head>\n<body${errorClass}>\n <div class=\"root\">\n <a class=\"\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://axiom.co\">\n ${SVG_LOGO}\n </svg>\n </a>\n <div class=\"center\">\n ${\n error\n ? `<h2 id=\"msg\">Login failed</h2>\n <p id=\"details\">${errorMessage}</p>`\n : `<h2 id=\"msg\">Login successful</h2>\n <p id=\"details\">You can close this page and return to your CLI.</p>`\n }\n </div>\n </div>\n <script>\n window.history.replaceState({}, '', \\`\\${window.location.pathname}\\`);\n </script>\n</body>\n</html>`;\n}\n\nexport interface CallbackServerResult {\n server: http.Server;\n port: number;\n url: string;\n}\n\nexport async function startCallbackServer(): Promise<CallbackServerResult> {\n return new Promise((resolve) => {\n const server = http.createServer();\n server.listen(0, '127.0.0.1', () => {\n const address = server.address() as AddressInfo;\n resolve({\n server,\n port: address.port,\n url: `http://127.0.0.1:${address.port}`,\n });\n });\n });\n}\n\nexport interface CallbackResult {\n code: string;\n}\n\nexport async function waitForCallback(\n server: http.Server,\n expectedState: string,\n): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(\n () => {\n server.close();\n reject(new Error('Authentication timeout after 5 minutes'));\n },\n 5 * 60 * 1000,\n ); // 5 minute timeout\n\n server.on('request', (req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '', `http://${req.headers.host}`);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n const errorDescription = url.searchParams.get('error_description');\n\n if (error) {\n const errorMsg = errorDescription || error;\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(renderCallbackPage(errorMsg));\n clearTimeout(timeout);\n server.close();\n reject(new Error(`OAuth error: ${errorMsg}`));\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(renderCallbackPage('Missing code or state parameter'));\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(renderCallbackPage('Invalid state parameter (CSRF protection)'));\n clearTimeout(timeout);\n server.close();\n reject(new Error('Invalid state parameter'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(renderCallbackPage());\n\n clearTimeout(timeout);\n server.close();\n resolve({ code });\n });\n });\n}\n"],"mappings":"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","names":["authContext"]}
|
|
@@ -147,6 +147,16 @@ interface AxiomConfigBase {
|
|
|
147
147
|
* @example ['**\/node_modules/**', '**\/.next/**']
|
|
148
148
|
*/
|
|
149
149
|
exclude?: string[];
|
|
150
|
+
/**
|
|
151
|
+
* Optional Vitest config file to load for eval runs.
|
|
152
|
+
*
|
|
153
|
+
* When omitted or set to false, evals run without loading any Vitest config,
|
|
154
|
+
* keeping them isolated from the application's Vite/Vitest plugin graph.
|
|
155
|
+
*
|
|
156
|
+
* @default false
|
|
157
|
+
* @example './vitest.eval.config.ts'
|
|
158
|
+
*/
|
|
159
|
+
vitestConfig?: string | false;
|
|
150
160
|
};
|
|
151
161
|
}
|
|
152
162
|
/**
|
package/dist/config.d.ts
CHANGED