@agent-inspect/vitest 6.16.1 → 6.17.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/index.cjs +5 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -91,6 +91,7 @@ function createAgentInspectVitestReporter(options = {}) {
|
|
|
91
91
|
async function handleTest(test) {
|
|
92
92
|
if (!isObject(test)) return;
|
|
93
93
|
if (seenObjects.has(test)) return;
|
|
94
|
+
if (options.evidenceOn === "never") return;
|
|
94
95
|
const status = readStatus(test);
|
|
95
96
|
if (status === void 0 || status === "skipped") return;
|
|
96
97
|
const identity = readIdentity(test);
|
|
@@ -99,6 +100,7 @@ function createAgentInspectVitestReporter(options = {}) {
|
|
|
99
100
|
const association = resolveAssociation(test, options);
|
|
100
101
|
if (association === void 0) return;
|
|
101
102
|
if (status === "passed") {
|
|
103
|
+
if (options.evidenceOn === "fail") return;
|
|
102
104
|
if (retainedSuccesses >= successLimit) return;
|
|
103
105
|
retainedSuccesses += 1;
|
|
104
106
|
}
|
|
@@ -170,6 +172,9 @@ function createAgentInspectVitestReporter(options = {}) {
|
|
|
170
172
|
var agentInspectVitestReporter = createAgentInspectVitestReporter;
|
|
171
173
|
function normalizeSuccessLimit(options) {
|
|
172
174
|
const cap = clampCount(options.maxSuccessfulTraces, DEFAULT_SUCCESS_LIMIT);
|
|
175
|
+
if (options.evidenceOn === "always" && options.retainSuccessful === void 0) {
|
|
176
|
+
return cap;
|
|
177
|
+
}
|
|
173
178
|
if (options.retainSuccessful === true) return cap;
|
|
174
179
|
if (typeof options.retainSuccessful === "number") {
|
|
175
180
|
return Math.min(clampCount(options.retainSuccessful, 0), cap);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/matchers.ts","../src/index.ts"],"names":["evaluateTraceContract","defineTraceContract","buildTraceFacts","path","writeFile","createReporterArtifactPath","mkdir","createTraceArtifactManifest"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Experimental Vitest matchers for AgentInspect TraceFacts / TraceContract.\n *\n * @experimental Part of the v6.13 TraceFacts train.\n */\n\nimport {\n buildTraceFacts,\n defineTraceContract,\n evaluateTraceContract,\n type TraceCheckInput,\n type TraceContractInput,\n} from \"agent-inspect/checks\";\n\ntype TraceLike =\n | TraceCheckInput\n | { readonly events: TraceCheckInput[\"read\"][\"events\"] }\n | TraceCheckInput[\"read\"][\"events\"];\n\nfunction eventsFrom(trace: TraceLike): TraceCheckInput[\"read\"][\"events\"] {\n if (Array.isArray(trace)) return trace;\n if (\"read\" in trace && trace.read?.events) return trace.read.events;\n if (\"events\" in trace && Array.isArray(trace.events)) return trace.events;\n return [];\n}\n\nfunction inputFrom(trace: TraceLike): TraceCheckInput | undefined {\n if (!Array.isArray(trace) && \"read\" in trace && trace.read) {\n return trace as TraceCheckInput;\n }\n return undefined;\n}\n\nexport interface AgentInspectVitestMatchers<R = unknown> {\n toPassTraceContract(contract: TraceContractInput): R;\n toHaveRequiredTool(toolName: string): R;\n}\n\nexport const agentInspectVitestMatchers = {\n toPassTraceContract(received: TraceLike, contract: TraceContractInput) {\n const input = inputFrom(received);\n if (!input) {\n return {\n pass: false,\n message: () =>\n \"toPassTraceContract expects TraceCheckInput ({ read }) so evaluateTraceContract can run.\",\n };\n }\n const result = evaluateTraceContract(input, defineTraceContract(contract));\n return {\n pass: result.status === \"pass\",\n message: () =>\n result.status === \"pass\"\n ? \"expected trace contract to fail\"\n : `expected trace contract to pass; findings=${JSON.stringify(\n result.findings.filter((f) => f.status === \"fail\").map((f) => f.ruleId),\n )}`,\n };\n },\n toHaveRequiredTool(received: TraceLike, toolName: string) {\n const facts = buildTraceFacts(eventsFrom(received));\n const pass = facts.toolsByName.has(toolName);\n return {\n pass,\n message: () =>\n pass\n ? `expected tool ${toolName} to be absent`\n : `expected required tool ${toolName}; found=${JSON.stringify([\n ...facts.toolsByName.keys(),\n ])}`,\n };\n },\n};\n\nexport type { TraceContractInput };\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n createReporterArtifactPath,\n createTraceArtifactManifest,\n type TraceArtifact,\n type TraceArtifactManifest,\n type TraceArtifactRedactionProfile,\n type TraceReporterDiagnostic,\n} from \"agent-inspect/reporters\";\n\nexport type AgentInspectVitestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/vitest`.\n *\n * Attach this object to Vitest task metadata, or return it from\n * `resolveTrace`. Associations are explicit only; the reporter never guesses\n * by timestamps.\n */\nexport interface AgentInspectVitestTraceAssociation {\n /** AgentInspect run/span identifier to show in safe artifacts. */\n readonly runId?: string;\n /** Local trace file path. Only the basename is written to artifacts. */\n readonly tracePath?: string;\n /** Optional stable label for the artifact directory. */\n readonly artifactLabel?: string;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of throwing so Vitest's original test\n * result remains authoritative.\n */\nexport interface AgentInspectVitestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"on-diagnostic-failed\"\n | \"unsafe-artifact-path\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Vitest reporter.\n *\n * The reporter is local-only: it performs no network I/O and writes bounded,\n * structural artifacts without reading trace contents.\n */\nexport interface AgentInspectVitestReporterOptions {\n /** Directory for safe Vitest artifacts. Defaults to `.agent-inspect/vitest-artifacts`. */\n readonly artifactDir?: string;\n /** Optional GitHub step-summary path. Only bounded structural lines are appended. */\n readonly githubSummary?: string;\n /**\n * Keep artifacts for passing tests. `false`/undefined keeps none; `true`\n * keeps up to `maxSuccessfulTraces`; a number keeps up to that many.\n */\n readonly retainSuccessful?: boolean | number;\n /** Upper bound for retained passing-test artifacts. Defaults to 20. */\n readonly maxSuccessfulTraces?: number;\n /** Redaction profile recorded on generated artifacts. Defaults to `share`. */\n readonly redactionProfile?: TraceArtifactRedactionProfile;\n /** Deterministic manifest timestamp. Defaults to the Unix epoch. */\n readonly generatedAt?: string;\n /** Resolve explicit test-to-trace associations from a Vitest task/result. */\n readonly resolveTrace?: (\n test: unknown,\n ) => AgentInspectVitestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectVitestDiagnostic) => void;\n}\n\nexport interface AgentInspectVitestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectVitestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Vitest reporter facade.\n *\n * The shape is intentionally structural so the package stays tolerant of\n * Vitest reporter API drift while still exposing the hooks Vitest calls.\n */\nexport interface AgentInspectVitestReporter {\n onTestCaseResult(test: unknown): Promise<void>;\n onTaskUpdate(tasks: unknown): Promise<void>;\n onFinished(files?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[];\n getArtifacts(): readonly AgentInspectVitestArtifact[];\n}\n\ntype TestIdentity = {\n readonly id: string;\n readonly name: string;\n readonly file?: string;\n};\n\ntype TestLike = {\n readonly id?: unknown;\n readonly name?: unknown;\n readonly suite?: unknown;\n readonly file?: unknown;\n readonly filepath?: unknown;\n readonly result?: unknown;\n readonly meta?: unknown;\n readonly context?: unknown;\n readonly tasks?: unknown;\n readonly children?: unknown;\n};\n\ntype ResultLike = {\n readonly state?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/vitest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/vitest-artifacts\";\nconst DEFAULT_SUCCESS_LIMIT = 20;\nconst MAX_SUCCESS_LIMIT = 100;\nconst MAX_TEXT = 180;\nconst DEFAULT_GENERATED_AT = \"1970-01-01T00:00:00.000Z\";\n\n/**\n * Create the experimental AgentInspect Vitest reporter.\n */\nexport function createAgentInspectVitestReporter(\n options: AgentInspectVitestReporterOptions = {},\n): AgentInspectVitestReporter {\n const diagnostics: AgentInspectVitestDiagnostic[] = [];\n const artifacts: AgentInspectVitestArtifact[] = [];\n const seenObjects = new WeakSet<object>();\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n\n const reporter: AgentInspectVitestReporter = {\n async onTestCaseResult(test: unknown): Promise<void> {\n await handleTest(test);\n },\n async onTaskUpdate(tasks: unknown): Promise<void> {\n for (const test of collectTasks(tasks)) {\n await handleTest(test);\n }\n },\n async onFinished(files?: unknown): Promise<void> {\n for (const test of collectTasks(files)) {\n await handleTest(test);\n }\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectVitestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleTest(test: unknown): Promise<void> {\n if (!isObject(test)) return;\n if (seenObjects.has(test)) return;\n\n const status = readStatus(test);\n if (status === undefined || status === \"skipped\") return;\n\n const identity = readIdentity(test);\n const seenKey = `${identity.id}:${status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(test, options);\n if (association === undefined) return;\n\n if (status === \"passed\") {\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\n seenObjects.add(test);\n seenKeys.add(seenKey);\n\n try {\n const artifact = await writeSafeArtifact({\n artifactDir: options.artifactDir ?? DEFAULT_ARTIFACT_DIR,\n association,\n generatedAt: options.generatedAt ?? DEFAULT_GENERATED_AT,\n identity,\n reserveArtifactName,\n redactionProfile: options.redactionProfile ?? \"share\",\n status,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Vitest artifact: ${errorMessage(error)}`,\n testId: identity.id,\n });\n }\n }\n\n function reserveArtifactName(seed: string): string {\n const base = safeSegment(seed);\n const next = (artifactNames.get(base) ?? 0) + 1;\n artifactNames.set(base, next);\n return next === 1 ? base : `${base}-${next}`;\n }\n\n function reportDiagnostic(diagnostic: AgentInspectVitestDiagnostic): void {\n diagnostics.push(diagnostic);\n if (options.onDiagnostic === undefined) return;\n try {\n options.onDiagnostic(diagnostic);\n } catch (error) {\n diagnostics.push({\n code: \"on-diagnostic-failed\",\n message: `AgentInspect Vitest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined || artifacts.length === 0) return;\n const failed = artifacts.filter((artifact) => artifact.status === \"failed\").length;\n const passed = artifacts.filter((artifact) => artifact.status === \"passed\").length;\n const lines = [\n \"\",\n \"## AgentInspect Vitest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n try {\n await writeFile(options.githubSummary, `${lines.join(\"\\n\")}\\n`, { flag: \"a\" });\n } catch (error) {\n reportDiagnostic({\n code: \"github-summary-write-failed\",\n message: `Could not append AgentInspect Vitest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\nexport const agentInspectVitestReporter = createAgentInspectVitestReporter;\n\nexport { agentInspectVitestMatchers } from \"./matchers.js\";\nexport type { AgentInspectVitestMatchers } from \"./matchers.js\";\n\nfunction normalizeSuccessLimit(options: AgentInspectVitestReporterOptions): number {\n const cap = clampCount(options.maxSuccessfulTraces, DEFAULT_SUCCESS_LIMIT);\n if (options.retainSuccessful === true) return cap;\n if (typeof options.retainSuccessful === \"number\") {\n return Math.min(clampCount(options.retainSuccessful, 0), cap);\n }\n return 0;\n}\n\nfunction clampCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(MAX_SUCCESS_LIMIT, Math.floor(value)));\n}\n\nfunction resolveAssociation(\n test: object,\n options: AgentInspectVitestReporterOptions,\n): AgentInspectVitestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(test);\n if (isAssociation(resolved)) return resolved;\n\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n return (\n readAssociationFromMeta(task.meta) ??\n readAssociationFromContext(task.context) ??\n readAssociationFromMeta(result?.meta)\n );\n}\n\nfunction readAssociationFromContext(\n context: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(context)) return undefined;\n const maybeMeta = readProp(context, \"meta\");\n return readAssociationFromMeta(maybeMeta);\n}\n\nfunction readAssociationFromMeta(\n meta: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(meta)) return undefined;\n const direct = readProp(meta, \"agentInspect\");\n const hyphenated = readProp(meta, \"agent-inspect\");\n const trace = readProp(meta, \"trace\");\n for (const candidate of [direct, hyphenated, trace]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectVitestTraceAssociation {\n if (!isObject(value)) return false;\n return (\n readOptionalString(value, \"runId\") !== undefined ||\n readOptionalString(value, \"tracePath\") !== undefined ||\n readOptionalString(value, \"artifactLabel\") !== undefined\n );\n}\n\nfunction readStatus(test: object): AgentInspectVitestStatus | undefined {\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n const raw =\n readOptionalString(result, \"state\") ??\n readOptionalString(result, \"status\") ??\n readOptionalString(test, \"state\") ??\n readOptionalString(test, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"fail\" || normalized === \"failed\") return \"failed\";\n if (normalized === \"pass\" || normalized === \"passed\") return \"passed\";\n if (normalized === \"skip\" || normalized === \"skipped\") return \"skipped\";\n return undefined;\n}\n\nfunction readIdentity(test: object): TestIdentity {\n const task = test as TestLike;\n const id = readOptionalString(test, \"id\") ?? readOptionalString(test, \"taskId\");\n const name =\n readOptionalString(test, \"fullName\") ??\n readOptionalString(test, \"name\") ??\n readOptionalString(task.suite, \"name\") ??\n id ??\n \"unknown-test\";\n const file =\n readOptionalString(test, \"file\") ??\n readOptionalString(test, \"filepath\") ??\n readOptionalString(task.suite, \"file\");\n return {\n file: file === undefined ? undefined : path.basename(file),\n id: boundText(redactText(id ?? name)),\n name: boundText(redactText(name)),\n };\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectVitestTraceAssociation;\n readonly generatedAt: string;\n readonly identity: TestIdentity;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectVitestStatus;\n}): Promise<AgentInspectVitestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.identity.id ??\n input.identity.name ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"summary\",\n format: \"md\",\n });\n\n if (\n !manifestPathResult.ok ||\n manifestPathResult.absolutePath === undefined ||\n manifestPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(manifestPathResult.diagnostics));\n }\n if (\n !summaryPathResult.ok ||\n summaryPathResult.absolutePath === undefined ||\n summaryPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(summaryPathResult.diagnostics));\n }\n\n const directory = path.dirname(manifestPathResult.absolutePath);\n await mkdir(directory, { recursive: true });\n\n const traceFile =\n input.association.tracePath === undefined\n ? undefined\n : path.basename(input.association.tracePath);\n const manifestArtifact: TraceArtifact = {\n kind: \"report\",\n path: manifestPathResult.relativePath,\n format: \"json\",\n redactionProfile: input.redactionProfile,\n };\n const summaryArtifact: TraceArtifact = {\n kind: \"summary\",\n path: summaryPathResult.relativePath,\n format: \"md\",\n redactionProfile: input.redactionProfile,\n };\n const manifest = createTraceArtifactManifest({\n framework: \"vitest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: input.identity.id,\n name: input.identity.name,\n ...(input.identity.file === undefined ? {} : { file: input.identity.file }),\n status: input.status,\n tracePath: safeOptional(traceFile),\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n },\n ],\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n });\n const trace = {\n runId: safeOptional(input.association.runId),\n file: safeOptional(traceFile),\n };\n\n await writeFile(\n manifestPathResult.absolutePath,\n `${JSON.stringify({ package: PACKAGE_NAME, manifest, trace }, null, 2)}\\n`,\n );\n const summaryPath = summaryPathResult.absolutePath;\n await writeFile(summaryPath, renderSummary(manifest, trace), \"utf-8\");\n\n return {\n directory,\n manifest,\n manifestPath: manifestPathResult.absolutePath,\n status: input.status,\n summaryPath,\n testId: input.identity.id,\n };\n}\n\nfunction renderSummary(\n manifest: TraceArtifactManifest,\n trace: { readonly runId?: string; readonly file?: string },\n): string {\n const result = manifest.results[0];\n return [\n \"# AgentInspect Vitest Artifact\",\n \"\",\n `- Test: ${result?.name ?? \"unknown\"}`,\n `- Test id: ${result?.testId ?? \"unknown\"}`,\n `- Status: ${result?.status ?? \"unknown\"}`,\n `- File: ${result?.file ?? \"unknown\"}`,\n `- Trace run: ${trace.runId ?? \"unknown\"}`,\n `- Trace file: ${result?.tracePath ?? \"unknown\"}`,\n `- Manifest schema: ${manifest.schemaVersion}`,\n \"\",\n \"Trace contents are intentionally not embedded in this artifact.\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatPathDiagnostics(\n diagnostics: readonly TraceReporterDiagnostic[],\n): string {\n if (diagnostics.length === 0) return \"Unsafe AgentInspect Vitest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\n}\n\nfunction* collectTasks(input: unknown, seen = new WeakSet<object>()): Iterable<unknown> {\n if (Array.isArray(input)) {\n for (const item of input) yield* collectTasks(item, seen);\n return;\n }\n if (!isObject(input) || seen.has(input)) return;\n\n seen.add(input);\n yield input;\n\n const task = input as TestLike;\n for (const childList of [task.tasks, task.children]) {\n if (Array.isArray(childList)) yield* collectTasks(childList, seen);\n }\n}\n\nfunction safeOptional(value: string | undefined): string | undefined {\n return value === undefined ? undefined : boundText(redactText(value));\n}\n\nfunction safeSegment(value: string): string {\n const sanitized = redactText(value)\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n return sanitized.length > 0 ? sanitized : \"trace\";\n}\n\nfunction boundText(value: string): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_TEXT) return compact;\n return `${compact.slice(0, MAX_TEXT - 12)}...[truncated]`;\n}\n\nfunction redactText(value: string): string {\n return value\n .replace(/\\bsk-[A-Za-z0-9_-]{8,}\\b/g, \"[REDACTED]\")\n .replace(/\\b(?:api[_-]?key|authorization|token|secret|password)\\s*[:=]\\s*[^,\\s]+/gi, \"$1=[REDACTED]\");\n}\n\nfunction readOptionalString(value: unknown, key: string): string | undefined {\n if (!isObject(value)) return undefined;\n const property = readProp(value, key);\n return typeof property === \"string\" && property.length > 0 ? property : undefined;\n}\n\nfunction readProp(value: object, key: string): unknown {\n return (value as Record<string, unknown>)[key];\n}\n\nfunction isObject(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/matchers.ts","../src/index.ts"],"names":["evaluateTraceContract","defineTraceContract","buildTraceFacts","path","writeFile","createReporterArtifactPath","mkdir","createTraceArtifactManifest"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Experimental Vitest matchers for AgentInspect TraceFacts / TraceContract.\n *\n * @experimental Part of the v6.13 TraceFacts train.\n */\n\nimport {\n buildTraceFacts,\n defineTraceContract,\n evaluateTraceContract,\n type TraceCheckInput,\n type TraceContractInput,\n} from \"agent-inspect/checks\";\n\ntype TraceLike =\n | TraceCheckInput\n | { readonly events: TraceCheckInput[\"read\"][\"events\"] }\n | TraceCheckInput[\"read\"][\"events\"];\n\nfunction eventsFrom(trace: TraceLike): TraceCheckInput[\"read\"][\"events\"] {\n if (Array.isArray(trace)) return trace;\n if (\"read\" in trace && trace.read?.events) return trace.read.events;\n if (\"events\" in trace && Array.isArray(trace.events)) return trace.events;\n return [];\n}\n\nfunction inputFrom(trace: TraceLike): TraceCheckInput | undefined {\n if (!Array.isArray(trace) && \"read\" in trace && trace.read) {\n return trace as TraceCheckInput;\n }\n return undefined;\n}\n\nexport interface AgentInspectVitestMatchers<R = unknown> {\n toPassTraceContract(contract: TraceContractInput): R;\n toHaveRequiredTool(toolName: string): R;\n}\n\nexport const agentInspectVitestMatchers = {\n toPassTraceContract(received: TraceLike, contract: TraceContractInput) {\n const input = inputFrom(received);\n if (!input) {\n return {\n pass: false,\n message: () =>\n \"toPassTraceContract expects TraceCheckInput ({ read }) so evaluateTraceContract can run.\",\n };\n }\n const result = evaluateTraceContract(input, defineTraceContract(contract));\n return {\n pass: result.status === \"pass\",\n message: () =>\n result.status === \"pass\"\n ? \"expected trace contract to fail\"\n : `expected trace contract to pass; findings=${JSON.stringify(\n result.findings.filter((f) => f.status === \"fail\").map((f) => f.ruleId),\n )}`,\n };\n },\n toHaveRequiredTool(received: TraceLike, toolName: string) {\n const facts = buildTraceFacts(eventsFrom(received));\n const pass = facts.toolsByName.has(toolName);\n return {\n pass,\n message: () =>\n pass\n ? `expected tool ${toolName} to be absent`\n : `expected required tool ${toolName}; found=${JSON.stringify([\n ...facts.toolsByName.keys(),\n ])}`,\n };\n },\n};\n\nexport type { TraceContractInput };\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n createReporterArtifactPath,\n createTraceArtifactManifest,\n type TraceArtifact,\n type TraceArtifactManifest,\n type TraceArtifactRedactionProfile,\n type TraceReporterDiagnostic,\n} from \"agent-inspect/reporters\";\n\nexport type AgentInspectVitestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/vitest`.\n *\n * Attach this object to Vitest task metadata, or return it from\n * `resolveTrace`. Associations are explicit only; the reporter never guesses\n * by timestamps.\n */\nexport interface AgentInspectVitestTraceAssociation {\n /** AgentInspect run/span identifier to show in safe artifacts. */\n readonly runId?: string;\n /** Local trace file path. Only the basename is written to artifacts. */\n readonly tracePath?: string;\n /** Optional stable label for the artifact directory. */\n readonly artifactLabel?: string;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of throwing so Vitest's original test\n * result remains authoritative.\n */\nexport interface AgentInspectVitestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"on-diagnostic-failed\"\n | \"unsafe-artifact-path\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Vitest reporter.\n *\n * The reporter is local-only: it performs no network I/O and writes bounded,\n * structural artifacts without reading trace contents.\n */\nexport interface AgentInspectVitestReporterOptions {\n /** Directory for safe Vitest artifacts. Defaults to `.agent-inspect/vitest-artifacts`. */\n readonly artifactDir?: string;\n /** Optional GitHub step-summary path. Only bounded structural lines are appended. */\n readonly githubSummary?: string;\n /**\n * Keep artifacts for passing tests. `false`/undefined keeps none; `true`\n * keeps up to `maxSuccessfulTraces`; a number keeps up to that many.\n */\n readonly retainSuccessful?: boolean | number;\n /** Upper bound for retained passing-test artifacts. Defaults to 20. */\n readonly maxSuccessfulTraces?: number;\n /** Redaction profile recorded on generated artifacts. Defaults to `share`. */\n readonly redactionProfile?: TraceArtifactRedactionProfile;\n /**\n * Local Evidence-style retention mode for reporter artifacts (no upload).\n * `fail` (default when omitted with retainSuccessful unset): failures only.\n * `always`: also retain successful traces up to the success limit.\n * `never`: skip artifact writes entirely.\n */\n readonly evidenceOn?: \"fail\" | \"always\" | \"never\";\n /** Deterministic manifest timestamp. Defaults to the Unix epoch. */\n readonly generatedAt?: string;\n /** Resolve explicit test-to-trace associations from a Vitest task/result. */\n readonly resolveTrace?: (\n test: unknown,\n ) => AgentInspectVitestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectVitestDiagnostic) => void;\n}\n\nexport interface AgentInspectVitestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectVitestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Vitest reporter facade.\n *\n * The shape is intentionally structural so the package stays tolerant of\n * Vitest reporter API drift while still exposing the hooks Vitest calls.\n */\nexport interface AgentInspectVitestReporter {\n onTestCaseResult(test: unknown): Promise<void>;\n onTaskUpdate(tasks: unknown): Promise<void>;\n onFinished(files?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[];\n getArtifacts(): readonly AgentInspectVitestArtifact[];\n}\n\ntype TestIdentity = {\n readonly id: string;\n readonly name: string;\n readonly file?: string;\n};\n\ntype TestLike = {\n readonly id?: unknown;\n readonly name?: unknown;\n readonly suite?: unknown;\n readonly file?: unknown;\n readonly filepath?: unknown;\n readonly result?: unknown;\n readonly meta?: unknown;\n readonly context?: unknown;\n readonly tasks?: unknown;\n readonly children?: unknown;\n};\n\ntype ResultLike = {\n readonly state?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/vitest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/vitest-artifacts\";\nconst DEFAULT_SUCCESS_LIMIT = 20;\nconst MAX_SUCCESS_LIMIT = 100;\nconst MAX_TEXT = 180;\nconst DEFAULT_GENERATED_AT = \"1970-01-01T00:00:00.000Z\";\n\n/**\n * Create the experimental AgentInspect Vitest reporter.\n */\nexport function createAgentInspectVitestReporter(\n options: AgentInspectVitestReporterOptions = {},\n): AgentInspectVitestReporter {\n const diagnostics: AgentInspectVitestDiagnostic[] = [];\n const artifacts: AgentInspectVitestArtifact[] = [];\n const seenObjects = new WeakSet<object>();\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n\n const reporter: AgentInspectVitestReporter = {\n async onTestCaseResult(test: unknown): Promise<void> {\n await handleTest(test);\n },\n async onTaskUpdate(tasks: unknown): Promise<void> {\n for (const test of collectTasks(tasks)) {\n await handleTest(test);\n }\n },\n async onFinished(files?: unknown): Promise<void> {\n for (const test of collectTasks(files)) {\n await handleTest(test);\n }\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectVitestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleTest(test: unknown): Promise<void> {\n if (!isObject(test)) return;\n if (seenObjects.has(test)) return;\n\n if (options.evidenceOn === \"never\") return;\n\n const status = readStatus(test);\n if (status === undefined || status === \"skipped\") return;\n\n const identity = readIdentity(test);\n const seenKey = `${identity.id}:${status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(test, options);\n if (association === undefined) return;\n\n if (status === \"passed\") {\n if (options.evidenceOn === \"fail\") return;\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\n seenObjects.add(test);\n seenKeys.add(seenKey);\n\n try {\n const artifact = await writeSafeArtifact({\n artifactDir: options.artifactDir ?? DEFAULT_ARTIFACT_DIR,\n association,\n generatedAt: options.generatedAt ?? DEFAULT_GENERATED_AT,\n identity,\n reserveArtifactName,\n redactionProfile: options.redactionProfile ?? \"share\",\n status,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Vitest artifact: ${errorMessage(error)}`,\n testId: identity.id,\n });\n }\n }\n\n function reserveArtifactName(seed: string): string {\n const base = safeSegment(seed);\n const next = (artifactNames.get(base) ?? 0) + 1;\n artifactNames.set(base, next);\n return next === 1 ? base : `${base}-${next}`;\n }\n\n function reportDiagnostic(diagnostic: AgentInspectVitestDiagnostic): void {\n diagnostics.push(diagnostic);\n if (options.onDiagnostic === undefined) return;\n try {\n options.onDiagnostic(diagnostic);\n } catch (error) {\n diagnostics.push({\n code: \"on-diagnostic-failed\",\n message: `AgentInspect Vitest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined || artifacts.length === 0) return;\n const failed = artifacts.filter((artifact) => artifact.status === \"failed\").length;\n const passed = artifacts.filter((artifact) => artifact.status === \"passed\").length;\n const lines = [\n \"\",\n \"## AgentInspect Vitest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n try {\n await writeFile(options.githubSummary, `${lines.join(\"\\n\")}\\n`, { flag: \"a\" });\n } catch (error) {\n reportDiagnostic({\n code: \"github-summary-write-failed\",\n message: `Could not append AgentInspect Vitest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\nexport const agentInspectVitestReporter = createAgentInspectVitestReporter;\n\nexport { agentInspectVitestMatchers } from \"./matchers.js\";\nexport type { AgentInspectVitestMatchers } from \"./matchers.js\";\n\nfunction normalizeSuccessLimit(options: AgentInspectVitestReporterOptions): number {\n const cap = clampCount(options.maxSuccessfulTraces, DEFAULT_SUCCESS_LIMIT);\n if (options.evidenceOn === \"always\" && options.retainSuccessful === undefined) {\n return cap;\n }\n if (options.retainSuccessful === true) return cap;\n if (typeof options.retainSuccessful === \"number\") {\n return Math.min(clampCount(options.retainSuccessful, 0), cap);\n }\n return 0;\n}\n\nfunction clampCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(MAX_SUCCESS_LIMIT, Math.floor(value)));\n}\n\nfunction resolveAssociation(\n test: object,\n options: AgentInspectVitestReporterOptions,\n): AgentInspectVitestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(test);\n if (isAssociation(resolved)) return resolved;\n\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n return (\n readAssociationFromMeta(task.meta) ??\n readAssociationFromContext(task.context) ??\n readAssociationFromMeta(result?.meta)\n );\n}\n\nfunction readAssociationFromContext(\n context: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(context)) return undefined;\n const maybeMeta = readProp(context, \"meta\");\n return readAssociationFromMeta(maybeMeta);\n}\n\nfunction readAssociationFromMeta(\n meta: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(meta)) return undefined;\n const direct = readProp(meta, \"agentInspect\");\n const hyphenated = readProp(meta, \"agent-inspect\");\n const trace = readProp(meta, \"trace\");\n for (const candidate of [direct, hyphenated, trace]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectVitestTraceAssociation {\n if (!isObject(value)) return false;\n return (\n readOptionalString(value, \"runId\") !== undefined ||\n readOptionalString(value, \"tracePath\") !== undefined ||\n readOptionalString(value, \"artifactLabel\") !== undefined\n );\n}\n\nfunction readStatus(test: object): AgentInspectVitestStatus | undefined {\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n const raw =\n readOptionalString(result, \"state\") ??\n readOptionalString(result, \"status\") ??\n readOptionalString(test, \"state\") ??\n readOptionalString(test, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"fail\" || normalized === \"failed\") return \"failed\";\n if (normalized === \"pass\" || normalized === \"passed\") return \"passed\";\n if (normalized === \"skip\" || normalized === \"skipped\") return \"skipped\";\n return undefined;\n}\n\nfunction readIdentity(test: object): TestIdentity {\n const task = test as TestLike;\n const id = readOptionalString(test, \"id\") ?? readOptionalString(test, \"taskId\");\n const name =\n readOptionalString(test, \"fullName\") ??\n readOptionalString(test, \"name\") ??\n readOptionalString(task.suite, \"name\") ??\n id ??\n \"unknown-test\";\n const file =\n readOptionalString(test, \"file\") ??\n readOptionalString(test, \"filepath\") ??\n readOptionalString(task.suite, \"file\");\n return {\n file: file === undefined ? undefined : path.basename(file),\n id: boundText(redactText(id ?? name)),\n name: boundText(redactText(name)),\n };\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectVitestTraceAssociation;\n readonly generatedAt: string;\n readonly identity: TestIdentity;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectVitestStatus;\n}): Promise<AgentInspectVitestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.identity.id ??\n input.identity.name ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"summary\",\n format: \"md\",\n });\n\n if (\n !manifestPathResult.ok ||\n manifestPathResult.absolutePath === undefined ||\n manifestPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(manifestPathResult.diagnostics));\n }\n if (\n !summaryPathResult.ok ||\n summaryPathResult.absolutePath === undefined ||\n summaryPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(summaryPathResult.diagnostics));\n }\n\n const directory = path.dirname(manifestPathResult.absolutePath);\n await mkdir(directory, { recursive: true });\n\n const traceFile =\n input.association.tracePath === undefined\n ? undefined\n : path.basename(input.association.tracePath);\n const manifestArtifact: TraceArtifact = {\n kind: \"report\",\n path: manifestPathResult.relativePath,\n format: \"json\",\n redactionProfile: input.redactionProfile,\n };\n const summaryArtifact: TraceArtifact = {\n kind: \"summary\",\n path: summaryPathResult.relativePath,\n format: \"md\",\n redactionProfile: input.redactionProfile,\n };\n const manifest = createTraceArtifactManifest({\n framework: \"vitest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: input.identity.id,\n name: input.identity.name,\n ...(input.identity.file === undefined ? {} : { file: input.identity.file }),\n status: input.status,\n tracePath: safeOptional(traceFile),\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n },\n ],\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n });\n const trace = {\n runId: safeOptional(input.association.runId),\n file: safeOptional(traceFile),\n };\n\n await writeFile(\n manifestPathResult.absolutePath,\n `${JSON.stringify({ package: PACKAGE_NAME, manifest, trace }, null, 2)}\\n`,\n );\n const summaryPath = summaryPathResult.absolutePath;\n await writeFile(summaryPath, renderSummary(manifest, trace), \"utf-8\");\n\n return {\n directory,\n manifest,\n manifestPath: manifestPathResult.absolutePath,\n status: input.status,\n summaryPath,\n testId: input.identity.id,\n };\n}\n\nfunction renderSummary(\n manifest: TraceArtifactManifest,\n trace: { readonly runId?: string; readonly file?: string },\n): string {\n const result = manifest.results[0];\n return [\n \"# AgentInspect Vitest Artifact\",\n \"\",\n `- Test: ${result?.name ?? \"unknown\"}`,\n `- Test id: ${result?.testId ?? \"unknown\"}`,\n `- Status: ${result?.status ?? \"unknown\"}`,\n `- File: ${result?.file ?? \"unknown\"}`,\n `- Trace run: ${trace.runId ?? \"unknown\"}`,\n `- Trace file: ${result?.tracePath ?? \"unknown\"}`,\n `- Manifest schema: ${manifest.schemaVersion}`,\n \"\",\n \"Trace contents are intentionally not embedded in this artifact.\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatPathDiagnostics(\n diagnostics: readonly TraceReporterDiagnostic[],\n): string {\n if (diagnostics.length === 0) return \"Unsafe AgentInspect Vitest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\n}\n\nfunction* collectTasks(input: unknown, seen = new WeakSet<object>()): Iterable<unknown> {\n if (Array.isArray(input)) {\n for (const item of input) yield* collectTasks(item, seen);\n return;\n }\n if (!isObject(input) || seen.has(input)) return;\n\n seen.add(input);\n yield input;\n\n const task = input as TestLike;\n for (const childList of [task.tasks, task.children]) {\n if (Array.isArray(childList)) yield* collectTasks(childList, seen);\n }\n}\n\nfunction safeOptional(value: string | undefined): string | undefined {\n return value === undefined ? undefined : boundText(redactText(value));\n}\n\nfunction safeSegment(value: string): string {\n const sanitized = redactText(value)\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n return sanitized.length > 0 ? sanitized : \"trace\";\n}\n\nfunction boundText(value: string): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_TEXT) return compact;\n return `${compact.slice(0, MAX_TEXT - 12)}...[truncated]`;\n}\n\nfunction redactText(value: string): string {\n return value\n .replace(/\\bsk-[A-Za-z0-9_-]{8,}\\b/g, \"[REDACTED]\")\n .replace(/\\b(?:api[_-]?key|authorization|token|secret|password)\\s*[:=]\\s*[^,\\s]+/gi, \"$1=[REDACTED]\");\n}\n\nfunction readOptionalString(value: unknown, key: string): string | undefined {\n if (!isObject(value)) return undefined;\n const property = readProp(value, key);\n return typeof property === \"string\" && property.length > 0 ? property : undefined;\n}\n\nfunction readProp(value: object, key: string): unknown {\n return (value as Record<string, unknown>)[key];\n}\n\nfunction isObject(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -292,6 +292,13 @@ interface AgentInspectVitestReporterOptions {
|
|
|
292
292
|
readonly maxSuccessfulTraces?: number;
|
|
293
293
|
/** Redaction profile recorded on generated artifacts. Defaults to `share`. */
|
|
294
294
|
readonly redactionProfile?: TraceArtifactRedactionProfile;
|
|
295
|
+
/**
|
|
296
|
+
* Local Evidence-style retention mode for reporter artifacts (no upload).
|
|
297
|
+
* `fail` (default when omitted with retainSuccessful unset): failures only.
|
|
298
|
+
* `always`: also retain successful traces up to the success limit.
|
|
299
|
+
* `never`: skip artifact writes entirely.
|
|
300
|
+
*/
|
|
301
|
+
readonly evidenceOn?: "fail" | "always" | "never";
|
|
295
302
|
/** Deterministic manifest timestamp. Defaults to the Unix epoch. */
|
|
296
303
|
readonly generatedAt?: string;
|
|
297
304
|
/** Resolve explicit test-to-trace associations from a Vitest task/result. */
|
package/dist/index.d.ts
CHANGED
|
@@ -292,6 +292,13 @@ interface AgentInspectVitestReporterOptions {
|
|
|
292
292
|
readonly maxSuccessfulTraces?: number;
|
|
293
293
|
/** Redaction profile recorded on generated artifacts. Defaults to `share`. */
|
|
294
294
|
readonly redactionProfile?: TraceArtifactRedactionProfile;
|
|
295
|
+
/**
|
|
296
|
+
* Local Evidence-style retention mode for reporter artifacts (no upload).
|
|
297
|
+
* `fail` (default when omitted with retainSuccessful unset): failures only.
|
|
298
|
+
* `always`: also retain successful traces up to the success limit.
|
|
299
|
+
* `never`: skip artifact writes entirely.
|
|
300
|
+
*/
|
|
301
|
+
readonly evidenceOn?: "fail" | "always" | "never";
|
|
295
302
|
/** Deterministic manifest timestamp. Defaults to the Unix epoch. */
|
|
296
303
|
readonly generatedAt?: string;
|
|
297
304
|
/** Resolve explicit test-to-trace associations from a Vitest task/result. */
|
package/dist/index.mjs
CHANGED
|
@@ -85,6 +85,7 @@ function createAgentInspectVitestReporter(options = {}) {
|
|
|
85
85
|
async function handleTest(test) {
|
|
86
86
|
if (!isObject(test)) return;
|
|
87
87
|
if (seenObjects.has(test)) return;
|
|
88
|
+
if (options.evidenceOn === "never") return;
|
|
88
89
|
const status = readStatus(test);
|
|
89
90
|
if (status === void 0 || status === "skipped") return;
|
|
90
91
|
const identity = readIdentity(test);
|
|
@@ -93,6 +94,7 @@ function createAgentInspectVitestReporter(options = {}) {
|
|
|
93
94
|
const association = resolveAssociation(test, options);
|
|
94
95
|
if (association === void 0) return;
|
|
95
96
|
if (status === "passed") {
|
|
97
|
+
if (options.evidenceOn === "fail") return;
|
|
96
98
|
if (retainedSuccesses >= successLimit) return;
|
|
97
99
|
retainedSuccesses += 1;
|
|
98
100
|
}
|
|
@@ -164,6 +166,9 @@ function createAgentInspectVitestReporter(options = {}) {
|
|
|
164
166
|
var agentInspectVitestReporter = createAgentInspectVitestReporter;
|
|
165
167
|
function normalizeSuccessLimit(options) {
|
|
166
168
|
const cap = clampCount(options.maxSuccessfulTraces, DEFAULT_SUCCESS_LIMIT);
|
|
169
|
+
if (options.evidenceOn === "always" && options.retainSuccessful === void 0) {
|
|
170
|
+
return cap;
|
|
171
|
+
}
|
|
167
172
|
if (options.retainSuccessful === true) return cap;
|
|
168
173
|
if (typeof options.retainSuccessful === "number") {
|
|
169
174
|
return Math.min(clampCount(options.retainSuccessful, 0), cap);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/matchers.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Experimental Vitest matchers for AgentInspect TraceFacts / TraceContract.\n *\n * @experimental Part of the v6.13 TraceFacts train.\n */\n\nimport {\n buildTraceFacts,\n defineTraceContract,\n evaluateTraceContract,\n type TraceCheckInput,\n type TraceContractInput,\n} from \"agent-inspect/checks\";\n\ntype TraceLike =\n | TraceCheckInput\n | { readonly events: TraceCheckInput[\"read\"][\"events\"] }\n | TraceCheckInput[\"read\"][\"events\"];\n\nfunction eventsFrom(trace: TraceLike): TraceCheckInput[\"read\"][\"events\"] {\n if (Array.isArray(trace)) return trace;\n if (\"read\" in trace && trace.read?.events) return trace.read.events;\n if (\"events\" in trace && Array.isArray(trace.events)) return trace.events;\n return [];\n}\n\nfunction inputFrom(trace: TraceLike): TraceCheckInput | undefined {\n if (!Array.isArray(trace) && \"read\" in trace && trace.read) {\n return trace as TraceCheckInput;\n }\n return undefined;\n}\n\nexport interface AgentInspectVitestMatchers<R = unknown> {\n toPassTraceContract(contract: TraceContractInput): R;\n toHaveRequiredTool(toolName: string): R;\n}\n\nexport const agentInspectVitestMatchers = {\n toPassTraceContract(received: TraceLike, contract: TraceContractInput) {\n const input = inputFrom(received);\n if (!input) {\n return {\n pass: false,\n message: () =>\n \"toPassTraceContract expects TraceCheckInput ({ read }) so evaluateTraceContract can run.\",\n };\n }\n const result = evaluateTraceContract(input, defineTraceContract(contract));\n return {\n pass: result.status === \"pass\",\n message: () =>\n result.status === \"pass\"\n ? \"expected trace contract to fail\"\n : `expected trace contract to pass; findings=${JSON.stringify(\n result.findings.filter((f) => f.status === \"fail\").map((f) => f.ruleId),\n )}`,\n };\n },\n toHaveRequiredTool(received: TraceLike, toolName: string) {\n const facts = buildTraceFacts(eventsFrom(received));\n const pass = facts.toolsByName.has(toolName);\n return {\n pass,\n message: () =>\n pass\n ? `expected tool ${toolName} to be absent`\n : `expected required tool ${toolName}; found=${JSON.stringify([\n ...facts.toolsByName.keys(),\n ])}`,\n };\n },\n};\n\nexport type { TraceContractInput };\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n createReporterArtifactPath,\n createTraceArtifactManifest,\n type TraceArtifact,\n type TraceArtifactManifest,\n type TraceArtifactRedactionProfile,\n type TraceReporterDiagnostic,\n} from \"agent-inspect/reporters\";\n\nexport type AgentInspectVitestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/vitest`.\n *\n * Attach this object to Vitest task metadata, or return it from\n * `resolveTrace`. Associations are explicit only; the reporter never guesses\n * by timestamps.\n */\nexport interface AgentInspectVitestTraceAssociation {\n /** AgentInspect run/span identifier to show in safe artifacts. */\n readonly runId?: string;\n /** Local trace file path. Only the basename is written to artifacts. */\n readonly tracePath?: string;\n /** Optional stable label for the artifact directory. */\n readonly artifactLabel?: string;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of throwing so Vitest's original test\n * result remains authoritative.\n */\nexport interface AgentInspectVitestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"on-diagnostic-failed\"\n | \"unsafe-artifact-path\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Vitest reporter.\n *\n * The reporter is local-only: it performs no network I/O and writes bounded,\n * structural artifacts without reading trace contents.\n */\nexport interface AgentInspectVitestReporterOptions {\n /** Directory for safe Vitest artifacts. Defaults to `.agent-inspect/vitest-artifacts`. */\n readonly artifactDir?: string;\n /** Optional GitHub step-summary path. Only bounded structural lines are appended. */\n readonly githubSummary?: string;\n /**\n * Keep artifacts for passing tests. `false`/undefined keeps none; `true`\n * keeps up to `maxSuccessfulTraces`; a number keeps up to that many.\n */\n readonly retainSuccessful?: boolean | number;\n /** Upper bound for retained passing-test artifacts. Defaults to 20. */\n readonly maxSuccessfulTraces?: number;\n /** Redaction profile recorded on generated artifacts. Defaults to `share`. */\n readonly redactionProfile?: TraceArtifactRedactionProfile;\n /** Deterministic manifest timestamp. Defaults to the Unix epoch. */\n readonly generatedAt?: string;\n /** Resolve explicit test-to-trace associations from a Vitest task/result. */\n readonly resolveTrace?: (\n test: unknown,\n ) => AgentInspectVitestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectVitestDiagnostic) => void;\n}\n\nexport interface AgentInspectVitestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectVitestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Vitest reporter facade.\n *\n * The shape is intentionally structural so the package stays tolerant of\n * Vitest reporter API drift while still exposing the hooks Vitest calls.\n */\nexport interface AgentInspectVitestReporter {\n onTestCaseResult(test: unknown): Promise<void>;\n onTaskUpdate(tasks: unknown): Promise<void>;\n onFinished(files?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[];\n getArtifacts(): readonly AgentInspectVitestArtifact[];\n}\n\ntype TestIdentity = {\n readonly id: string;\n readonly name: string;\n readonly file?: string;\n};\n\ntype TestLike = {\n readonly id?: unknown;\n readonly name?: unknown;\n readonly suite?: unknown;\n readonly file?: unknown;\n readonly filepath?: unknown;\n readonly result?: unknown;\n readonly meta?: unknown;\n readonly context?: unknown;\n readonly tasks?: unknown;\n readonly children?: unknown;\n};\n\ntype ResultLike = {\n readonly state?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/vitest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/vitest-artifacts\";\nconst DEFAULT_SUCCESS_LIMIT = 20;\nconst MAX_SUCCESS_LIMIT = 100;\nconst MAX_TEXT = 180;\nconst DEFAULT_GENERATED_AT = \"1970-01-01T00:00:00.000Z\";\n\n/**\n * Create the experimental AgentInspect Vitest reporter.\n */\nexport function createAgentInspectVitestReporter(\n options: AgentInspectVitestReporterOptions = {},\n): AgentInspectVitestReporter {\n const diagnostics: AgentInspectVitestDiagnostic[] = [];\n const artifacts: AgentInspectVitestArtifact[] = [];\n const seenObjects = new WeakSet<object>();\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n\n const reporter: AgentInspectVitestReporter = {\n async onTestCaseResult(test: unknown): Promise<void> {\n await handleTest(test);\n },\n async onTaskUpdate(tasks: unknown): Promise<void> {\n for (const test of collectTasks(tasks)) {\n await handleTest(test);\n }\n },\n async onFinished(files?: unknown): Promise<void> {\n for (const test of collectTasks(files)) {\n await handleTest(test);\n }\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectVitestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleTest(test: unknown): Promise<void> {\n if (!isObject(test)) return;\n if (seenObjects.has(test)) return;\n\n const status = readStatus(test);\n if (status === undefined || status === \"skipped\") return;\n\n const identity = readIdentity(test);\n const seenKey = `${identity.id}:${status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(test, options);\n if (association === undefined) return;\n\n if (status === \"passed\") {\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\n seenObjects.add(test);\n seenKeys.add(seenKey);\n\n try {\n const artifact = await writeSafeArtifact({\n artifactDir: options.artifactDir ?? DEFAULT_ARTIFACT_DIR,\n association,\n generatedAt: options.generatedAt ?? DEFAULT_GENERATED_AT,\n identity,\n reserveArtifactName,\n redactionProfile: options.redactionProfile ?? \"share\",\n status,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Vitest artifact: ${errorMessage(error)}`,\n testId: identity.id,\n });\n }\n }\n\n function reserveArtifactName(seed: string): string {\n const base = safeSegment(seed);\n const next = (artifactNames.get(base) ?? 0) + 1;\n artifactNames.set(base, next);\n return next === 1 ? base : `${base}-${next}`;\n }\n\n function reportDiagnostic(diagnostic: AgentInspectVitestDiagnostic): void {\n diagnostics.push(diagnostic);\n if (options.onDiagnostic === undefined) return;\n try {\n options.onDiagnostic(diagnostic);\n } catch (error) {\n diagnostics.push({\n code: \"on-diagnostic-failed\",\n message: `AgentInspect Vitest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined || artifacts.length === 0) return;\n const failed = artifacts.filter((artifact) => artifact.status === \"failed\").length;\n const passed = artifacts.filter((artifact) => artifact.status === \"passed\").length;\n const lines = [\n \"\",\n \"## AgentInspect Vitest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n try {\n await writeFile(options.githubSummary, `${lines.join(\"\\n\")}\\n`, { flag: \"a\" });\n } catch (error) {\n reportDiagnostic({\n code: \"github-summary-write-failed\",\n message: `Could not append AgentInspect Vitest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\nexport const agentInspectVitestReporter = createAgentInspectVitestReporter;\n\nexport { agentInspectVitestMatchers } from \"./matchers.js\";\nexport type { AgentInspectVitestMatchers } from \"./matchers.js\";\n\nfunction normalizeSuccessLimit(options: AgentInspectVitestReporterOptions): number {\n const cap = clampCount(options.maxSuccessfulTraces, DEFAULT_SUCCESS_LIMIT);\n if (options.retainSuccessful === true) return cap;\n if (typeof options.retainSuccessful === \"number\") {\n return Math.min(clampCount(options.retainSuccessful, 0), cap);\n }\n return 0;\n}\n\nfunction clampCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(MAX_SUCCESS_LIMIT, Math.floor(value)));\n}\n\nfunction resolveAssociation(\n test: object,\n options: AgentInspectVitestReporterOptions,\n): AgentInspectVitestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(test);\n if (isAssociation(resolved)) return resolved;\n\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n return (\n readAssociationFromMeta(task.meta) ??\n readAssociationFromContext(task.context) ??\n readAssociationFromMeta(result?.meta)\n );\n}\n\nfunction readAssociationFromContext(\n context: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(context)) return undefined;\n const maybeMeta = readProp(context, \"meta\");\n return readAssociationFromMeta(maybeMeta);\n}\n\nfunction readAssociationFromMeta(\n meta: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(meta)) return undefined;\n const direct = readProp(meta, \"agentInspect\");\n const hyphenated = readProp(meta, \"agent-inspect\");\n const trace = readProp(meta, \"trace\");\n for (const candidate of [direct, hyphenated, trace]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectVitestTraceAssociation {\n if (!isObject(value)) return false;\n return (\n readOptionalString(value, \"runId\") !== undefined ||\n readOptionalString(value, \"tracePath\") !== undefined ||\n readOptionalString(value, \"artifactLabel\") !== undefined\n );\n}\n\nfunction readStatus(test: object): AgentInspectVitestStatus | undefined {\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n const raw =\n readOptionalString(result, \"state\") ??\n readOptionalString(result, \"status\") ??\n readOptionalString(test, \"state\") ??\n readOptionalString(test, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"fail\" || normalized === \"failed\") return \"failed\";\n if (normalized === \"pass\" || normalized === \"passed\") return \"passed\";\n if (normalized === \"skip\" || normalized === \"skipped\") return \"skipped\";\n return undefined;\n}\n\nfunction readIdentity(test: object): TestIdentity {\n const task = test as TestLike;\n const id = readOptionalString(test, \"id\") ?? readOptionalString(test, \"taskId\");\n const name =\n readOptionalString(test, \"fullName\") ??\n readOptionalString(test, \"name\") ??\n readOptionalString(task.suite, \"name\") ??\n id ??\n \"unknown-test\";\n const file =\n readOptionalString(test, \"file\") ??\n readOptionalString(test, \"filepath\") ??\n readOptionalString(task.suite, \"file\");\n return {\n file: file === undefined ? undefined : path.basename(file),\n id: boundText(redactText(id ?? name)),\n name: boundText(redactText(name)),\n };\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectVitestTraceAssociation;\n readonly generatedAt: string;\n readonly identity: TestIdentity;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectVitestStatus;\n}): Promise<AgentInspectVitestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.identity.id ??\n input.identity.name ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"summary\",\n format: \"md\",\n });\n\n if (\n !manifestPathResult.ok ||\n manifestPathResult.absolutePath === undefined ||\n manifestPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(manifestPathResult.diagnostics));\n }\n if (\n !summaryPathResult.ok ||\n summaryPathResult.absolutePath === undefined ||\n summaryPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(summaryPathResult.diagnostics));\n }\n\n const directory = path.dirname(manifestPathResult.absolutePath);\n await mkdir(directory, { recursive: true });\n\n const traceFile =\n input.association.tracePath === undefined\n ? undefined\n : path.basename(input.association.tracePath);\n const manifestArtifact: TraceArtifact = {\n kind: \"report\",\n path: manifestPathResult.relativePath,\n format: \"json\",\n redactionProfile: input.redactionProfile,\n };\n const summaryArtifact: TraceArtifact = {\n kind: \"summary\",\n path: summaryPathResult.relativePath,\n format: \"md\",\n redactionProfile: input.redactionProfile,\n };\n const manifest = createTraceArtifactManifest({\n framework: \"vitest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: input.identity.id,\n name: input.identity.name,\n ...(input.identity.file === undefined ? {} : { file: input.identity.file }),\n status: input.status,\n tracePath: safeOptional(traceFile),\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n },\n ],\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n });\n const trace = {\n runId: safeOptional(input.association.runId),\n file: safeOptional(traceFile),\n };\n\n await writeFile(\n manifestPathResult.absolutePath,\n `${JSON.stringify({ package: PACKAGE_NAME, manifest, trace }, null, 2)}\\n`,\n );\n const summaryPath = summaryPathResult.absolutePath;\n await writeFile(summaryPath, renderSummary(manifest, trace), \"utf-8\");\n\n return {\n directory,\n manifest,\n manifestPath: manifestPathResult.absolutePath,\n status: input.status,\n summaryPath,\n testId: input.identity.id,\n };\n}\n\nfunction renderSummary(\n manifest: TraceArtifactManifest,\n trace: { readonly runId?: string; readonly file?: string },\n): string {\n const result = manifest.results[0];\n return [\n \"# AgentInspect Vitest Artifact\",\n \"\",\n `- Test: ${result?.name ?? \"unknown\"}`,\n `- Test id: ${result?.testId ?? \"unknown\"}`,\n `- Status: ${result?.status ?? \"unknown\"}`,\n `- File: ${result?.file ?? \"unknown\"}`,\n `- Trace run: ${trace.runId ?? \"unknown\"}`,\n `- Trace file: ${result?.tracePath ?? \"unknown\"}`,\n `- Manifest schema: ${manifest.schemaVersion}`,\n \"\",\n \"Trace contents are intentionally not embedded in this artifact.\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatPathDiagnostics(\n diagnostics: readonly TraceReporterDiagnostic[],\n): string {\n if (diagnostics.length === 0) return \"Unsafe AgentInspect Vitest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\n}\n\nfunction* collectTasks(input: unknown, seen = new WeakSet<object>()): Iterable<unknown> {\n if (Array.isArray(input)) {\n for (const item of input) yield* collectTasks(item, seen);\n return;\n }\n if (!isObject(input) || seen.has(input)) return;\n\n seen.add(input);\n yield input;\n\n const task = input as TestLike;\n for (const childList of [task.tasks, task.children]) {\n if (Array.isArray(childList)) yield* collectTasks(childList, seen);\n }\n}\n\nfunction safeOptional(value: string | undefined): string | undefined {\n return value === undefined ? undefined : boundText(redactText(value));\n}\n\nfunction safeSegment(value: string): string {\n const sanitized = redactText(value)\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n return sanitized.length > 0 ? sanitized : \"trace\";\n}\n\nfunction boundText(value: string): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_TEXT) return compact;\n return `${compact.slice(0, MAX_TEXT - 12)}...[truncated]`;\n}\n\nfunction redactText(value: string): string {\n return value\n .replace(/\\bsk-[A-Za-z0-9_-]{8,}\\b/g, \"[REDACTED]\")\n .replace(/\\b(?:api[_-]?key|authorization|token|secret|password)\\s*[:=]\\s*[^,\\s]+/gi, \"$1=[REDACTED]\");\n}\n\nfunction readOptionalString(value: unknown, key: string): string | undefined {\n if (!isObject(value)) return undefined;\n const property = readProp(value, key);\n return typeof property === \"string\" && property.length > 0 ? property : undefined;\n}\n\nfunction readProp(value: object, key: string): unknown {\n return (value as Record<string, unknown>)[key];\n}\n\nfunction isObject(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/matchers.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Experimental Vitest matchers for AgentInspect TraceFacts / TraceContract.\n *\n * @experimental Part of the v6.13 TraceFacts train.\n */\n\nimport {\n buildTraceFacts,\n defineTraceContract,\n evaluateTraceContract,\n type TraceCheckInput,\n type TraceContractInput,\n} from \"agent-inspect/checks\";\n\ntype TraceLike =\n | TraceCheckInput\n | { readonly events: TraceCheckInput[\"read\"][\"events\"] }\n | TraceCheckInput[\"read\"][\"events\"];\n\nfunction eventsFrom(trace: TraceLike): TraceCheckInput[\"read\"][\"events\"] {\n if (Array.isArray(trace)) return trace;\n if (\"read\" in trace && trace.read?.events) return trace.read.events;\n if (\"events\" in trace && Array.isArray(trace.events)) return trace.events;\n return [];\n}\n\nfunction inputFrom(trace: TraceLike): TraceCheckInput | undefined {\n if (!Array.isArray(trace) && \"read\" in trace && trace.read) {\n return trace as TraceCheckInput;\n }\n return undefined;\n}\n\nexport interface AgentInspectVitestMatchers<R = unknown> {\n toPassTraceContract(contract: TraceContractInput): R;\n toHaveRequiredTool(toolName: string): R;\n}\n\nexport const agentInspectVitestMatchers = {\n toPassTraceContract(received: TraceLike, contract: TraceContractInput) {\n const input = inputFrom(received);\n if (!input) {\n return {\n pass: false,\n message: () =>\n \"toPassTraceContract expects TraceCheckInput ({ read }) so evaluateTraceContract can run.\",\n };\n }\n const result = evaluateTraceContract(input, defineTraceContract(contract));\n return {\n pass: result.status === \"pass\",\n message: () =>\n result.status === \"pass\"\n ? \"expected trace contract to fail\"\n : `expected trace contract to pass; findings=${JSON.stringify(\n result.findings.filter((f) => f.status === \"fail\").map((f) => f.ruleId),\n )}`,\n };\n },\n toHaveRequiredTool(received: TraceLike, toolName: string) {\n const facts = buildTraceFacts(eventsFrom(received));\n const pass = facts.toolsByName.has(toolName);\n return {\n pass,\n message: () =>\n pass\n ? `expected tool ${toolName} to be absent`\n : `expected required tool ${toolName}; found=${JSON.stringify([\n ...facts.toolsByName.keys(),\n ])}`,\n };\n },\n};\n\nexport type { TraceContractInput };\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n createReporterArtifactPath,\n createTraceArtifactManifest,\n type TraceArtifact,\n type TraceArtifactManifest,\n type TraceArtifactRedactionProfile,\n type TraceReporterDiagnostic,\n} from \"agent-inspect/reporters\";\n\nexport type AgentInspectVitestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/vitest`.\n *\n * Attach this object to Vitest task metadata, or return it from\n * `resolveTrace`. Associations are explicit only; the reporter never guesses\n * by timestamps.\n */\nexport interface AgentInspectVitestTraceAssociation {\n /** AgentInspect run/span identifier to show in safe artifacts. */\n readonly runId?: string;\n /** Local trace file path. Only the basename is written to artifacts. */\n readonly tracePath?: string;\n /** Optional stable label for the artifact directory. */\n readonly artifactLabel?: string;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of throwing so Vitest's original test\n * result remains authoritative.\n */\nexport interface AgentInspectVitestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"on-diagnostic-failed\"\n | \"unsafe-artifact-path\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Vitest reporter.\n *\n * The reporter is local-only: it performs no network I/O and writes bounded,\n * structural artifacts without reading trace contents.\n */\nexport interface AgentInspectVitestReporterOptions {\n /** Directory for safe Vitest artifacts. Defaults to `.agent-inspect/vitest-artifacts`. */\n readonly artifactDir?: string;\n /** Optional GitHub step-summary path. Only bounded structural lines are appended. */\n readonly githubSummary?: string;\n /**\n * Keep artifacts for passing tests. `false`/undefined keeps none; `true`\n * keeps up to `maxSuccessfulTraces`; a number keeps up to that many.\n */\n readonly retainSuccessful?: boolean | number;\n /** Upper bound for retained passing-test artifacts. Defaults to 20. */\n readonly maxSuccessfulTraces?: number;\n /** Redaction profile recorded on generated artifacts. Defaults to `share`. */\n readonly redactionProfile?: TraceArtifactRedactionProfile;\n /**\n * Local Evidence-style retention mode for reporter artifacts (no upload).\n * `fail` (default when omitted with retainSuccessful unset): failures only.\n * `always`: also retain successful traces up to the success limit.\n * `never`: skip artifact writes entirely.\n */\n readonly evidenceOn?: \"fail\" | \"always\" | \"never\";\n /** Deterministic manifest timestamp. Defaults to the Unix epoch. */\n readonly generatedAt?: string;\n /** Resolve explicit test-to-trace associations from a Vitest task/result. */\n readonly resolveTrace?: (\n test: unknown,\n ) => AgentInspectVitestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectVitestDiagnostic) => void;\n}\n\nexport interface AgentInspectVitestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectVitestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Vitest reporter facade.\n *\n * The shape is intentionally structural so the package stays tolerant of\n * Vitest reporter API drift while still exposing the hooks Vitest calls.\n */\nexport interface AgentInspectVitestReporter {\n onTestCaseResult(test: unknown): Promise<void>;\n onTaskUpdate(tasks: unknown): Promise<void>;\n onFinished(files?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[];\n getArtifacts(): readonly AgentInspectVitestArtifact[];\n}\n\ntype TestIdentity = {\n readonly id: string;\n readonly name: string;\n readonly file?: string;\n};\n\ntype TestLike = {\n readonly id?: unknown;\n readonly name?: unknown;\n readonly suite?: unknown;\n readonly file?: unknown;\n readonly filepath?: unknown;\n readonly result?: unknown;\n readonly meta?: unknown;\n readonly context?: unknown;\n readonly tasks?: unknown;\n readonly children?: unknown;\n};\n\ntype ResultLike = {\n readonly state?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/vitest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/vitest-artifacts\";\nconst DEFAULT_SUCCESS_LIMIT = 20;\nconst MAX_SUCCESS_LIMIT = 100;\nconst MAX_TEXT = 180;\nconst DEFAULT_GENERATED_AT = \"1970-01-01T00:00:00.000Z\";\n\n/**\n * Create the experimental AgentInspect Vitest reporter.\n */\nexport function createAgentInspectVitestReporter(\n options: AgentInspectVitestReporterOptions = {},\n): AgentInspectVitestReporter {\n const diagnostics: AgentInspectVitestDiagnostic[] = [];\n const artifacts: AgentInspectVitestArtifact[] = [];\n const seenObjects = new WeakSet<object>();\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n\n const reporter: AgentInspectVitestReporter = {\n async onTestCaseResult(test: unknown): Promise<void> {\n await handleTest(test);\n },\n async onTaskUpdate(tasks: unknown): Promise<void> {\n for (const test of collectTasks(tasks)) {\n await handleTest(test);\n }\n },\n async onFinished(files?: unknown): Promise<void> {\n for (const test of collectTasks(files)) {\n await handleTest(test);\n }\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectVitestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectVitestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleTest(test: unknown): Promise<void> {\n if (!isObject(test)) return;\n if (seenObjects.has(test)) return;\n\n if (options.evidenceOn === \"never\") return;\n\n const status = readStatus(test);\n if (status === undefined || status === \"skipped\") return;\n\n const identity = readIdentity(test);\n const seenKey = `${identity.id}:${status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(test, options);\n if (association === undefined) return;\n\n if (status === \"passed\") {\n if (options.evidenceOn === \"fail\") return;\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\n seenObjects.add(test);\n seenKeys.add(seenKey);\n\n try {\n const artifact = await writeSafeArtifact({\n artifactDir: options.artifactDir ?? DEFAULT_ARTIFACT_DIR,\n association,\n generatedAt: options.generatedAt ?? DEFAULT_GENERATED_AT,\n identity,\n reserveArtifactName,\n redactionProfile: options.redactionProfile ?? \"share\",\n status,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Vitest artifact: ${errorMessage(error)}`,\n testId: identity.id,\n });\n }\n }\n\n function reserveArtifactName(seed: string): string {\n const base = safeSegment(seed);\n const next = (artifactNames.get(base) ?? 0) + 1;\n artifactNames.set(base, next);\n return next === 1 ? base : `${base}-${next}`;\n }\n\n function reportDiagnostic(diagnostic: AgentInspectVitestDiagnostic): void {\n diagnostics.push(diagnostic);\n if (options.onDiagnostic === undefined) return;\n try {\n options.onDiagnostic(diagnostic);\n } catch (error) {\n diagnostics.push({\n code: \"on-diagnostic-failed\",\n message: `AgentInspect Vitest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined || artifacts.length === 0) return;\n const failed = artifacts.filter((artifact) => artifact.status === \"failed\").length;\n const passed = artifacts.filter((artifact) => artifact.status === \"passed\").length;\n const lines = [\n \"\",\n \"## AgentInspect Vitest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n try {\n await writeFile(options.githubSummary, `${lines.join(\"\\n\")}\\n`, { flag: \"a\" });\n } catch (error) {\n reportDiagnostic({\n code: \"github-summary-write-failed\",\n message: `Could not append AgentInspect Vitest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\nexport const agentInspectVitestReporter = createAgentInspectVitestReporter;\n\nexport { agentInspectVitestMatchers } from \"./matchers.js\";\nexport type { AgentInspectVitestMatchers } from \"./matchers.js\";\n\nfunction normalizeSuccessLimit(options: AgentInspectVitestReporterOptions): number {\n const cap = clampCount(options.maxSuccessfulTraces, DEFAULT_SUCCESS_LIMIT);\n if (options.evidenceOn === \"always\" && options.retainSuccessful === undefined) {\n return cap;\n }\n if (options.retainSuccessful === true) return cap;\n if (typeof options.retainSuccessful === \"number\") {\n return Math.min(clampCount(options.retainSuccessful, 0), cap);\n }\n return 0;\n}\n\nfunction clampCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(MAX_SUCCESS_LIMIT, Math.floor(value)));\n}\n\nfunction resolveAssociation(\n test: object,\n options: AgentInspectVitestReporterOptions,\n): AgentInspectVitestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(test);\n if (isAssociation(resolved)) return resolved;\n\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n return (\n readAssociationFromMeta(task.meta) ??\n readAssociationFromContext(task.context) ??\n readAssociationFromMeta(result?.meta)\n );\n}\n\nfunction readAssociationFromContext(\n context: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(context)) return undefined;\n const maybeMeta = readProp(context, \"meta\");\n return readAssociationFromMeta(maybeMeta);\n}\n\nfunction readAssociationFromMeta(\n meta: unknown,\n): AgentInspectVitestTraceAssociation | undefined {\n if (!isObject(meta)) return undefined;\n const direct = readProp(meta, \"agentInspect\");\n const hyphenated = readProp(meta, \"agent-inspect\");\n const trace = readProp(meta, \"trace\");\n for (const candidate of [direct, hyphenated, trace]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectVitestTraceAssociation {\n if (!isObject(value)) return false;\n return (\n readOptionalString(value, \"runId\") !== undefined ||\n readOptionalString(value, \"tracePath\") !== undefined ||\n readOptionalString(value, \"artifactLabel\") !== undefined\n );\n}\n\nfunction readStatus(test: object): AgentInspectVitestStatus | undefined {\n const task = test as TestLike;\n const result = isObject(task.result) ? (task.result as ResultLike) : undefined;\n const raw =\n readOptionalString(result, \"state\") ??\n readOptionalString(result, \"status\") ??\n readOptionalString(test, \"state\") ??\n readOptionalString(test, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"fail\" || normalized === \"failed\") return \"failed\";\n if (normalized === \"pass\" || normalized === \"passed\") return \"passed\";\n if (normalized === \"skip\" || normalized === \"skipped\") return \"skipped\";\n return undefined;\n}\n\nfunction readIdentity(test: object): TestIdentity {\n const task = test as TestLike;\n const id = readOptionalString(test, \"id\") ?? readOptionalString(test, \"taskId\");\n const name =\n readOptionalString(test, \"fullName\") ??\n readOptionalString(test, \"name\") ??\n readOptionalString(task.suite, \"name\") ??\n id ??\n \"unknown-test\";\n const file =\n readOptionalString(test, \"file\") ??\n readOptionalString(test, \"filepath\") ??\n readOptionalString(task.suite, \"file\");\n return {\n file: file === undefined ? undefined : path.basename(file),\n id: boundText(redactText(id ?? name)),\n name: boundText(redactText(name)),\n };\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectVitestTraceAssociation;\n readonly generatedAt: string;\n readonly identity: TestIdentity;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectVitestStatus;\n}): Promise<AgentInspectVitestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.identity.id ??\n input.identity.name ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.identity.name,\n file: input.identity.file,\n kind: \"summary\",\n format: \"md\",\n });\n\n if (\n !manifestPathResult.ok ||\n manifestPathResult.absolutePath === undefined ||\n manifestPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(manifestPathResult.diagnostics));\n }\n if (\n !summaryPathResult.ok ||\n summaryPathResult.absolutePath === undefined ||\n summaryPathResult.relativePath === undefined\n ) {\n throw new Error(formatPathDiagnostics(summaryPathResult.diagnostics));\n }\n\n const directory = path.dirname(manifestPathResult.absolutePath);\n await mkdir(directory, { recursive: true });\n\n const traceFile =\n input.association.tracePath === undefined\n ? undefined\n : path.basename(input.association.tracePath);\n const manifestArtifact: TraceArtifact = {\n kind: \"report\",\n path: manifestPathResult.relativePath,\n format: \"json\",\n redactionProfile: input.redactionProfile,\n };\n const summaryArtifact: TraceArtifact = {\n kind: \"summary\",\n path: summaryPathResult.relativePath,\n format: \"md\",\n redactionProfile: input.redactionProfile,\n };\n const manifest = createTraceArtifactManifest({\n framework: \"vitest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: input.identity.id,\n name: input.identity.name,\n ...(input.identity.file === undefined ? {} : { file: input.identity.file }),\n status: input.status,\n tracePath: safeOptional(traceFile),\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n },\n ],\n artifacts: [manifestArtifact, summaryArtifact],\n diagnostics: [],\n });\n const trace = {\n runId: safeOptional(input.association.runId),\n file: safeOptional(traceFile),\n };\n\n await writeFile(\n manifestPathResult.absolutePath,\n `${JSON.stringify({ package: PACKAGE_NAME, manifest, trace }, null, 2)}\\n`,\n );\n const summaryPath = summaryPathResult.absolutePath;\n await writeFile(summaryPath, renderSummary(manifest, trace), \"utf-8\");\n\n return {\n directory,\n manifest,\n manifestPath: manifestPathResult.absolutePath,\n status: input.status,\n summaryPath,\n testId: input.identity.id,\n };\n}\n\nfunction renderSummary(\n manifest: TraceArtifactManifest,\n trace: { readonly runId?: string; readonly file?: string },\n): string {\n const result = manifest.results[0];\n return [\n \"# AgentInspect Vitest Artifact\",\n \"\",\n `- Test: ${result?.name ?? \"unknown\"}`,\n `- Test id: ${result?.testId ?? \"unknown\"}`,\n `- Status: ${result?.status ?? \"unknown\"}`,\n `- File: ${result?.file ?? \"unknown\"}`,\n `- Trace run: ${trace.runId ?? \"unknown\"}`,\n `- Trace file: ${result?.tracePath ?? \"unknown\"}`,\n `- Manifest schema: ${manifest.schemaVersion}`,\n \"\",\n \"Trace contents are intentionally not embedded in this artifact.\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatPathDiagnostics(\n diagnostics: readonly TraceReporterDiagnostic[],\n): string {\n if (diagnostics.length === 0) return \"Unsafe AgentInspect Vitest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\n}\n\nfunction* collectTasks(input: unknown, seen = new WeakSet<object>()): Iterable<unknown> {\n if (Array.isArray(input)) {\n for (const item of input) yield* collectTasks(item, seen);\n return;\n }\n if (!isObject(input) || seen.has(input)) return;\n\n seen.add(input);\n yield input;\n\n const task = input as TestLike;\n for (const childList of [task.tasks, task.children]) {\n if (Array.isArray(childList)) yield* collectTasks(childList, seen);\n }\n}\n\nfunction safeOptional(value: string | undefined): string | undefined {\n return value === undefined ? undefined : boundText(redactText(value));\n}\n\nfunction safeSegment(value: string): string {\n const sanitized = redactText(value)\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n return sanitized.length > 0 ? sanitized : \"trace\";\n}\n\nfunction boundText(value: string): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_TEXT) return compact;\n return `${compact.slice(0, MAX_TEXT - 12)}...[truncated]`;\n}\n\nfunction redactText(value: string): string {\n return value\n .replace(/\\bsk-[A-Za-z0-9_-]{8,}\\b/g, \"[REDACTED]\")\n .replace(/\\b(?:api[_-]?key|authorization|token|secret|password)\\s*[:=]\\s*[^,\\s]+/gi, \"$1=[REDACTED]\");\n}\n\nfunction readOptionalString(value: unknown, key: string): string | undefined {\n if (!isObject(value)) return undefined;\n const property = readProp(value, key);\n return typeof property === \"string\" && property.length > 0 ? property : undefined;\n}\n\nfunction readProp(value: object, key: string): unknown {\n return (value as Record<string, unknown>)[key];\n}\n\nfunction isObject(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-inspect/vitest",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.17.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Vitest reporter and experimental TraceContract matchers for AgentInspect local evidence",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"vitest": "^2.1.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"agent-inspect": "6.
|
|
40
|
+
"agent-inspect": "6.17.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"vitest": "^2.1.8"
|