agent-inspect 6.31.30 → 6.31.32

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/docs/CLI.md +3 -1
  4. package/docs/TRACE-CONTRACTS.md +2 -0
  5. package/package.json +2 -2
  6. package/packages/cli/dist/{chunk-4GTOJ3G2.mjs → chunk-PEGM6T2X.mjs} +82 -9
  7. package/packages/cli/dist/chunk-PEGM6T2X.mjs.map +1 -0
  8. package/packages/cli/dist/index.cjs +185 -33
  9. package/packages/cli/dist/index.cjs.map +1 -1
  10. package/packages/cli/dist/index.mjs +109 -30
  11. package/packages/cli/dist/index.mjs.map +1 -1
  12. package/packages/cli/dist/{src-BF74ZVDF.mjs → src-CWUJTMRD.mjs} +3 -3
  13. package/packages/cli/dist/{src-BF74ZVDF.mjs.map → src-CWUJTMRD.mjs.map} +1 -1
  14. package/packages/core/dist/advanced.cjs +4 -0
  15. package/packages/core/dist/advanced.cjs.map +1 -1
  16. package/packages/core/dist/advanced.d.cts +2 -2
  17. package/packages/core/dist/advanced.d.ts +2 -2
  18. package/packages/core/dist/advanced.mjs +9 -9
  19. package/packages/core/dist/checks.cjs +76 -7
  20. package/packages/core/dist/checks.cjs.map +1 -1
  21. package/packages/core/dist/checks.d.cts +2 -2
  22. package/packages/core/dist/checks.d.ts +2 -2
  23. package/packages/core/dist/checks.mjs +3 -3
  24. package/packages/core/dist/{chunk-BYNAJPNH.mjs → chunk-6G67ZN72.mjs} +79 -10
  25. package/packages/core/dist/chunk-6G67ZN72.mjs.map +1 -0
  26. package/packages/core/dist/{chunk-76QIWWJ5.mjs → chunk-6S666BF4.mjs} +3 -3
  27. package/packages/core/dist/{chunk-76QIWWJ5.mjs.map → chunk-6S666BF4.mjs.map} +1 -1
  28. package/packages/core/dist/{chunk-QMO3ITYF.mjs → chunk-FBPDF7HO.mjs} +3 -3
  29. package/packages/core/dist/{chunk-QMO3ITYF.mjs.map → chunk-FBPDF7HO.mjs.map} +1 -1
  30. package/packages/core/dist/{chunk-XM27TZLD.mjs → chunk-RB6WANSW.mjs} +6 -2
  31. package/packages/core/dist/chunk-RB6WANSW.mjs.map +1 -0
  32. package/packages/core/dist/{chunk-JTJN4KBJ.mjs → chunk-VIEJJ5JB.mjs} +4 -4
  33. package/packages/core/dist/{chunk-JTJN4KBJ.mjs.map → chunk-VIEJJ5JB.mjs.map} +1 -1
  34. package/packages/core/dist/exporters.cjs +89 -22
  35. package/packages/core/dist/exporters.cjs.map +1 -1
  36. package/packages/core/dist/exporters.mjs +88 -25
  37. package/packages/core/dist/exporters.mjs.map +1 -1
  38. package/packages/core/dist/{index-DACU4Dy1.d.cts → index-Ceyw5x7b.d.cts} +4 -2
  39. package/packages/core/dist/{index-b4tIGrzq.d.ts → index-K5Cinf1r.d.ts} +4 -2
  40. package/packages/core/dist/index.cjs +4 -0
  41. package/packages/core/dist/index.cjs.map +1 -1
  42. package/packages/core/dist/index.mjs +4 -4
  43. package/packages/core/dist/writers.cjs +4 -0
  44. package/packages/core/dist/writers.cjs.map +1 -1
  45. package/packages/core/dist/writers.mjs +1 -1
  46. package/packages/cli/dist/chunk-4GTOJ3G2.mjs.map +0 -1
  47. package/packages/core/dist/chunk-BYNAJPNH.mjs.map +0 -1
  48. package/packages/core/dist/chunk-XM27TZLD.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, persistedInspectEventsToRunTrees, 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, 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-4GTOJ3G2.mjs';
2
+ import { ATTRIBUTION_CONFIDENCES, createSafetyRawContentRule, createSafetyRedactionRule, createSafetySecretPatternRule, createSafetyOversizedAttributeRule, resolveTraceDir, parseDuration, buildSessionIndex, resolveBundleRunIds, getTraceFilePath, openTrace, sha256Hex, collectTraceSchemaVersions, persistedInspectEventsToRunTrees, 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, 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-PEGM6T2X.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.30";
17
+ var version = "6.31.32";
18
18
 
19
19
  // packages/cli/src/trace-dir-scale.ts
20
20
  var TRACE_COUNT_WARN = 1e3;
@@ -2178,6 +2178,16 @@ function stepIdOf(event) {
2178
2178
  const value = event.attributes?.stepId;
2179
2179
  return typeof value === "string" && value.trim() !== "" ? value : void 0;
2180
2180
  }
2181
+ function attemptIdOf(event) {
2182
+ const direct = event.attributes?.attemptId;
2183
+ if (typeof direct === "string" && direct.trim() !== "") return direct;
2184
+ const meta = event.attributes?.metadata;
2185
+ if (meta && typeof meta === "object" && !Array.isArray(meta)) {
2186
+ const nested = meta.attemptId;
2187
+ if (typeof nested === "string" && nested.trim() !== "") return nested;
2188
+ }
2189
+ return void 0;
2190
+ }
2181
2191
  function lifecycleKey(event) {
2182
2192
  if (event.kind === "RUN") return `run:${event.runId}`;
2183
2193
  const stepId = stepIdOf(event);
@@ -2187,6 +2197,9 @@ function lifecycleKey(event) {
2187
2197
  function isTerminal(status) {
2188
2198
  return status === "ok" || status === "error";
2189
2199
  }
2200
+ function eventTime(event) {
2201
+ return typeof event.timestamp === "number" ? event.timestamp : 0;
2202
+ }
2190
2203
  function cloneNode(node) {
2191
2204
  return {
2192
2205
  event: {
@@ -2197,37 +2210,87 @@ function cloneNode(node) {
2197
2210
  depth: node.depth
2198
2211
  };
2199
2212
  }
2213
+ function joinOnePair(start, terminal) {
2214
+ const childMap = /* @__PURE__ */ new Map();
2215
+ if (start) {
2216
+ for (const child of start.children) {
2217
+ childMap.set(child.event.eventId, child);
2218
+ }
2219
+ }
2220
+ for (const child of terminal.children) {
2221
+ childMap.set(child.event.eventId, child);
2222
+ }
2223
+ return {
2224
+ event: {
2225
+ ...terminal.event,
2226
+ name: start?.event.name ?? terminal.event.name,
2227
+ kind: start?.event.kind ?? terminal.event.kind,
2228
+ ...start && attemptIdOf(terminal.event) === void 0 && attemptIdOf(start.event) ? {
2229
+ attributes: {
2230
+ ...terminal.event.attributes,
2231
+ attemptId: attemptIdOf(start.event)
2232
+ }
2233
+ } : {}
2234
+ },
2235
+ children: presentSiblingNodes([...childMap.values()]),
2236
+ depth: terminal.depth
2237
+ };
2238
+ }
2200
2239
  function joinSiblingGroup(group) {
2201
2240
  if (group.length <= 1) return group;
2202
- const terminals = group.filter((n) => isTerminal(n.event.status));
2203
- const runnings = group.filter((n) => n.event.status === "running");
2241
+ const terminals = group.filter((n) => isTerminal(n.event.status)).sort((a, b) => eventTime(a.event) - eventTime(b.event));
2242
+ const runnings = group.filter((n) => n.event.status === "running").sort((a, b) => eventTime(a.event) - eventTime(b.event));
2243
+ const others = group.filter(
2244
+ (n) => !isTerminal(n.event.status) && n.event.status !== "running"
2245
+ );
2204
2246
  const terminalStatuses = new Set(terminals.map((n) => n.event.status));
2205
2247
  if (terminalStatuses.size > 1) {
2206
2248
  return group;
2207
2249
  }
2208
- if (terminals.length >= 1) {
2209
- const terminal = terminals[terminals.length - 1];
2210
- const start = runnings[0];
2211
- const childMap = /* @__PURE__ */ new Map();
2212
- for (const n of group) {
2213
- for (const child of n.children) {
2214
- childMap.set(child.event.eventId, child);
2215
- }
2250
+ if (terminals.length > 1 && terminals.every((t) => attemptIdOf(t.event) === void 0) && runnings.every((r) => attemptIdOf(r.event) === void 0)) {
2251
+ return group;
2252
+ }
2253
+ const usedRunning = /* @__PURE__ */ new Set();
2254
+ const out = [];
2255
+ for (const terminal of terminals) {
2256
+ const terminalAttempt = attemptIdOf(terminal.event);
2257
+ const terminalTs = eventTime(terminal.event);
2258
+ const candidate = runnings.find((r) => {
2259
+ if (usedRunning.has(r.event.eventId)) return false;
2260
+ if (eventTime(r.event) > terminalTs) return false;
2261
+ const runningAttempt = attemptIdOf(r.event);
2262
+ if (terminalAttempt !== void 0) {
2263
+ return runningAttempt === terminalAttempt;
2264
+ }
2265
+ if (runningAttempt !== void 0) {
2266
+ return true;
2267
+ }
2268
+ return true;
2269
+ });
2270
+ if (candidate) {
2271
+ usedRunning.add(candidate.event.eventId);
2272
+ out.push(joinOnePair(candidate, terminal));
2273
+ } else {
2274
+ out.push({
2275
+ ...terminal,
2276
+ children: presentSiblingNodes(terminal.children)
2277
+ });
2216
2278
  }
2217
- return [
2218
- {
2219
- event: {
2220
- ...terminal.event,
2221
- name: start?.event.name ?? terminal.event.name,
2222
- kind: start?.event.kind ?? terminal.event.kind,
2223
- ...start?.event.timestamp !== void 0 && terminal.event.durationMs === void 0 ? {} : {}
2224
- },
2225
- children: presentSiblingNodes([...childMap.values()]),
2226
- depth: terminal.depth
2227
- }
2228
- ];
2229
2279
  }
2230
- return group;
2280
+ for (const running of runnings) {
2281
+ if (usedRunning.has(running.event.eventId)) continue;
2282
+ out.push({
2283
+ ...running,
2284
+ children: presentSiblingNodes(running.children)
2285
+ });
2286
+ }
2287
+ for (const other of others) {
2288
+ out.push({
2289
+ ...other,
2290
+ children: presentSiblingNodes(other.children)
2291
+ });
2292
+ }
2293
+ return out;
2231
2294
  }
2232
2295
  function presentSiblingNodes(nodes) {
2233
2296
  const prepared = nodes.map((n) => ({
@@ -4180,7 +4243,7 @@ async function newestTraceMtimeMs(traceDir) {
4180
4243
  }
4181
4244
  async function loadSessionRuns(traceDir) {
4182
4245
  try {
4183
- const mod = await import('./src-BF74ZVDF.mjs');
4246
+ const mod = await import('./src-CWUJTMRD.mjs');
4184
4247
  const dbPath = mod.resolveIndexDbPath(traceDir);
4185
4248
  const status = mod.indexStatus(dbPath);
4186
4249
  if (!status.healthy) {
@@ -5053,6 +5116,18 @@ var credentialDetectors = [
5053
5116
  pattern: /\b(?:sk-(?:proj-)?[a-zA-Z0-9_-]{16,}|sk-ant-[a-zA-Z0-9_-]{16,}|AIza[0-9A-Za-z_-]{20,})\b/,
5054
5117
  severity: "error"
5055
5118
  }),
5119
+ // Stripe secret/restricted keys (underscore form). Keep in sync with
5120
+ // packages/core/src/safety/credential-value-patterns.ts + checks DEFAULT_SECRET_PATTERNS (#520).
5121
+ patternDetector({
5122
+ id: "value.stripeSecretKey",
5123
+ pattern: /\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\b/,
5124
+ severity: "error"
5125
+ }),
5126
+ patternDetector({
5127
+ id: "value.slackToken",
5128
+ pattern: /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/,
5129
+ severity: "error"
5130
+ }),
5056
5131
  patternDetector({
5057
5132
  id: "value.githubToken",
5058
5133
  pattern: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{20,}\b/,
@@ -6800,8 +6875,9 @@ function parseEvidenceFormat(value) {
6800
6875
  `Unsupported --evidence-format "${value}". Use directory, html, or zip.`
6801
6876
  );
6802
6877
  }
6803
- function toAssessmentStatus(failed) {
6804
- return failed ? "UNSAFE" : "SAFE";
6878
+ function residualStatusToEvidenceSafe(status) {
6879
+ if (status === "SAFE_WITH_WARNINGS") return "SAFE WITH WARNINGS";
6880
+ return status;
6805
6881
  }
6806
6882
  function stableJson2(value) {
6807
6883
  return `${JSON.stringify(value, null, 2)}
@@ -6841,7 +6917,10 @@ async function writeLocalEvidence(input3) {
6841
6917
  combined += redacted.content.endsWith("\n") ? redacted.content : `${redacted.content}
6842
6918
  `;
6843
6919
  }
6844
- const assessmentStatus = toAssessmentStatus(input3.failed);
6920
+ const residual = await assessResidualFromContent(combined, {
6921
+ format: "agent-inspect-jsonl"
6922
+ });
6923
+ const assessmentStatus = residualStatusToEvidenceSafe(residual.status);
6845
6924
  const evidencePackage = buildEvidenceCiPackage({
6846
6925
  generatorVersion: version,
6847
6926
  runIds: input3.runIds,
@@ -14177,7 +14256,7 @@ function isModuleNotFound4(e) {
14177
14256
  }
14178
14257
  async function loadIndexSqlite() {
14179
14258
  try {
14180
- return await import('./src-BF74ZVDF.mjs');
14259
+ return await import('./src-CWUJTMRD.mjs');
14181
14260
  } catch (e) {
14182
14261
  if (isModuleNotFound4(e)) {
14183
14262
  console.error(