agent-inspect 6.31.33 → 6.31.35
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/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/docs/LIMITATIONS.md +22 -0
- package/docs/SAFE-TRACE-SHARING.md +1 -1
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-AILSHDEF.mjs → chunk-RLFYFWIZ.mjs} +76 -22
- package/packages/cli/dist/chunk-RLFYFWIZ.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +136 -37
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +64 -19
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-SP36M4VB.mjs → src-S23RCPL2.mjs} +3 -3
- package/packages/cli/dist/{src-SP36M4VB.mjs.map → src-S23RCPL2.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +47 -7
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.mjs +9 -9
- package/packages/core/dist/checks.cjs +71 -18
- package/packages/core/dist/checks.cjs.map +1 -1
- package/packages/core/dist/checks.mjs +3 -3
- package/packages/core/dist/{chunk-6S666BF4.mjs → chunk-2SKAI5ZN.mjs} +3 -3
- package/packages/core/dist/{chunk-6S666BF4.mjs.map → chunk-2SKAI5ZN.mjs.map} +1 -1
- package/packages/core/dist/{chunk-EMDJLFRK.mjs → chunk-3OMB34E6.mjs} +74 -21
- package/packages/core/dist/chunk-3OMB34E6.mjs.map +1 -0
- package/packages/core/dist/{chunk-FBPDF7HO.mjs → chunk-6F6KLGCR.mjs} +3 -3
- package/packages/core/dist/{chunk-FBPDF7HO.mjs.map → chunk-6F6KLGCR.mjs.map} +1 -1
- package/packages/core/dist/{chunk-RB6WANSW.mjs → chunk-PU3FF5AP.mjs} +5 -4
- package/packages/core/dist/chunk-PU3FF5AP.mjs.map +1 -0
- package/packages/core/dist/{chunk-VIEJJ5JB.mjs → chunk-X5RP2E2H.mjs} +4 -4
- package/packages/core/dist/{chunk-VIEJJ5JB.mjs.map → chunk-X5RP2E2H.mjs.map} +1 -1
- package/packages/core/dist/exporters.cjs +33 -9
- package/packages/core/dist/exporters.cjs.map +1 -1
- package/packages/core/dist/exporters.mjs +33 -10
- package/packages/core/dist/exporters.mjs.map +1 -1
- package/packages/core/dist/index.cjs +3 -2
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.mjs +4 -4
- package/packages/core/dist/writers.cjs +3 -2
- package/packages/core/dist/writers.cjs.map +1 -1
- package/packages/core/dist/writers.mjs +1 -1
- package/packages/cli/dist/chunk-AILSHDEF.mjs.map +0 -1
- package/packages/core/dist/chunk-EMDJLFRK.mjs.map +0 -1
- package/packages/core/dist/chunk-RB6WANSW.mjs.map +0 -1
|
@@ -269,8 +269,9 @@ var init_credential_value_patterns = __esm({
|
|
|
269
269
|
/\beyJ[a-zA-Z0-9_-]{8,}\.[a-zA-Z0-9_-]{8,}\.[a-zA-Z0-9_-]{8,}\b/,
|
|
270
270
|
/\b(?:sk-(?:proj-)?[a-zA-Z0-9_-]{16,}|sk-ant-[a-zA-Z0-9_-]{16,}|AIza[0-9A-Za-z_-]{20,})\b/,
|
|
271
271
|
// Stripe secret / restricted keys use underscores (not sk-). Keep in sync with
|
|
272
|
-
// packages/redact/src/index.ts + packages/core/src/checks DEFAULT_SECRET_PATTERNS (#520).
|
|
273
|
-
|
|
272
|
+
// packages/redact/src/index.ts + packages/core/src/checks DEFAULT_SECRET_PATTERNS (#520/#528).
|
|
273
|
+
// Use non-alnum lookarounds so underscore-adjacent forms (acct_sk_live_…, …_eu) match.
|
|
274
|
+
/(?<![A-Za-z0-9])(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}(?![A-Za-z0-9])/,
|
|
274
275
|
/\bxox[abposr]-[A-Za-z0-9-]{10,}\b/,
|
|
275
276
|
/\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{20,}\b/,
|
|
276
277
|
/\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/,
|
|
@@ -5728,11 +5729,27 @@ function eventTimestamp(finding, eventById) {
|
|
|
5728
5729
|
const eventId = finding.evidence[0]?.eventId;
|
|
5729
5730
|
return eventId ? eventById.get(eventId)?.timestamp ?? "" : "";
|
|
5730
5731
|
}
|
|
5732
|
+
function isObservedToolPolicyFinding(finding) {
|
|
5733
|
+
return finding.ruleId === "tool.usage" && finding.evidence[0]?.eventId !== void 0;
|
|
5734
|
+
}
|
|
5735
|
+
function isMissingToolConsequenceFinding(finding) {
|
|
5736
|
+
if (finding.evidence[0]?.eventId !== void 0) return false;
|
|
5737
|
+
if (finding.ruleId === "tool.usage" && /did not appear/.test(finding.message)) {
|
|
5738
|
+
return true;
|
|
5739
|
+
}
|
|
5740
|
+
return finding.ruleId.startsWith("contract.tool.arguments") && /^No finished tool named /.test(finding.message);
|
|
5741
|
+
}
|
|
5731
5742
|
function compareFindings(eventById) {
|
|
5732
5743
|
return (a, b) => {
|
|
5733
5744
|
if (SEVERITY_RANK[a.severity] !== SEVERITY_RANK[b.severity]) {
|
|
5734
5745
|
return SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity];
|
|
5735
5746
|
}
|
|
5747
|
+
const aPolicy = isObservedToolPolicyFinding(a);
|
|
5748
|
+
const bPolicy = isObservedToolPolicyFinding(b);
|
|
5749
|
+
const aMissing = isMissingToolConsequenceFinding(a);
|
|
5750
|
+
const bMissing = isMissingToolConsequenceFinding(b);
|
|
5751
|
+
if (aPolicy && bMissing) return -1;
|
|
5752
|
+
if (bPolicy && aMissing) return 1;
|
|
5736
5753
|
const byRule = a.ruleId.localeCompare(b.ruleId);
|
|
5737
5754
|
if (byRule !== 0) return byRule;
|
|
5738
5755
|
if (STATUS_RANK[a.status] !== STATUS_RANK[b.status]) {
|
|
@@ -5868,20 +5885,42 @@ function failFinding(ruleId, message, evidence, expected, actual, meta2) {
|
|
|
5868
5885
|
function toolName(event) {
|
|
5869
5886
|
return resolveCanonicalToolName(event);
|
|
5870
5887
|
}
|
|
5888
|
+
function isAsciiLetterCodePoint(codePoint) {
|
|
5889
|
+
return codePoint >= 65 && codePoint <= 90 || codePoint >= 97 && codePoint <= 122;
|
|
5890
|
+
}
|
|
5891
|
+
function isRiskyToolNameCodePoint(codePoint) {
|
|
5892
|
+
if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) return true;
|
|
5893
|
+
return codePoint === 1564 || codePoint === 8203 || codePoint === 8204 || codePoint === 8205 || codePoint === 8206 || codePoint === 8207 || codePoint >= 8234 && codePoint <= 8238 || codePoint >= 8294 && codePoint <= 8297 || codePoint === 65279;
|
|
5894
|
+
}
|
|
5895
|
+
function formatCodePointDetail(codePoint, index) {
|
|
5896
|
+
return `U+${codePoint.toString(16).toUpperCase().padStart(4, "0")} at index ${index}`;
|
|
5897
|
+
}
|
|
5871
5898
|
function formatToolNameForMessage(name) {
|
|
5899
|
+
let hasAsciiLetter = false;
|
|
5900
|
+
let hasNonAscii = false;
|
|
5901
|
+
let hasRisky = false;
|
|
5872
5902
|
const details = [];
|
|
5873
5903
|
for (let index = 0; index < name.length; ) {
|
|
5874
5904
|
const codePoint = name.codePointAt(index);
|
|
5875
5905
|
const width = codePoint > 65535 ? 2 : 1;
|
|
5906
|
+
if (isAsciiLetterCodePoint(codePoint)) hasAsciiLetter = true;
|
|
5907
|
+
const risky = isRiskyToolNameCodePoint(codePoint);
|
|
5908
|
+
if (risky) hasRisky = true;
|
|
5876
5909
|
if (codePoint > 127) {
|
|
5877
|
-
|
|
5878
|
-
|
|
5879
|
-
|
|
5910
|
+
hasNonAscii = true;
|
|
5911
|
+
details.push(formatCodePointDetail(codePoint, index));
|
|
5912
|
+
} else if (risky) {
|
|
5913
|
+
details.push(formatCodePointDetail(codePoint, index));
|
|
5880
5914
|
}
|
|
5881
5915
|
index += width;
|
|
5882
5916
|
}
|
|
5883
|
-
if (details.length === 0)
|
|
5884
|
-
|
|
5917
|
+
if (!hasRisky && !(hasAsciiLetter && hasNonAscii) || details.length === 0) {
|
|
5918
|
+
return name;
|
|
5919
|
+
}
|
|
5920
|
+
const shown = details.slice(0, MAX_TOOL_NAME_CODEPOINT_DETAILS);
|
|
5921
|
+
const remaining = details.length - shown.length;
|
|
5922
|
+
const detailText = remaining > 0 ? `${shown.join("; ")}; and ${remaining} more` : shown.join("; ");
|
|
5923
|
+
return `"${name}" (contains ${detailText})`;
|
|
5885
5924
|
}
|
|
5886
5925
|
function describeRunningEvent(event) {
|
|
5887
5926
|
if (event.kind === "TOOL") {
|
|
@@ -6505,7 +6544,12 @@ function createStepOrderingRule(options) {
|
|
|
6505
6544
|
const beforeRunning = semanticEvents(context).filter(
|
|
6506
6545
|
(event) => event.kind === options.before.kind && event.status === "running" && stepEndpointName(event, options.before.kind) === options.before.name
|
|
6507
6546
|
);
|
|
6508
|
-
|
|
6547
|
+
const afterRunning = semanticEvents(context).filter(
|
|
6548
|
+
(event) => event.kind === options.after.kind && event.status === "running" && stepEndpointName(event, options.after.kind) === options.after.name
|
|
6549
|
+
);
|
|
6550
|
+
const afterStarted = afterEvents.length > 0 || afterRunning.length > 0;
|
|
6551
|
+
const afterEvidenceEvent = afterEvents[0] ?? afterRunning[0];
|
|
6552
|
+
if (beforeRunning.length > 0 && afterStarted && afterEvidenceEvent !== void 0) {
|
|
6509
6553
|
const endpointExpected2 = bothTools ? { before: options.before.name, after: options.after.name } : { before: options.before, after: options.after };
|
|
6510
6554
|
return [
|
|
6511
6555
|
failFinding(
|
|
@@ -6513,18 +6557,20 @@ function createStepOrderingRule(options) {
|
|
|
6513
6557
|
`${subject} ${beforeLabel} started but never finished before ${afterLabel} ran.`,
|
|
6514
6558
|
[
|
|
6515
6559
|
...beforeRunning.map((event) => eventEvidence(event)),
|
|
6516
|
-
eventEvidence(
|
|
6560
|
+
eventEvidence(afterEvidenceEvent)
|
|
6517
6561
|
],
|
|
6518
6562
|
{ ...endpointExpected2, mode },
|
|
6519
6563
|
{
|
|
6520
6564
|
code: bothTools ? "tool.order.interval-unresolved" : "step.order.interval-unresolved",
|
|
6521
6565
|
unfinishedBefore: true,
|
|
6522
|
-
beforeStatus: "running"
|
|
6566
|
+
beforeStatus: "running",
|
|
6567
|
+
...beforeEvents.length > 0 ? { finishedBeforeMasked: true } : {},
|
|
6568
|
+
...afterEvents.length === 0 ? { afterStatus: "running" } : {}
|
|
6523
6569
|
}
|
|
6524
6570
|
)
|
|
6525
6571
|
];
|
|
6526
6572
|
}
|
|
6527
|
-
if (beforeEvents.length === 0 ||
|
|
6573
|
+
if (beforeEvents.length === 0 || !afterStarted) {
|
|
6528
6574
|
if (!requireEndpoints) return [];
|
|
6529
6575
|
const findings = [];
|
|
6530
6576
|
if (beforeEvents.length === 0) {
|
|
@@ -6548,7 +6594,7 @@ function createStepOrderingRule(options) {
|
|
|
6548
6594
|
)
|
|
6549
6595
|
);
|
|
6550
6596
|
}
|
|
6551
|
-
if (
|
|
6597
|
+
if (!afterStarted) {
|
|
6552
6598
|
const otherKinds = otherKindsForStepName(
|
|
6553
6599
|
context,
|
|
6554
6600
|
options.after.kind,
|
|
@@ -6571,9 +6617,15 @@ function createStepOrderingRule(options) {
|
|
|
6571
6617
|
}
|
|
6572
6618
|
return findings;
|
|
6573
6619
|
}
|
|
6574
|
-
const
|
|
6575
|
-
|
|
6576
|
-
|
|
6620
|
+
const afterForOrder = afterEvents.length > 0 ? afterEvents : afterRunning;
|
|
6621
|
+
const encounter = [
|
|
6622
|
+
...finishedEvents(context).filter(
|
|
6623
|
+
(event) => event.kind === options.before.kind && stepEndpointName(event, options.before.kind) === options.before.name || event.kind === options.after.kind && stepEndpointName(event, options.after.kind) === options.after.name
|
|
6624
|
+
),
|
|
6625
|
+
...afterEvents.length === 0 ? afterRunning.filter(
|
|
6626
|
+
(event) => !finishedEvents(context).some((finished) => finished.eventId === event.eventId)
|
|
6627
|
+
) : []
|
|
6628
|
+
];
|
|
6577
6629
|
let beforeIndex;
|
|
6578
6630
|
let afterIndex;
|
|
6579
6631
|
for (const [position, event] of encounter.entries()) {
|
|
@@ -6604,7 +6656,7 @@ function createStepOrderingRule(options) {
|
|
|
6604
6656
|
];
|
|
6605
6657
|
}
|
|
6606
6658
|
const beforeEvent = beforeEvents[0];
|
|
6607
|
-
const afterEvent =
|
|
6659
|
+
const afterEvent = afterForOrder[0];
|
|
6608
6660
|
const beforeEnd = eventEndMs(beforeEvent);
|
|
6609
6661
|
const afterStart = eventStartMs(afterEvent);
|
|
6610
6662
|
const endpointExpected = bothTools ? { before: options.before.name, after: options.after.name } : { before: options.before, after: options.after };
|
|
@@ -6690,7 +6742,7 @@ function createStepOrderingRule(options) {
|
|
|
6690
6742
|
latestBefore = { event, end };
|
|
6691
6743
|
}
|
|
6692
6744
|
}
|
|
6693
|
-
for (const event of
|
|
6745
|
+
for (const event of afterForOrder) {
|
|
6694
6746
|
const start = eventStartMs(event);
|
|
6695
6747
|
if (start === void 0) {
|
|
6696
6748
|
missingAfterStarts += 1;
|
|
@@ -6719,7 +6771,7 @@ function createStepOrderingRule(options) {
|
|
|
6719
6771
|
const tie = tiedEnd === tiedStart ? recordedTieOrder(
|
|
6720
6772
|
context,
|
|
6721
6773
|
beforeEvents.filter((event) => eventEndMs(event) === tiedEnd),
|
|
6722
|
-
|
|
6774
|
+
afterForOrder.filter((event) => eventStartMs(event) === tiedStart)
|
|
6723
6775
|
) : void 0;
|
|
6724
6776
|
if (latestBefore.end > earliestAfter.start || tie !== void 0 && tie.inOrder !== true) {
|
|
6725
6777
|
return [
|
|
@@ -7595,7 +7647,7 @@ function runTraceChecks(input3, options = {}) {
|
|
|
7595
7647
|
ruleExecutions
|
|
7596
7648
|
};
|
|
7597
7649
|
}
|
|
7598
|
-
var SEVERITY_RANK, STATUS_RANK, CONFIDENCE_RANK, DEFAULT_SENSITIVE_KEYS, DEFAULT_RAW_CONTENT_KEYS, DEFAULT_SAFE_RAW_CONTENT_PATH_PREFIXES, SAFE_USAGE_LEAF_KEYS, DEFAULT_SECRET_PATTERNS;
|
|
7650
|
+
var SEVERITY_RANK, STATUS_RANK, CONFIDENCE_RANK, DEFAULT_SENSITIVE_KEYS, DEFAULT_RAW_CONTENT_KEYS, DEFAULT_SAFE_RAW_CONTENT_PATH_PREFIXES, SAFE_USAGE_LEAF_KEYS, DEFAULT_SECRET_PATTERNS, MAX_TOOL_NAME_CODEPOINT_DETAILS;
|
|
7599
7651
|
var init_checks2 = __esm({
|
|
7600
7652
|
"packages/core/src/checks/index.ts"() {
|
|
7601
7653
|
init_inspect_event();
|
|
@@ -7684,10 +7736,11 @@ var init_checks2 = __esm({
|
|
|
7684
7736
|
DEFAULT_SECRET_PATTERNS = [
|
|
7685
7737
|
{ id: "bearer-token", pattern: /Bearer\s+[A-Za-z0-9._~+/-]{12,}=*/ },
|
|
7686
7738
|
{ id: "openai-key", pattern: /sk-[A-Za-z0-9_-]{16,}/ },
|
|
7687
|
-
// Stripe + Slack: keep in sync with packages/redact + credential-value-patterns (#520).
|
|
7739
|
+
// Stripe + Slack: keep in sync with packages/redact + credential-value-patterns (#520/#528).
|
|
7740
|
+
// Non-alnum lookarounds so underscore-adjacent forms (acct_sk_live_…, …_eu) match.
|
|
7688
7741
|
{
|
|
7689
7742
|
id: "stripe-key",
|
|
7690
|
-
pattern:
|
|
7743
|
+
pattern: /(?<![A-Za-z0-9])(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}(?![A-Za-z0-9])/
|
|
7691
7744
|
},
|
|
7692
7745
|
{ id: "slack-token", pattern: /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/ },
|
|
7693
7746
|
{ id: "aws-access-key", pattern: /AKIA[0-9A-Z]{16}/ },
|
|
@@ -7698,6 +7751,7 @@ var init_checks2 = __esm({
|
|
|
7698
7751
|
pattern: /\b(?:api[_-]?key|internal[_-]?token|access[_-]?token|auth[_-]?token|password|secret|token)=(?!\[(?:REDACTED|HASH:(?:[0-9a-f]{8}|unknown))\](?![^\s"'\\&#?]))([^\s"'\\]{8,})/i
|
|
7699
7752
|
}
|
|
7700
7753
|
];
|
|
7754
|
+
MAX_TOOL_NAME_CODEPOINT_DETAILS = 3;
|
|
7701
7755
|
}
|
|
7702
7756
|
});
|
|
7703
7757
|
|
|
@@ -17464,7 +17518,7 @@ var init_src = __esm({
|
|
|
17464
17518
|
});
|
|
17465
17519
|
|
|
17466
17520
|
// package.json
|
|
17467
|
-
var version = "6.31.
|
|
17521
|
+
var version = "6.31.35";
|
|
17468
17522
|
|
|
17469
17523
|
// packages/cli/src/list.ts
|
|
17470
17524
|
init_advanced();
|
|
@@ -19692,11 +19746,25 @@ function attemptIdOf3(event) {
|
|
|
19692
19746
|
}
|
|
19693
19747
|
return void 0;
|
|
19694
19748
|
}
|
|
19749
|
+
function operationIdOf(event) {
|
|
19750
|
+
const direct = event.attributes?.operationId;
|
|
19751
|
+
if (typeof direct === "string" && direct.trim() !== "") return direct;
|
|
19752
|
+
const meta2 = event.attributes?.metadata;
|
|
19753
|
+
if (meta2 && typeof meta2 === "object" && !Array.isArray(meta2)) {
|
|
19754
|
+
const nested = meta2.operationId;
|
|
19755
|
+
if (typeof nested === "string" && nested.trim() !== "") return nested;
|
|
19756
|
+
}
|
|
19757
|
+
return void 0;
|
|
19758
|
+
}
|
|
19695
19759
|
function lifecycleKey(event) {
|
|
19696
19760
|
if (event.kind === "RUN") return `run:${event.runId}`;
|
|
19697
19761
|
const stepId = stepIdOf2(event);
|
|
19698
|
-
if (stepId
|
|
19699
|
-
|
|
19762
|
+
if (stepId === void 0) return `event:${event.eventId}`;
|
|
19763
|
+
const attemptId = attemptIdOf3(event);
|
|
19764
|
+
if (attemptId !== void 0) return `step:${stepId}:attempt:${attemptId}`;
|
|
19765
|
+
const operationId = operationIdOf(event);
|
|
19766
|
+
if (operationId !== void 0) return `step:${stepId}:op:${operationId}`;
|
|
19767
|
+
return `step:${stepId}`;
|
|
19700
19768
|
}
|
|
19701
19769
|
function isTerminal(status) {
|
|
19702
19770
|
return status === "ok" || status === "error";
|
|
@@ -19747,6 +19815,12 @@ function joinSiblingGroup(group) {
|
|
|
19747
19815
|
const others = group.filter(
|
|
19748
19816
|
(n) => !isTerminal(n.event.status) && n.event.status !== "running"
|
|
19749
19817
|
);
|
|
19818
|
+
const operationIds = new Set(
|
|
19819
|
+
group.map((n) => operationIdOf(n.event)).filter((id) => id !== void 0)
|
|
19820
|
+
);
|
|
19821
|
+
if (operationIds.size > 1) {
|
|
19822
|
+
return group;
|
|
19823
|
+
}
|
|
19750
19824
|
const terminalStatuses = new Set(terminals.map((n) => n.event.status));
|
|
19751
19825
|
if (terminalStatuses.size > 1) {
|
|
19752
19826
|
return group;
|
|
@@ -19758,19 +19832,22 @@ function joinSiblingGroup(group) {
|
|
|
19758
19832
|
const out = [];
|
|
19759
19833
|
for (const terminal of terminals) {
|
|
19760
19834
|
const terminalAttempt = attemptIdOf3(terminal.event);
|
|
19835
|
+
const terminalOp = operationIdOf(terminal.event);
|
|
19761
19836
|
const terminalTs = eventTime3(terminal.event);
|
|
19762
|
-
const
|
|
19837
|
+
const candidates = runnings.filter((r) => {
|
|
19763
19838
|
if (usedRunning.has(r.event.eventId)) return false;
|
|
19764
19839
|
if (eventTime3(r.event) > terminalTs) return false;
|
|
19840
|
+
const runningOp = operationIdOf(r.event);
|
|
19841
|
+
if (terminalOp !== void 0 && runningOp !== void 0 && terminalOp !== runningOp) {
|
|
19842
|
+
return false;
|
|
19843
|
+
}
|
|
19765
19844
|
const runningAttempt = attemptIdOf3(r.event);
|
|
19766
19845
|
if (terminalAttempt !== void 0) {
|
|
19767
19846
|
return runningAttempt === terminalAttempt;
|
|
19768
19847
|
}
|
|
19769
|
-
|
|
19770
|
-
return true;
|
|
19771
|
-
}
|
|
19772
|
-
return true;
|
|
19848
|
+
return runningAttempt === void 0;
|
|
19773
19849
|
});
|
|
19850
|
+
const candidate = candidates.length === 1 ? candidates[0] : void 0;
|
|
19774
19851
|
if (candidate) {
|
|
19775
19852
|
usedRunning.add(candidate.event.eventId);
|
|
19776
19853
|
out.push(joinOnePair(candidate, terminal));
|
|
@@ -22660,10 +22737,11 @@ var credentialDetectors = [
|
|
|
22660
22737
|
severity: "error"
|
|
22661
22738
|
}),
|
|
22662
22739
|
// Stripe secret/restricted keys (underscore form). Keep in sync with
|
|
22663
|
-
// packages/core/src/safety/credential-value-patterns.ts + checks DEFAULT_SECRET_PATTERNS (#520).
|
|
22740
|
+
// packages/core/src/safety/credential-value-patterns.ts + checks DEFAULT_SECRET_PATTERNS (#520/#528).
|
|
22741
|
+
// Non-alnum lookarounds so underscore-adjacent forms (acct_sk_live_…, …_eu) match.
|
|
22664
22742
|
patternDetector({
|
|
22665
22743
|
id: "value.stripeSecretKey",
|
|
22666
|
-
pattern:
|
|
22744
|
+
pattern: /(?<![A-Za-z0-9])(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}(?![A-Za-z0-9])/,
|
|
22667
22745
|
severity: "error"
|
|
22668
22746
|
}),
|
|
22669
22747
|
patternDetector({
|
|
@@ -24444,6 +24522,21 @@ function stableJson2(value) {
|
|
|
24444
24522
|
return `${JSON.stringify(value, null, 2)}
|
|
24445
24523
|
`;
|
|
24446
24524
|
}
|
|
24525
|
+
function alignCheckResultsAggregateStatus(checkResultsJson, assessmentStatus) {
|
|
24526
|
+
let parsed;
|
|
24527
|
+
try {
|
|
24528
|
+
parsed = JSON.parse(checkResultsJson);
|
|
24529
|
+
} catch {
|
|
24530
|
+
return stableJson2({
|
|
24531
|
+
aggregateStatus: assessmentStatus,
|
|
24532
|
+
raw: checkResultsJson
|
|
24533
|
+
});
|
|
24534
|
+
}
|
|
24535
|
+
return stableJson2({
|
|
24536
|
+
...parsed,
|
|
24537
|
+
aggregateStatus: assessmentStatus
|
|
24538
|
+
});
|
|
24539
|
+
}
|
|
24447
24540
|
async function writeLocalEvidence(input3) {
|
|
24448
24541
|
const profile = input3.redactionProfile ?? "share";
|
|
24449
24542
|
const format = input3.format ?? "directory";
|
|
@@ -24482,6 +24575,10 @@ async function writeLocalEvidence(input3) {
|
|
|
24482
24575
|
format: "agent-inspect-jsonl"
|
|
24483
24576
|
});
|
|
24484
24577
|
const assessmentStatus = residualStatusToEvidenceSafe(residual.status);
|
|
24578
|
+
const checkResultsJson = alignCheckResultsAggregateStatus(
|
|
24579
|
+
input3.checkResultsJson,
|
|
24580
|
+
assessmentStatus
|
|
24581
|
+
);
|
|
24485
24582
|
const evidencePackage = buildEvidenceCiPackage({
|
|
24486
24583
|
generatorVersion: version,
|
|
24487
24584
|
runIds: input3.runIds,
|
|
@@ -24489,7 +24586,7 @@ async function writeLocalEvidence(input3) {
|
|
|
24489
24586
|
redactedTraceJsonl: combined,
|
|
24490
24587
|
redactionProfile: profile,
|
|
24491
24588
|
assessmentStatus,
|
|
24492
|
-
checkResultsJson
|
|
24589
|
+
checkResultsJson,
|
|
24493
24590
|
...input3.summaryText !== void 0 ? { summaryText: input3.summaryText } : {},
|
|
24494
24591
|
...input3.contractPackage !== void 0 ? { contractPackage: input3.contractPackage } : {}
|
|
24495
24592
|
});
|
|
@@ -24550,12 +24647,12 @@ async function writeLocalEvidence(input3) {
|
|
|
24550
24647
|
return baseDir;
|
|
24551
24648
|
}
|
|
24552
24649
|
function checkResultToEvidenceJson(result, runIds) {
|
|
24553
|
-
const status = result.status === "pass" ? "SAFE" : result.status === "fail" ? "UNSAFE" : "UNKNOWN";
|
|
24554
24650
|
return stableJson2({
|
|
24555
|
-
aggregateStatus:
|
|
24651
|
+
aggregateStatus: "UNKNOWN",
|
|
24652
|
+
checkStatus: result.status,
|
|
24556
24653
|
runs: runIds.map((runId) => ({
|
|
24557
24654
|
runId,
|
|
24558
|
-
status,
|
|
24655
|
+
checkStatus: result.status,
|
|
24559
24656
|
errors: result.summary.errors,
|
|
24560
24657
|
warnings: result.summary.warnings,
|
|
24561
24658
|
findings: result.findings.length,
|
|
@@ -32608,10 +32705,12 @@ async function gateCommand(options = {}) {
|
|
|
32608
32705
|
runIds: runIds.length > 0 ? runIds : ["gate"],
|
|
32609
32706
|
sourceContents,
|
|
32610
32707
|
...gateOptions.traceDir !== void 0 ? { dir: gateOptions.traceDir } : {},
|
|
32611
|
-
|
|
32708
|
+
// aggregateStatus is filled from residual assessment before hashing (#529).
|
|
32709
|
+
// Gate pass/fail stays in `gate` / process.exitCode, not aggregateStatus.
|
|
32612
32710
|
checkResultsJson: `${JSON.stringify(
|
|
32613
32711
|
{
|
|
32614
|
-
aggregateStatus:
|
|
32712
|
+
aggregateStatus: "UNKNOWN",
|
|
32713
|
+
gateStatus: failed ? "fail" : "pass",
|
|
32615
32714
|
gate: result
|
|
32616
32715
|
},
|
|
32617
32716
|
null,
|