@agent-inspect/vitest 6.12.1 → 6.13.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 CHANGED
@@ -3,11 +3,54 @@
3
3
  var promises = require('fs/promises');
4
4
  var path = require('path');
5
5
  var reporters = require('agent-inspect/reporters');
6
+ var checks = require('agent-inspect/checks');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
9
 
9
10
  var path__default = /*#__PURE__*/_interopDefault(path);
10
11
 
12
+ // packages/vitest/src/index.ts
13
+ function eventsFrom(trace) {
14
+ if (Array.isArray(trace)) return trace;
15
+ if ("read" in trace && trace.read?.events) return trace.read.events;
16
+ if ("events" in trace && Array.isArray(trace.events)) return trace.events;
17
+ return [];
18
+ }
19
+ function inputFrom(trace) {
20
+ if (!Array.isArray(trace) && "read" in trace && trace.read) {
21
+ return trace;
22
+ }
23
+ return void 0;
24
+ }
25
+ var agentInspectVitestMatchers = {
26
+ toPassTraceContract(received, contract) {
27
+ const input = inputFrom(received);
28
+ if (!input) {
29
+ return {
30
+ pass: false,
31
+ message: () => "toPassTraceContract expects TraceCheckInput ({ read }) so evaluateTraceContract can run."
32
+ };
33
+ }
34
+ const result = checks.evaluateTraceContract(input, checks.defineTraceContract(contract));
35
+ return {
36
+ pass: result.status === "pass",
37
+ message: () => result.status === "pass" ? "expected trace contract to fail" : `expected trace contract to pass; findings=${JSON.stringify(
38
+ result.findings.filter((f) => f.status === "fail").map((f) => f.ruleId)
39
+ )}`
40
+ };
41
+ },
42
+ toHaveRequiredTool(received, toolName) {
43
+ const facts = checks.buildTraceFacts(eventsFrom(received));
44
+ const pass = facts.toolsByName.has(toolName);
45
+ return {
46
+ pass,
47
+ message: () => pass ? `expected tool ${toolName} to be absent` : `expected required tool ${toolName}; found=${JSON.stringify([
48
+ ...facts.toolsByName.keys()
49
+ ])}`
50
+ };
51
+ }
52
+ };
53
+
11
54
  // packages/vitest/src/index.ts
12
55
  var PACKAGE_NAME = "@agent-inspect/vitest";
13
56
  var DEFAULT_ARTIFACT_DIR = ".agent-inspect/vitest-artifacts";
@@ -326,6 +369,7 @@ function errorMessage(error) {
326
369
  return error instanceof Error ? error.message : String(error);
327
370
  }
328
371
 
372
+ exports.agentInspectVitestMatchers = agentInspectVitestMatchers;
329
373
  exports.agentInspectVitestReporter = agentInspectVitestReporter;
330
374
  exports.createAgentInspectVitestReporter = createAgentInspectVitestReporter;
331
375
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["path","writeFile","createReporterArtifactPath","mkdir","createTraceArtifactManifest"],"mappings":"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","file":"index.cjs","sourcesContent":["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\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 /** 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"]}
package/dist/index.d.cts CHANGED
@@ -51,6 +51,191 @@ interface TraceArtifactManifest {
51
51
  diagnostics: TraceReporterDiagnostic[];
52
52
  }
53
53
 
54
+ type AttributionConfidence = "explicit" | "correlated" | "heuristic" | "unknown";
55
+ type InspectKind = "RUN" | "AGENT" | "LLM" | "TOOL" | "CHAIN" | "RETRIEVER" | "DECISION" | "RESULT" | "ERROR" | "LOGIC" | "LOG" | "OUTCOME";
56
+ interface EventSource {
57
+ type: "manual" | "json-log" | "log4js" | "pino" | "winston" | "adapter";
58
+ file?: string;
59
+ line?: number;
60
+ }
61
+ interface InspectEvent {
62
+ eventId: string;
63
+ runId: string;
64
+ parentId?: string;
65
+ name: string;
66
+ kind: InspectKind;
67
+ timestamp: number;
68
+ status?: "running" | "ok" | "error";
69
+ durationMs?: number;
70
+ attributes?: Record<string, unknown>;
71
+ confidence: AttributionConfidence;
72
+ source: EventSource;
73
+ }
74
+ interface InspectNode {
75
+ event: InspectEvent;
76
+ children: InspectNode[];
77
+ depth: number;
78
+ }
79
+ interface InspectRunTree {
80
+ runId: string;
81
+ name?: string;
82
+ status?: "running" | "ok" | "error";
83
+ startedAt?: number;
84
+ endedAt?: number;
85
+ durationMs?: number;
86
+ children: InspectNode[];
87
+ metadata: {
88
+ totalEvents: number;
89
+ confidenceBreakdown: Record<AttributionConfidence, number>;
90
+ kinds: Record<InspectKind, number>;
91
+ };
92
+ }
93
+
94
+ type PersistedEventSourceType = "manual" | "json-log" | "log4js" | "adapter" | "ai-sdk" | "otel";
95
+ interface PersistedEventSource {
96
+ type: PersistedEventSourceType;
97
+ name?: string;
98
+ version?: string;
99
+ }
100
+ type PersistedEventStatus = "running" | "ok" | "error" | "unknown";
101
+ interface PersistedInspectError {
102
+ name?: string;
103
+ message: string;
104
+ code?: string;
105
+ }
106
+ interface PersistedTokenUsage {
107
+ input?: number;
108
+ output?: number;
109
+ total?: number;
110
+ cached?: number;
111
+ }
112
+ interface PersistedTraceContext {
113
+ traceId?: string;
114
+ spanId?: string;
115
+ parentSpanId?: string;
116
+ }
117
+ interface PersistedInspectEventBase {
118
+ eventId: string;
119
+ runId: string;
120
+ parentId?: string;
121
+ kind: InspectKind;
122
+ name: string;
123
+ status?: PersistedEventStatus;
124
+ timestamp: string;
125
+ startedAt?: string;
126
+ endedAt?: string;
127
+ durationMs?: number;
128
+ confidence: AttributionConfidence;
129
+ source: PersistedEventSource;
130
+ attributes?: Record<string, unknown>;
131
+ inputSummary?: unknown;
132
+ outputSummary?: unknown;
133
+ error?: PersistedInspectError;
134
+ tokenUsage?: PersistedTokenUsage;
135
+ trace?: PersistedTraceContext;
136
+ }
137
+ interface PersistedInspectEventV02 extends PersistedInspectEventBase {
138
+ schemaVersion: "0.2";
139
+ }
140
+ interface PersistedInspectEventV10 extends PersistedInspectEventBase {
141
+ schemaVersion: "1.0";
142
+ [key: string]: unknown;
143
+ }
144
+ type PersistedInspectEvent = PersistedInspectEventV02 | PersistedInspectEventV10;
145
+
146
+ type TraceReadWarningSeverity = "info" | "warning" | "error";
147
+ interface TraceReadWarning {
148
+ code: string;
149
+ message: string;
150
+ severity?: TraceReadWarningSeverity;
151
+ sourceFile?: string;
152
+ line?: number;
153
+ field?: string;
154
+ }
155
+ interface TraceReadResult {
156
+ format: string;
157
+ events: PersistedInspectEvent[];
158
+ runs: InspectRunTree[];
159
+ warnings: TraceReadWarning[];
160
+ unsupportedFields: string[];
161
+ sourceFiles: string[];
162
+ }
163
+
164
+ /**
165
+ * @experimental Typed trace contract input. Evolves during v6.5.x.
166
+ */
167
+ interface TraceContractRunRules {
168
+ requireCompleted?: boolean;
169
+ allowedStatuses?: string[];
170
+ maxDurationMs?: number;
171
+ }
172
+ interface TraceContractToolRules {
173
+ required?: string[];
174
+ /** Alias of `required` (TraceContract v2 normalization). */
175
+ requiredTools?: string[];
176
+ forbidden?: string[];
177
+ /** Alias of `forbidden`. */
178
+ forbiddenTools?: string[];
179
+ allowed?: string[];
180
+ maxCalls?: number;
181
+ requiredOrder?: string[];
182
+ }
183
+ interface TraceContractLlmRules {
184
+ maxCalls?: number;
185
+ maxTotalTokens?: number;
186
+ allowedModels?: string[];
187
+ }
188
+ interface TraceContractObservationRules {
189
+ required?: string[];
190
+ failOn?: Array<"failed" | "unknown" | "skipped">;
191
+ }
192
+ interface TraceContractInput {
193
+ run?: TraceContractRunRules;
194
+ tools?: TraceContractToolRules;
195
+ llm?: TraceContractLlmRules;
196
+ observations?: TraceContractObservationRules;
197
+ }
198
+
199
+ /**
200
+ * Experimental input projection for trace checks.
201
+ *
202
+ * The `read` value must come from `agent-inspect/readers` or an equivalent
203
+ * already-normalized `TraceReadResult`. The checks engine does not read files
204
+ * or reparse source payloads.
205
+ *
206
+ * @experimental Available through `agent-inspect/checks`; the checks API may
207
+ * evolve during the v1.x experimental period.
208
+ */
209
+ interface TraceCheckInput {
210
+ read: TraceReadResult;
211
+ selectedRun?: InspectRunTree;
212
+ sourceLabel?: string;
213
+ }
214
+
215
+ /**
216
+ * Experimental Vitest matchers for AgentInspect TraceFacts / TraceContract.
217
+ *
218
+ * @experimental Part of the v6.13 TraceFacts train.
219
+ */
220
+
221
+ type TraceLike = TraceCheckInput | {
222
+ readonly events: TraceCheckInput["read"]["events"];
223
+ } | TraceCheckInput["read"]["events"];
224
+ interface AgentInspectVitestMatchers<R = unknown> {
225
+ toPassTraceContract(contract: TraceContractInput): R;
226
+ toHaveRequiredTool(toolName: string): R;
227
+ }
228
+ declare const agentInspectVitestMatchers: {
229
+ toPassTraceContract(received: TraceLike, contract: TraceContractInput): {
230
+ pass: boolean;
231
+ message: () => string;
232
+ };
233
+ toHaveRequiredTool(received: TraceLike, toolName: string): {
234
+ pass: boolean;
235
+ message: () => string;
236
+ };
237
+ };
238
+
54
239
  type AgentInspectVitestStatus = "failed" | "passed" | "skipped";
55
240
  /**
56
241
  * Experimental trace association read by `@agent-inspect/vitest`.
@@ -132,4 +317,4 @@ interface AgentInspectVitestReporter {
132
317
  declare function createAgentInspectVitestReporter(options?: AgentInspectVitestReporterOptions): AgentInspectVitestReporter;
133
318
  declare const agentInspectVitestReporter: typeof createAgentInspectVitestReporter;
134
319
 
135
- export { type AgentInspectVitestArtifact, type AgentInspectVitestDiagnostic, type AgentInspectVitestReporter, type AgentInspectVitestReporterOptions, type AgentInspectVitestStatus, type AgentInspectVitestTraceAssociation, agentInspectVitestReporter, createAgentInspectVitestReporter };
320
+ export { type AgentInspectVitestArtifact, type AgentInspectVitestDiagnostic, type AgentInspectVitestMatchers, type AgentInspectVitestReporter, type AgentInspectVitestReporterOptions, type AgentInspectVitestStatus, type AgentInspectVitestTraceAssociation, agentInspectVitestMatchers, agentInspectVitestReporter, createAgentInspectVitestReporter };
package/dist/index.d.ts CHANGED
@@ -51,6 +51,191 @@ interface TraceArtifactManifest {
51
51
  diagnostics: TraceReporterDiagnostic[];
52
52
  }
53
53
 
54
+ type AttributionConfidence = "explicit" | "correlated" | "heuristic" | "unknown";
55
+ type InspectKind = "RUN" | "AGENT" | "LLM" | "TOOL" | "CHAIN" | "RETRIEVER" | "DECISION" | "RESULT" | "ERROR" | "LOGIC" | "LOG" | "OUTCOME";
56
+ interface EventSource {
57
+ type: "manual" | "json-log" | "log4js" | "pino" | "winston" | "adapter";
58
+ file?: string;
59
+ line?: number;
60
+ }
61
+ interface InspectEvent {
62
+ eventId: string;
63
+ runId: string;
64
+ parentId?: string;
65
+ name: string;
66
+ kind: InspectKind;
67
+ timestamp: number;
68
+ status?: "running" | "ok" | "error";
69
+ durationMs?: number;
70
+ attributes?: Record<string, unknown>;
71
+ confidence: AttributionConfidence;
72
+ source: EventSource;
73
+ }
74
+ interface InspectNode {
75
+ event: InspectEvent;
76
+ children: InspectNode[];
77
+ depth: number;
78
+ }
79
+ interface InspectRunTree {
80
+ runId: string;
81
+ name?: string;
82
+ status?: "running" | "ok" | "error";
83
+ startedAt?: number;
84
+ endedAt?: number;
85
+ durationMs?: number;
86
+ children: InspectNode[];
87
+ metadata: {
88
+ totalEvents: number;
89
+ confidenceBreakdown: Record<AttributionConfidence, number>;
90
+ kinds: Record<InspectKind, number>;
91
+ };
92
+ }
93
+
94
+ type PersistedEventSourceType = "manual" | "json-log" | "log4js" | "adapter" | "ai-sdk" | "otel";
95
+ interface PersistedEventSource {
96
+ type: PersistedEventSourceType;
97
+ name?: string;
98
+ version?: string;
99
+ }
100
+ type PersistedEventStatus = "running" | "ok" | "error" | "unknown";
101
+ interface PersistedInspectError {
102
+ name?: string;
103
+ message: string;
104
+ code?: string;
105
+ }
106
+ interface PersistedTokenUsage {
107
+ input?: number;
108
+ output?: number;
109
+ total?: number;
110
+ cached?: number;
111
+ }
112
+ interface PersistedTraceContext {
113
+ traceId?: string;
114
+ spanId?: string;
115
+ parentSpanId?: string;
116
+ }
117
+ interface PersistedInspectEventBase {
118
+ eventId: string;
119
+ runId: string;
120
+ parentId?: string;
121
+ kind: InspectKind;
122
+ name: string;
123
+ status?: PersistedEventStatus;
124
+ timestamp: string;
125
+ startedAt?: string;
126
+ endedAt?: string;
127
+ durationMs?: number;
128
+ confidence: AttributionConfidence;
129
+ source: PersistedEventSource;
130
+ attributes?: Record<string, unknown>;
131
+ inputSummary?: unknown;
132
+ outputSummary?: unknown;
133
+ error?: PersistedInspectError;
134
+ tokenUsage?: PersistedTokenUsage;
135
+ trace?: PersistedTraceContext;
136
+ }
137
+ interface PersistedInspectEventV02 extends PersistedInspectEventBase {
138
+ schemaVersion: "0.2";
139
+ }
140
+ interface PersistedInspectEventV10 extends PersistedInspectEventBase {
141
+ schemaVersion: "1.0";
142
+ [key: string]: unknown;
143
+ }
144
+ type PersistedInspectEvent = PersistedInspectEventV02 | PersistedInspectEventV10;
145
+
146
+ type TraceReadWarningSeverity = "info" | "warning" | "error";
147
+ interface TraceReadWarning {
148
+ code: string;
149
+ message: string;
150
+ severity?: TraceReadWarningSeverity;
151
+ sourceFile?: string;
152
+ line?: number;
153
+ field?: string;
154
+ }
155
+ interface TraceReadResult {
156
+ format: string;
157
+ events: PersistedInspectEvent[];
158
+ runs: InspectRunTree[];
159
+ warnings: TraceReadWarning[];
160
+ unsupportedFields: string[];
161
+ sourceFiles: string[];
162
+ }
163
+
164
+ /**
165
+ * @experimental Typed trace contract input. Evolves during v6.5.x.
166
+ */
167
+ interface TraceContractRunRules {
168
+ requireCompleted?: boolean;
169
+ allowedStatuses?: string[];
170
+ maxDurationMs?: number;
171
+ }
172
+ interface TraceContractToolRules {
173
+ required?: string[];
174
+ /** Alias of `required` (TraceContract v2 normalization). */
175
+ requiredTools?: string[];
176
+ forbidden?: string[];
177
+ /** Alias of `forbidden`. */
178
+ forbiddenTools?: string[];
179
+ allowed?: string[];
180
+ maxCalls?: number;
181
+ requiredOrder?: string[];
182
+ }
183
+ interface TraceContractLlmRules {
184
+ maxCalls?: number;
185
+ maxTotalTokens?: number;
186
+ allowedModels?: string[];
187
+ }
188
+ interface TraceContractObservationRules {
189
+ required?: string[];
190
+ failOn?: Array<"failed" | "unknown" | "skipped">;
191
+ }
192
+ interface TraceContractInput {
193
+ run?: TraceContractRunRules;
194
+ tools?: TraceContractToolRules;
195
+ llm?: TraceContractLlmRules;
196
+ observations?: TraceContractObservationRules;
197
+ }
198
+
199
+ /**
200
+ * Experimental input projection for trace checks.
201
+ *
202
+ * The `read` value must come from `agent-inspect/readers` or an equivalent
203
+ * already-normalized `TraceReadResult`. The checks engine does not read files
204
+ * or reparse source payloads.
205
+ *
206
+ * @experimental Available through `agent-inspect/checks`; the checks API may
207
+ * evolve during the v1.x experimental period.
208
+ */
209
+ interface TraceCheckInput {
210
+ read: TraceReadResult;
211
+ selectedRun?: InspectRunTree;
212
+ sourceLabel?: string;
213
+ }
214
+
215
+ /**
216
+ * Experimental Vitest matchers for AgentInspect TraceFacts / TraceContract.
217
+ *
218
+ * @experimental Part of the v6.13 TraceFacts train.
219
+ */
220
+
221
+ type TraceLike = TraceCheckInput | {
222
+ readonly events: TraceCheckInput["read"]["events"];
223
+ } | TraceCheckInput["read"]["events"];
224
+ interface AgentInspectVitestMatchers<R = unknown> {
225
+ toPassTraceContract(contract: TraceContractInput): R;
226
+ toHaveRequiredTool(toolName: string): R;
227
+ }
228
+ declare const agentInspectVitestMatchers: {
229
+ toPassTraceContract(received: TraceLike, contract: TraceContractInput): {
230
+ pass: boolean;
231
+ message: () => string;
232
+ };
233
+ toHaveRequiredTool(received: TraceLike, toolName: string): {
234
+ pass: boolean;
235
+ message: () => string;
236
+ };
237
+ };
238
+
54
239
  type AgentInspectVitestStatus = "failed" | "passed" | "skipped";
55
240
  /**
56
241
  * Experimental trace association read by `@agent-inspect/vitest`.
@@ -132,4 +317,4 @@ interface AgentInspectVitestReporter {
132
317
  declare function createAgentInspectVitestReporter(options?: AgentInspectVitestReporterOptions): AgentInspectVitestReporter;
133
318
  declare const agentInspectVitestReporter: typeof createAgentInspectVitestReporter;
134
319
 
135
- export { type AgentInspectVitestArtifact, type AgentInspectVitestDiagnostic, type AgentInspectVitestReporter, type AgentInspectVitestReporterOptions, type AgentInspectVitestStatus, type AgentInspectVitestTraceAssociation, agentInspectVitestReporter, createAgentInspectVitestReporter };
320
+ export { type AgentInspectVitestArtifact, type AgentInspectVitestDiagnostic, type AgentInspectVitestMatchers, type AgentInspectVitestReporter, type AgentInspectVitestReporterOptions, type AgentInspectVitestStatus, type AgentInspectVitestTraceAssociation, agentInspectVitestMatchers, agentInspectVitestReporter, createAgentInspectVitestReporter };
package/dist/index.mjs CHANGED
@@ -1,6 +1,49 @@
1
1
  import { writeFile, mkdir } from 'fs/promises';
2
2
  import path from 'path';
3
3
  import { createReporterArtifactPath, createTraceArtifactManifest } from 'agent-inspect/reporters';
4
+ import { buildTraceFacts, evaluateTraceContract, defineTraceContract } from 'agent-inspect/checks';
5
+
6
+ // packages/vitest/src/index.ts
7
+ function eventsFrom(trace) {
8
+ if (Array.isArray(trace)) return trace;
9
+ if ("read" in trace && trace.read?.events) return trace.read.events;
10
+ if ("events" in trace && Array.isArray(trace.events)) return trace.events;
11
+ return [];
12
+ }
13
+ function inputFrom(trace) {
14
+ if (!Array.isArray(trace) && "read" in trace && trace.read) {
15
+ return trace;
16
+ }
17
+ return void 0;
18
+ }
19
+ var agentInspectVitestMatchers = {
20
+ toPassTraceContract(received, contract) {
21
+ const input = inputFrom(received);
22
+ if (!input) {
23
+ return {
24
+ pass: false,
25
+ message: () => "toPassTraceContract expects TraceCheckInput ({ read }) so evaluateTraceContract can run."
26
+ };
27
+ }
28
+ const result = evaluateTraceContract(input, defineTraceContract(contract));
29
+ return {
30
+ pass: result.status === "pass",
31
+ message: () => result.status === "pass" ? "expected trace contract to fail" : `expected trace contract to pass; findings=${JSON.stringify(
32
+ result.findings.filter((f) => f.status === "fail").map((f) => f.ruleId)
33
+ )}`
34
+ };
35
+ },
36
+ toHaveRequiredTool(received, toolName) {
37
+ const facts = buildTraceFacts(eventsFrom(received));
38
+ const pass = facts.toolsByName.has(toolName);
39
+ return {
40
+ pass,
41
+ message: () => pass ? `expected tool ${toolName} to be absent` : `expected required tool ${toolName}; found=${JSON.stringify([
42
+ ...facts.toolsByName.keys()
43
+ ])}`
44
+ };
45
+ }
46
+ };
4
47
 
5
48
  // packages/vitest/src/index.ts
6
49
  var PACKAGE_NAME = "@agent-inspect/vitest";
@@ -320,6 +363,6 @@ function errorMessage(error) {
320
363
  return error instanceof Error ? error.message : String(error);
321
364
  }
322
365
 
323
- export { agentInspectVitestReporter, createAgentInspectVitestReporter };
366
+ export { agentInspectVitestMatchers, agentInspectVitestReporter, createAgentInspectVitestReporter };
324
367
  //# sourceMappingURL=index.mjs.map
325
368
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["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\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 /** 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-inspect/vitest",
3
- "version": "6.12.1",
3
+ "version": "6.13.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Optional Vitest reporter for AgentInspect local trace artifacts",
@@ -37,7 +37,7 @@
37
37
  "vitest": "^2.1.0"
38
38
  },
39
39
  "dependencies": {
40
- "agent-inspect": "6.12.1"
40
+ "agent-inspect": "6.13.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "vitest": "^2.1.8"