agent-inspect 6.31.21 → 6.31.23

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.
Files changed (48) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/package.json +1 -1
  4. package/packages/cli/dist/{chunk-N5JN26MW.mjs → chunk-P27XTK5U.mjs} +347 -36
  5. package/packages/cli/dist/chunk-P27XTK5U.mjs.map +1 -0
  6. package/packages/cli/dist/index.cjs +434 -63
  7. package/packages/cli/dist/index.cjs.map +1 -1
  8. package/packages/cli/dist/index.mjs +81 -33
  9. package/packages/cli/dist/index.mjs.map +1 -1
  10. package/packages/cli/dist/{src-VMGRSTG7.mjs → src-EWZYLDST.mjs} +3 -3
  11. package/packages/cli/dist/{src-VMGRSTG7.mjs.map → src-EWZYLDST.mjs.map} +1 -1
  12. package/packages/core/dist/advanced.cjs +280 -10
  13. package/packages/core/dist/advanced.cjs.map +1 -1
  14. package/packages/core/dist/advanced.mjs +6 -5
  15. package/packages/core/dist/advanced.mjs.map +1 -1
  16. package/packages/core/dist/checks.cjs +185 -27
  17. package/packages/core/dist/checks.cjs.map +1 -1
  18. package/packages/core/dist/checks.mjs +2 -1
  19. package/packages/core/dist/{chunk-JE3TUFAQ.mjs → chunk-77PUPLPG.mjs} +14 -8
  20. package/packages/core/dist/chunk-77PUPLPG.mjs.map +1 -0
  21. package/packages/core/dist/chunk-AN5MOADW.mjs +204 -0
  22. package/packages/core/dist/chunk-AN5MOADW.mjs.map +1 -0
  23. package/packages/core/dist/{chunk-4CDX5GDS.mjs → chunk-IMCM42W6.mjs} +110 -99
  24. package/packages/core/dist/chunk-IMCM42W6.mjs.map +1 -0
  25. package/packages/core/dist/{chunk-YU6XT5A2.mjs → chunk-J2ST4VCX.mjs} +45 -3
  26. package/packages/core/dist/chunk-J2ST4VCX.mjs.map +1 -0
  27. package/packages/core/dist/{chunk-EIP5CNEL.mjs → chunk-JJSL346L.mjs} +58 -3
  28. package/packages/core/dist/chunk-JJSL346L.mjs.map +1 -0
  29. package/packages/core/dist/exporters.cjs +91 -29
  30. package/packages/core/dist/exporters.cjs.map +1 -1
  31. package/packages/core/dist/exporters.mjs +78 -29
  32. package/packages/core/dist/exporters.mjs.map +1 -1
  33. package/packages/core/dist/logs.cjs +206 -1
  34. package/packages/core/dist/logs.cjs.map +1 -1
  35. package/packages/core/dist/logs.mjs +3 -2
  36. package/packages/core/dist/logs.mjs.map +1 -1
  37. package/packages/core/dist/persisted.cjs +226 -8
  38. package/packages/core/dist/persisted.cjs.map +1 -1
  39. package/packages/core/dist/persisted.mjs +9 -5
  40. package/packages/core/dist/persisted.mjs.map +1 -1
  41. package/packages/core/dist/readers.cjs +276 -6
  42. package/packages/core/dist/readers.cjs.map +1 -1
  43. package/packages/core/dist/readers.mjs +4 -3
  44. package/packages/cli/dist/chunk-N5JN26MW.mjs.map +0 -1
  45. package/packages/core/dist/chunk-4CDX5GDS.mjs.map +0 -1
  46. package/packages/core/dist/chunk-EIP5CNEL.mjs.map +0 -1
  47. package/packages/core/dist/chunk-JE3TUFAQ.mjs.map +0 -1
  48. package/packages/core/dist/chunk-YU6XT5A2.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { ATTRIBUTION_CONFIDENCES, createSafetyRawContentRule, createSafetyRedactionRule, createSafetySecretPatternRule, createSafetyOversizedAttributeRule, resolveTraceDir, parseDuration, buildSessionIndex, resolveBundleRunIds, getTraceFilePath, openTrace, sha256Hex, collectTraceSchemaVersions, aggregateBundleSafeStatus, bundleFailsOnSafety, bundleRunAssetRelativePath, buildPlaceholderArtifact, EVIDENCE_HTML_FILENAME, EVIDENCE_MANIFEST_FILENAME, buildBundleMetadata, buildBundleSummaryMarkdown, buildEvidenceHtmlShell, buildEvidenceProvenanceViewHtml, EVIDENCE_FORMAT_VERSION, inferEvidenceFileRole, buildEvidenceSafetyViewHtml, buildEvidenceDiffViewHtml, buildEvidenceCircuitViewHtml, buildEvidenceOutcomesViewHtml, buildEvidenceContractsViewHtml, buildEvidenceToolsLlmViewHtml, buildEvidenceCausalFailureViewHtml, buildEvidenceTimelineViewHtml, buildEvidenceTreeViewHtml, buildEvidenceManifest, serializeEvidenceManifest, buildZipArchive, assertBundlePathContained, enrichSessionRunRecord, normalizeBundleOutputPath, sanitizeBundleRunId, defaultBundleOutputPath, runTraceChecks, assertEvidenceRelativePath, TraceDirectory, loadTraceMetadataList, loadSessionRunRecords, TraceReadError, resolveRedactionProfile, applyProfileMetadataCaps, Redactor, flattenTree, escapeHtml, safeString, compactAttributes, stableJson, escapeMarkdown, DEFAULT_REDACT_KEYS, truncateStringForProfile, stringContainsHighConfidenceCredential, isCredentialSensitiveKey, extractMetadata, filterTraces, truncateName, buildRunSummary, formatDuration, formatTimestamp, renderErrorLine, isAgentInspectTrace, persistedInspectEventsToRunTrees, defineTraceContract, filterMetasBySessionScope, evaluateTraceContract, aggregateSessionCheckResults, createBaselineRegressionRule, summarizeSemanticParity, buildEvidenceCiPackage, verifyEvidenceDirectory, diffTraceEvents, renderRunDiff, buildRunTimeline, renderTimeline, buildTraceStats, renderTraceStats, parseDurationFilter, searchTraces, formatStepLabel, buildActivitySummary, renderActivitySummaryHuman, buildRunWhatSummary, renderRunWhat, buildLocalExplanation, resolveSuiteTemplate, defaultSuiteConfigTemplate, loadSuiteConfig, validateSuiteConfig, runSuite, renderSuiteReport, analyzeCohort, renderCohortReport, gateHasThresholds, runGate, renderGateReport, persistedInspectEventsToTraceEvents, renderStepLine, getIndent, TreeBuilder, validateEvent, traceEventToPersistedInspectEvent, isPersistedInspectEvent, createRunStatusRule, createStructureOrphanRule, createStructureCycleRule, createRunDurationRule, createMaxStepDurationRule, createRequireCompletedRule, createStallDetectionRule, createObservedOutcomeRule, createRunDepthRule, createToolUsageRule, createLlmUsageRule, createStructureRelationshipRule, createStructureParallelWidthRule, projectLogicalEvents, summarizeObservedOutcomes, extractOutcomesFromTraceEvents, renderObservedOutcomesMarkdown, renderObservedOutcomesHtml, DEFAULT_SUITE_ARTIFACTS_DIR, parseCohortMetricList, COHORT_METRIC_IDS, parseGateList, nanoid, isAttributionConfidence, zeroKinds, diffRuns, manualTraceEventsToComparableRun } from './chunk-N5JN26MW.mjs';
2
+ import { ATTRIBUTION_CONFIDENCES, createSafetyRawContentRule, createSafetyRedactionRule, createSafetySecretPatternRule, createSafetyOversizedAttributeRule, resolveTraceDir, parseDuration, buildSessionIndex, resolveBundleRunIds, getTraceFilePath, openTrace, sha256Hex, collectTraceSchemaVersions, aggregateBundleSafeStatus, bundleFailsOnSafety, bundleRunAssetRelativePath, buildPlaceholderArtifact, EVIDENCE_HTML_FILENAME, EVIDENCE_MANIFEST_FILENAME, buildBundleMetadata, buildBundleSummaryMarkdown, buildEvidenceHtmlShell, buildEvidenceProvenanceViewHtml, EVIDENCE_FORMAT_VERSION, inferEvidenceFileRole, buildEvidenceSafetyViewHtml, buildEvidenceDiffViewHtml, buildEvidenceCircuitViewHtml, buildEvidenceOutcomesViewHtml, buildEvidenceContractsViewHtml, buildEvidenceToolsLlmViewHtml, buildEvidenceCausalFailureViewHtml, buildEvidenceTimelineViewHtml, buildEvidenceTreeViewHtml, buildEvidenceManifest, serializeEvidenceManifest, buildZipArchive, assertBundlePathContained, enrichSessionRunRecord, normalizeBundleOutputPath, sanitizeBundleRunId, defaultBundleOutputPath, runTraceChecks, assertEvidenceRelativePath, TraceDirectory, loadTraceMetadataList, loadSessionRunRecords, TraceReadError, resolveRedactionProfile, applyProfileMetadataCaps, Redactor, flattenTree, escapeHtml, safeString, compactAttributes, stableJson, escapeMarkdown, IDENTITY_CONFLICT_ATTR, DELIVERY_CONFLICT_ATTR, DELIVERY_EVENT_BASE_ATTR, DEFAULT_REDACT_KEYS, truncateStringForProfile, stringContainsHighConfidenceCredential, isCredentialSensitiveKey, extractMetadata, filterTraces, truncateName, buildRunSummary, formatDuration, formatTimestamp, renderErrorLine, isAgentInspectTrace, persistedInspectEventsToRunTrees, defineTraceContract, filterMetasBySessionScope, evaluateTraceContract, aggregateSessionCheckResults, createBaselineRegressionRule, summarizeSemanticParity, buildEvidenceCiPackage, verifyEvidenceDirectory, diffTraceEvents, renderRunDiff, buildRunTimeline, renderTimeline, buildTraceStats, renderTraceStats, parseDurationFilter, searchTraces, formatStepLabel, buildActivitySummary, renderActivitySummaryHuman, buildRunWhatSummary, renderRunWhat, buildLocalExplanation, resolveSuiteTemplate, defaultSuiteConfigTemplate, loadSuiteConfig, validateSuiteConfig, runSuite, renderSuiteReport, analyzeCohort, renderCohortReport, gateHasThresholds, runGate, renderGateReport, persistedInspectEventsToTraceEvents, renderStepLine, getIndent, TreeBuilder, validateEvent, traceEventToPersistedInspectEvent, isPersistedInspectEvent, createRunStatusRule, createStructureOrphanRule, createStructureCycleRule, createRunDurationRule, createMaxStepDurationRule, createRequireCompletedRule, createStallDetectionRule, createObservedOutcomeRule, createRunDepthRule, createToolUsageRule, createLlmUsageRule, createStructureRelationshipRule, createStructureParallelWidthRule, projectLogicalEvents, summarizeObservedOutcomes, extractOutcomesFromTraceEvents, renderObservedOutcomesMarkdown, renderObservedOutcomesHtml, DEFAULT_SUITE_ARTIFACTS_DIR, parseCohortMetricList, COHORT_METRIC_IDS, parseGateList, nanoid, isAttributionConfidence, zeroKinds, diffRuns, manualTraceEventsToComparableRun } from './chunk-P27XTK5U.mjs';
3
3
  import { realpathSync, constants as constants$1, existsSync, readFileSync } from 'fs';
4
4
  import path19 from 'path';
5
5
  import { fileURLToPath, pathToFileURL } from 'url';
@@ -14,7 +14,7 @@ import { createServer } from 'http';
14
14
  import { createRequire } from 'module';
15
15
 
16
16
  // package.json
17
- var version = "6.31.21";
17
+ var version = "6.31.23";
18
18
 
19
19
  // packages/cli/src/trace-dir-scale.ts
20
20
  var TRACE_COUNT_WARN = 1e3;
@@ -2616,43 +2616,85 @@ var STRUCTURAL_IDENTITY_KEYS = [
2616
2616
  "attemptNumber",
2617
2617
  "attempt"
2618
2618
  ];
2619
- function pickBoundedIdentityString(bag, key, maxLen) {
2619
+ function nestedBag(bag) {
2620
2620
  if (!bag || typeof bag !== "object") return void 0;
2621
- const direct = bag[key];
2622
- if (typeof direct === "string" && direct.trim() !== "") {
2623
- return direct.trim().slice(0, maxLen);
2624
- }
2625
- const nested = bag.metadata && typeof bag.metadata === "object" ? bag.metadata[key] : void 0;
2626
- if (typeof nested === "string" && nested.trim() !== "") {
2627
- return nested.trim().slice(0, maxLen);
2621
+ const nested = bag.metadata;
2622
+ if (!nested || typeof nested !== "object" || Array.isArray(nested)) return void 0;
2623
+ return nested;
2624
+ }
2625
+ function pickBoundedIdentityString(bag, key, maxLen) {
2626
+ if (!bag || typeof bag !== "object") return {};
2627
+ const directRaw = bag[key];
2628
+ const nestedRaw = nestedBag(bag)?.[key];
2629
+ const directFull = typeof directRaw === "string" && directRaw.trim() !== "" ? directRaw.trim() : void 0;
2630
+ const nestedFull = typeof nestedRaw === "string" && nestedRaw.trim() !== "" ? nestedRaw.trim() : void 0;
2631
+ const direct = directFull !== void 0 ? directFull.slice(0, maxLen) : void 0;
2632
+ const nested = nestedFull !== void 0 ? nestedFull.slice(0, maxLen) : void 0;
2633
+ if (directFull !== void 0 && nestedFull !== void 0 && directFull !== nestedFull) {
2634
+ return {
2635
+ value: direct,
2636
+ conflictAlternate: nested,
2637
+ truncatedCollision: direct === nested
2638
+ };
2628
2639
  }
2629
- return void 0;
2640
+ if (direct !== void 0) return { value: direct };
2641
+ if (nested !== void 0) return { value: nested };
2642
+ return {};
2630
2643
  }
2631
2644
  function pickBoundedIdentityNumber(bag, key) {
2632
- if (!bag || typeof bag !== "object") return void 0;
2633
- const direct = bag[key];
2634
- if (typeof direct === "number" && Number.isFinite(direct)) return direct;
2635
- const nested = bag.metadata && typeof bag.metadata === "object" ? bag.metadata[key] : void 0;
2636
- if (typeof nested === "number" && Number.isFinite(nested)) return nested;
2637
- return void 0;
2645
+ if (!bag || typeof bag !== "object") return {};
2646
+ const directRaw = bag[key];
2647
+ const nestedRaw = nestedBag(bag)?.[key];
2648
+ const direct = typeof directRaw === "number" && Number.isFinite(directRaw) ? directRaw : void 0;
2649
+ const nested = typeof nestedRaw === "number" && Number.isFinite(nestedRaw) ? nestedRaw : void 0;
2650
+ if (direct !== void 0 && nested !== void 0 && direct !== nested) {
2651
+ return { value: direct, conflictAlternate: nested };
2652
+ }
2653
+ if (direct !== void 0) return { value: direct };
2654
+ if (nested !== void 0) return { value: nested };
2655
+ return {};
2638
2656
  }
2639
2657
  function appendStructuralIdentityAttrs(attrs, meta, maxLen) {
2640
- const operationId = pickBoundedIdentityString(meta, "operationId", maxLen);
2641
- if (operationId !== void 0) {
2642
- attrs.push(stringAttr("agent_inspect.operation_id", operationId));
2658
+ const conflicts = [];
2659
+ const emitString = (key, otlpKey, conflictKey) => {
2660
+ const picked = pickBoundedIdentityString(meta, key, maxLen);
2661
+ if (picked.value !== void 0) {
2662
+ attrs.push(stringAttr(otlpKey, picked.value));
2663
+ }
2664
+ if (picked.conflictAlternate !== void 0 || picked.truncatedCollision) {
2665
+ if (picked.conflictAlternate !== void 0) {
2666
+ attrs.push(stringAttr(conflictKey, picked.conflictAlternate));
2667
+ }
2668
+ conflicts.push(key);
2669
+ }
2670
+ };
2671
+ emitString("operationId", "agent_inspect.operation_id", IDENTITY_CONFLICT_ATTR.operationId);
2672
+ emitString("attemptId", "agent_inspect.attempt_id", IDENTITY_CONFLICT_ATTR.attemptId);
2673
+ emitString("retryOf", "agent_inspect.retry_of", IDENTITY_CONFLICT_ATTR.retryOf);
2674
+ const attemptNumberPrimary = pickBoundedIdentityNumber(meta, "attemptNumber");
2675
+ const attemptNumber2 = attemptNumberPrimary.value !== void 0 || attemptNumberPrimary.conflictAlternate !== void 0 ? attemptNumberPrimary : pickBoundedIdentityNumber(meta, "attempt");
2676
+ if (attemptNumber2.value !== void 0) {
2677
+ attrs.push(intAttr("agent_inspect.attempt_number", attemptNumber2.value));
2643
2678
  }
2644
- const attemptId = pickBoundedIdentityString(meta, "attemptId", maxLen);
2645
- if (attemptId !== void 0) {
2646
- attrs.push(stringAttr("agent_inspect.attempt_id", attemptId));
2679
+ if (attemptNumber2.conflictAlternate !== void 0) {
2680
+ attrs.push(
2681
+ intAttr(IDENTITY_CONFLICT_ATTR.attemptNumber, attemptNumber2.conflictAlternate)
2682
+ );
2683
+ conflicts.push("attemptNumber");
2647
2684
  }
2648
- const retryOf = pickBoundedIdentityString(meta, "retryOf", maxLen);
2649
- if (retryOf !== void 0) {
2650
- attrs.push(stringAttr("agent_inspect.retry_of", retryOf));
2685
+ if (conflicts.length > 0) {
2686
+ attrs.push(
2687
+ stringAttr(IDENTITY_CONFLICT_ATTR.fields, conflicts.join(",").slice(0, maxLen))
2688
+ );
2651
2689
  }
2652
- const attemptNumber2 = pickBoundedIdentityNumber(meta, "attemptNumber") ?? pickBoundedIdentityNumber(meta, "attempt");
2653
- if (attemptNumber2 !== void 0) {
2654
- attrs.push(intAttr("agent_inspect.attempt_number", attemptNumber2));
2690
+ if (meta?.[DELIVERY_CONFLICT_ATTR] === true) {
2691
+ attrs.push(boolAttr(DELIVERY_CONFLICT_ATTR, true));
2655
2692
  }
2693
+ const deliveryBase = meta?.[DELIVERY_EVENT_BASE_ATTR];
2694
+ if (typeof deliveryBase === "string" && deliveryBase.trim() !== "") {
2695
+ attrs.push(stringAttr(DELIVERY_EVENT_BASE_ATTR, deliveryBase.trim().slice(0, maxLen)));
2696
+ }
2697
+ return conflicts;
2656
2698
  }
2657
2699
  function resolveSpanTimes(ev) {
2658
2700
  const startedAtMs = typeof ev.attributes?.startedAtMs === "number" && Number.isFinite(ev.attributes.startedAtMs) ? ev.attributes.startedAtMs : void 0;
@@ -2675,7 +2717,8 @@ function exportOtlpJson(tree, options) {
2675
2717
  "OTLP JSON export uses OTel GenAI-aligned attributes where applicable; experimental until verified against specific collectors.",
2676
2718
  "Not OTLP gRPC/protobuf \u2014 JSON mapping only. Generated locally; no network upload.",
2677
2719
  "Status and span kind use OTLP numeric enums (StatusCode 0/1/2, SpanKind INTERNAL=1).",
2678
- "When present on source events, operationId/attemptId/retryOf/attemptNumber are emitted as bounded agent_inspect.* identity attributes (not a broad attribute dump)."
2720
+ "When present on source events, operationId/attemptId/retryOf/attemptNumber are emitted as bounded agent_inspect.* identity attributes (not a broad attribute dump).",
2721
+ "When direct and nested identity disagree, export prefers direct for non-strict consumers and emits agent_inspect.identity_conflict.* for the nested alternate; this does not certify conflicting identity."
2679
2722
  ];
2680
2723
  const traceId = hexFrom2(`trace:${tree.runId}`, 16);
2681
2724
  const includeAttributes = options?.includeAttributes ?? false;
@@ -2723,11 +2766,16 @@ function exportOtlpJson(tree, options) {
2723
2766
  if (typeof inp === "number") attrs.push(intAttr("gen_ai.usage.input_tokens", inp));
2724
2767
  if (typeof outp === "number") attrs.push(intAttr("gen_ai.usage.output_tokens", outp));
2725
2768
  }
2726
- appendStructuralIdentityAttrs(
2769
+ const identityConflicts = appendStructuralIdentityAttrs(
2727
2770
  attrs,
2728
2771
  meta && typeof meta === "object" ? meta : void 0,
2729
2772
  maxLen
2730
2773
  );
2774
+ if (identityConflicts.length > 0) {
2775
+ warnings.push(
2776
+ `Identity representation conflict on event ${ev.eventId}: ${identityConflicts.join(", ")} (direct preferred; nested retained on agent_inspect.identity_conflict.*).`
2777
+ );
2778
+ }
2731
2779
  if (includeAttributes && meta && typeof meta === "object") {
2732
2780
  const skipKeys = /* @__PURE__ */ new Set([
2733
2781
  "tokens",
@@ -4040,7 +4088,7 @@ async function newestTraceMtimeMs(traceDir) {
4040
4088
  }
4041
4089
  async function loadSessionRuns(traceDir) {
4042
4090
  try {
4043
- const mod = await import('./src-VMGRSTG7.mjs');
4091
+ const mod = await import('./src-EWZYLDST.mjs');
4044
4092
  const dbPath = mod.resolveIndexDbPath(traceDir);
4045
4093
  const status = mod.indexStatus(dbPath);
4046
4094
  if (!status.healthy) {
@@ -14022,7 +14070,7 @@ function isModuleNotFound4(e) {
14022
14070
  }
14023
14071
  async function loadIndexSqlite() {
14024
14072
  try {
14025
- return await import('./src-VMGRSTG7.mjs');
14073
+ return await import('./src-EWZYLDST.mjs');
14026
14074
  } catch (e) {
14027
14075
  if (isModuleNotFound4(e)) {
14028
14076
  console.error(