agent-skill-evals 0.1.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/README.md +155 -0
- package/dist/agent/index.d.mts +3 -0
- package/dist/agent/index.mjs +2 -0
- package/dist/agent-CM7fIL_C.mjs +1525 -0
- package/dist/agent-CM7fIL_C.mjs.map +1 -0
- package/dist/assertion-entries-CfmNt-fp.d.mts +9 -0
- package/dist/assertion-entries-CfmNt-fp.d.mts.map +1 -0
- package/dist/assertions/index.d.mts +47 -0
- package/dist/assertions/index.d.mts.map +1 -0
- package/dist/assertions/index.mjs +574 -0
- package/dist/assertions/index.mjs.map +1 -0
- package/dist/index-4l7TCFny.d.mts +90 -0
- package/dist/index-4l7TCFny.d.mts.map +1 -0
- package/dist/internal-services-5-mRgNls.mjs +226 -0
- package/dist/internal-services-5-mRgNls.mjs.map +1 -0
- package/dist/internal-services-DbsekQ_K.d.mts +76 -0
- package/dist/internal-services-DbsekQ_K.d.mts.map +1 -0
- package/dist/skill-checks/index.d.mts +113 -0
- package/dist/skill-checks/index.d.mts.map +1 -0
- package/dist/skill-checks/index.mjs +408 -0
- package/dist/skill-checks/index.mjs.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-CM7fIL_C.mjs","names":["OptionalString"],"sources":["../src/runtime-checks/_helpers.ts","../src/runtime-checks/schemas.ts","../src/runtime-checks/verifier-succeeds.ts","../src/runtime-checks/verifier-fails.ts","../src/runtime-checks/file-exists.ts","../src/runtime-checks/file-created.ts","../src/runtime-checks/file-not-modified.ts","../src/runtime-checks/file-contains.ts","../src/runtime-checks/code-pattern-exists.ts","../src/runtime-checks/code-no-pattern.ts","../src/runtime-checks/file-changes-outside-scope.ts","../src/runtime-checks/_match.ts","../src/runtime-checks/_call-match.ts","../src/runtime-checks/tool-called.ts","../src/runtime-checks/tool-not-called.ts","../src/runtime-checks/skill-loaded.ts","../src/runtime-checks/index.ts","../src/runtime-checks/catalog.ts","../src/evidence-types.ts","../src/evidence-schema.ts","../src/agent/evidence.ts","../src/agent/command-runner.ts","../src/agent/jsonl-stream.ts","../src/agent/adapters.ts","../src/agent/adapter-catalog.ts","../src/runtime-checks/_files.ts","../src/agent/world.ts","../src/agent/file-watch.ts","../src/agent/index.ts"],"sourcesContent":["import type {\n AssertionMode,\n AgentSkillEvalsAssertionResult,\n} from \"../internal-types.js\";\n\nexport function result(\n pass: boolean,\n reason: string,\n evidence?: unknown,\n): AgentSkillEvalsAssertionResult {\n return { pass, score: pass ? 1 : 0, reason, evidence };\n}\n\nexport function validationFailure(reason: string): AgentSkillEvalsAssertionResult {\n return result(false, reason);\n}\n\n/**\n * Map a \"matched\" boolean to a pass result based on mode. Used by effect\n * types that don't self-encode polarity (file.exists, tool.called, ...).\n *\n * - should: pass = matched\n * - should_not: pass = !matched\n * - precondition: pass = matched (precondition asserts a current state)\n */\nexport function applyMode(\n matched: boolean,\n mode: AssertionMode,\n reasonMatched: string,\n reasonUnmatched: string,\n): AgentSkillEvalsAssertionResult {\n switch (mode) {\n case \"should\":\n case \"precondition\":\n return result(matched, matched ? reasonMatched : reasonUnmatched);\n case \"should_not\":\n return result(!matched, matched ? reasonMatched : reasonUnmatched);\n }\n}\n","import * as Either from \"effect/Either\";\nimport * as Schema from \"effect/Schema\";\nimport type { AgentSkillEvalsAssertionResult } from \"../internal-types.js\";\nimport { validationFailure } from \"./_helpers.js\";\n\nconst NonEmptyString = Schema.String.pipe(\n Schema.filter((value) => value.trim().length > 0, {\n identifier: \"NonEmptyString\",\n }),\n);\n\nconst OptionalString = Schema.optional(Schema.String);\n\nexport const PathArgsSchema = Schema.Struct({\n path: NonEmptyString,\n});\n\nexport const FileContainsArgsSchema = Schema.Struct({\n path: NonEmptyString,\n text: Schema.String,\n});\n\nexport const FileChangesOutsideScopeArgsSchema = Schema.Struct({\n scope: Schema.Array(NonEmptyString).pipe(Schema.minItems(1)),\n});\n\nexport const CodePatternArgsSchema = Schema.Struct({\n glob: NonEmptyString,\n pattern: NonEmptyString,\n});\n\nexport const VerifierArgsSchema = Schema.Struct({\n run: NonEmptyString,\n args: Schema.optional(Schema.Array(Schema.String)),\n timeoutMs: Schema.optional(Schema.Number),\n});\n\nexport const ToolCalledArgsSchema = Schema.Struct({\n tool: NonEmptyString,\n provider: OptionalString,\n server: OptionalString,\n args_match: Schema.optional(Schema.Unknown),\n});\n\nexport const ToolNotCalledArgsSchema = Schema.Struct({\n tool: OptionalString,\n provider: OptionalString,\n server: OptionalString,\n args_match: Schema.optional(Schema.Unknown),\n});\n\nexport const SkillLoadedArgsSchema = Schema.Struct({\n should_include: Schema.optional(Schema.Array(NonEmptyString)),\n should_exclude: Schema.optional(Schema.Array(NonEmptyString)),\n delivery: Schema.optional(Schema.Literal(\"native\", \"mcp\")),\n provider: OptionalString,\n server: OptionalString,\n source: OptionalString,\n});\n\nexport interface CodePatternArgs {\n glob: string;\n pattern: string;\n}\n\nexport interface FileChangesOutsideScopeArgs {\n scope: string[];\n}\n\nexport interface FileContainsArgs {\n path: string;\n text: string;\n}\n\nexport interface PathArgs {\n path: string;\n}\n\nexport interface ToolCalledArgs {\n tool: string;\n provider?: string;\n server?: string;\n args_match?: unknown;\n}\n\nexport interface ToolNotCalledArgs {\n tool?: string;\n provider?: string;\n server?: string;\n args_match?: unknown;\n}\n\nexport interface SkillLoadedArgs {\n should_include?: string[];\n should_exclude?: string[];\n delivery?: \"native\" | \"mcp\";\n provider?: string;\n server?: string;\n source?: string;\n}\n\nexport interface VerifierArgs {\n run: string;\n args?: string[];\n timeoutMs?: number;\n}\n\nexport function decodeCheckArgs<A, I>(\n schema: Schema.Schema<A, I, never>,\n assertion: unknown,\n invalidReason: string,\n): A | AgentSkillEvalsAssertionResult {\n const decoded = Schema.decodeUnknownEither(schema, { errors: \"all\" })(assertion ?? {});\n return Either.isRight(decoded) ? decoded.right : validationFailure(invalidReason);\n}\n\nexport function isValidationFailure(value: unknown): value is AgentSkillEvalsAssertionResult {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"pass\" in value &&\n (value as AgentSkillEvalsAssertionResult).pass === false &&\n typeof (value as AgentSkillEvalsAssertionResult).reason === \"string\"\n );\n}\n\nexport function decodeToolNotCalledArgs(\n assertion: unknown,\n): ToolNotCalledArgs | AgentSkillEvalsAssertionResult {\n const decoded = decodeCheckArgs(\n ToolNotCalledArgsSchema,\n assertion,\n \"tool.not_called: assertion must include at least one selector\",\n );\n return decoded;\n}\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport { decodeCheckArgs, isValidationFailure, VerifierArgsSchema } from \"./schemas.js\";\n\nexport const verifierSucceeds: VerifierPlugin = {\n type: \"verifier.succeeds\",\n verify(ctx) {\n return Effect.gen(function* () {\n const a = decodeCheckArgs(\n VerifierArgsSchema,\n ctx.assertion,\n \"verifier.succeeds: assertion.run must be a non-empty string\",\n );\n if (isValidationFailure(a)) return a;\n const r = yield* ctx.world.exec(a.run, a.args ?? [], {\n timeoutMs: a.timeoutMs ?? 60_000,\n });\n const matched = r.exitCode === 0;\n return applyMode(\n matched,\n ctx.mode,\n `verifier.succeeds: ${a.run} exited 0`,\n `verifier.succeeds: ${a.run} exited ${r.exitCode}: ${r.stderr.slice(0, 200)}`,\n );\n });\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport { decodeCheckArgs, isValidationFailure, VerifierArgsSchema } from \"./schemas.js\";\n\nexport const verifierFails: VerifierPlugin = {\n type: \"verifier.fails\",\n verify(ctx) {\n return Effect.gen(function* () {\n const a = decodeCheckArgs(\n VerifierArgsSchema,\n ctx.assertion,\n \"verifier.fails: assertion.run must be a non-empty string\",\n );\n if (isValidationFailure(a)) return a;\n const r = yield* ctx.world.exec(a.run, a.args ?? [], {\n timeoutMs: a.timeoutMs ?? 60_000,\n });\n const matched = r.exitCode !== 0;\n return applyMode(\n matched,\n ctx.mode,\n `verifier.fails: ${a.run} exited ${r.exitCode} (failed as expected)`,\n `verifier.fails: ${a.run} unexpectedly exited 0`,\n );\n });\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport { decodeCheckArgs, isValidationFailure, PathArgsSchema } from \"./schemas.js\";\n\nexport const fileExists: VerifierPlugin = {\n type: \"file.exists\",\n verify(ctx) {\n return Effect.gen(function* () {\n const a = decodeCheckArgs(\n PathArgsSchema,\n ctx.assertion,\n \"file.exists: assertion.path must be a non-empty string\",\n );\n if (isValidationFailure(a)) return a;\n const content = yield* ctx.world.readFile(a.path);\n const exists = content !== null;\n return applyMode(\n exists,\n ctx.mode,\n `file.exists: ${a.path} present`,\n `file.exists: ${a.path} not found`,\n );\n });\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport { decodeCheckArgs, isValidationFailure, PathArgsSchema } from \"./schemas.js\";\n\nexport const fileCreated: VerifierPlugin = {\n type: \"file.created\",\n verify(ctx) {\n const a = decodeCheckArgs(\n PathArgsSchema,\n ctx.assertion,\n \"file.created: assertion.path must be a non-empty string\",\n );\n if (isValidationFailure(a)) return Effect.succeed(a);\n const created = ctx.evidence\n .filesWritten()\n .some((ev) => ev.path === a.path && ev.op === \"create\");\n return Effect.succeed(applyMode(\n created,\n ctx.mode,\n `file.created: ${a.path} created`,\n `file.created: ${a.path} was not created`,\n ));\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport { decodeCheckArgs, isValidationFailure, PathArgsSchema } from \"./schemas.js\";\n\nexport const fileNotModified: VerifierPlugin = {\n type: \"file.not_modified\",\n verify(ctx) {\n const a = decodeCheckArgs(\n PathArgsSchema,\n ctx.assertion,\n \"file.not_modified: assertion.path must be a non-empty string\",\n );\n if (isValidationFailure(a)) return Effect.succeed(a);\n const wasModified = ctx.evidence\n .filesWritten()\n .some((f) => f.path === a.path);\n const matched = !wasModified;\n return Effect.succeed(applyMode(\n matched,\n ctx.mode,\n `file.not_modified: ${a.path} unchanged`,\n `file.not_modified: ${a.path} was modified`,\n ));\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport {\n decodeCheckArgs,\n FileContainsArgsSchema,\n isValidationFailure,\n} from \"./schemas.js\";\n\nexport const fileContains: VerifierPlugin = {\n type: \"file.contains\",\n verify(ctx) {\n return Effect.gen(function* () {\n const a = decodeCheckArgs(\n FileContainsArgsSchema,\n ctx.assertion,\n \"file.contains: assertion.path must be a non-empty string and assertion.text must be a string\",\n );\n if (isValidationFailure(a)) return a;\n const content = yield* ctx.world.readFile(a.path);\n const matched = content !== null && content.includes(a.text);\n return applyMode(\n matched,\n ctx.mode,\n `file.contains: ${a.path} contains \"${a.text.slice(0, 40)}\"`,\n content === null\n ? `file.contains: ${a.path} not found`\n : `file.contains: ${a.path} missing \"${a.text.slice(0, 40)}\"`,\n );\n });\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport {\n CodePatternArgsSchema,\n decodeCheckArgs,\n isValidationFailure,\n} from \"./schemas.js\";\n\nexport const codePatternExists: VerifierPlugin = {\n type: \"code.pattern_exists\",\n verify(ctx) {\n return Effect.gen(function* () {\n const a = decodeCheckArgs(\n CodePatternArgsSchema,\n ctx.assertion,\n \"code.pattern_exists: assertion.glob and assertion.pattern must be non-empty strings\",\n );\n if (isValidationFailure(a)) return a;\n let re: RegExp;\n try {\n re = new RegExp(a.pattern);\n } catch (err) {\n return {\n pass: false,\n score: 0,\n reason: `code.pattern_exists: invalid assertion.pattern regex: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n const files = yield* ctx.world.listFiles(a.glob);\n const matchedFiles: string[] = [];\n for (const f of files) {\n const content = yield* ctx.world.readFile(f);\n if (content && re.test(content)) matchedFiles.push(f);\n }\n const matched = matchedFiles.length > 0;\n return applyMode(\n matched,\n ctx.mode,\n `code.pattern_exists: /${a.pattern}/ found in ${matchedFiles.slice(0, 3).join(\", \")}`,\n `code.pattern_exists: /${a.pattern}/ not found in any ${a.glob}`,\n );\n });\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { codePatternExists } from \"./code-pattern-exists.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport {\n CodePatternArgsSchema,\n decodeCheckArgs,\n isValidationFailure,\n} from \"./schemas.js\";\n\n/**\n * Polarity-inverted alias of code.pattern_exists. \"matched\" means\n * \"no pattern matches anywhere\", which is the natural reading of the name.\n */\nexport const codeNoPattern: VerifierPlugin = {\n type: \"code.no_pattern\",\n verify(ctx) {\n return Effect.gen(function* () {\n const a = decodeCheckArgs(\n CodePatternArgsSchema,\n ctx.assertion,\n \"code.no_pattern: assertion.glob and assertion.pattern must be non-empty strings\",\n );\n if (isValidationFailure(a)) return a;\n try {\n new RegExp(a.pattern);\n } catch (err) {\n return {\n pass: false,\n score: 0,\n reason: `code.no_pattern: invalid assertion.pattern regex: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n const inner = yield* codePatternExists.verify({\n ...ctx,\n mode: \"should\",\n });\n // inner.pass = pattern was found\n const matched = !inner.pass;\n return applyMode(\n matched,\n ctx.mode,\n `code.no_pattern: pattern absent`,\n `code.no_pattern: pattern present (${inner.reason})`,\n );\n });\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport {\n decodeCheckArgs,\n FileChangesOutsideScopeArgsSchema,\n isValidationFailure,\n} from \"./schemas.js\";\n\nexport const fileChangesOutsideScope: VerifierPlugin = {\n type: \"file.changes_outside_scope\",\n verify(ctx) {\n const a = decodeCheckArgs(\n FileChangesOutsideScopeArgsSchema,\n ctx.assertion,\n \"file.changes_outside_scope: assertion.scope must contain at least one non-empty string\",\n );\n if (isValidationFailure(a)) return Effect.succeed(a);\n const written = ctx.evidence.filesWritten();\n const unrelated = written.filter((f) => !a.scope.some((s) => f.path.startsWith(s)));\n const matched = unrelated.length > 0;\n return Effect.succeed(applyMode(\n matched,\n ctx.mode,\n `file.changes_outside_scope: ${unrelated.length} file(s) outside scope: ${unrelated.slice(0, 3).map((f) => f.path).join(\", \")}`,\n `file.changes_outside_scope: no changes outside scope`,\n ));\n },\n};\n","export function matchesSubset(actual: unknown, expected: unknown): boolean {\n if (expected === actual) return true;\n if (Array.isArray(expected)) {\n return (\n Array.isArray(actual) &&\n expected.length === actual.length &&\n expected.every((item, i) => matchesSubset(actual[i], item))\n );\n }\n if (expected && typeof expected === \"object\") {\n if (!actual || typeof actual !== \"object\" || Array.isArray(actual)) return false;\n const actualRecord = actual as Record<string, unknown>;\n return Object.entries(expected as Record<string, unknown>).every(([key, value]) =>\n matchesSubset(actualRecord[key], value),\n );\n }\n return false;\n}\n","import { matchesSubset } from \"./_match.js\";\n\nexport interface CallMatchArgs {\n tool?: string;\n provider?: string;\n server?: string;\n args_match?: unknown;\n}\n\ninterface RecordedCall {\n tool: string;\n provider?: string;\n server?: string;\n args?: unknown;\n}\n\nexport function matchesRecordedCall(call: RecordedCall, args: CallMatchArgs): boolean {\n return (\n (!args.tool || call.tool === args.tool) &&\n (!args.provider || call.provider === args.provider) &&\n (!args.server || call.server === args.server) &&\n (args.args_match === undefined || matchesSubset(call.args, args.args_match))\n );\n}\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport { matchesRecordedCall } from \"./_call-match.js\";\nimport { decodeCheckArgs, isValidationFailure, ToolCalledArgsSchema } from \"./schemas.js\";\n\nexport const toolCalled: VerifierPlugin = {\n type: \"tool.called\",\n verify({ assertion, evidence, mode }) {\n const a = decodeCheckArgs(\n ToolCalledArgsSchema,\n assertion,\n \"tool.called: assertion.tool must be a non-empty string\",\n );\n if (isValidationFailure(a)) return Effect.succeed(a);\n const calls = evidence.toolCalls();\n if (!calls.length) {\n return Effect.succeed({ pass: false, score: 0, reason: \"tool.called: no built-in tool evidence found\" });\n }\n const found = calls.some((c) => matchesRecordedCall(c, a));\n return Effect.succeed(applyMode(\n found,\n mode,\n \"tool.called: matched built-in tool call\",\n \"tool.called: matching call not found\",\n ));\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { matchesRecordedCall } from \"./_call-match.js\";\nimport { decodeToolNotCalledArgs, isValidationFailure } from \"./schemas.js\";\n\nexport const toolNotCalled: VerifierPlugin = {\n type: \"tool.not_called\",\n verify({ assertion, evidence }) {\n const a = decodeToolNotCalledArgs(assertion);\n if (isValidationFailure(a)) return Effect.succeed(a);\n const calls = evidence.toolCalls();\n const found = calls.some((c) => matchesRecordedCall(c, a));\n return Effect.succeed(found\n ? { pass: false, score: 0, reason: \"tool.not_called: forbidden built-in tool call observed\" }\n : { pass: true, score: 1, reason: \"tool.not_called: no matching built-in tool calls observed\" });\n },\n};\n","import * as Effect from \"effect/Effect\";\nimport type { SkillLoadEvent, VerifierPlugin } from \"../internal-types.js\";\nimport { applyMode } from \"./_helpers.js\";\nimport { decodeCheckArgs, isValidationFailure, SkillLoadedArgsSchema } from \"./schemas.js\";\n\nexport const skillLoaded: VerifierPlugin = {\n type: \"skill.loaded\",\n verify({ assertion, evidence, mode }) {\n const a = decodeCheckArgs(\n SkillLoadedArgsSchema,\n assertion,\n \"skill.loaded: assertion must be an object\",\n );\n if (isValidationFailure(a)) return Effect.succeed(a);\n\n const shouldInclude = a.should_include ?? [];\n const shouldExclude = a.should_exclude ?? [];\n if (shouldInclude.length === 0 && shouldExclude.length === 0) {\n return Effect.succeed({\n pass: false,\n score: 0,\n reason: \"skill.loaded: declare should_include or should_exclude\",\n });\n }\n\n const events = evidence.skillsLoaded().filter((event) => matchesLoad(event, a));\n const loaded = new Set(events.map((event) => event.skill));\n const missing = shouldInclude.filter((skill) => !loaded.has(skill));\n const forbidden = shouldExclude.filter((skill) => loaded.has(skill));\n\n const matched = missing.length === 0 && forbidden.length === 0;\n const unmatchedReason = skillLoadedMismatchReason(missing, forbidden);\n\n return Effect.succeed(applyMode(\n matched,\n mode,\n \"skill.loaded: expected skill context observed\",\n unmatchedReason,\n ));\n },\n};\n\nfunction skillLoadedMismatchReason(\n missing: readonly string[],\n forbidden: readonly string[],\n): string {\n const reasons = [\n missing.length ? `missing loaded skill(s): ${missing.join(\", \")}` : \"\",\n forbidden.length ? `forbidden loaded skill(s): ${forbidden.join(\", \")}` : \"\",\n ].filter(Boolean);\n return `skill.loaded: ${reasons.join(\"; \")}`;\n}\n\nfunction matchesLoad(\n event: SkillLoadEvent,\n args: {\n delivery?: \"native\" | \"mcp\";\n provider?: string;\n server?: string;\n source?: string;\n },\n): boolean {\n return (\n (!args.delivery || event.delivery === args.delivery) &&\n (!args.provider || event.provider === args.provider) &&\n (!args.server || event.server === args.server) &&\n (!args.source || event.source === args.source)\n );\n}\n","import type { VerifierPlugin } from \"../internal-types.js\";\n\nimport { verifierSucceeds } from \"./verifier-succeeds.js\";\nimport { verifierFails } from \"./verifier-fails.js\";\nimport { fileExists } from \"./file-exists.js\";\nimport { fileCreated } from \"./file-created.js\";\nimport { fileNotModified } from \"./file-not-modified.js\";\nimport { fileContains } from \"./file-contains.js\";\nimport { codePatternExists } from \"./code-pattern-exists.js\";\nimport { codeNoPattern } from \"./code-no-pattern.js\";\nimport { fileChangesOutsideScope } from \"./file-changes-outside-scope.js\";\nimport { toolCalled } from \"./tool-called.js\";\nimport { toolNotCalled } from \"./tool-not-called.js\";\nimport { skillLoaded } from \"./skill-loaded.js\";\nimport { RUNTIME_CHECK_TYPES } from \"./check-set.js\";\n\nexport const corePlugins: readonly VerifierPlugin[] = [\n verifierSucceeds,\n verifierFails,\n fileExists,\n fileCreated,\n fileContains,\n fileNotModified,\n fileChangesOutsideScope,\n codePatternExists,\n codeNoPattern,\n toolCalled,\n toolNotCalled,\n skillLoaded,\n];\n\nexport function buildRegistry(\n extra: readonly VerifierPlugin[] = [],\n): Map<string, VerifierPlugin> {\n const reg = new Map<string, VerifierPlugin>();\n for (const p of [...corePlugins, ...extra]) {\n reg.set(p.type, p);\n }\n return reg;\n}\n\nexport const coreRegistry = buildRegistry();\n\nexport { RUNTIME_CHECK_TYPES };\n\nexport {\n verifierSucceeds,\n verifierFails,\n fileExists,\n fileCreated,\n fileNotModified,\n fileContains,\n codePatternExists,\n codeNoPattern,\n fileChangesOutsideScope,\n toolCalled,\n toolNotCalled,\n skillLoaded,\n};\n","import * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport type { VerifierPlugin } from \"../internal-types.js\";\nimport { corePlugins } from \"./index.js\";\n\nexport interface RuntimeCheckCatalogService {\n all(): readonly VerifierPlugin[];\n get(type: string): VerifierPlugin | undefined;\n knownTypes(): ReadonlySet<string>;\n}\n\nexport class RuntimeCheckCatalog extends Context.Tag(\"agent-skill-evals/promptfoo/RuntimeCheckCatalog\")<\n RuntimeCheckCatalog,\n RuntimeCheckCatalogService\n>() {}\n\nexport function runtimeCheckCatalogFromChecks(\n checks: readonly VerifierPlugin[] = corePlugins,\n): RuntimeCheckCatalogService {\n const registry = new Map<string, VerifierPlugin>();\n for (const check of checks) {\n registry.set(check.type, check);\n }\n return {\n all: () => [...registry.values()],\n get: (type) => registry.get(type),\n knownTypes: () => new Set(registry.keys()),\n };\n}\n\nexport function makeRuntimeCheckCatalogLayer(\n extraChecks: readonly VerifierPlugin[] = [],\n): Layer.Layer<RuntimeCheckCatalog> {\n return Layer.succeed(\n RuntimeCheckCatalog,\n runtimeCheckCatalogFromChecks([...corePlugins, ...extraChecks]),\n );\n}\n\nexport const RuntimeCheckCatalogLive = makeRuntimeCheckCatalogLayer();\n\nexport function getRuntimeCheck(\n type: string,\n): Effect.Effect<VerifierPlugin | undefined, never, RuntimeCheckCatalog> {\n return Effect.map(RuntimeCheckCatalog, (catalog) => catalog.get(type));\n}\n\nexport const getKnownRuntimeCheckTypes: Effect.Effect<ReadonlySet<string>, never, RuntimeCheckCatalog> =\n Effect.map(RuntimeCheckCatalog, (catalog) => catalog.knownTypes());\n","export const EVIDENCE_SCHEMA_VERSION = \"agent-skill-evals.evidence.v1\";\n\nexport interface CommandEvent {\n command: string;\n args: string[];\n exitCode: number;\n signal?: string;\n stdout?: string;\n stderr?: string;\n startedAt: number;\n durationMs: number;\n}\n\nexport interface FileEvent {\n path: string;\n op: \"create\" | \"modify\" | \"delete\";\n}\n\nexport interface ToolCallEvent {\n tool: string;\n provider?: string;\n server?: string;\n args?: unknown;\n result?: unknown;\n startedAt: number;\n durationMs: number;\n}\n\nexport interface SkillLoadEvent {\n skill: string;\n delivery: \"native\" | \"mcp\";\n provider?: string;\n server?: string;\n source?: string;\n startedAt: number;\n}\n\nexport interface Usage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface RunSummary {\n runDir: string;\n worldPath: string;\n fixture: string;\n durationMs?: number;\n}\n\nexport interface EvidenceSnapshot {\n schemaVersion: typeof EVIDENCE_SCHEMA_VERSION;\n output: string;\n run: RunSummary;\n commands: CommandEvent[];\n filesWritten: FileEvent[];\n toolCalls: ToolCallEvent[];\n skillsLoaded: SkillLoadEvent[];\n usage: Usage;\n extensions?: Record<string, unknown>;\n}\n","import * as Either from \"effect/Either\";\nimport * as ParseResult from \"effect/ParseResult\";\nimport * as Schema from \"effect/Schema\";\nimport {\n EVIDENCE_SCHEMA_VERSION,\n type CommandEvent,\n type EvidenceSnapshot,\n type FileEvent,\n type SkillLoadEvent,\n type RunSummary,\n type ToolCallEvent,\n type Usage,\n} from \"./evidence-types.js\";\n\nconst OptionalString = Schema.optional(Schema.String);\nconst OptionalNumber = Schema.optional(Schema.Number);\nconst StringArray = Schema.mutable(Schema.Array(Schema.String));\n\nconst CommandEventSchema = Schema.Struct({\n command: Schema.String,\n args: Schema.optionalWith(StringArray, { default: () => [] }),\n exitCode: Schema.Number,\n signal: OptionalString,\n stdout: OptionalString,\n stderr: OptionalString,\n startedAt: Schema.Number,\n durationMs: Schema.Number,\n});\n\nconst FileEventSchema = Schema.Struct({\n path: Schema.String,\n op: Schema.Literal(\"create\", \"modify\", \"delete\"),\n});\n\nconst ToolCallEventSchema = Schema.Struct({\n tool: Schema.String,\n provider: OptionalString,\n server: OptionalString,\n args: Schema.optional(Schema.Unknown),\n result: Schema.optional(Schema.Unknown),\n startedAt: Schema.Number,\n durationMs: Schema.Number,\n});\n\nconst SkillLoadEventSchema = Schema.Struct({\n skill: Schema.String,\n delivery: Schema.Literal(\"native\", \"mcp\"),\n provider: OptionalString,\n server: OptionalString,\n source: OptionalString,\n startedAt: Schema.Number,\n});\n\nconst UsageSchema = Schema.Struct({\n inputTokens: OptionalNumber,\n outputTokens: OptionalNumber,\n totalTokens: OptionalNumber,\n cacheReadTokens: OptionalNumber,\n cacheWriteTokens: OptionalNumber,\n});\n\nconst RunSummarySchema = Schema.Struct({\n runDir: Schema.String,\n worldPath: Schema.String,\n fixture: Schema.String,\n durationMs: OptionalNumber,\n});\n\nconst EvidenceSnapshotSchema = Schema.Struct({\n schemaVersion: Schema.Literal(EVIDENCE_SCHEMA_VERSION),\n output: Schema.optionalWith(Schema.String, { default: () => \"\" }),\n run: RunSummarySchema,\n commands: Schema.optionalWith(Schema.mutable(Schema.Array(CommandEventSchema)), { default: () => [] }),\n filesWritten: Schema.optionalWith(Schema.mutable(Schema.Array(FileEventSchema)), { default: () => [] }),\n toolCalls: Schema.optionalWith(Schema.mutable(Schema.Array(ToolCallEventSchema)), { default: () => [] }),\n skillsLoaded: Schema.optionalWith(Schema.mutable(Schema.Array(SkillLoadEventSchema)), { default: () => [] }),\n usage: Schema.optionalWith(UsageSchema, { default: () => ({}) }),\n extensions: Schema.optional(Schema.Record({\n key: Schema.String,\n value: Schema.Unknown,\n })),\n});\n\nconst decodeEvidenceSnapshot = Schema.decodeUnknownEither(EvidenceSnapshotSchema, {\n errors: \"all\",\n});\n\nexport type {\n CommandEvent,\n EvidenceSnapshot,\n FileEvent,\n SkillLoadEvent,\n RunSummary,\n ToolCallEvent,\n Usage,\n};\n\nexport { EVIDENCE_SCHEMA_VERSION };\n\nexport function decodeEvidenceSnapshotEither(\n input: unknown,\n): Either.Either<EvidenceSnapshot, Error> {\n const decoded = decodeEvidenceSnapshot(input);\n if (Either.isRight(decoded)) return Either.right(decoded.right);\n return Either.left(new Error(ParseResult.TreeFormatter.formatErrorSync(decoded.left)));\n}\n\nexport function parseEvidenceSnapshot(input: unknown): EvidenceSnapshot {\n const decoded = decodeEvidenceSnapshotEither(input);\n if (Either.isRight(decoded)) return decoded.right;\n throw decoded.left;\n}\n","import { join } from \"node:path\";\nimport * as Effect from \"effect/Effect\";\nimport type {\n EvidenceHandle,\n FileEvent,\n SkillLoadEvent,\n ToolCallEvent,\n Usage,\n CommandEvent,\n} from \"../internal-types.js\";\nimport {\n EVIDENCE_SCHEMA_VERSION,\n type EvidenceSnapshot,\n} from \"../evidence-types.js\";\nimport { parseEvidenceSnapshot } from \"../evidence-schema.js\";\nimport { FileSystem, NodeServicesLive } from \"../internal-services.js\";\n\nexport type { EvidenceSnapshot };\n\nexport interface SkillEvidenceConfig {\n mcpResource?: {\n uriArgPaths?: readonly string[];\n uriPatterns?: readonly string[];\n };\n mcpTool?: {\n toolPatterns?: readonly string[];\n };\n nativeArgs?: {\n whenArgs?: readonly string[];\n whenAnyArgs?: readonly string[];\n skillPathFlags?: readonly string[];\n provider?: string;\n source?: string;\n };\n}\n\nconst DEFAULT_SKILL_EVIDENCE_CONFIG = {\n mcpResource: {\n uriArgPaths: [\"uri\"],\n uriPatterns: [\"^skill://(?<skill>[^/]+)/SKILL\\\\.md$\"],\n },\n mcpTool: {\n toolPatterns: [\"^load_(?<skill>[A-Za-z0-9_-]+)_skill$\"],\n },\n} as const satisfies SkillEvidenceConfig;\n\nexport class EvidenceCollector {\n private readonly skillEvidenceConfig: SkillEvidenceConfig;\n private snapshot: EvidenceSnapshot = {\n schemaVersion: EVIDENCE_SCHEMA_VERSION,\n output: \"\",\n run: {\n runDir: \"\",\n worldPath: \"\",\n fixture: \"\",\n },\n commands: [],\n filesWritten: [],\n toolCalls: [],\n skillsLoaded: [],\n usage: {},\n };\n\n constructor(skillEvidenceConfig: SkillEvidenceConfig = {}) {\n this.skillEvidenceConfig = mergeSkillEvidenceConfig(skillEvidenceConfig);\n }\n\n addCommand(e: CommandEvent): void {\n this.snapshot.commands.push(e);\n }\n\n addFileWrite(e: FileEvent): void {\n this.snapshot.filesWritten.push(e);\n }\n\n addToolCall(e: ToolCallEvent): void {\n this.snapshot.toolCalls.push(e);\n const skillLoad = skillLoadFromToolCall(e, this.skillEvidenceConfig);\n if (skillLoad) this.addSkillLoad(skillLoad);\n }\n\n addSkillLoad(e: SkillLoadEvent): void {\n const exists = this.snapshot.skillsLoaded.some((existing) =>\n existing.skill === e.skill &&\n existing.delivery === e.delivery &&\n existing.provider === e.provider &&\n existing.server === e.server\n );\n if (exists) return;\n this.snapshot.skillsLoaded.push(e);\n }\n\n setUsage(u: Usage): void {\n this.snapshot.usage = u;\n }\n\n addUsage(u: Usage): void {\n this.snapshot.usage = mergeUsage(this.snapshot.usage, u);\n }\n\n setOutput(output: string): void {\n this.snapshot.output = output;\n }\n\n setRun(run: EvidenceSnapshot[\"run\"]): void {\n this.snapshot.run = run;\n }\n\n toSnapshot(): EvidenceSnapshot {\n return parseEvidenceSnapshot({\n schemaVersion: this.snapshot.schemaVersion,\n output: this.snapshot.output,\n run: { ...this.snapshot.run },\n commands: [...this.snapshot.commands],\n filesWritten: [...this.snapshot.filesWritten],\n toolCalls: [...this.snapshot.toolCalls],\n skillsLoaded: [...this.snapshot.skillsLoaded],\n usage: { ...this.snapshot.usage },\n extensions: this.snapshot.extensions ? { ...this.snapshot.extensions } : undefined,\n });\n }\n\n async writeTo(runDir: string): Promise<string> {\n return Effect.runPromise(writeEvidenceToEffect(this, runDir).pipe(Effect.provide(NodeServicesLive)));\n }\n\n static fromSnapshot(snapshot: EvidenceSnapshot): EvidenceCollector {\n const collector = new EvidenceCollector();\n collector.snapshot = parseEvidenceSnapshot(snapshot);\n return collector;\n }\n}\n\nfunction mergeSkillEvidenceConfig(config: SkillEvidenceConfig): SkillEvidenceConfig {\n return {\n mcpResource: {\n uriArgPaths: config.mcpResource?.uriArgPaths ?? DEFAULT_SKILL_EVIDENCE_CONFIG.mcpResource.uriArgPaths,\n uriPatterns: config.mcpResource?.uriPatterns ?? DEFAULT_SKILL_EVIDENCE_CONFIG.mcpResource.uriPatterns,\n },\n mcpTool: {\n toolPatterns: config.mcpTool?.toolPatterns ?? DEFAULT_SKILL_EVIDENCE_CONFIG.mcpTool.toolPatterns,\n },\n ...(config.nativeArgs ? { nativeArgs: config.nativeArgs } : {}),\n };\n}\n\nfunction skillLoadFromToolCall(\n event: ToolCallEvent,\n config: SkillEvidenceConfig,\n): SkillLoadEvent | undefined {\n const uri = skillUriFromArgs(event.args, config.mcpResource?.uriArgPaths ?? []);\n const skill = uri\n ? skillFromPattern(uri, config.mcpResource?.uriPatterns ?? [])\n : skillFromTool(event.tool, config.mcpTool?.toolPatterns ?? []);\n if (!skill) return undefined;\n const server = event.server ?? serverFromArgs(event.args);\n return {\n skill,\n delivery: \"mcp\",\n ...(event.provider ? { provider: event.provider } : {}),\n ...(server ? { server } : {}),\n source: event.tool,\n startedAt: event.startedAt,\n };\n}\n\nfunction skillUriFromArgs(args: unknown, paths: readonly string[]): string | undefined {\n for (const path of paths) {\n const uri = valueAtPath(args, path);\n if (typeof uri === \"string\") return uri;\n }\n return undefined;\n}\n\nfunction serverFromArgs(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) return undefined;\n const server = (args as Record<string, unknown>).server;\n return typeof server === \"string\" ? server : undefined;\n}\n\nfunction skillFromPattern(value: string, patterns: readonly string[]): string | undefined {\n for (const pattern of patterns) {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, \"i\");\n } catch {\n continue;\n }\n const match = regex.exec(value);\n const skill = match?.groups?.skill ?? match?.[1];\n if (skill) return skill;\n }\n return undefined;\n}\n\nfunction skillFromTool(tool: string, patterns: readonly string[]): string | undefined {\n const skill = skillFromPattern(tool, patterns);\n return skill?.replace(/_/g, \"-\");\n}\n\nfunction valueAtPath(value: unknown, path: string): unknown {\n let current = value;\n for (const segment of path.split(\".\")) {\n if (!current || typeof current !== \"object\" || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction addOptionalNumbers(a: number | undefined, b: number | undefined): number | undefined {\n if (a === undefined) return b;\n if (b === undefined) return a;\n return a + b;\n}\n\nfunction mergeUsage(a: Usage, b: Usage): Usage {\n return {\n inputTokens: addOptionalNumbers(a.inputTokens, b.inputTokens),\n outputTokens: addOptionalNumbers(a.outputTokens, b.outputTokens),\n totalTokens: addOptionalNumbers(a.totalTokens, b.totalTokens),\n cacheReadTokens: addOptionalNumbers(a.cacheReadTokens, b.cacheReadTokens),\n cacheWriteTokens: addOptionalNumbers(a.cacheWriteTokens, b.cacheWriteTokens),\n };\n}\n\nexport function writeEvidenceToEffect(\n collector: EvidenceCollector,\n runDir: string,\n): Effect.Effect<string, unknown, FileSystem> {\n return Effect.gen(function* () {\n const fs = yield* FileSystem;\n const path = join(runDir, \"evidence.json\");\n yield* fs.writeText(path, JSON.stringify(collector.toSnapshot(), null, 2));\n return path;\n });\n}\n\nexport function evidenceFromSnapshot(s: EvidenceSnapshot): EvidenceHandle {\n return {\n commands: () => s.commands,\n filesWritten: () => s.filesWritten,\n toolCalls: () => s.toolCalls,\n skillsLoaded: () => s.skillsLoaded,\n usage: () => s.usage,\n };\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport * as Clock from \"effect/Clock\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\n\nexport interface CommandRunOptions {\n cwd: string;\n env?: NodeJS.ProcessEnv;\n stdin?: string;\n timeoutMs?: number;\n stdoutLimit?: number;\n stderrLimit?: number;\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n}\n\nexport interface CommandRunResult {\n command: string;\n args: string[];\n exitCode: number;\n signal?: NodeJS.Signals;\n stdout: string;\n stderr: string;\n startedAt: number;\n durationMs: number;\n timedOut: boolean;\n error?: Error;\n}\n\nconst DEFAULT_OUTPUT_LIMIT = 4096;\nconst KILL_GRACE_MS = 1_000;\nconst EXIT_STDIO_FLUSH_MS = 50;\n\ninterface ProcessRunnerService {\n run(\n command: string,\n args: readonly string[],\n options: CommandRunOptions,\n ): Effect.Effect<CommandRunResult>;\n}\n\nexport class ProcessRunner extends Context.Tag(\"agent-skill-evals/promptfoo/ProcessRunner\")<\n ProcessRunner,\n ProcessRunnerService\n>() {}\n\nfunction appendLimited(current: string, chunk: string, limit: number): string {\n if (limit <= 0) return \"\";\n const next = current + chunk;\n return next.length <= limit ? next : next.slice(next.length - limit);\n}\n\nfunction killProcessGroup(child: ChildProcess, signal: NodeJS.Signals): void {\n if (!child.pid) return;\n try {\n if (process.platform === \"win32\") {\n child.kill(signal);\n } else {\n process.kill(-child.pid, signal);\n }\n } catch {\n try {\n child.kill(signal);\n } catch {\n // The process may already be gone.\n }\n }\n}\n\nexport function runCommand(\n command: string,\n args: readonly string[] = [],\n options: CommandRunOptions,\n): Promise<CommandRunResult> {\n return Effect.runPromise(\n runCommandEffect(command, args, options).pipe(Effect.provide(ProcessRunnerLive)),\n );\n}\n\nexport function runCommandEffect(\n command: string,\n args: readonly string[] = [],\n options: CommandRunOptions,\n): Effect.Effect<CommandRunResult, never, ProcessRunner> {\n return Effect.flatMap(ProcessRunner, (runner) => runner.run(command, args, options));\n}\n\n// This stays custom because it preserves process-group kill, forced timeout,\n// and inherited-stdio behavior that platform Command has not been proven to match.\nexport const ProcessRunnerLive = Layer.succeed(ProcessRunner, {\n run: nodeRunCommandEffect,\n});\n\nfunction nodeRunCommandEffect(\n command: string,\n args: readonly string[],\n options: CommandRunOptions,\n): Effect.Effect<CommandRunResult> {\n const stdoutLimit = options.stdoutLimit ?? DEFAULT_OUTPUT_LIMIT;\n const stderrLimit = options.stderrLimit ?? DEFAULT_OUTPUT_LIMIT;\n\n return Effect.gen(function* () {\n const startedAt = yield* Clock.currentTimeMillis;\n return yield* Effect.async<CommandRunResult>((resume, signal) => {\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n let timeoutTimer: NodeJS.Timeout | null = null;\n let forceTimer: NodeJS.Timeout | null = null;\n let exitFlushTimer: NodeJS.Timeout | null = null;\n let abortListener: (() => void) | null = null;\n\n const finish = (result: Omit<CommandRunResult, \"durationMs\">) => {\n if (settled) return;\n settled = true;\n if (timeoutTimer) clearTimeout(timeoutTimer);\n if (forceTimer) clearTimeout(forceTimer);\n if (exitFlushTimer) clearTimeout(exitFlushTimer);\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.stdin?.destroy();\n if (abortListener) signal.removeEventListener(\"abort\", abortListener);\n if (process.platform !== \"win32\") killProcessGroup(child, \"SIGTERM\");\n resume(\n Clock.currentTimeMillis.pipe(\n Effect.map((endedAt) => ({\n ...result,\n durationMs: endedAt - startedAt,\n })),\n ),\n );\n };\n\n abortListener = () => {\n timedOut = true;\n stderr = appendLimited(\n stderr,\n `${stderr ? \"\\n\" : \"\"}agent-skill-evals: command interrupted`,\n stderrLimit,\n );\n killProcessGroup(child, \"SIGKILL\");\n finish({\n command,\n args: [...args],\n exitCode: -1,\n signal: \"SIGKILL\",\n stdout,\n stderr,\n startedAt,\n timedOut,\n });\n };\n signal.addEventListener(\"abort\", abortListener, { once: true });\n\n child.stdout?.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout = appendLimited(stdout, text, stdoutLimit);\n options.onStdout?.(text);\n });\n\n child.stderr?.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr = appendLimited(stderr, text, stderrLimit);\n options.onStderr?.(text);\n });\n\n child.on(\"error\", (error) => {\n stderr = appendLimited(stderr, String(error), stderrLimit);\n finish({\n command,\n args: [...args],\n exitCode: -1,\n stdout,\n stderr,\n startedAt,\n timedOut,\n error,\n });\n });\n\n child.on(\"exit\", (code, signal) => {\n const result = {\n command,\n args: [...args],\n exitCode: code ?? -1,\n signal: signal ?? undefined,\n stdout,\n stderr,\n startedAt,\n timedOut,\n };\n exitFlushTimer = setTimeout(() => finish(result), EXIT_STDIO_FLUSH_MS);\n });\n\n child.on(\"close\", (code, signal) => {\n finish({\n command,\n args: [...args],\n exitCode: code ?? -1,\n signal: signal ?? undefined,\n stdout,\n stderr,\n startedAt,\n timedOut,\n });\n });\n\n if (options.stdin !== undefined) {\n child.stdin?.write(options.stdin);\n }\n child.stdin?.end();\n\n if (options.timeoutMs) {\n timeoutTimer = setTimeout(() => {\n timedOut = true;\n stderr = appendLimited(\n stderr,\n `${stderr ? \"\\n\" : \"\"}agent-skill-evals: command timed out after ${options.timeoutMs}ms`,\n stderrLimit,\n );\n killProcessGroup(child, \"SIGKILL\");\n forceTimer = setTimeout(() => {\n finish({\n command,\n args: [...args],\n exitCode: -1,\n signal: \"SIGKILL\",\n stdout,\n stderr,\n startedAt,\n timedOut,\n });\n }, KILL_GRACE_MS);\n }, options.timeoutMs);\n }\n });\n });\n}\n","import * as Effect from \"effect/Effect\";\nimport * as Stream from \"effect/Stream\";\n\ninterface JsonlState {\n leftover: string;\n events: unknown[];\n}\n\nfunction appendLine(events: unknown[], line: string): unknown[] {\n if (!line.trim()) return events;\n try {\n return [...events, JSON.parse(line) as unknown];\n } catch {\n return events;\n }\n}\n\nfunction parseChunk(state: JsonlState, text: string): JsonlState {\n const lines = (state.leftover + text).split(\"\\n\");\n const leftover = lines.pop() ?? \"\";\n const events = lines.reduce(appendLine, state.events);\n return { leftover, events };\n}\n\nexport interface JsonlEventParser {\n push(chunk: string): unknown[];\n finish(): unknown[];\n}\n\nexport function createJsonlEventParser(): JsonlEventParser {\n let leftover = \"\";\n return {\n push(chunk) {\n const state = parseChunk({ leftover, events: [] }, chunk);\n leftover = state.leftover;\n return state.events;\n },\n finish() {\n const events = appendLine([], leftover);\n leftover = \"\";\n return events;\n },\n };\n}\n\nexport function parseJsonlChunksEffect(\n chunks: Iterable<string>,\n): Effect.Effect<unknown[]> {\n return Stream.fromIterable(chunks).pipe(\n Stream.runFold({ leftover: \"\", events: [] } satisfies JsonlState, parseChunk),\n Effect.map((state) => ({\n ...state,\n events: appendLine(state.events, state.leftover),\n })),\n Effect.map((state) => state.events),\n );\n}\n\nexport function parseJsonlChunks(chunks: Iterable<string>): unknown[] {\n return Effect.runSync(parseJsonlChunksEffect(chunks));\n}\n","import { isAbsolute, relative } from \"node:path\";\nimport * as Clock from \"effect/Clock\";\nimport * as Effect from \"effect/Effect\";\nimport type { EvidenceCollector } from \"./evidence.js\";\nimport type { CommandEvent, ToolCallEvent, Usage } from \"../internal-types.js\";\nimport { ProcessRunner, runCommandEffect } from \"./command-runner.js\";\nimport { createJsonlEventParser } from \"./jsonl-stream.js\";\n\nexport interface AdapterRunInput {\n command: string;\n args: readonly string[];\n cwd: string;\n prompt: string;\n evidence: EvidenceCollector;\n timeoutMs?: number;\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface AdapterRunResult {\n output: string;\n exitCode: number;\n timedOut: boolean;\n error?: string;\n durationMs: number;\n}\n\nexport interface Adapter {\n id: string;\n run(input: AdapterRunInput): Effect.Effect<AdapterRunResult, never, ProcessRunner>;\n}\n\ninterface JsonlAdapterOptions {\n promptDelivery?: \"stdin\" | \"arg\";\n}\n\ninterface EvidenceSink {\n addCommand(e: CommandEvent): void;\n addToolCall(e: ToolCallEvent): void;\n setUsage(u: Usage): void;\n addUsage(u: Usage): void;\n now?: () => number;\n}\n\nfunction argsWithPrompt(args: readonly string[], prompt: string): string[] {\n const dashIndex = args.lastIndexOf(\"-\");\n if (dashIndex === -1) return [...args, prompt];\n return args.map((arg, index) => (index === dashIndex ? prompt : arg));\n}\n\nfunction normalizePathFromCwd(path: string, cwd: string): string {\n if (!isAbsolute(path)) return path;\n const candidate = path.startsWith(\"/private/\") ? path.slice(\"/private\".length) : path;\n const base = cwd.startsWith(\"/private/\") ? cwd.slice(\"/private\".length) : cwd;\n const rel = relative(base, candidate);\n return rel && !rel.startsWith(\"..\") && !isAbsolute(rel) ? rel : path;\n}\n\nfunction normalizeToolCallArgs(args: unknown, cwd: string): unknown {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) return args;\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(args)) {\n const pathLike = (key === \"path\" || key === \"file_path\") && typeof value === \"string\";\n const normalizedValue = pathLike ? normalizePathFromCwd(value, cwd) : value;\n normalized[key] = normalizedValue;\n if (key === \"file_path\" && typeof normalizedValue === \"string\" && normalized.path === undefined) {\n normalized.path = normalizedValue;\n }\n }\n return normalized;\n}\n\nfunction normalizeMcpToolCall(event: ToolCallEvent): ToolCallEvent {\n const match = /^mcp__(.+?)__(.+)$/.exec(event.tool);\n if (!match) return event;\n return {\n ...event,\n server: event.server ?? match[1],\n tool: match[2] ?? event.tool,\n };\n}\n\nfunction parseJsonObjectString(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === \"object\" ? parsed : value;\n } catch {\n return value;\n }\n}\n\nfunction evidenceWithRelativeToolPaths(\n evidence: EvidenceCollector,\n cwd: string,\n now: () => number,\n): EvidenceSink {\n return {\n addCommand: (event) => evidence.addCommand(event),\n addToolCall: (event) => {\n const normalized = normalizeMcpToolCall(event);\n evidence.addToolCall({\n ...normalized,\n args: normalizeToolCallArgs(normalized.args, cwd),\n });\n },\n setUsage: (usage) => evidence.setUsage(usage),\n addUsage: (usage) => evidence.addUsage(usage),\n now,\n };\n}\n\nfunction normalizeUsage(usage: Record<string, number>): Usage {\n const inputTokens = usage.input_tokens ?? usage.inputTokens ?? usage.input;\n const outputTokens = usage.output_tokens ?? usage.outputTokens ?? usage.output;\n const cacheReadTokens =\n usage.cache_read_input_tokens ?? usage.cacheReadTokens ?? usage.cacheRead;\n const cacheWriteTokens =\n usage.cache_creation_input_tokens ?? usage.cacheWriteTokens ?? usage.cacheWrite;\n return {\n inputTokens,\n outputTokens,\n totalTokens:\n usage.total_tokens ??\n usage.totalTokens ??\n addKnownNumbers(inputTokens, outputTokens),\n cacheReadTokens,\n cacheWriteTokens,\n };\n}\n\nfunction addKnownNumbers(...values: Array<number | undefined>): number | undefined {\n const present = values.filter((value): value is number => typeof value === \"number\");\n return present.length > 0 ? present.reduce((sum, value) => sum + value, 0) : undefined;\n}\n\nfunction normalizePiToolName(tool: string): string {\n switch (tool.toLowerCase()) {\n case \"bash\":\n return \"Bash\";\n case \"edit\":\n return \"Edit\";\n case \"read\":\n return \"Read\";\n case \"write\":\n return \"Write\";\n default:\n return tool;\n }\n}\n\nfunction evidenceStartedAt(evidence: EvidenceSink): number {\n return evidence.now?.() ?? 0;\n}\n\nfunction runJsonlAdapter(\n input: AdapterRunInput,\n onEvent: (evt: unknown, evidence: EvidenceSink, appendFinal: (s: string) => void) => void,\n options: JsonlAdapterOptions = {},\n): Effect.Effect<AdapterRunResult, never, ProcessRunner> {\n const { command, args, cwd, prompt, evidence, timeoutMs, env } = input;\n const promptDelivery = options.promptDelivery ?? \"stdin\";\n const spawnArgs = promptDelivery === \"arg\" ? argsWithPrompt(args, prompt) : [...args];\n return Effect.gen(function* () {\n const runStartedAt = yield* Clock.currentTimeMillis;\n const adapterEvidence = evidenceWithRelativeToolPaths(evidence, cwd, () => runStartedAt);\n const parser = createJsonlEventParser();\n let finalText = \"\";\n const handleChunk = (chunk: string) => {\n for (const evt of parser.push(chunk)) {\n onEvent(evt, adapterEvidence, (text) => (finalText += text));\n }\n };\n\n const result = yield* runCommandEffect(command, spawnArgs, {\n cwd,\n env,\n stdin: promptDelivery === \"stdin\" ? prompt : undefined,\n timeoutMs,\n stdoutLimit: 0,\n onStdout: handleChunk,\n });\n\n for (const evt of parser.finish()) {\n onEvent(evt, adapterEvidence, (text) => (finalText += text));\n }\n evidence.addCommand({\n command,\n args: [...spawnArgs],\n exitCode: result.exitCode,\n stderr: result.stderr.slice(0, 4096),\n startedAt: result.startedAt,\n durationMs: result.durationMs,\n });\n const error = result.error\n ? `adapter error: failed to start \"${command}\": ${result.error.message}`\n : result.timedOut\n ? `${command} timed out after ${timeoutMs ?? 0}ms`\n : result.exitCode !== 0\n ? `${command} exited ${result.exitCode}${result.stderr.trim() ? `: ${result.stderr.trim()}` : \"\"}`\n : undefined;\n if (error && !finalText.trim()) finalText = error;\n return {\n output: finalText.trim(),\n exitCode: result.exitCode,\n timedOut: result.timedOut,\n ...(error ? { error } : {}),\n durationMs: result.durationMs,\n };\n });\n}\n\n/**\n * Claude Code stream-json adapter: parses stream-json events emitted by\n * `claude -p ... --output-format stream-json` and projects them into evidence.\n *\n * Events of interest (see Claude Code docs):\n * - { type: \"system\" | \"assistant\" | \"user\" | \"result\", ... }\n * - tool_use blocks inside assistant content (Bash, Edit, Write, etc.)\n */\nexport const claudeCodeJsonAdapter: Adapter = {\n id: \"claude-code-json\",\n run(input) {\n return runJsonlAdapter(input, handleClaudeEvent);\n },\n};\n\nexport const codexJsonAdapter: Adapter = {\n id: \"codex-json\",\n run(input) {\n return runJsonlAdapter(input, handleCodexEvent, { promptDelivery: \"arg\" });\n },\n};\n\nexport const piJsonAdapter: Adapter = {\n id: \"pi-json\",\n run(input) {\n return runJsonlAdapter(input, handlePiEvent);\n },\n};\n\nexport const internalTestJsonAdapter: Adapter = {\n id: \"internal-test-json\",\n run(input) {\n return runJsonlAdapter(input, handleCodexEvent);\n },\n};\n\nexport function handleClaudeEvent(\n evt: unknown,\n evidence: EvidenceSink,\n appendFinal: (s: string) => void,\n): void {\n if (!evt || typeof evt !== \"object\") return;\n const e = evt as { type?: string; message?: unknown; result?: unknown; usage?: unknown };\n if (e.type === \"result\" && typeof e.result === \"string\") {\n appendFinal(e.result);\n }\n if (e.type === \"assistant\" && e.message && typeof e.message === \"object\") {\n const msg = e.message as { content?: unknown; usage?: unknown };\n if (msg.usage && typeof msg.usage === \"object\") {\n evidence.addUsage(normalizeUsage(msg.usage as Record<string, number>));\n }\n if (Array.isArray(msg.content)) {\n for (const block of msg.content) {\n if (!block || typeof block !== \"object\") continue;\n const b = block as { type?: string; text?: string; name?: string; input?: unknown };\n if (b.type === \"text\" && typeof b.text === \"string\") {\n appendFinal(b.text);\n }\n if (b.type === \"tool_use\" && typeof b.name === \"string\") {\n evidence.addToolCall({\n tool: b.name,\n provider: \"claude-code-json\",\n args: b.input,\n startedAt: evidenceStartedAt(evidence),\n durationMs: 0,\n });\n }\n }\n }\n }\n if (e.type === \"result\" && e.usage && typeof e.usage === \"object\") {\n evidence.setUsage(normalizeUsage(e.usage as Record<string, number>));\n }\n}\n\nexport function handleCodexEvent(\n evt: unknown,\n evidence: EvidenceSink,\n appendFinal: (s: string) => void,\n): void {\n if (!evt || typeof evt !== \"object\") return;\n const e = evt as Record<string, unknown>;\n const type = typeof e.type === \"string\" ? e.type : \"\";\n\n const text =\n typeof e.message === \"string\" ? e.message :\n typeof e.text === \"string\" ? e.text :\n typeof e.content === \"string\" ? e.content :\n typeof e.output === \"string\" ? e.output :\n undefined;\n if (text && /message|final|result|response|output/.test(type)) {\n appendFinal(text);\n }\n\n const item = e.item && typeof e.item === \"object\" ? e.item as Record<string, unknown> : e;\n const itemType = typeof item.type === \"string\" ? item.type : \"\";\n const toolName =\n typeof item.tool === \"string\" ? item.tool :\n typeof item.name === \"string\" && /tool|call|command/.test(`${type}:${itemType}`) ? item.name :\n undefined;\n if (toolName && /tool|call|command/.test(`${type}:${itemType}`)) {\n evidence.addToolCall({\n tool: toolName,\n provider: \"codex-json\",\n server: typeof item.server === \"string\" ? item.server : undefined,\n args: parseJsonObjectString(item.args ?? item.input ?? item.arguments),\n result: item.result ?? item.output,\n startedAt: evidenceStartedAt(evidence),\n durationMs: 0,\n });\n }\n\n if (itemType === \"file_change\" && Array.isArray(item.changes)) {\n for (const change of item.changes) {\n if (!change || typeof change !== \"object\") continue;\n const c = change as { path?: unknown; kind?: unknown };\n if (typeof c.path !== \"string\") continue;\n evidence.addToolCall({\n tool: \"Edit\",\n provider: \"codex-json\",\n args: {\n path: c.path,\n kind: typeof c.kind === \"string\" ? c.kind : undefined,\n },\n startedAt: evidenceStartedAt(evidence),\n durationMs: 0,\n });\n }\n }\n\n if ((type.includes(\"exec\") || type.includes(\"command\") || itemType.includes(\"command\")) && typeof item.command === \"string\") {\n const args = Array.isArray(item.args) ? item.args.map(String) : [];\n evidence.addCommand({\n command: item.command,\n args,\n exitCode: typeof item.exit_code === \"number\" ? item.exit_code : typeof item.exitCode === \"number\" ? item.exitCode : 0,\n stdout: typeof item.stdout === \"string\" ? item.stdout.slice(0, 4096) : typeof item.aggregated_output === \"string\" ? item.aggregated_output.slice(0, 4096) : undefined,\n stderr: typeof item.stderr === \"string\" ? item.stderr.slice(0, 4096) : undefined,\n startedAt: evidenceStartedAt(evidence),\n durationMs: typeof item.durationMs === \"number\" ? item.durationMs : 0,\n });\n }\n\n const usage = e.usage && typeof e.usage === \"object\" ? e.usage as Record<string, number> : undefined;\n if (usage) {\n evidence.setUsage(normalizeUsage(usage));\n }\n}\n\nexport function handlePiEvent(\n evt: unknown,\n evidence: EvidenceSink,\n appendFinal: (s: string) => void,\n): void {\n if (!evt || typeof evt !== \"object\") return;\n const e = evt as Record<string, unknown>;\n const type = typeof e.type === \"string\" ? e.type : \"\";\n const message = e.message && typeof e.message === \"object\"\n ? e.message as Record<string, unknown>\n : undefined;\n const messageUsage = message?.usage && typeof message.usage === \"object\"\n ? message.usage as Record<string, number>\n : undefined;\n if (messageUsage && (type === \"message_end\" || type === \"turn_end\" || type === \"agent_end\")) {\n evidence.setUsage(normalizeUsage(messageUsage));\n }\n\n const text =\n typeof e.message === \"string\" ? e.message :\n typeof e.text === \"string\" ? e.text :\n typeof e.content === \"string\" ? e.content :\n typeof e.output === \"string\" ? e.output :\n typeof e.result === \"string\" ? e.result :\n undefined;\n if (text && /assistant|message|final|result|response|output/.test(type)) {\n appendFinal(text);\n }\n\n if (type === \"tool_execution_start\" || type === \"tool_execution_end\") {\n const rawTool =\n typeof e.tool === \"string\" ? e.tool :\n typeof e.name === \"string\" ? e.name :\n typeof e.tool_name === \"string\" ? e.tool_name :\n typeof e.toolName === \"string\" ? e.toolName :\n undefined;\n const tool = rawTool ? normalizePiToolName(rawTool) : undefined;\n if (tool) {\n evidence.addToolCall({\n tool,\n provider: \"pi-json\",\n args: e.args ?? e.input ?? e.arguments,\n result: type === \"tool_execution_end\" ? e.result ?? e.output : undefined,\n startedAt: evidenceStartedAt(evidence),\n durationMs: typeof e.duration_ms === \"number\" ? e.duration_ms : typeof e.durationMs === \"number\" ? e.durationMs : 0,\n });\n }\n }\n\n if (type === \"tool_execution_end\") {\n const tool =\n typeof e.tool === \"string\" ? e.tool :\n typeof e.name === \"string\" ? e.name :\n typeof e.tool_name === \"string\" ? e.tool_name :\n typeof e.toolName === \"string\" ? e.toolName :\n \"\";\n const commandText =\n typeof e.command === \"string\" ? e.command :\n e.args && typeof e.args === \"object\" && !Array.isArray(e.args) && typeof (e.args as Record<string, unknown>).command === \"string\"\n ? (e.args as Record<string, string>).command\n : undefined;\n if (commandText && /bash|shell|command|exec/i.test(tool)) {\n evidence.addCommand({\n command: commandText,\n args: [],\n exitCode: typeof e.exit_code === \"number\" ? e.exit_code : typeof e.exitCode === \"number\" ? e.exitCode : 0,\n stdout: typeof e.stdout === \"string\" ? e.stdout.slice(0, 4096) : typeof e.output === \"string\" ? e.output.slice(0, 4096) : undefined,\n stderr: typeof e.stderr === \"string\" ? e.stderr.slice(0, 4096) : undefined,\n startedAt: evidenceStartedAt(evidence),\n durationMs: typeof e.duration_ms === \"number\" ? e.duration_ms : typeof e.durationMs === \"number\" ? e.durationMs : 0,\n });\n }\n }\n\n const usage = e.usage && typeof e.usage === \"object\"\n ? e.usage as Record<string, number>\n : e as Record<string, number>;\n if (type === \"usage\" || e.usage) {\n evidence.setUsage(normalizeUsage(usage));\n }\n}\n\nexport const adapterRegistry: Map<string, Adapter> = new Map([\n [claudeCodeJsonAdapter.id, claudeCodeJsonAdapter],\n [codexJsonAdapter.id, codexJsonAdapter],\n [piJsonAdapter.id, piJsonAdapter],\n [internalTestJsonAdapter.id, internalTestJsonAdapter],\n]);\n","import * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport { adapterRegistry, type Adapter } from \"./adapters.js\";\n\nexport interface AdapterCatalogService {\n get(id: string): Adapter | undefined;\n}\n\nexport class AdapterCatalog extends Context.Tag(\"agent-skill-evals/promptfoo/AdapterCatalog\")<\n AdapterCatalog,\n AdapterCatalogService\n>() {}\n\nexport const AdapterCatalogLive = Layer.succeed(AdapterCatalog, {\n get: (id) => adapterRegistry.get(id),\n});\n\nexport function getAdapter(\n id: string,\n): Effect.Effect<Adapter | undefined, never, AdapterCatalog> {\n return Effect.map(AdapterCatalog, (catalog) => catalog.get(id));\n}\n","import { join, relative } from \"node:path\";\nimport * as Effect from \"effect/Effect\";\nimport { FileSystem, NodeServicesLive } from \"../internal-services.js\";\n\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\"]);\n\nexport async function walkFiles(\n root: string,\n visit: (relativePath: string, absolutePath: string) => Promise<void> | void,\n): Promise<void> {\n return Effect.runPromise(\n walkFilesEffect(root, (relativePath, absolutePath) =>\n Effect.promise(() => Promise.resolve(visit(relativePath, absolutePath))),\n ).pipe(Effect.provide(NodeServicesLive)),\n );\n}\n\nexport function walkFilesEffect(\n root: string,\n visit: (relativePath: string, absolutePath: string) => Effect.Effect<void, never, FileSystem>,\n): Effect.Effect<void, never, FileSystem> {\n return Effect.gen(function* () {\n const fs = yield* FileSystem;\n function walk(dir: string): Effect.Effect<void, never, FileSystem> {\n return Effect.gen(function* () {\n const entries = yield* fs.readDirectory(dir).pipe(\n Effect.catchAll(() => Effect.succeed([])),\n );\n for (const entry of entries) {\n const absolutePath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n yield* walk(absolutePath);\n continue;\n }\n if (entry.isFile()) {\n yield* visit(relative(root, absolutePath), absolutePath);\n }\n }\n });\n }\n\n const rootStat = yield* fs.stat(root).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!rootStat?.isDirectory()) return;\n yield* walk(root);\n });\n}\n\n/**\n * Minimal glob support for Agent Skill Evals verifier conventions. Handles literal\n * paths, recursive extension globs, and `*` segments without adding a runtime\n * dependency.\n */\nexport async function listMatchingFiles(root: string, glob: string): Promise<string[]> {\n return Effect.runPromise(listMatchingFilesEffect(root, glob).pipe(Effect.provide(NodeServicesLive)));\n}\n\nexport function listMatchingFilesEffect(\n root: string,\n glob: string,\n): Effect.Effect<string[], never, FileSystem> {\n return Effect.gen(function* () {\n const matches: string[] = [];\n yield* walkFilesEffect(root, (relativePath) => Effect.sync(() => {\n if (matchesGlob(relativePath, glob)) matches.push(relativePath);\n }));\n return matches;\n });\n}\n\nexport function matchesGlob(relativePath: string, glob: string): boolean {\n if (!glob.includes(\"/\") && relativePath.includes(\"/\")) {\n return globToRegExp(glob).test(relativePath.split(\"/\").at(-1) ?? relativePath);\n }\n return globToRegExp(glob).test(relativePath);\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const globstar = \"__AGENT_SKILL_EVALS_GLOBSTAR__\";\n const star = \"__AGENT_SKILL_EVALS_STAR__\";\n const pattern = glob\n .replace(/^\\.\\//, \"\")\n .replace(/\\*\\*\\//g, globstar)\n .replace(/\\*\\*/g, globstar)\n .replace(/\\*/g, star)\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replaceAll(globstar, \"(?:.*/)?\")\n .replaceAll(star, \"[^/]*\");\n return new RegExp(`^${pattern}$`);\n}\n","import { join, resolve, isAbsolute } from \"node:path\";\nimport * as Effect from \"effect/Effect\";\nimport type { CommandEvent, WorldHandle } from \"../internal-types.js\";\nimport { Environment, FileSystem, NodeServicesLive } from \"../internal-services.js\";\nimport { runCommandEffect, ProcessRunnerLive } from \"./command-runner.js\";\nimport { listMatchingFilesEffect } from \"../runtime-checks/_files.js\";\n\nexport interface CreateWorldInput {\n fixturePath: string;\n testFileDir?: string;\n baseDir?: string;\n}\n\nexport interface RunDir {\n runDir: string;\n worldPath: string;\n}\n\nexport async function createRunDir(): Promise<RunDir> {\n return Effect.runPromise(createRunDirEffect().pipe(Effect.provide(NodeServicesLive)));\n}\n\nexport function createRunDirEffect(): Effect.Effect<RunDir, unknown, FileSystem> {\n return Effect.gen(function* () {\n const fs = yield* FileSystem;\n const runDir = yield* fs.makeTempDirectory(\"agent-skill-evals-run-\");\n const worldPath = join(runDir, \"world\");\n yield* fs.makeDirectory(worldPath);\n return { runDir, worldPath };\n });\n}\n\nexport async function copyFixture(input: CreateWorldInput, worldPath: string): Promise<void> {\n return Effect.runPromise(copyFixtureEffect(input, worldPath).pipe(Effect.provide(NodeServicesLive)));\n}\n\nexport function copyFixtureEffect(\n input: CreateWorldInput,\n worldPath: string,\n): Effect.Effect<void, unknown, FileSystem | Environment> {\n return Effect.gen(function* () {\n const fs = yield* FileSystem;\n const env = yield* Environment;\n const cwd = yield* env.cwd;\n const src = isAbsolute(input.fixturePath)\n ? input.fixturePath\n : resolve(input.testFileDir ?? input.baseDir ?? cwd, input.fixturePath);\n yield* fs.copyDirectory(src, worldPath);\n });\n}\n\nexport function makeWorldHandle(\n worldPath: string,\n recordCommand?: (event: CommandEvent) => void,\n): WorldHandle {\n return {\n path: worldPath,\n readFile(rel) {\n return Effect.gen(function* () {\n const fs = yield* FileSystem;\n return yield* fs.readText(join(worldPath, rel)).pipe(\n Effect.catchAll(() => Effect.succeed(null)),\n );\n }).pipe(Effect.provide(NodeServicesLive));\n },\n listFiles(glob) {\n return listMatchingFilesEffect(worldPath, glob).pipe(\n Effect.provide(NodeServicesLive),\n );\n },\n exec(command, args = [], opts = {}) {\n return Effect.gen(function* () {\n const environment = yield* Environment;\n const env = yield* environment.env;\n const result = yield* runCommandEffect(command, args, {\n cwd: worldPath,\n env: { ...env, ...(opts.env ?? {}) },\n timeoutMs: opts.timeoutMs,\n });\n recordCommand?.({\n command,\n args: [...args],\n exitCode: result.exitCode,\n stdout: result.stdout.slice(0, 4096),\n stderr: result.stderr.slice(0, 4096),\n startedAt: result.startedAt,\n durationMs: result.durationMs,\n });\n return {\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n }).pipe(\n Effect.provide(ProcessRunnerLive),\n Effect.provide(NodeServicesLive),\n );\n },\n diff() {\n // Phase 1 placeholder; Phase 2+ may wire a real diff.\n return Effect.succeed(\"\");\n },\n };\n}\n","import { join, relative } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport * as Effect from \"effect/Effect\";\nimport type { FileEvent } from \"../internal-types.js\";\nimport { FileSystem, NodeServicesLive } from \"../internal-services.js\";\n\n/**\n * Snapshot a directory tree as { relativePath -> sha256 }. Used pre/post\n * agent run to compute file-level diffs. Skips node_modules and .git.\n */\nexport async function snapshotTree(root: string): Promise<Map<string, string>> {\n return Effect.runPromise(snapshotTreeEffect(root).pipe(Effect.provide(NodeServicesLive)));\n}\n\nexport function snapshotTreeEffect(\n root: string,\n): Effect.Effect<Map<string, string>, never, FileSystem> {\n return Effect.gen(function* () {\n const out = new Map<string, string>();\n const fs = yield* FileSystem;\n function walk(dir: string): Effect.Effect<void, never, FileSystem> {\n return Effect.gen(function* () {\n const entries = yield* fs.readDirectory(dir).pipe(\n Effect.catchAll(() => Effect.succeed([])),\n );\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n if (e.name === \"node_modules\" || e.name === \".git\") continue;\n yield* walk(p);\n } else if (e.isFile()) {\n const buf = yield* fs.readFile(p).pipe(\n Effect.catchAll(() => Effect.succeed(null)),\n );\n if (!buf) continue;\n const hash = createHash(\"sha256\").update(buf).digest(\"hex\");\n out.set(relative(root, p), hash);\n }\n }\n });\n }\n yield* fs.stat(root).pipe(Effect.catchAll(() => Effect.succeed(null)));\n yield* walk(root);\n return out;\n });\n}\n\nexport function diffTrees(\n before: Map<string, string>,\n after: Map<string, string>,\n): FileEvent[] {\n const events: FileEvent[] = [];\n for (const [path, hash] of after) {\n const prev = before.get(path);\n if (prev === undefined) {\n events.push({ path, op: \"create\" });\n } else if (prev !== hash) {\n events.push({ path, op: \"modify\" });\n }\n }\n for (const [path] of before) {\n if (!after.has(path)) events.push({ path, op: \"delete\" });\n }\n return events;\n}\n","import { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport * as Clock from \"effect/Clock\";\nimport * as Either from \"effect/Either\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as ParseResult from \"effect/ParseResult\";\nimport * as Schema from \"effect/Schema\";\nimport type { AgentSkillEvalsAssertionResult } from \"../internal-types.js\";\nimport { parseRuntimeTestFields } from \"../assertion-entries.js\";\nimport {\n getRuntimeCheck,\n RuntimeCheckCatalog,\n RuntimeCheckCatalogLive,\n} from \"../runtime-checks/catalog.js\";\nimport {\n EvidenceCollector,\n evidenceFromSnapshot,\n type SkillEvidenceConfig,\n writeEvidenceToEffect,\n} from \"./evidence.js\";\nimport {\n AdapterCatalog,\n AdapterCatalogLive,\n getAdapter,\n} from \"./adapter-catalog.js\";\nimport {\n copyFixtureEffect,\n createRunDirEffect,\n makeWorldHandle,\n} from \"./world.js\";\nimport { snapshotTreeEffect, diffTrees } from \"./file-watch.js\";\nimport { ProcessRunner, ProcessRunnerLive } from \"./command-runner.js\";\nimport { Environment, FileSystem, NodeServicesLive } from \"../internal-services.js\";\n\ninterface ProviderConfig {\n adapter?: string;\n command?: string;\n args?: readonly string[];\n timeoutMs?: number;\n baseDir?: string;\n isolatedHome?: boolean;\n skillEvidence?: SkillEvidenceConfig;\n}\n\nconst SkillEvidenceConfigSchema = Schema.Struct({\n mcpResource: Schema.optional(Schema.Struct({\n uriArgPaths: Schema.optional(Schema.Array(Schema.String)),\n uriPatterns: Schema.optional(Schema.Array(Schema.String)),\n })),\n mcpTool: Schema.optional(Schema.Struct({\n toolPatterns: Schema.optional(Schema.Array(Schema.String)),\n })),\n nativeArgs: Schema.optional(Schema.Struct({\n whenArgs: Schema.optional(Schema.Array(Schema.String)),\n whenAnyArgs: Schema.optional(Schema.Array(Schema.String)),\n skillPathFlags: Schema.optional(Schema.Array(Schema.String)),\n provider: Schema.optional(Schema.String),\n source: Schema.optional(Schema.String),\n })),\n});\n\nconst ProviderConfigSchema = Schema.Struct({\n adapter: Schema.optional(Schema.String),\n command: Schema.optional(Schema.String),\n args: Schema.optional(Schema.Array(Schema.String)),\n timeoutMs: Schema.optional(Schema.Number),\n baseDir: Schema.optional(Schema.String),\n isolatedHome: Schema.optional(Schema.Boolean),\n skillEvidence: Schema.optional(SkillEvidenceConfigSchema),\n});\n\nconst DOCUMENTED_ADAPTERS = [\"codex-json\", \"claude-code-json\", \"pi-json\"] as const;\n\ninterface PromptfooContext {\n vars?: Record<string, unknown>;\n test?: { vars?: Record<string, unknown>; metadata?: Record<string, unknown> };\n}\n\ninterface ProviderResponse {\n output: string;\n metadata?: Record<string, unknown>;\n cost?: number;\n tokenUsage?: { total?: number; prompt?: number; completion?: number; cached?: number };\n error?: string;\n}\n\ntype AgentRequirements =\n | RuntimeCheckCatalog\n | AdapterCatalog\n | FileSystem\n | Environment\n | ProcessRunner;\n\nconst AgentLiveLayer = Layer.mergeAll(\n RuntimeCheckCatalogLive,\n AdapterCatalogLive,\n NodeServicesLive,\n ProcessRunnerLive,\n);\n\nexport interface AgentSkillEvalsProviderMetadata {\n runDir: string;\n worldPath: string;\n evidencePath: string;\n fixture: string;\n skill?: string;\n kind?: string;\n preconditionResults: AgentSkillEvalsAssertionResult[];\n preconditionsPassed: boolean;\n durationMs: number;\n}\n\ninterface PreparedRun {\n runDir: string;\n worldPath: string;\n world: ReturnType<typeof makeWorldHandle>;\n evidenceCollector: EvidenceCollector;\n}\n\nfunction asVars(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction varsFromContext(context: PromptfooContext): Record<string, unknown> {\n return asVars(context.vars) ?? asVars(context.test?.vars) ?? {};\n}\n\nfunction decodeProviderConfig(input: unknown): ProviderConfig | { error: string } {\n const decoded = Schema.decodeUnknownEither(ProviderConfigSchema, { errors: \"all\" })(\n input ?? {},\n );\n if (Either.isRight(decoded)) return decoded.right;\n return {\n error: `agent-skill-evals-provider: invalid config: ${ParseResult.TreeFormatter.formatErrorSync(decoded.left)}`,\n };\n}\n\nfunction prepareRunEffect(\n fixture: string,\n config: ProviderConfig,\n): Effect.Effect<PreparedRun | { error: string }, never, FileSystem | Environment> {\n return Effect.gen(function* () {\n const created = yield* Effect.either(createRunDirEffect());\n if (Either.isLeft(created)) {\n return {\n error: `agent-skill-evals-provider: failed to create isolated world: ${created.left instanceof Error ? created.left.message : String(created.left)}`,\n };\n }\n const { runDir, worldPath } = created.right;\n const copied = yield* Effect.either(\n copyFixtureEffect({ fixturePath: fixture, baseDir: config.baseDir }, worldPath),\n );\n if (Either.isLeft(copied)) {\n return {\n error: `agent-skill-evals-provider: failed to copy vars.fixture \"${fixture}\" into isolated world: ${copied.left instanceof Error ? copied.left.message : String(copied.left)}`,\n };\n }\n\n const evidenceCollector = new EvidenceCollector(config.skillEvidence);\n return {\n runDir,\n worldPath,\n evidenceCollector,\n world: makeWorldHandle(worldPath, (event) => evidenceCollector.addCommand(event)),\n };\n });\n}\n\nfunction runPreconditionsEffect(\n vars: Record<string, unknown>,\n run: PreparedRun,\n): Effect.Effect<{ results: AgentSkillEvalsAssertionResult[]; passed: boolean }, never, RuntimeCheckCatalog> {\n return Effect.gen(function* () {\n const results: AgentSkillEvalsAssertionResult[] = [];\n let passed = true;\n const parsed = parseRuntimeTestFields(vars);\n for (const error of parsed.errors.filter((e) => e.field === \"preconditions\")) {\n const at = error.index === undefined ? error.field : `${error.field}[${error.index}]`;\n results.push({\n pass: false,\n score: 0,\n reason: `precondition: ${at}: ${error.reason}`,\n });\n passed = false;\n }\n for (const entry of parsed.preconditions) {\n const plugin = yield* getRuntimeCheck(entry.type);\n if (!plugin) {\n results.push({\n pass: false,\n score: 0,\n reason: `precondition: unknown effect type \"${entry.type}\"`,\n });\n passed = false;\n continue;\n }\n const result = yield* plugin.verify({\n assertion: entry.args,\n world: run.world,\n evidence: evidenceFromSnapshot(run.evidenceCollector.toSnapshot()),\n mode: \"precondition\",\n });\n results.push(result);\n if (!result.pass) passed = false;\n }\n return { results, passed };\n });\n}\n\nfunction resolveConfiguredPath(baseDir: string, path: string): string {\n if (path.includes(\"=\")) return path;\n return path.startsWith(\"./\") ||\n path.startsWith(\"../\") ||\n (!isAbsolute(path) && path.includes(\"/\"))\n ? resolve(baseDir, path)\n : path;\n}\n\nfunction expandEnvVars(value: string, env: NodeJS.ProcessEnv): string {\n return value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)(:-([^}]*))?\\}/g, (_match, name: string, _fallbackPart: string, fallback: string | undefined) =>\n env[name] ?? fallback ?? \"\",\n );\n}\n\nfunction skillNameFromNativePath(path: string): string | undefined {\n const normalized = path.replace(/\\/+$/, \"\");\n if (!normalized) return undefined;\n const leaf = basename(normalized);\n return leaf === \"SKILL.md\" ? basename(dirname(normalized)) : leaf.replace(/\\.md$/i, \"\");\n}\n\nfunction addNativeSkillEvidenceFromConfig(\n run: PreparedRun,\n config: ProviderConfig,\n startedAt: number,\n): void {\n const nativeConfig = nativeSkillEvidenceConfig(config);\n if (!nativeConfig) return;\n const args = config.args ?? [];\n if (!nativeConfig.whenArgs.every((arg) => args.includes(arg))) return;\n if (nativeConfig.whenAnyArgs.length > 0 && !nativeConfig.whenAnyArgs.some((arg) => args.includes(arg))) return;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg) continue;\n const source = nativeConfig.skillPathFlags.includes(arg) ? arg : undefined;\n if (!source) continue;\n const skillPath = args[index + 1];\n if (!skillPath) continue;\n const skill = skillNameFromNativePath(skillPath);\n if (!skill) continue;\n run.evidenceCollector.addSkillLoad({\n skill,\n delivery: \"native\",\n provider: nativeConfig.provider,\n source: nativeConfig.source ?? source,\n startedAt,\n });\n }\n}\n\nfunction nativeSkillEvidenceConfig(config: ProviderConfig): {\n whenArgs: readonly string[];\n whenAnyArgs: readonly string[];\n skillPathFlags: readonly string[];\n provider: string;\n source?: string;\n} | undefined {\n const configured = config.skillEvidence?.nativeArgs;\n if (configured) {\n return {\n whenArgs: configured.whenArgs ?? [],\n whenAnyArgs: configured.whenAnyArgs ?? [],\n skillPathFlags: configured.skillPathFlags ?? [\"--skill\"],\n provider: configured.provider ?? config.adapter ?? \"agent\",\n source: configured.source,\n };\n }\n if (config.adapter === \"pi-json\") {\n return {\n whenArgs: [],\n whenAnyArgs: [\"--no-skills\", \"-ns\"],\n skillPathFlags: [\"--skill\"],\n provider: \"pi-json\",\n source: \"--skill\",\n };\n }\n return undefined;\n}\n\nfunction promptfooTokenUsage(usage: {\n totalTokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n}): ProviderResponse[\"tokenUsage\"] {\n const tokenUsage = {\n ...(usage.totalTokens !== undefined ? { total: usage.totalTokens } : {}),\n ...(usage.inputTokens !== undefined ? { prompt: usage.inputTokens } : {}),\n ...(usage.outputTokens !== undefined ? { completion: usage.outputTokens } : {}),\n ...(usage.cacheReadTokens !== undefined ? { cached: usage.cacheReadTokens } : {}),\n };\n return Object.keys(tokenUsage).length > 0 ? tokenUsage : undefined;\n}\n\nfunction runConfiguredAdapterEffect(input: {\n prompt: string;\n run: PreparedRun;\n config: ProviderConfig;\n}): Effect.Effect<\n { output: string; error?: string },\n never,\n AdapterCatalog | Environment | ProcessRunner\n> {\n return Effect.gen(function* () {\n const adapterId = input.config.adapter;\n if (!adapterId) {\n return {\n output: \"\",\n error: \"agent-skill-evals-provider: config.adapter is required. Use codex-json, claude-code-json, or pi-json.\",\n };\n }\n const adapter = yield* getAdapter(adapterId);\n if (!adapter) {\n return {\n output: \"\",\n error: `agent-skill-evals-provider: unknown adapter \"${adapterId}\". Supported adapters: ${DOCUMENTED_ADAPTERS.join(\", \")}`,\n };\n }\n if (!input.config.command) {\n return {\n output: \"\",\n error: \"agent-skill-evals-provider: config.command is required for dynamic agent runs\",\n };\n }\n const command = input.config.command;\n\n const environment = yield* Environment;\n const cwd = yield* environment.cwd;\n const env = yield* environment.env;\n const baseDir = input.config.baseDir ?? cwd;\n const result = yield* adapter.run({\n command: resolveConfiguredPath(baseDir, expandEnvVars(command, env)),\n args: (input.config.args ?? []).map((arg) =>\n typeof arg === \"string\" ? resolveConfiguredPath(baseDir, expandEnvVars(arg, env)) : arg,\n ),\n cwd: input.run.worldPath,\n prompt: input.prompt,\n evidence: input.run.evidenceCollector,\n timeoutMs: input.config.timeoutMs ?? 5 * 60_000,\n env: {\n ...env,\n ...(input.config.isolatedHome ? { HOME: join(input.run.runDir, \"agent-home\") } : {}),\n },\n });\n return { output: result.output, ...(result.error ? { error: result.error } : {}) };\n });\n}\n\nfunction collectFileEvidenceEffect(\n run: PreparedRun,\n preTree: Map<string, string>,\n): Effect.Effect<void, never, FileSystem> {\n return Effect.gen(function* () {\n const postTree = yield* snapshotTreeEffect(run.worldPath);\n for (const event of diffTrees(preTree, postTree)) {\n run.evidenceCollector.addFileWrite(event);\n }\n });\n}\n\nasync function persistMetadata(input: {\n run: PreparedRun;\n fixture: string;\n vars: Record<string, unknown>;\n output: string;\n preconditionResults: AgentSkillEvalsAssertionResult[];\n preconditionsPassed: boolean;\n startedAt: number;\n}): Promise<AgentSkillEvalsProviderMetadata> {\n return Effect.runPromise(\n persistMetadataEffect(input).pipe(Effect.provide(NodeServicesLive)),\n );\n}\n\nfunction persistMetadataEffect(input: {\n run: PreparedRun;\n fixture: string;\n vars: Record<string, unknown>;\n output: string;\n preconditionResults: AgentSkillEvalsAssertionResult[];\n preconditionsPassed: boolean;\n startedAt: number;\n}): Effect.Effect<AgentSkillEvalsProviderMetadata, unknown, FileSystem> {\n return Effect.gen(function* () {\n const fs = yield* FileSystem;\n const now = yield* Clock.currentTimeMillis;\n const durationMs = now - input.startedAt;\n input.run.evidenceCollector.setOutput(input.output);\n input.run.evidenceCollector.setRun({\n runDir: input.run.runDir,\n worldPath: input.run.worldPath,\n fixture: input.fixture,\n durationMs,\n });\n const evidencePath = yield* writeEvidenceToEffect(input.run.evidenceCollector, input.run.runDir);\n const metadata: AgentSkillEvalsProviderMetadata = {\n runDir: input.run.runDir,\n worldPath: input.run.worldPath,\n evidencePath,\n fixture: input.fixture,\n skill: input.vars.skill as string | undefined,\n kind: input.vars.kind as string | undefined,\n preconditionResults: input.preconditionResults,\n preconditionsPassed: input.preconditionsPassed,\n durationMs,\n };\n\n yield* fs.writeText(\n join(input.run.runDir, \"agent-skill-evals-meta.json\"),\n JSON.stringify(metadata, null, 2),\n );\n return metadata;\n });\n}\n\nclass AgentSkillEvalsProvider {\n config: ProviderConfig;\n private readonly configError?: string;\n id: () => string;\n\n constructor(options: { config?: ProviderConfig; id?: string } = {}) {\n const config = decodeProviderConfig(options.config ?? {});\n if (\"error\" in config) {\n this.config = {};\n this.configError = config.error;\n } else {\n this.config = config;\n }\n const label = options.id ?? \"agent-skill-evals\";\n this.id = () => label;\n }\n\n async callApi(\n prompt: string,\n context: PromptfooContext = {},\n ): Promise<ProviderResponse> {\n return Effect.runPromise(\n this.callApiEffect(prompt, context).pipe(Effect.provide(AgentLiveLayer)),\n );\n }\n\n private callApiEffect(\n prompt: string,\n context: PromptfooContext = {},\n ): Effect.Effect<ProviderResponse, never, AgentRequirements> {\n const self = this;\n return Effect.gen(function* () {\n if (self.configError) {\n return { output: \"\", error: self.configError };\n }\n const startedAt = yield* Clock.currentTimeMillis;\n const vars = varsFromContext(context);\n const fixture = vars.fixture as string | undefined;\n if (!fixture) {\n return {\n output: \"\",\n error: \"agent-skill-evals-provider: vars.fixture is required. Set vars.fixture to the fixture directory for this test case.\",\n };\n }\n\n const prepared = yield* prepareRunEffect(fixture, self.config);\n if (\"error\" in prepared) {\n return { output: \"\", error: prepared.error };\n }\n\n const preconditions = yield* runPreconditionsEffect(vars, prepared);\n const preTree = yield* snapshotTreeEffect(prepared.worldPath);\n\n let output = \"\";\n let error: string | undefined;\n if (preconditions.passed) {\n addNativeSkillEvidenceFromConfig(prepared, self.config, startedAt);\n const result = yield* runConfiguredAdapterEffect({\n prompt,\n run: prepared,\n config: self.config,\n });\n output = result.output;\n error = result.error;\n }\n yield* collectFileEvidenceEffect(prepared, preTree);\n\n const metadata = yield* persistMetadataEffect({\n run: prepared,\n fixture,\n vars,\n output,\n preconditionResults: preconditions.results,\n preconditionsPassed: preconditions.passed,\n startedAt,\n }).pipe(Effect.orDie);\n\n const usage = promptfooTokenUsage(prepared.evidenceCollector.toSnapshot().usage);\n return {\n output,\n ...(error ? { error } : {}),\n metadata: metadata as unknown as Record<string, unknown>,\n ...(usage ? { tokenUsage: usage } : {}),\n };\n });\n }\n}\n\n// Promptfoo loads the default export from the local shim. The named export is\n// useful for tests and direct programmatic use.\nexport default AgentSkillEvalsProvider;\nexport { AgentSkillEvalsProvider };\n\nexport {\n EvidenceCollector,\n evidenceFromSnapshot,\n type EvidenceSnapshot,\n} from \"./evidence.js\";\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion-entries-CfmNt-fp.d.mts","names":[],"sources":["../src/assertion-entries.ts"],"mappings":";UAUiB,mBAAA;EACf,KAAA;EACA,KAAA;EACA,MAAA;AAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//#region src/assertions/_shared.d.ts
|
|
2
|
+
interface PromptfooAssertContext {
|
|
3
|
+
vars?: Record<string, unknown>;
|
|
4
|
+
providerResponse?: {
|
|
5
|
+
metadata?: unknown;
|
|
6
|
+
tokenUsage?: {
|
|
7
|
+
total?: number;
|
|
8
|
+
prompt?: number;
|
|
9
|
+
completion?: number;
|
|
10
|
+
cached?: number;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
test?: {
|
|
14
|
+
vars?: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
assertion?: {
|
|
17
|
+
metric?: string;
|
|
18
|
+
};
|
|
19
|
+
assert?: {
|
|
20
|
+
metric?: string;
|
|
21
|
+
};
|
|
22
|
+
config?: {
|
|
23
|
+
metric?: string;
|
|
24
|
+
agentSkillEvals?: unknown;
|
|
25
|
+
};
|
|
26
|
+
metric?: string;
|
|
27
|
+
}
|
|
28
|
+
interface GradingResult {
|
|
29
|
+
pass: boolean;
|
|
30
|
+
score: number;
|
|
31
|
+
reason: string;
|
|
32
|
+
componentResults?: Array<{
|
|
33
|
+
pass: boolean;
|
|
34
|
+
score: number;
|
|
35
|
+
reason: string;
|
|
36
|
+
}>;
|
|
37
|
+
metadata?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region src/assertions/skill-test.d.ts
|
|
41
|
+
declare function skillTest(_output: string, context: PromptfooAssertContext): Promise<GradingResult>;
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region src/assertions/promptfoo.d.ts
|
|
44
|
+
declare function agentSkillEvalsAssertions(output: string, context: PromptfooAssertContext): Promise<GradingResult>;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { type GradingResult, type PromptfooAssertContext, agentSkillEvalsAssertions as default, agentSkillEvalsAssertions as promptfooAssertions, skillTest };
|
|
47
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/assertions/_shared.ts","../../src/assertions/skill-test.ts","../../src/assertions/promptfoo.ts"],"mappings":";UA4BiB,sBAAA;EACf,IAAA,GAAO,MAAA;EACP,gBAAA;IACE,QAAA;IACA,UAAA;MACE,KAAA;MACA,MAAA;MACA,UAAA;MACA,MAAA;IAAA;EAAA;EAGJ,IAAA;IAAS,IAAA,GAAO,MAAA;EAAA;EAChB,SAAA;IAAc,MAAA;EAAA;EACd,MAAA;IAAW,MAAA;EAAA;EACX,MAAA;IAAW,MAAA;IAAiB,eAAA;EAAA;EAC5B,MAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,KAAA;EACA,MAAA;EACA,gBAAA,GAAmB,KAAA;IAAQ,IAAA;IAAe,KAAA;IAAe,MAAA;EAAA;EACzD,QAAA,GAAW,MAAA;AAAA;;;iBC5BiB,SAAA,CAC5B,OAAA,UACA,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,aAAA;;;iBCWmB,yBAAA,CAC5B,MAAA,UACA,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,aAAA"}
|