@agent-inspect/jest 6.12.2 → 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
@@ -5,11 +5,54 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var promises = require('fs/promises');
6
6
  var path = require('path');
7
7
  var reporters = require('agent-inspect/reporters');
8
+ var checks = require('agent-inspect/checks');
8
9
 
9
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
11
 
11
12
  var path__default = /*#__PURE__*/_interopDefault(path);
12
13
 
14
+ // packages/jest/src/index.ts
15
+ function eventsFrom(trace) {
16
+ if (Array.isArray(trace)) return trace;
17
+ if ("read" in trace && trace.read?.events) return trace.read.events;
18
+ if ("events" in trace && Array.isArray(trace.events)) return trace.events;
19
+ return [];
20
+ }
21
+ function inputFrom(trace) {
22
+ if (!Array.isArray(trace) && "read" in trace && trace.read) {
23
+ return trace;
24
+ }
25
+ return void 0;
26
+ }
27
+ var agentInspectJestMatchers = {
28
+ toPassTraceContract(received, contract) {
29
+ const input = inputFrom(received);
30
+ if (!input) {
31
+ return {
32
+ pass: false,
33
+ message: () => "toPassTraceContract expects TraceCheckInput ({ read }) so evaluateTraceContract can run."
34
+ };
35
+ }
36
+ const result = checks.evaluateTraceContract(input, checks.defineTraceContract(contract));
37
+ return {
38
+ pass: result.status === "pass",
39
+ message: () => result.status === "pass" ? "expected trace contract to fail" : `expected trace contract to pass; findings=${JSON.stringify(
40
+ result.findings.filter((f) => f.status === "fail").map((f) => f.ruleId)
41
+ )}`
42
+ };
43
+ },
44
+ toHaveRequiredTool(received, toolName) {
45
+ const facts = checks.buildTraceFacts(eventsFrom(received));
46
+ const pass = facts.toolsByName.has(toolName);
47
+ return {
48
+ pass,
49
+ message: () => pass ? `expected tool ${toolName} to be absent` : `expected required tool ${toolName}; found=${JSON.stringify([
50
+ ...facts.toolsByName.keys()
51
+ ])}`
52
+ };
53
+ }
54
+ };
55
+
13
56
  // packages/jest/src/index.ts
14
57
  var PACKAGE_NAME = "@agent-inspect/jest";
15
58
  var DEFAULT_ARTIFACT_DIR = ".agent-inspect/jest-artifacts";
@@ -426,6 +469,7 @@ function errorMessage(error) {
426
469
  }
427
470
 
428
471
  exports.AgentInspectJestReporter = AgentInspectJestReporter;
472
+ exports.agentInspectJestMatchers = agentInspectJestMatchers;
429
473
  exports.agentInspectJestReporter = agentInspectJestReporter;
430
474
  exports.createAgentInspectJestReporter = createAgentInspectJestReporter;
431
475
  exports.default = index_default;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["mkdir","path","writeFile","createReporterArtifactPath","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 AgentInspectJestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/jest`.\n *\n * Jest does not expose Vitest-style task metadata, so the default path is an\n * explicit `associations` map keyed by test identity, or a `resolveTrace`\n * callback. The reporter never guesses by timestamps.\n */\nexport interface AgentInspectJestTraceAssociation {\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 normalized view of one Jest assertion result.\n */\nexport interface AgentInspectJestTestCase {\n readonly id: string;\n readonly title: string;\n readonly fullName: string;\n readonly file?: string;\n readonly status: AgentInspectJestStatus;\n readonly raw: unknown;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of thrown so Jest's original test result\n * remains authoritative.\n */\nexport interface AgentInspectJestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"no-trace-association\"\n | \"on-diagnostic-failed\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Jest 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 AgentInspectJestReporterOptions {\n /** Directory for safe Jest artifacts. Defaults to `.agent-inspect/jest-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 /** Explicit trace associations keyed by `file::fullName`, `basename::fullName`, or `fullName`. */\n readonly associations?: Record<string, AgentInspectJestTraceAssociation>;\n /** Resolve explicit test-to-trace associations from a normalized Jest case. */\n readonly resolveTrace?: (\n test: AgentInspectJestTestCase,\n ) => AgentInspectJestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectJestDiagnostic) => void;\n}\n\nexport interface AgentInspectJestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectJestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Jest reporter facade.\n *\n * The hooks mirror Jest reporter lifecycle names, while inputs stay structural\n * to avoid a runtime dependency on Jest internals.\n */\nexport interface AgentInspectJestReporterFacade {\n onTestResult(test: unknown, testResult: unknown, aggregatedResult?: unknown): Promise<void>;\n onRunComplete(contexts?: unknown, results?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectJestDiagnostic[];\n getArtifacts(): readonly AgentInspectJestArtifact[];\n}\n\ntype AssertionResultLike = {\n readonly ancestorTitles?: unknown;\n readonly title?: unknown;\n readonly fullName?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n readonly agentInspect?: unknown;\n};\n\ntype TestFileResultLike = {\n readonly testFilePath?: unknown;\n readonly testResults?: unknown;\n readonly assertionResults?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/jest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/jest-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\";\nconst ASSOCIATION_DOCS =\n \"https://github.com/rajudandigam/agent-inspect/blob/main/packages/jest/README.md#trace-association\";\n\n/**\n * Attach an explicit AgentInspect trace association to a Jest assertion result.\n *\n * The reporter does not instrument tests automatically; pass the returned object\n * as `agentInspect` / `meta.agentInspect` or use `associations` / `resolveTrace`.\n */\nexport function withAgentInspectJestTrace(\n association: AgentInspectJestTraceAssociation,\n): { readonly agentInspect: AgentInspectJestTraceAssociation } {\n return { agentInspect: association };\n}\n\n/**\n * Create the experimental AgentInspect Jest reporter.\n */\nexport function createAgentInspectJestReporter(\n options: AgentInspectJestReporterOptions = {},\n): AgentInspectJestReporterFacade {\n const diagnostics: AgentInspectJestDiagnostic[] = [];\n const artifacts: AgentInspectJestArtifact[] = [];\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const failedWithoutAssociation = new Set<string>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n let reportedMissingAssociation = false;\n\n const reporter: AgentInspectJestReporterFacade = {\n async onTestResult(_test: unknown, testResult: unknown): Promise<void> {\n await handleFileResult(testResult);\n },\n async onRunComplete(_contexts?: unknown, results?: unknown): Promise<void> {\n for (const fileResult of readRunResults(results)) {\n await handleFileResult(fileResult);\n }\n await emitMissingAssociationDiagnostic();\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleFileResult(testResult: unknown): Promise<void> {\n for (const testCase of readTestCases(testResult)) {\n await handleTestCase(testCase);\n }\n }\n\n async function handleTestCase(testCase: AgentInspectJestTestCase): Promise<void> {\n const seenKey = `${testCase.id}:${testCase.status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(testCase, options);\n if (association === undefined) {\n if (testCase.status === \"failed\") {\n failedWithoutAssociation.add(testCase.id);\n }\n return;\n }\n\n if (testCase.status === \"passed\") {\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\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 redactionProfile: options.redactionProfile ?? \"share\",\n reserveArtifactName,\n status: testCase.status,\n testCase,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest artifact: ${errorMessage(error)}`,\n testId: testCase.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: AgentInspectJestDiagnostic): 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 Jest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function emitMissingAssociationDiagnostic(): Promise<void> {\n if (reportedMissingAssociation || failedWithoutAssociation.size === 0) return;\n reportedMissingAssociation = true;\n const count = failedWithoutAssociation.size;\n const sampleIds = [...failedWithoutAssociation].slice(0, 3);\n const message =\n `${count} failed Jest test(s) had no AgentInspect trace association. ` +\n `Reporter does not instrument tests automatically; no trace artifact was generated. ` +\n `Use withAgentInspectJestTrace, associations, resolveTrace, or meta.agentInspect. ` +\n `Docs: ${ASSOCIATION_DOCS}. Samples: ${sampleIds.join(\"; \")}`;\n reportDiagnostic({\n code: \"no-trace-association\",\n // Keep the helper name before truncation so the diagnostic stays actionable.\n message: boundText(message, 320),\n });\n\n try {\n const artifactDir = options.artifactDir ?? DEFAULT_ARTIFACT_DIR;\n await mkdir(artifactDir, { recursive: true });\n const diagnosticPath = path.join(artifactDir, \"no-trace-association.md\");\n const body = [\n \"# AgentInspect Jest — missing trace association\",\n \"\",\n \"Failed tests were observed without an explicit AgentInspect trace association.\",\n \"No trace artifact was generated for those tests.\",\n \"\",\n \"The reporter does **not** instrument Jest automatically.\",\n `Associate traces explicitly. Docs: ${ASSOCIATION_DOCS}`,\n \"\",\n \"## Failed tests without association\",\n \"\",\n ...[...failedWithoutAssociation].slice(0, 20).map((id) => `- ${boundText(id)}`),\n \"\",\n ].join(\"\\n\");\n await writeFile(diagnosticPath, body, \"utf-8\");\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest no-association diagnostic: ${errorMessage(error)}`,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined) return;\n if (artifacts.length === 0 && failedWithoutAssociation.size === 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 Jest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Failed tests without trace association: ${failedWithoutAssociation.size}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n if (failedWithoutAssociation.size > 0) {\n lines.push(\n \"No automatic instrumentation: associate traces via `associations`, `resolveTrace`, or `withAgentInspectJestTrace`.\",\n \"\",\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 Jest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\n/**\n * Experimental Jest custom reporter class.\n */\nexport class AgentInspectJestReporter implements AgentInspectJestReporterFacade {\n private readonly reporter: AgentInspectJestReporterFacade;\n\n constructor(_globalConfig?: unknown, options: AgentInspectJestReporterOptions = {}) {\n this.reporter = createAgentInspectJestReporter(options);\n }\n\n async onTestResult(\n test: unknown,\n testResult: unknown,\n aggregatedResult?: unknown,\n ): Promise<void> {\n await this.reporter.onTestResult(test, testResult, aggregatedResult);\n }\n\n async onRunComplete(contexts?: unknown, results?: unknown): Promise<void> {\n await this.reporter.onRunComplete(contexts, results);\n }\n\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return this.reporter.getDiagnostics();\n }\n\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return this.reporter.getArtifacts();\n }\n}\n\nexport const agentInspectJestReporter = createAgentInspectJestReporter;\nexport default AgentInspectJestReporter;\n\nfunction normalizeSuccessLimit(options: AgentInspectJestReporterOptions): 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 testCase: AgentInspectJestTestCase,\n options: AgentInspectJestReporterOptions,\n): AgentInspectJestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(testCase);\n if (isAssociation(resolved)) return resolved;\n\n const explicit = resolveFromAssociationMap(testCase, options.associations);\n if (explicit !== undefined) return explicit;\n\n return readAssociationFromAssertion(testCase.raw);\n}\n\nfunction resolveFromAssociationMap(\n testCase: AgentInspectJestTestCase,\n associations: Record<string, AgentInspectJestTraceAssociation> | undefined,\n): AgentInspectJestTraceAssociation | undefined {\n if (associations === undefined) return undefined;\n const basename = testCase.file === undefined ? undefined : path.basename(testCase.file);\n const candidates = [\n testCase.id,\n testCase.fullName,\n basename === undefined ? undefined : `${basename}::${testCase.fullName}`,\n ];\n for (const candidate of candidates) {\n if (candidate !== undefined && isAssociation(associations[candidate])) {\n return associations[candidate];\n }\n }\n return undefined;\n}\n\nfunction readAssociationFromAssertion(\n assertion: unknown,\n): AgentInspectJestTraceAssociation | undefined {\n if (!isObject(assertion)) return undefined;\n const direct = readProp(assertion, \"agentInspect\");\n if (isAssociation(direct)) return direct;\n\n const meta = readProp(assertion, \"meta\");\n if (!isObject(meta)) return undefined;\n for (const candidate of [\n readProp(meta, \"agentInspect\"),\n readProp(meta, \"agent-inspect\"),\n readProp(meta, \"trace\"),\n ]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectJestTraceAssociation {\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 readRunResults(results: unknown): unknown[] {\n if (!isObject(results)) return [];\n const testResults = readProp(results, \"testResults\");\n return Array.isArray(testResults) ? testResults : [];\n}\n\nfunction readTestCases(testResult: unknown): AgentInspectJestTestCase[] {\n if (!isObject(testResult)) return [];\n const result = testResult as TestFileResultLike;\n const file = readOptionalString(result, \"testFilePath\");\n const assertions = Array.isArray(result.testResults)\n ? result.testResults\n : Array.isArray(result.assertionResults)\n ? result.assertionResults\n : [];\n\n const cases: AgentInspectJestTestCase[] = [];\n for (const assertion of assertions) {\n if (!isObject(assertion)) continue;\n const status = readStatus(assertion);\n if (status === undefined || status === \"skipped\") continue;\n\n const title = readOptionalString(assertion, \"title\") ?? \"unknown-test\";\n const fullName = readFullName(assertion as AssertionResultLike, title);\n const id = `${file ?? \"unknown-file\"}::${fullName}`;\n cases.push({\n file,\n fullName: boundText(redactText(fullName)),\n id: boundText(redactText(id)),\n raw: assertion,\n status,\n title: boundText(redactText(title)),\n });\n }\n return cases;\n}\n\nfunction readFullName(assertion: AssertionResultLike, title: string): string {\n const explicit = readOptionalString(assertion, \"fullName\");\n if (explicit !== undefined) return explicit;\n\n const ancestors = Array.isArray(assertion.ancestorTitles)\n ? assertion.ancestorTitles.filter((item): item is string => typeof item === \"string\")\n : [];\n return [...ancestors, title].join(\" \");\n}\n\nfunction readStatus(assertion: object): AgentInspectJestStatus | undefined {\n const raw = readOptionalString(assertion, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"failed\" || normalized === \"fail\") return \"failed\";\n if (normalized === \"passed\" || normalized === \"pass\") return \"passed\";\n if (\n normalized === \"pending\" ||\n normalized === \"todo\" ||\n normalized === \"skipped\" ||\n normalized === \"skip\" ||\n normalized === \"disabled\"\n ) {\n return \"skipped\";\n }\n return undefined;\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectJestTraceAssociation;\n readonly generatedAt: string;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectJestStatus;\n readonly testCase: AgentInspectJestTestCase;\n}): Promise<AgentInspectJestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.testCase.id ??\n input.testCase.fullName ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const testFile =\n input.testCase.file === undefined ? undefined : path.basename(input.testCase.file);\n const safeTestId = `${testFile ?? \"unknown-file\"}::${input.testCase.fullName}`;\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\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: \"jest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: safeTestId,\n name: input.testCase.fullName,\n ...(testFile === undefined ? {} : { file: testFile }),\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: safeTestId,\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 Jest 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 Jest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\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, max = MAX_TEXT): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= max) return compact;\n return `${compact.slice(0, max - 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","mkdir","path","writeFile","createReporterArtifactPath","createTraceArtifactManifest"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Experimental Jest 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 const agentInspectJestMatchers = {\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 AgentInspectJestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/jest`.\n *\n * Jest does not expose Vitest-style task metadata, so the default path is an\n * explicit `associations` map keyed by test identity, or a `resolveTrace`\n * callback. The reporter never guesses by timestamps.\n */\nexport interface AgentInspectJestTraceAssociation {\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 normalized view of one Jest assertion result.\n */\nexport interface AgentInspectJestTestCase {\n readonly id: string;\n readonly title: string;\n readonly fullName: string;\n readonly file?: string;\n readonly status: AgentInspectJestStatus;\n readonly raw: unknown;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of thrown so Jest's original test result\n * remains authoritative.\n */\nexport interface AgentInspectJestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"no-trace-association\"\n | \"on-diagnostic-failed\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Jest 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 AgentInspectJestReporterOptions {\n /** Directory for safe Jest artifacts. Defaults to `.agent-inspect/jest-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 /** Explicit trace associations keyed by `file::fullName`, `basename::fullName`, or `fullName`. */\n readonly associations?: Record<string, AgentInspectJestTraceAssociation>;\n /** Resolve explicit test-to-trace associations from a normalized Jest case. */\n readonly resolveTrace?: (\n test: AgentInspectJestTestCase,\n ) => AgentInspectJestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectJestDiagnostic) => void;\n}\n\nexport interface AgentInspectJestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectJestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Jest reporter facade.\n *\n * The hooks mirror Jest reporter lifecycle names, while inputs stay structural\n * to avoid a runtime dependency on Jest internals.\n */\nexport interface AgentInspectJestReporterFacade {\n onTestResult(test: unknown, testResult: unknown, aggregatedResult?: unknown): Promise<void>;\n onRunComplete(contexts?: unknown, results?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectJestDiagnostic[];\n getArtifacts(): readonly AgentInspectJestArtifact[];\n}\n\ntype AssertionResultLike = {\n readonly ancestorTitles?: unknown;\n readonly title?: unknown;\n readonly fullName?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n readonly agentInspect?: unknown;\n};\n\ntype TestFileResultLike = {\n readonly testFilePath?: unknown;\n readonly testResults?: unknown;\n readonly assertionResults?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/jest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/jest-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\";\nconst ASSOCIATION_DOCS =\n \"https://github.com/rajudandigam/agent-inspect/blob/main/packages/jest/README.md#trace-association\";\n\n/**\n * Attach an explicit AgentInspect trace association to a Jest assertion result.\n *\n * The reporter does not instrument tests automatically; pass the returned object\n * as `agentInspect` / `meta.agentInspect` or use `associations` / `resolveTrace`.\n */\nexport function withAgentInspectJestTrace(\n association: AgentInspectJestTraceAssociation,\n): { readonly agentInspect: AgentInspectJestTraceAssociation } {\n return { agentInspect: association };\n}\n\n/**\n * Create the experimental AgentInspect Jest reporter.\n */\nexport function createAgentInspectJestReporter(\n options: AgentInspectJestReporterOptions = {},\n): AgentInspectJestReporterFacade {\n const diagnostics: AgentInspectJestDiagnostic[] = [];\n const artifacts: AgentInspectJestArtifact[] = [];\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const failedWithoutAssociation = new Set<string>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n let reportedMissingAssociation = false;\n\n const reporter: AgentInspectJestReporterFacade = {\n async onTestResult(_test: unknown, testResult: unknown): Promise<void> {\n await handleFileResult(testResult);\n },\n async onRunComplete(_contexts?: unknown, results?: unknown): Promise<void> {\n for (const fileResult of readRunResults(results)) {\n await handleFileResult(fileResult);\n }\n await emitMissingAssociationDiagnostic();\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleFileResult(testResult: unknown): Promise<void> {\n for (const testCase of readTestCases(testResult)) {\n await handleTestCase(testCase);\n }\n }\n\n async function handleTestCase(testCase: AgentInspectJestTestCase): Promise<void> {\n const seenKey = `${testCase.id}:${testCase.status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(testCase, options);\n if (association === undefined) {\n if (testCase.status === \"failed\") {\n failedWithoutAssociation.add(testCase.id);\n }\n return;\n }\n\n if (testCase.status === \"passed\") {\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\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 redactionProfile: options.redactionProfile ?? \"share\",\n reserveArtifactName,\n status: testCase.status,\n testCase,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest artifact: ${errorMessage(error)}`,\n testId: testCase.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: AgentInspectJestDiagnostic): 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 Jest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function emitMissingAssociationDiagnostic(): Promise<void> {\n if (reportedMissingAssociation || failedWithoutAssociation.size === 0) return;\n reportedMissingAssociation = true;\n const count = failedWithoutAssociation.size;\n const sampleIds = [...failedWithoutAssociation].slice(0, 3);\n const message =\n `${count} failed Jest test(s) had no AgentInspect trace association. ` +\n `Reporter does not instrument tests automatically; no trace artifact was generated. ` +\n `Use withAgentInspectJestTrace, associations, resolveTrace, or meta.agentInspect. ` +\n `Docs: ${ASSOCIATION_DOCS}. Samples: ${sampleIds.join(\"; \")}`;\n reportDiagnostic({\n code: \"no-trace-association\",\n // Keep the helper name before truncation so the diagnostic stays actionable.\n message: boundText(message, 320),\n });\n\n try {\n const artifactDir = options.artifactDir ?? DEFAULT_ARTIFACT_DIR;\n await mkdir(artifactDir, { recursive: true });\n const diagnosticPath = path.join(artifactDir, \"no-trace-association.md\");\n const body = [\n \"# AgentInspect Jest — missing trace association\",\n \"\",\n \"Failed tests were observed without an explicit AgentInspect trace association.\",\n \"No trace artifact was generated for those tests.\",\n \"\",\n \"The reporter does **not** instrument Jest automatically.\",\n `Associate traces explicitly. Docs: ${ASSOCIATION_DOCS}`,\n \"\",\n \"## Failed tests without association\",\n \"\",\n ...[...failedWithoutAssociation].slice(0, 20).map((id) => `- ${boundText(id)}`),\n \"\",\n ].join(\"\\n\");\n await writeFile(diagnosticPath, body, \"utf-8\");\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest no-association diagnostic: ${errorMessage(error)}`,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined) return;\n if (artifacts.length === 0 && failedWithoutAssociation.size === 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 Jest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Failed tests without trace association: ${failedWithoutAssociation.size}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n if (failedWithoutAssociation.size > 0) {\n lines.push(\n \"No automatic instrumentation: associate traces via `associations`, `resolveTrace`, or `withAgentInspectJestTrace`.\",\n \"\",\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 Jest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\n/**\n * Experimental Jest custom reporter class.\n */\nexport class AgentInspectJestReporter implements AgentInspectJestReporterFacade {\n private readonly reporter: AgentInspectJestReporterFacade;\n\n constructor(_globalConfig?: unknown, options: AgentInspectJestReporterOptions = {}) {\n this.reporter = createAgentInspectJestReporter(options);\n }\n\n async onTestResult(\n test: unknown,\n testResult: unknown,\n aggregatedResult?: unknown,\n ): Promise<void> {\n await this.reporter.onTestResult(test, testResult, aggregatedResult);\n }\n\n async onRunComplete(contexts?: unknown, results?: unknown): Promise<void> {\n await this.reporter.onRunComplete(contexts, results);\n }\n\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return this.reporter.getDiagnostics();\n }\n\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return this.reporter.getArtifacts();\n }\n}\n\nexport const agentInspectJestReporter = createAgentInspectJestReporter;\nexport default AgentInspectJestReporter;\n\nexport { agentInspectJestMatchers } from \"./matchers.js\";\n\nfunction normalizeSuccessLimit(options: AgentInspectJestReporterOptions): 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 testCase: AgentInspectJestTestCase,\n options: AgentInspectJestReporterOptions,\n): AgentInspectJestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(testCase);\n if (isAssociation(resolved)) return resolved;\n\n const explicit = resolveFromAssociationMap(testCase, options.associations);\n if (explicit !== undefined) return explicit;\n\n return readAssociationFromAssertion(testCase.raw);\n}\n\nfunction resolveFromAssociationMap(\n testCase: AgentInspectJestTestCase,\n associations: Record<string, AgentInspectJestTraceAssociation> | undefined,\n): AgentInspectJestTraceAssociation | undefined {\n if (associations === undefined) return undefined;\n const basename = testCase.file === undefined ? undefined : path.basename(testCase.file);\n const candidates = [\n testCase.id,\n testCase.fullName,\n basename === undefined ? undefined : `${basename}::${testCase.fullName}`,\n ];\n for (const candidate of candidates) {\n if (candidate !== undefined && isAssociation(associations[candidate])) {\n return associations[candidate];\n }\n }\n return undefined;\n}\n\nfunction readAssociationFromAssertion(\n assertion: unknown,\n): AgentInspectJestTraceAssociation | undefined {\n if (!isObject(assertion)) return undefined;\n const direct = readProp(assertion, \"agentInspect\");\n if (isAssociation(direct)) return direct;\n\n const meta = readProp(assertion, \"meta\");\n if (!isObject(meta)) return undefined;\n for (const candidate of [\n readProp(meta, \"agentInspect\"),\n readProp(meta, \"agent-inspect\"),\n readProp(meta, \"trace\"),\n ]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectJestTraceAssociation {\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 readRunResults(results: unknown): unknown[] {\n if (!isObject(results)) return [];\n const testResults = readProp(results, \"testResults\");\n return Array.isArray(testResults) ? testResults : [];\n}\n\nfunction readTestCases(testResult: unknown): AgentInspectJestTestCase[] {\n if (!isObject(testResult)) return [];\n const result = testResult as TestFileResultLike;\n const file = readOptionalString(result, \"testFilePath\");\n const assertions = Array.isArray(result.testResults)\n ? result.testResults\n : Array.isArray(result.assertionResults)\n ? result.assertionResults\n : [];\n\n const cases: AgentInspectJestTestCase[] = [];\n for (const assertion of assertions) {\n if (!isObject(assertion)) continue;\n const status = readStatus(assertion);\n if (status === undefined || status === \"skipped\") continue;\n\n const title = readOptionalString(assertion, \"title\") ?? \"unknown-test\";\n const fullName = readFullName(assertion as AssertionResultLike, title);\n const id = `${file ?? \"unknown-file\"}::${fullName}`;\n cases.push({\n file,\n fullName: boundText(redactText(fullName)),\n id: boundText(redactText(id)),\n raw: assertion,\n status,\n title: boundText(redactText(title)),\n });\n }\n return cases;\n}\n\nfunction readFullName(assertion: AssertionResultLike, title: string): string {\n const explicit = readOptionalString(assertion, \"fullName\");\n if (explicit !== undefined) return explicit;\n\n const ancestors = Array.isArray(assertion.ancestorTitles)\n ? assertion.ancestorTitles.filter((item): item is string => typeof item === \"string\")\n : [];\n return [...ancestors, title].join(\" \");\n}\n\nfunction readStatus(assertion: object): AgentInspectJestStatus | undefined {\n const raw = readOptionalString(assertion, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"failed\" || normalized === \"fail\") return \"failed\";\n if (normalized === \"passed\" || normalized === \"pass\") return \"passed\";\n if (\n normalized === \"pending\" ||\n normalized === \"todo\" ||\n normalized === \"skipped\" ||\n normalized === \"skip\" ||\n normalized === \"disabled\"\n ) {\n return \"skipped\";\n }\n return undefined;\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectJestTraceAssociation;\n readonly generatedAt: string;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectJestStatus;\n readonly testCase: AgentInspectJestTestCase;\n}): Promise<AgentInspectJestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.testCase.id ??\n input.testCase.fullName ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const testFile =\n input.testCase.file === undefined ? undefined : path.basename(input.testCase.file);\n const safeTestId = `${testFile ?? \"unknown-file\"}::${input.testCase.fullName}`;\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\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: \"jest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: safeTestId,\n name: input.testCase.fullName,\n ...(testFile === undefined ? {} : { file: testFile }),\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: safeTestId,\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 Jest 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 Jest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\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, max = MAX_TEXT): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= max) return compact;\n return `${compact.slice(0, max - 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,187 @@ 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 Jest 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
+ declare const agentInspectJestMatchers: {
225
+ toPassTraceContract(received: TraceLike, contract: TraceContractInput): {
226
+ pass: boolean;
227
+ message: () => string;
228
+ };
229
+ toHaveRequiredTool(received: TraceLike, toolName: string): {
230
+ pass: boolean;
231
+ message: () => string;
232
+ };
233
+ };
234
+
54
235
  type AgentInspectJestStatus = "failed" | "passed" | "skipped";
55
236
  /**
56
237
  * Experimental trace association read by `@agent-inspect/jest`.
@@ -164,4 +345,4 @@ declare class AgentInspectJestReporter implements AgentInspectJestReporterFacade
164
345
  }
165
346
  declare const agentInspectJestReporter: typeof createAgentInspectJestReporter;
166
347
 
167
- export { type AgentInspectJestArtifact, type AgentInspectJestDiagnostic, AgentInspectJestReporter, type AgentInspectJestReporterFacade, type AgentInspectJestReporterOptions, type AgentInspectJestStatus, type AgentInspectJestTestCase, type AgentInspectJestTraceAssociation, agentInspectJestReporter, createAgentInspectJestReporter, AgentInspectJestReporter as default, withAgentInspectJestTrace };
348
+ export { type AgentInspectJestArtifact, type AgentInspectJestDiagnostic, AgentInspectJestReporter, type AgentInspectJestReporterFacade, type AgentInspectJestReporterOptions, type AgentInspectJestStatus, type AgentInspectJestTestCase, type AgentInspectJestTraceAssociation, agentInspectJestMatchers, agentInspectJestReporter, createAgentInspectJestReporter, AgentInspectJestReporter as default, withAgentInspectJestTrace };
package/dist/index.d.ts CHANGED
@@ -51,6 +51,187 @@ 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 Jest 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
+ declare const agentInspectJestMatchers: {
225
+ toPassTraceContract(received: TraceLike, contract: TraceContractInput): {
226
+ pass: boolean;
227
+ message: () => string;
228
+ };
229
+ toHaveRequiredTool(received: TraceLike, toolName: string): {
230
+ pass: boolean;
231
+ message: () => string;
232
+ };
233
+ };
234
+
54
235
  type AgentInspectJestStatus = "failed" | "passed" | "skipped";
55
236
  /**
56
237
  * Experimental trace association read by `@agent-inspect/jest`.
@@ -164,4 +345,4 @@ declare class AgentInspectJestReporter implements AgentInspectJestReporterFacade
164
345
  }
165
346
  declare const agentInspectJestReporter: typeof createAgentInspectJestReporter;
166
347
 
167
- export { type AgentInspectJestArtifact, type AgentInspectJestDiagnostic, AgentInspectJestReporter, type AgentInspectJestReporterFacade, type AgentInspectJestReporterOptions, type AgentInspectJestStatus, type AgentInspectJestTestCase, type AgentInspectJestTraceAssociation, agentInspectJestReporter, createAgentInspectJestReporter, AgentInspectJestReporter as default, withAgentInspectJestTrace };
348
+ export { type AgentInspectJestArtifact, type AgentInspectJestDiagnostic, AgentInspectJestReporter, type AgentInspectJestReporterFacade, type AgentInspectJestReporterOptions, type AgentInspectJestStatus, type AgentInspectJestTestCase, type AgentInspectJestTraceAssociation, agentInspectJestMatchers, agentInspectJestReporter, createAgentInspectJestReporter, AgentInspectJestReporter as default, withAgentInspectJestTrace };
package/dist/index.mjs CHANGED
@@ -1,6 +1,49 @@
1
1
  import { mkdir, writeFile } 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/jest/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 agentInspectJestMatchers = {
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/jest/src/index.ts
6
49
  var PACKAGE_NAME = "@agent-inspect/jest";
@@ -417,6 +460,6 @@ function errorMessage(error) {
417
460
  return error instanceof Error ? error.message : String(error);
418
461
  }
419
462
 
420
- export { AgentInspectJestReporter, agentInspectJestReporter, createAgentInspectJestReporter, index_default as default, withAgentInspectJestTrace };
463
+ export { AgentInspectJestReporter, agentInspectJestMatchers, agentInspectJestReporter, createAgentInspectJestReporter, index_default as default, withAgentInspectJestTrace };
421
464
  //# sourceMappingURL=index.mjs.map
422
465
  //# 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 AgentInspectJestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/jest`.\n *\n * Jest does not expose Vitest-style task metadata, so the default path is an\n * explicit `associations` map keyed by test identity, or a `resolveTrace`\n * callback. The reporter never guesses by timestamps.\n */\nexport interface AgentInspectJestTraceAssociation {\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 normalized view of one Jest assertion result.\n */\nexport interface AgentInspectJestTestCase {\n readonly id: string;\n readonly title: string;\n readonly fullName: string;\n readonly file?: string;\n readonly status: AgentInspectJestStatus;\n readonly raw: unknown;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of thrown so Jest's original test result\n * remains authoritative.\n */\nexport interface AgentInspectJestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"no-trace-association\"\n | \"on-diagnostic-failed\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Jest 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 AgentInspectJestReporterOptions {\n /** Directory for safe Jest artifacts. Defaults to `.agent-inspect/jest-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 /** Explicit trace associations keyed by `file::fullName`, `basename::fullName`, or `fullName`. */\n readonly associations?: Record<string, AgentInspectJestTraceAssociation>;\n /** Resolve explicit test-to-trace associations from a normalized Jest case. */\n readonly resolveTrace?: (\n test: AgentInspectJestTestCase,\n ) => AgentInspectJestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectJestDiagnostic) => void;\n}\n\nexport interface AgentInspectJestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectJestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Jest reporter facade.\n *\n * The hooks mirror Jest reporter lifecycle names, while inputs stay structural\n * to avoid a runtime dependency on Jest internals.\n */\nexport interface AgentInspectJestReporterFacade {\n onTestResult(test: unknown, testResult: unknown, aggregatedResult?: unknown): Promise<void>;\n onRunComplete(contexts?: unknown, results?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectJestDiagnostic[];\n getArtifacts(): readonly AgentInspectJestArtifact[];\n}\n\ntype AssertionResultLike = {\n readonly ancestorTitles?: unknown;\n readonly title?: unknown;\n readonly fullName?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n readonly agentInspect?: unknown;\n};\n\ntype TestFileResultLike = {\n readonly testFilePath?: unknown;\n readonly testResults?: unknown;\n readonly assertionResults?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/jest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/jest-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\";\nconst ASSOCIATION_DOCS =\n \"https://github.com/rajudandigam/agent-inspect/blob/main/packages/jest/README.md#trace-association\";\n\n/**\n * Attach an explicit AgentInspect trace association to a Jest assertion result.\n *\n * The reporter does not instrument tests automatically; pass the returned object\n * as `agentInspect` / `meta.agentInspect` or use `associations` / `resolveTrace`.\n */\nexport function withAgentInspectJestTrace(\n association: AgentInspectJestTraceAssociation,\n): { readonly agentInspect: AgentInspectJestTraceAssociation } {\n return { agentInspect: association };\n}\n\n/**\n * Create the experimental AgentInspect Jest reporter.\n */\nexport function createAgentInspectJestReporter(\n options: AgentInspectJestReporterOptions = {},\n): AgentInspectJestReporterFacade {\n const diagnostics: AgentInspectJestDiagnostic[] = [];\n const artifacts: AgentInspectJestArtifact[] = [];\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const failedWithoutAssociation = new Set<string>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n let reportedMissingAssociation = false;\n\n const reporter: AgentInspectJestReporterFacade = {\n async onTestResult(_test: unknown, testResult: unknown): Promise<void> {\n await handleFileResult(testResult);\n },\n async onRunComplete(_contexts?: unknown, results?: unknown): Promise<void> {\n for (const fileResult of readRunResults(results)) {\n await handleFileResult(fileResult);\n }\n await emitMissingAssociationDiagnostic();\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleFileResult(testResult: unknown): Promise<void> {\n for (const testCase of readTestCases(testResult)) {\n await handleTestCase(testCase);\n }\n }\n\n async function handleTestCase(testCase: AgentInspectJestTestCase): Promise<void> {\n const seenKey = `${testCase.id}:${testCase.status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(testCase, options);\n if (association === undefined) {\n if (testCase.status === \"failed\") {\n failedWithoutAssociation.add(testCase.id);\n }\n return;\n }\n\n if (testCase.status === \"passed\") {\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\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 redactionProfile: options.redactionProfile ?? \"share\",\n reserveArtifactName,\n status: testCase.status,\n testCase,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest artifact: ${errorMessage(error)}`,\n testId: testCase.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: AgentInspectJestDiagnostic): 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 Jest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function emitMissingAssociationDiagnostic(): Promise<void> {\n if (reportedMissingAssociation || failedWithoutAssociation.size === 0) return;\n reportedMissingAssociation = true;\n const count = failedWithoutAssociation.size;\n const sampleIds = [...failedWithoutAssociation].slice(0, 3);\n const message =\n `${count} failed Jest test(s) had no AgentInspect trace association. ` +\n `Reporter does not instrument tests automatically; no trace artifact was generated. ` +\n `Use withAgentInspectJestTrace, associations, resolveTrace, or meta.agentInspect. ` +\n `Docs: ${ASSOCIATION_DOCS}. Samples: ${sampleIds.join(\"; \")}`;\n reportDiagnostic({\n code: \"no-trace-association\",\n // Keep the helper name before truncation so the diagnostic stays actionable.\n message: boundText(message, 320),\n });\n\n try {\n const artifactDir = options.artifactDir ?? DEFAULT_ARTIFACT_DIR;\n await mkdir(artifactDir, { recursive: true });\n const diagnosticPath = path.join(artifactDir, \"no-trace-association.md\");\n const body = [\n \"# AgentInspect Jest — missing trace association\",\n \"\",\n \"Failed tests were observed without an explicit AgentInspect trace association.\",\n \"No trace artifact was generated for those tests.\",\n \"\",\n \"The reporter does **not** instrument Jest automatically.\",\n `Associate traces explicitly. Docs: ${ASSOCIATION_DOCS}`,\n \"\",\n \"## Failed tests without association\",\n \"\",\n ...[...failedWithoutAssociation].slice(0, 20).map((id) => `- ${boundText(id)}`),\n \"\",\n ].join(\"\\n\");\n await writeFile(diagnosticPath, body, \"utf-8\");\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest no-association diagnostic: ${errorMessage(error)}`,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined) return;\n if (artifacts.length === 0 && failedWithoutAssociation.size === 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 Jest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Failed tests without trace association: ${failedWithoutAssociation.size}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n if (failedWithoutAssociation.size > 0) {\n lines.push(\n \"No automatic instrumentation: associate traces via `associations`, `resolveTrace`, or `withAgentInspectJestTrace`.\",\n \"\",\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 Jest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\n/**\n * Experimental Jest custom reporter class.\n */\nexport class AgentInspectJestReporter implements AgentInspectJestReporterFacade {\n private readonly reporter: AgentInspectJestReporterFacade;\n\n constructor(_globalConfig?: unknown, options: AgentInspectJestReporterOptions = {}) {\n this.reporter = createAgentInspectJestReporter(options);\n }\n\n async onTestResult(\n test: unknown,\n testResult: unknown,\n aggregatedResult?: unknown,\n ): Promise<void> {\n await this.reporter.onTestResult(test, testResult, aggregatedResult);\n }\n\n async onRunComplete(contexts?: unknown, results?: unknown): Promise<void> {\n await this.reporter.onRunComplete(contexts, results);\n }\n\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return this.reporter.getDiagnostics();\n }\n\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return this.reporter.getArtifacts();\n }\n}\n\nexport const agentInspectJestReporter = createAgentInspectJestReporter;\nexport default AgentInspectJestReporter;\n\nfunction normalizeSuccessLimit(options: AgentInspectJestReporterOptions): 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 testCase: AgentInspectJestTestCase,\n options: AgentInspectJestReporterOptions,\n): AgentInspectJestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(testCase);\n if (isAssociation(resolved)) return resolved;\n\n const explicit = resolveFromAssociationMap(testCase, options.associations);\n if (explicit !== undefined) return explicit;\n\n return readAssociationFromAssertion(testCase.raw);\n}\n\nfunction resolveFromAssociationMap(\n testCase: AgentInspectJestTestCase,\n associations: Record<string, AgentInspectJestTraceAssociation> | undefined,\n): AgentInspectJestTraceAssociation | undefined {\n if (associations === undefined) return undefined;\n const basename = testCase.file === undefined ? undefined : path.basename(testCase.file);\n const candidates = [\n testCase.id,\n testCase.fullName,\n basename === undefined ? undefined : `${basename}::${testCase.fullName}`,\n ];\n for (const candidate of candidates) {\n if (candidate !== undefined && isAssociation(associations[candidate])) {\n return associations[candidate];\n }\n }\n return undefined;\n}\n\nfunction readAssociationFromAssertion(\n assertion: unknown,\n): AgentInspectJestTraceAssociation | undefined {\n if (!isObject(assertion)) return undefined;\n const direct = readProp(assertion, \"agentInspect\");\n if (isAssociation(direct)) return direct;\n\n const meta = readProp(assertion, \"meta\");\n if (!isObject(meta)) return undefined;\n for (const candidate of [\n readProp(meta, \"agentInspect\"),\n readProp(meta, \"agent-inspect\"),\n readProp(meta, \"trace\"),\n ]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectJestTraceAssociation {\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 readRunResults(results: unknown): unknown[] {\n if (!isObject(results)) return [];\n const testResults = readProp(results, \"testResults\");\n return Array.isArray(testResults) ? testResults : [];\n}\n\nfunction readTestCases(testResult: unknown): AgentInspectJestTestCase[] {\n if (!isObject(testResult)) return [];\n const result = testResult as TestFileResultLike;\n const file = readOptionalString(result, \"testFilePath\");\n const assertions = Array.isArray(result.testResults)\n ? result.testResults\n : Array.isArray(result.assertionResults)\n ? result.assertionResults\n : [];\n\n const cases: AgentInspectJestTestCase[] = [];\n for (const assertion of assertions) {\n if (!isObject(assertion)) continue;\n const status = readStatus(assertion);\n if (status === undefined || status === \"skipped\") continue;\n\n const title = readOptionalString(assertion, \"title\") ?? \"unknown-test\";\n const fullName = readFullName(assertion as AssertionResultLike, title);\n const id = `${file ?? \"unknown-file\"}::${fullName}`;\n cases.push({\n file,\n fullName: boundText(redactText(fullName)),\n id: boundText(redactText(id)),\n raw: assertion,\n status,\n title: boundText(redactText(title)),\n });\n }\n return cases;\n}\n\nfunction readFullName(assertion: AssertionResultLike, title: string): string {\n const explicit = readOptionalString(assertion, \"fullName\");\n if (explicit !== undefined) return explicit;\n\n const ancestors = Array.isArray(assertion.ancestorTitles)\n ? assertion.ancestorTitles.filter((item): item is string => typeof item === \"string\")\n : [];\n return [...ancestors, title].join(\" \");\n}\n\nfunction readStatus(assertion: object): AgentInspectJestStatus | undefined {\n const raw = readOptionalString(assertion, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"failed\" || normalized === \"fail\") return \"failed\";\n if (normalized === \"passed\" || normalized === \"pass\") return \"passed\";\n if (\n normalized === \"pending\" ||\n normalized === \"todo\" ||\n normalized === \"skipped\" ||\n normalized === \"skip\" ||\n normalized === \"disabled\"\n ) {\n return \"skipped\";\n }\n return undefined;\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectJestTraceAssociation;\n readonly generatedAt: string;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectJestStatus;\n readonly testCase: AgentInspectJestTestCase;\n}): Promise<AgentInspectJestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.testCase.id ??\n input.testCase.fullName ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const testFile =\n input.testCase.file === undefined ? undefined : path.basename(input.testCase.file);\n const safeTestId = `${testFile ?? \"unknown-file\"}::${input.testCase.fullName}`;\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\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: \"jest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: safeTestId,\n name: input.testCase.fullName,\n ...(testFile === undefined ? {} : { file: testFile }),\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: safeTestId,\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 Jest 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 Jest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\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, max = MAX_TEXT): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= max) return compact;\n return `${compact.slice(0, max - 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 Jest 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 const agentInspectJestMatchers = {\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 AgentInspectJestStatus = \"failed\" | \"passed\" | \"skipped\";\n\n/**\n * Experimental trace association read by `@agent-inspect/jest`.\n *\n * Jest does not expose Vitest-style task metadata, so the default path is an\n * explicit `associations` map keyed by test identity, or a `resolveTrace`\n * callback. The reporter never guesses by timestamps.\n */\nexport interface AgentInspectJestTraceAssociation {\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 normalized view of one Jest assertion result.\n */\nexport interface AgentInspectJestTestCase {\n readonly id: string;\n readonly title: string;\n readonly fullName: string;\n readonly file?: string;\n readonly status: AgentInspectJestStatus;\n readonly raw: unknown;\n}\n\n/**\n * Experimental diagnostic emitted when reporter work cannot be completed.\n *\n * Diagnostics are reported instead of thrown so Jest's original test result\n * remains authoritative.\n */\nexport interface AgentInspectJestDiagnostic {\n readonly code:\n | \"artifact-write-failed\"\n | \"github-summary-write-failed\"\n | \"no-trace-association\"\n | \"on-diagnostic-failed\";\n readonly message: string;\n readonly testId?: string;\n}\n\n/**\n * Experimental options for the AgentInspect Jest 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 AgentInspectJestReporterOptions {\n /** Directory for safe Jest artifacts. Defaults to `.agent-inspect/jest-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 /** Explicit trace associations keyed by `file::fullName`, `basename::fullName`, or `fullName`. */\n readonly associations?: Record<string, AgentInspectJestTraceAssociation>;\n /** Resolve explicit test-to-trace associations from a normalized Jest case. */\n readonly resolveTrace?: (\n test: AgentInspectJestTestCase,\n ) => AgentInspectJestTraceAssociation | undefined;\n /** Observe non-fatal reporter diagnostics. */\n readonly onDiagnostic?: (diagnostic: AgentInspectJestDiagnostic) => void;\n}\n\nexport interface AgentInspectJestArtifact {\n readonly directory: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly status: AgentInspectJestStatus;\n readonly testId: string;\n readonly manifest: TraceArtifactManifest;\n}\n\n/**\n * Experimental Jest reporter facade.\n *\n * The hooks mirror Jest reporter lifecycle names, while inputs stay structural\n * to avoid a runtime dependency on Jest internals.\n */\nexport interface AgentInspectJestReporterFacade {\n onTestResult(test: unknown, testResult: unknown, aggregatedResult?: unknown): Promise<void>;\n onRunComplete(contexts?: unknown, results?: unknown): Promise<void>;\n getDiagnostics(): readonly AgentInspectJestDiagnostic[];\n getArtifacts(): readonly AgentInspectJestArtifact[];\n}\n\ntype AssertionResultLike = {\n readonly ancestorTitles?: unknown;\n readonly title?: unknown;\n readonly fullName?: unknown;\n readonly status?: unknown;\n readonly meta?: unknown;\n readonly agentInspect?: unknown;\n};\n\ntype TestFileResultLike = {\n readonly testFilePath?: unknown;\n readonly testResults?: unknown;\n readonly assertionResults?: unknown;\n};\n\nconst PACKAGE_NAME = \"@agent-inspect/jest\";\nconst DEFAULT_ARTIFACT_DIR = \".agent-inspect/jest-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\";\nconst ASSOCIATION_DOCS =\n \"https://github.com/rajudandigam/agent-inspect/blob/main/packages/jest/README.md#trace-association\";\n\n/**\n * Attach an explicit AgentInspect trace association to a Jest assertion result.\n *\n * The reporter does not instrument tests automatically; pass the returned object\n * as `agentInspect` / `meta.agentInspect` or use `associations` / `resolveTrace`.\n */\nexport function withAgentInspectJestTrace(\n association: AgentInspectJestTraceAssociation,\n): { readonly agentInspect: AgentInspectJestTraceAssociation } {\n return { agentInspect: association };\n}\n\n/**\n * Create the experimental AgentInspect Jest reporter.\n */\nexport function createAgentInspectJestReporter(\n options: AgentInspectJestReporterOptions = {},\n): AgentInspectJestReporterFacade {\n const diagnostics: AgentInspectJestDiagnostic[] = [];\n const artifacts: AgentInspectJestArtifact[] = [];\n const seenKeys = new Set<string>();\n const artifactNames = new Map<string, number>();\n const failedWithoutAssociation = new Set<string>();\n const successLimit = normalizeSuccessLimit(options);\n let retainedSuccesses = 0;\n let reportedMissingAssociation = false;\n\n const reporter: AgentInspectJestReporterFacade = {\n async onTestResult(_test: unknown, testResult: unknown): Promise<void> {\n await handleFileResult(testResult);\n },\n async onRunComplete(_contexts?: unknown, results?: unknown): Promise<void> {\n for (const fileResult of readRunResults(results)) {\n await handleFileResult(fileResult);\n }\n await emitMissingAssociationDiagnostic();\n await appendGithubSummary();\n },\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return diagnostics.slice();\n },\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return artifacts.slice();\n },\n };\n\n async function handleFileResult(testResult: unknown): Promise<void> {\n for (const testCase of readTestCases(testResult)) {\n await handleTestCase(testCase);\n }\n }\n\n async function handleTestCase(testCase: AgentInspectJestTestCase): Promise<void> {\n const seenKey = `${testCase.id}:${testCase.status}`;\n if (seenKeys.has(seenKey)) return;\n\n const association = resolveAssociation(testCase, options);\n if (association === undefined) {\n if (testCase.status === \"failed\") {\n failedWithoutAssociation.add(testCase.id);\n }\n return;\n }\n\n if (testCase.status === \"passed\") {\n if (retainedSuccesses >= successLimit) return;\n retainedSuccesses += 1;\n }\n\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 redactionProfile: options.redactionProfile ?? \"share\",\n reserveArtifactName,\n status: testCase.status,\n testCase,\n });\n artifacts.push(artifact);\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest artifact: ${errorMessage(error)}`,\n testId: testCase.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: AgentInspectJestDiagnostic): 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 Jest diagnostic callback failed: ${errorMessage(error)}`,\n testId: diagnostic.testId,\n });\n }\n }\n\n async function emitMissingAssociationDiagnostic(): Promise<void> {\n if (reportedMissingAssociation || failedWithoutAssociation.size === 0) return;\n reportedMissingAssociation = true;\n const count = failedWithoutAssociation.size;\n const sampleIds = [...failedWithoutAssociation].slice(0, 3);\n const message =\n `${count} failed Jest test(s) had no AgentInspect trace association. ` +\n `Reporter does not instrument tests automatically; no trace artifact was generated. ` +\n `Use withAgentInspectJestTrace, associations, resolveTrace, or meta.agentInspect. ` +\n `Docs: ${ASSOCIATION_DOCS}. Samples: ${sampleIds.join(\"; \")}`;\n reportDiagnostic({\n code: \"no-trace-association\",\n // Keep the helper name before truncation so the diagnostic stays actionable.\n message: boundText(message, 320),\n });\n\n try {\n const artifactDir = options.artifactDir ?? DEFAULT_ARTIFACT_DIR;\n await mkdir(artifactDir, { recursive: true });\n const diagnosticPath = path.join(artifactDir, \"no-trace-association.md\");\n const body = [\n \"# AgentInspect Jest — missing trace association\",\n \"\",\n \"Failed tests were observed without an explicit AgentInspect trace association.\",\n \"No trace artifact was generated for those tests.\",\n \"\",\n \"The reporter does **not** instrument Jest automatically.\",\n `Associate traces explicitly. Docs: ${ASSOCIATION_DOCS}`,\n \"\",\n \"## Failed tests without association\",\n \"\",\n ...[...failedWithoutAssociation].slice(0, 20).map((id) => `- ${boundText(id)}`),\n \"\",\n ].join(\"\\n\");\n await writeFile(diagnosticPath, body, \"utf-8\");\n } catch (error) {\n reportDiagnostic({\n code: \"artifact-write-failed\",\n message: `Could not write AgentInspect Jest no-association diagnostic: ${errorMessage(error)}`,\n });\n }\n }\n\n async function appendGithubSummary(): Promise<void> {\n if (options.githubSummary === undefined) return;\n if (artifacts.length === 0 && failedWithoutAssociation.size === 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 Jest artifacts\",\n \"\",\n `- Failed test artifacts: ${failed}`,\n `- Passing test artifacts retained: ${passed}`,\n `- Failed tests without trace association: ${failedWithoutAssociation.size}`,\n `- Artifact directory: ${boundText(path.basename(options.artifactDir ?? DEFAULT_ARTIFACT_DIR))}`,\n \"\",\n ];\n if (failedWithoutAssociation.size > 0) {\n lines.push(\n \"No automatic instrumentation: associate traces via `associations`, `resolveTrace`, or `withAgentInspectJestTrace`.\",\n \"\",\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 Jest summary: ${errorMessage(error)}`,\n });\n }\n }\n\n return reporter;\n}\n\n/**\n * Experimental Jest custom reporter class.\n */\nexport class AgentInspectJestReporter implements AgentInspectJestReporterFacade {\n private readonly reporter: AgentInspectJestReporterFacade;\n\n constructor(_globalConfig?: unknown, options: AgentInspectJestReporterOptions = {}) {\n this.reporter = createAgentInspectJestReporter(options);\n }\n\n async onTestResult(\n test: unknown,\n testResult: unknown,\n aggregatedResult?: unknown,\n ): Promise<void> {\n await this.reporter.onTestResult(test, testResult, aggregatedResult);\n }\n\n async onRunComplete(contexts?: unknown, results?: unknown): Promise<void> {\n await this.reporter.onRunComplete(contexts, results);\n }\n\n getDiagnostics(): readonly AgentInspectJestDiagnostic[] {\n return this.reporter.getDiagnostics();\n }\n\n getArtifacts(): readonly AgentInspectJestArtifact[] {\n return this.reporter.getArtifacts();\n }\n}\n\nexport const agentInspectJestReporter = createAgentInspectJestReporter;\nexport default AgentInspectJestReporter;\n\nexport { agentInspectJestMatchers } from \"./matchers.js\";\n\nfunction normalizeSuccessLimit(options: AgentInspectJestReporterOptions): 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 testCase: AgentInspectJestTestCase,\n options: AgentInspectJestReporterOptions,\n): AgentInspectJestTraceAssociation | undefined {\n const resolved = options.resolveTrace?.(testCase);\n if (isAssociation(resolved)) return resolved;\n\n const explicit = resolveFromAssociationMap(testCase, options.associations);\n if (explicit !== undefined) return explicit;\n\n return readAssociationFromAssertion(testCase.raw);\n}\n\nfunction resolveFromAssociationMap(\n testCase: AgentInspectJestTestCase,\n associations: Record<string, AgentInspectJestTraceAssociation> | undefined,\n): AgentInspectJestTraceAssociation | undefined {\n if (associations === undefined) return undefined;\n const basename = testCase.file === undefined ? undefined : path.basename(testCase.file);\n const candidates = [\n testCase.id,\n testCase.fullName,\n basename === undefined ? undefined : `${basename}::${testCase.fullName}`,\n ];\n for (const candidate of candidates) {\n if (candidate !== undefined && isAssociation(associations[candidate])) {\n return associations[candidate];\n }\n }\n return undefined;\n}\n\nfunction readAssociationFromAssertion(\n assertion: unknown,\n): AgentInspectJestTraceAssociation | undefined {\n if (!isObject(assertion)) return undefined;\n const direct = readProp(assertion, \"agentInspect\");\n if (isAssociation(direct)) return direct;\n\n const meta = readProp(assertion, \"meta\");\n if (!isObject(meta)) return undefined;\n for (const candidate of [\n readProp(meta, \"agentInspect\"),\n readProp(meta, \"agent-inspect\"),\n readProp(meta, \"trace\"),\n ]) {\n if (isAssociation(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction isAssociation(\n value: unknown,\n): value is AgentInspectJestTraceAssociation {\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 readRunResults(results: unknown): unknown[] {\n if (!isObject(results)) return [];\n const testResults = readProp(results, \"testResults\");\n return Array.isArray(testResults) ? testResults : [];\n}\n\nfunction readTestCases(testResult: unknown): AgentInspectJestTestCase[] {\n if (!isObject(testResult)) return [];\n const result = testResult as TestFileResultLike;\n const file = readOptionalString(result, \"testFilePath\");\n const assertions = Array.isArray(result.testResults)\n ? result.testResults\n : Array.isArray(result.assertionResults)\n ? result.assertionResults\n : [];\n\n const cases: AgentInspectJestTestCase[] = [];\n for (const assertion of assertions) {\n if (!isObject(assertion)) continue;\n const status = readStatus(assertion);\n if (status === undefined || status === \"skipped\") continue;\n\n const title = readOptionalString(assertion, \"title\") ?? \"unknown-test\";\n const fullName = readFullName(assertion as AssertionResultLike, title);\n const id = `${file ?? \"unknown-file\"}::${fullName}`;\n cases.push({\n file,\n fullName: boundText(redactText(fullName)),\n id: boundText(redactText(id)),\n raw: assertion,\n status,\n title: boundText(redactText(title)),\n });\n }\n return cases;\n}\n\nfunction readFullName(assertion: AssertionResultLike, title: string): string {\n const explicit = readOptionalString(assertion, \"fullName\");\n if (explicit !== undefined) return explicit;\n\n const ancestors = Array.isArray(assertion.ancestorTitles)\n ? assertion.ancestorTitles.filter((item): item is string => typeof item === \"string\")\n : [];\n return [...ancestors, title].join(\" \");\n}\n\nfunction readStatus(assertion: object): AgentInspectJestStatus | undefined {\n const raw = readOptionalString(assertion, \"status\");\n if (raw === undefined) return undefined;\n\n const normalized = raw.toLowerCase();\n if (normalized === \"failed\" || normalized === \"fail\") return \"failed\";\n if (normalized === \"passed\" || normalized === \"pass\") return \"passed\";\n if (\n normalized === \"pending\" ||\n normalized === \"todo\" ||\n normalized === \"skipped\" ||\n normalized === \"skip\" ||\n normalized === \"disabled\"\n ) {\n return \"skipped\";\n }\n return undefined;\n}\n\nasync function writeSafeArtifact(input: {\n readonly artifactDir: string;\n readonly association: AgentInspectJestTraceAssociation;\n readonly generatedAt: string;\n readonly redactionProfile: TraceArtifactRedactionProfile;\n readonly reserveArtifactName: (seed: string) => string;\n readonly status: AgentInspectJestStatus;\n readonly testCase: AgentInspectJestTestCase;\n}): Promise<AgentInspectJestArtifact> {\n const artifactSeed =\n input.association.artifactLabel ??\n input.testCase.id ??\n input.testCase.fullName ??\n input.status;\n const artifactName = input.reserveArtifactName(artifactSeed);\n const testFile =\n input.testCase.file === undefined ? undefined : path.basename(input.testCase.file);\n const safeTestId = `${testFile ?? \"unknown-file\"}::${input.testCase.fullName}`;\n const manifestPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\n kind: \"report\",\n format: \"json\",\n });\n const summaryPathResult = createReporterArtifactPath({\n outputDir: input.artifactDir,\n testId: artifactName,\n name: input.testCase.fullName,\n file: testFile,\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: \"jest\",\n generatedAt: input.generatedAt,\n results: [\n {\n testId: safeTestId,\n name: input.testCase.fullName,\n ...(testFile === undefined ? {} : { file: testFile }),\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: safeTestId,\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 Jest 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 Jest artifact path.\";\n return diagnostics.map((diagnostic) => diagnostic.message).join(\"; \");\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, max = MAX_TEXT): string {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= max) return compact;\n return `${compact.slice(0, max - 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/jest",
3
- "version": "6.12.2",
3
+ "version": "6.13.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Optional Jest reporter for AgentInspect local trace artifacts",
@@ -42,7 +42,7 @@
42
42
  }
43
43
  },
44
44
  "dependencies": {
45
- "agent-inspect": "6.12.2"
45
+ "agent-inspect": "6.13.0"
46
46
  },
47
47
  "devDependencies": {
48
48
  "jest": "^30.2.0"