agentfootprint 10.1.0 → 10.2.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/CAPABILITIES.md +1 -0
- package/dist/adapters/llm/AnthropicProvider.js +17 -1
- package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/anthropicMessageProjection.js +26 -1
- package/dist/adapters/llm/anthropicMessageProjection.js.map +1 -1
- package/dist/adapters/llm/anthropicMessagesWire.js +42 -37
- package/dist/adapters/llm/anthropicMessagesWire.js.map +1 -1
- package/dist/adapters/llm/anthropicReplayLayout.js +63 -12
- package/dist/adapters/llm/anthropicReplayLayout.js.map +1 -1
- package/dist/adapters/llm/anthropicToolArguments.js +122 -0
- package/dist/adapters/llm/anthropicToolArguments.js.map +1 -0
- package/dist/adapters/types.js.map +1 -1
- package/dist/answer-validation/validate.js +7 -107
- package/dist/answer-validation/validate.js.map +1 -1
- package/dist/core/Agent.js +5 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/arguments/resolve.js +4 -0
- package/dist/core/agent/arguments/resolve.js.map +1 -1
- package/dist/core/agent/arguments/subflow.js +1 -0
- package/dist/core/agent/arguments/subflow.js.map +1 -1
- package/dist/core/agent/findings/types.js.map +1 -1
- package/dist/core/agent/findings/verificationCheck.js +99 -0
- package/dist/core/agent/findings/verificationCheck.js.map +1 -0
- package/dist/core/agent/findings/verificationCheckpoint.js +110 -0
- package/dist/core/agent/findings/verificationCheckpoint.js.map +1 -0
- package/dist/core/agent/findings/verificationConfig.js +119 -0
- package/dist/core/agent/findings/verificationConfig.js.map +1 -0
- package/dist/core/agent/findings/verificationRow.js +181 -0
- package/dist/core/agent/findings/verificationRow.js.map +1 -0
- package/dist/core/agent/findings/verificationState.js +152 -0
- package/dist/core/agent/findings/verificationState.js.map +1 -0
- package/dist/core/agent/findings/verificationTypes.js +23 -0
- package/dist/core/agent/findings/verificationTypes.js.map +1 -0
- package/dist/core/agent/outputEnforcement.js +5 -0
- package/dist/core/agent/outputEnforcement.js.map +1 -1
- package/dist/core/agent/stages/toolCalls.js +20 -3
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/agent/toolArgsValidation.js +12 -1
- package/dist/core/agent/toolArgsValidation.js.map +1 -1
- package/dist/core/runCheckpoint.js +45 -4
- package/dist/core/runCheckpoint.js.map +1 -1
- package/dist/esm/adapters/llm/AnthropicProvider.js +17 -1
- package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/anthropicMessageProjection.js +26 -1
- package/dist/esm/adapters/llm/anthropicMessageProjection.js.map +1 -1
- package/dist/esm/adapters/llm/anthropicMessagesWire.d.ts +9 -3
- package/dist/esm/adapters/llm/anthropicMessagesWire.js +42 -37
- package/dist/esm/adapters/llm/anthropicMessagesWire.js.map +1 -1
- package/dist/esm/adapters/llm/anthropicReplayLayout.d.ts +1 -1
- package/dist/esm/adapters/llm/anthropicReplayLayout.js +63 -12
- package/dist/esm/adapters/llm/anthropicReplayLayout.js.map +1 -1
- package/dist/esm/adapters/llm/anthropicToolArguments.d.ts +31 -0
- package/dist/esm/adapters/llm/anthropicToolArguments.js +118 -0
- package/dist/esm/adapters/llm/anthropicToolArguments.js.map +1 -0
- package/dist/esm/adapters/types.d.ts +17 -0
- package/dist/esm/adapters/types.js.map +1 -1
- package/dist/esm/answer-validation/validate.js +1 -101
- package/dist/esm/answer-validation/validate.js.map +1 -1
- package/dist/esm/core/Agent.js +5 -0
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/arguments/resolve.d.ts +1 -0
- package/dist/esm/core/agent/arguments/resolve.js +4 -0
- package/dist/esm/core/agent/arguments/resolve.js.map +1 -1
- package/dist/esm/core/agent/arguments/subflow.js +1 -0
- package/dist/esm/core/agent/arguments/subflow.js.map +1 -1
- package/dist/esm/core/agent/findings/types.d.ts +2 -1
- package/dist/esm/core/agent/findings/types.js.map +1 -1
- package/dist/esm/core/agent/findings/verificationCheck.d.ts +24 -0
- package/dist/esm/core/agent/findings/verificationCheck.js +95 -0
- package/dist/esm/core/agent/findings/verificationCheck.js.map +1 -0
- package/dist/esm/core/agent/findings/verificationCheckpoint.d.ts +10 -0
- package/dist/esm/core/agent/findings/verificationCheckpoint.js +104 -0
- package/dist/esm/core/agent/findings/verificationCheckpoint.js.map +1 -0
- package/dist/esm/core/agent/findings/verificationConfig.d.ts +30 -0
- package/dist/esm/core/agent/findings/verificationConfig.js +115 -0
- package/dist/esm/core/agent/findings/verificationConfig.js.map +1 -0
- package/dist/esm/core/agent/findings/verificationRow.d.ts +16 -0
- package/dist/esm/core/agent/findings/verificationRow.js +174 -0
- package/dist/esm/core/agent/findings/verificationRow.js.map +1 -0
- package/dist/esm/core/agent/findings/verificationState.d.ts +39 -0
- package/dist/esm/core/agent/findings/verificationState.js +143 -0
- package/dist/esm/core/agent/findings/verificationState.js.map +1 -0
- package/dist/esm/core/agent/findings/verificationTypes.d.ts +55 -0
- package/dist/esm/core/agent/findings/verificationTypes.js +20 -0
- package/dist/esm/core/agent/findings/verificationTypes.js.map +1 -0
- package/dist/esm/core/agent/outputEnforcement.js +5 -0
- package/dist/esm/core/agent/outputEnforcement.js.map +1 -1
- package/dist/esm/core/agent/stages/toolCalls.js +21 -4
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/agent/toolArgsValidation.d.ts +2 -0
- package/dist/esm/core/agent/toolArgsValidation.js +10 -0
- package/dist/esm/core/agent/toolArgsValidation.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +1 -0
- package/dist/esm/core/runCheckpoint.d.ts +11 -1
- package/dist/esm/core/runCheckpoint.js +45 -4
- package/dist/esm/core/runCheckpoint.js.map +1 -1
- package/dist/esm/integrity/claim-binding/admit.d.ts +12 -0
- package/dist/esm/integrity/claim-binding/admit.js +204 -0
- package/dist/esm/integrity/claim-binding/admit.js.map +1 -0
- package/dist/esm/integrity/claim-binding/bindEvidence.d.ts +8 -0
- package/dist/esm/integrity/claim-binding/bindEvidence.js +144 -0
- package/dist/esm/integrity/claim-binding/bindEvidence.js.map +1 -0
- package/dist/esm/integrity/claim-binding/capture.d.ts +25 -0
- package/dist/esm/integrity/claim-binding/capture.js +143 -0
- package/dist/esm/integrity/claim-binding/capture.js.map +1 -0
- package/dist/esm/integrity/claim-binding/scope.d.ts +23 -0
- package/dist/esm/integrity/claim-binding/scope.js +149 -0
- package/dist/esm/integrity/claim-binding/scope.js.map +1 -0
- package/dist/esm/integrity/claim-binding/types.d.ts +99 -0
- package/dist/esm/integrity/claim-binding/types.js +23 -0
- package/dist/esm/integrity/claim-binding/types.js.map +1 -0
- package/dist/esm/integrity/unsupported-claim/check.js +33 -55
- package/dist/esm/integrity/unsupported-claim/check.js.map +1 -1
- package/dist/esm/integrity/unsupported-claim/evaluate.d.ts +18 -0
- package/dist/esm/integrity/unsupported-claim/evaluate.js +34 -0
- package/dist/esm/integrity/unsupported-claim/evaluate.js.map +1 -0
- package/dist/esm/lib/boundedJson.d.ts +3 -0
- package/dist/esm/lib/boundedJson.js +104 -0
- package/dist/esm/lib/boundedJson.js.map +1 -0
- package/dist/esm/lib/time-travel/receipt.js +4 -0
- package/dist/esm/lib/time-travel/receipt.js.map +1 -1
- package/dist/esm/memory/identity/encode.d.ts +7 -0
- package/dist/esm/memory/identity/encode.js +14 -0
- package/dist/esm/memory/identity/encode.js.map +1 -1
- package/dist/esm/redaction/conversation.js +3 -0
- package/dist/esm/redaction/conversation.js.map +1 -1
- package/dist/esm/redaction/knownStrings.js +8 -0
- package/dist/esm/redaction/knownStrings.js.map +1 -1
- package/dist/esm/thinking/replay.d.ts +6 -1
- package/dist/esm/thinking/replay.js.map +1 -1
- package/dist/integrity/claim-binding/admit.js +211 -0
- package/dist/integrity/claim-binding/admit.js.map +1 -0
- package/dist/integrity/claim-binding/bindEvidence.js +148 -0
- package/dist/integrity/claim-binding/bindEvidence.js.map +1 -0
- package/dist/integrity/claim-binding/capture.js +152 -0
- package/dist/integrity/claim-binding/capture.js.map +1 -0
- package/dist/integrity/claim-binding/scope.js +159 -0
- package/dist/integrity/claim-binding/scope.js.map +1 -0
- package/dist/integrity/claim-binding/types.js +26 -0
- package/dist/integrity/claim-binding/types.js.map +1 -0
- package/dist/integrity/unsupported-claim/check.js +32 -54
- package/dist/integrity/unsupported-claim/check.js.map +1 -1
- package/dist/integrity/unsupported-claim/evaluate.js +38 -0
- package/dist/integrity/unsupported-claim/evaluate.js.map +1 -0
- package/dist/lib/boundedJson.js +109 -0
- package/dist/lib/boundedJson.js.map +1 -0
- package/dist/lib/time-travel/receipt.js +4 -0
- package/dist/lib/time-travel/receipt.js.map +1 -1
- package/dist/memory/identity/encode.js +16 -1
- package/dist/memory/identity/encode.js.map +1 -1
- package/dist/redaction/conversation.js +3 -0
- package/dist/redaction/conversation.js.map +1 -1
- package/dist/redaction/knownStrings.js +8 -0
- package/dist/redaction/knownStrings.js.map +1 -1
- package/dist/thinking/replay.js.map +1 -1
- package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/anthropicMessageProjection.d.ts.map +1 -1
- package/dist/types/adapters/llm/anthropicMessagesWire.d.ts +9 -3
- package/dist/types/adapters/llm/anthropicMessagesWire.d.ts.map +1 -1
- package/dist/types/adapters/llm/anthropicReplayLayout.d.ts +1 -1
- package/dist/types/adapters/llm/anthropicReplayLayout.d.ts.map +1 -1
- package/dist/types/adapters/llm/anthropicToolArguments.d.ts +32 -0
- package/dist/types/adapters/llm/anthropicToolArguments.d.ts.map +1 -0
- package/dist/types/adapters/types.d.ts +17 -0
- package/dist/types/adapters/types.d.ts.map +1 -1
- package/dist/types/answer-validation/validate.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/resolve.d.ts +1 -0
- package/dist/types/core/agent/arguments/resolve.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/subflow.d.ts.map +1 -1
- package/dist/types/core/agent/findings/types.d.ts +2 -1
- package/dist/types/core/agent/findings/types.d.ts.map +1 -1
- package/dist/types/core/agent/findings/verificationCheck.d.ts +25 -0
- package/dist/types/core/agent/findings/verificationCheck.d.ts.map +1 -0
- package/dist/types/core/agent/findings/verificationCheckpoint.d.ts +11 -0
- package/dist/types/core/agent/findings/verificationCheckpoint.d.ts.map +1 -0
- package/dist/types/core/agent/findings/verificationConfig.d.ts +31 -0
- package/dist/types/core/agent/findings/verificationConfig.d.ts.map +1 -0
- package/dist/types/core/agent/findings/verificationRow.d.ts +17 -0
- package/dist/types/core/agent/findings/verificationRow.d.ts.map +1 -0
- package/dist/types/core/agent/findings/verificationState.d.ts +40 -0
- package/dist/types/core/agent/findings/verificationState.d.ts.map +1 -0
- package/dist/types/core/agent/findings/verificationTypes.d.ts +56 -0
- package/dist/types/core/agent/findings/verificationTypes.d.ts.map +1 -0
- package/dist/types/core/agent/outputEnforcement.d.ts.map +1 -1
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/agent/toolArgsValidation.d.ts +2 -0
- package/dist/types/core/agent/toolArgsValidation.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +1 -0
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/runCheckpoint.d.ts +11 -1
- package/dist/types/core/runCheckpoint.d.ts.map +1 -1
- package/dist/types/integrity/claim-binding/admit.d.ts +13 -0
- package/dist/types/integrity/claim-binding/admit.d.ts.map +1 -0
- package/dist/types/integrity/claim-binding/bindEvidence.d.ts +9 -0
- package/dist/types/integrity/claim-binding/bindEvidence.d.ts.map +1 -0
- package/dist/types/integrity/claim-binding/capture.d.ts +26 -0
- package/dist/types/integrity/claim-binding/capture.d.ts.map +1 -0
- package/dist/types/integrity/claim-binding/scope.d.ts +24 -0
- package/dist/types/integrity/claim-binding/scope.d.ts.map +1 -0
- package/dist/types/integrity/claim-binding/types.d.ts +100 -0
- package/dist/types/integrity/claim-binding/types.d.ts.map +1 -0
- package/dist/types/integrity/unsupported-claim/check.d.ts.map +1 -1
- package/dist/types/integrity/unsupported-claim/evaluate.d.ts +19 -0
- package/dist/types/integrity/unsupported-claim/evaluate.d.ts.map +1 -0
- package/dist/types/lib/boundedJson.d.ts +4 -0
- package/dist/types/lib/boundedJson.d.ts.map +1 -0
- package/dist/types/lib/time-travel/receipt.d.ts.map +1 -1
- package/dist/types/memory/identity/encode.d.ts +7 -0
- package/dist/types/memory/identity/encode.d.ts.map +1 -1
- package/dist/types/redaction/conversation.d.ts.map +1 -1
- package/dist/types/redaction/knownStrings.d.ts.map +1 -1
- package/dist/types/thinking/replay.d.ts +6 -1
- package/dist/types/thinking/replay.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ResultIdentity } from '../../../integrity/claim-binding/types.js';
|
|
2
|
+
import { type ClaimVerificationRow } from './verificationTypes.js';
|
|
3
|
+
/** Reuse receipt bounds; declared values have the compact binding-request cap. */
|
|
4
|
+
export declare const VERIFICATION_LIMITS: Readonly<{
|
|
5
|
+
rowBytes: number;
|
|
6
|
+
valueBytes: 8192;
|
|
7
|
+
identityText: number;
|
|
8
|
+
}>;
|
|
9
|
+
/** A runtime-reserved claim occurrence cannot collide with a result occurrence. */
|
|
10
|
+
export declare function claimIdentityOf(raw: ResultIdentity): string;
|
|
11
|
+
/** Canonical claim tuple reader, shared with checkpoint lineage/counter checks. */
|
|
12
|
+
export declare function readClaimIdentity(value: unknown): ResultIdentity;
|
|
13
|
+
/** Validate the recorded protocol without evaluating whether its value agrees. */
|
|
14
|
+
export declare function readClaimVerificationRow(raw: unknown): ClaimVerificationRow;
|
|
15
|
+
/** Non-throwing checkpoint union guard; admission uses the same strict reader. */
|
|
16
|
+
export declare function isClaimVerificationRow(raw: unknown): raw is ClaimVerificationRow;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict saved claim-verification protocol. Role: validate and detach a recorded
|
|
3
|
+
* check, never reconstruct evidence or rerun its checker. Storage authenticity
|
|
4
|
+
* and caller authorization are the surrounding checkpoint owner's responsibility.
|
|
5
|
+
*/
|
|
6
|
+
import { copyJson, ownData } from '../../../lib/boundedJson.js';
|
|
7
|
+
import { canonicalJson } from '../../../lib/canonicalJson.js';
|
|
8
|
+
import { decodePresentIdentityField, encodeIdentityField, } from '../../../memory/identity/encode.js';
|
|
9
|
+
import { comparableValueOf, participates } from '../../../integrity/assertion/types.js';
|
|
10
|
+
import { BINDING_LIMITS, boundedText } from '../../../integrity/claim-binding/scope.js';
|
|
11
|
+
import { validateCoverage } from '../../../integrity/claim-binding/admit.js';
|
|
12
|
+
import { readResultIdentity } from '../../../integrity/claim-binding/capture.js';
|
|
13
|
+
import { periodProblem } from '../coverage/period.js';
|
|
14
|
+
import { STANDING_VALUES } from './types.js';
|
|
15
|
+
import { VERIFICATION_UNVERIFIED_REASONS } from './verificationTypes.js';
|
|
16
|
+
/** Reuse receipt bounds; declared values have the compact binding-request cap. */
|
|
17
|
+
export const VERIFICATION_LIMITS = Object.freeze({
|
|
18
|
+
rowBytes: BINDING_LIMITS.resultBytes,
|
|
19
|
+
valueBytes: BINDING_LIMITS.scopeBytes,
|
|
20
|
+
identityText: BINDING_LIMITS.resultIdText + 'claim-verification'.length - 'claim-result'.length,
|
|
21
|
+
});
|
|
22
|
+
/** A runtime-reserved claim occurrence cannot collide with a result occurrence. */
|
|
23
|
+
export function claimIdentityOf(raw) {
|
|
24
|
+
const identity = ownData(raw, ['namespace', 'runId', 'ordinal']);
|
|
25
|
+
if (!boundedText(identity.namespace) ||
|
|
26
|
+
!boundedText(identity.runId) ||
|
|
27
|
+
typeof identity.ordinal !== 'number' ||
|
|
28
|
+
!Number.isSafeInteger(identity.ordinal) ||
|
|
29
|
+
identity.ordinal < 1)
|
|
30
|
+
throw new TypeError('Invalid runtime claim identity.');
|
|
31
|
+
return `claim-verification/${encodeIdentityField(identity.namespace)}/${encodeIdentityField(identity.runId)}/${identity.ordinal}`;
|
|
32
|
+
}
|
|
33
|
+
/** Canonical claim tuple reader, shared with checkpoint lineage/counter checks. */
|
|
34
|
+
export function readClaimIdentity(value) {
|
|
35
|
+
if (typeof value !== 'string' || value.length > VERIFICATION_LIMITS.identityText)
|
|
36
|
+
throw new TypeError('Invalid saved claim identity.');
|
|
37
|
+
const parts = value.split('/');
|
|
38
|
+
if (parts.length !== 4 || parts[0] !== 'claim-verification')
|
|
39
|
+
throw new TypeError('Invalid saved claim identity.');
|
|
40
|
+
const identity = {
|
|
41
|
+
namespace: decodePresentIdentityField(parts[1]),
|
|
42
|
+
runId: decodePresentIdentityField(parts[2]),
|
|
43
|
+
ordinal: Number(parts[3]),
|
|
44
|
+
};
|
|
45
|
+
if (value !== claimIdentityOf(identity))
|
|
46
|
+
throw new TypeError('Noncanonical saved claim identity.');
|
|
47
|
+
return Object.freeze(identity);
|
|
48
|
+
}
|
|
49
|
+
function integer(value, minimum) {
|
|
50
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= minimum;
|
|
51
|
+
}
|
|
52
|
+
function eligibleAssertion(raw) {
|
|
53
|
+
const assertion = ownData(raw, ['subject', 'predicate', 'value', 'stratum', 'provenance']);
|
|
54
|
+
const subject = ownData(assertion.subject, ['kind', 'id']);
|
|
55
|
+
const comparable = comparableValueOf(assertion.value);
|
|
56
|
+
if (subject.kind !== 'entity' ||
|
|
57
|
+
!boundedText(subject.id) ||
|
|
58
|
+
!boundedText(assertion.predicate) ||
|
|
59
|
+
assertion.stratum !== 'asserted' ||
|
|
60
|
+
typeof assertion.provenance !== 'string' ||
|
|
61
|
+
!Object.hasOwn(assertion, 'value') ||
|
|
62
|
+
!participates(assertion.value) ||
|
|
63
|
+
comparable === null ||
|
|
64
|
+
comparable === undefined ||
|
|
65
|
+
comparable === 'unknown')
|
|
66
|
+
throw new TypeError('Invalid eligible assertion.');
|
|
67
|
+
return assertion;
|
|
68
|
+
}
|
|
69
|
+
function validateResolved(row, claimIdentity) {
|
|
70
|
+
const resolved = ownData(row.resolved, [
|
|
71
|
+
'resultId',
|
|
72
|
+
'rule',
|
|
73
|
+
'scope',
|
|
74
|
+
'coverage',
|
|
75
|
+
'period',
|
|
76
|
+
'evidence',
|
|
77
|
+
'claim',
|
|
78
|
+
]);
|
|
79
|
+
const rule = ownData(resolved.rule, ['id', 'version']);
|
|
80
|
+
const scope = ownData(copyJson(resolved.scope, BINDING_LIMITS.scopeBytes, true));
|
|
81
|
+
const resultIdentity = readResultIdentity(resolved.resultId);
|
|
82
|
+
if (resultIdentity.namespace !== claimIdentity.namespace ||
|
|
83
|
+
resolved.resultId !== row.declaredResult ||
|
|
84
|
+
!boundedText(rule.id) ||
|
|
85
|
+
rule.id !== row.declaredRule ||
|
|
86
|
+
!boundedText(rule.version) ||
|
|
87
|
+
Object.keys(scope).length === 0 ||
|
|
88
|
+
Object.keys(scope).length > BINDING_LIMITS.dimensions ||
|
|
89
|
+
!Object.keys(scope).every(boundedText))
|
|
90
|
+
throw new TypeError('Invalid verification association.');
|
|
91
|
+
validateCoverage(resolved.coverage);
|
|
92
|
+
if (Object.hasOwn(resolved, 'period') && periodProblem(resolved.period, 'camel') !== undefined)
|
|
93
|
+
throw new TypeError('Invalid verification period.');
|
|
94
|
+
const evidence = eligibleAssertion(resolved.evidence);
|
|
95
|
+
const claim = eligibleAssertion(resolved.claim);
|
|
96
|
+
if (canonicalJson(evidence.subject) !== canonicalJson(claim.subject) ||
|
|
97
|
+
evidence.predicate !== claim.predicate ||
|
|
98
|
+
evidence.provenance !== `result ${resolved.resultId}` ||
|
|
99
|
+
claim.provenance !== `rule ${rule.id}` ||
|
|
100
|
+
canonicalJson(claim.value) !== canonicalJson(row.declaredValue))
|
|
101
|
+
throw new TypeError('Invalid verification pair association.');
|
|
102
|
+
}
|
|
103
|
+
/** Validate the recorded protocol without evaluating whether its value agrees. */
|
|
104
|
+
export function readClaimVerificationRow(raw) {
|
|
105
|
+
const detached = copyJson(raw, VERIFICATION_LIMITS.rowBytes, true);
|
|
106
|
+
const row = ownData(detached, [
|
|
107
|
+
'kind',
|
|
108
|
+
'claimId',
|
|
109
|
+
'declaredOn',
|
|
110
|
+
'standing',
|
|
111
|
+
'iteration',
|
|
112
|
+
'turn',
|
|
113
|
+
'checker',
|
|
114
|
+
'declaredResult',
|
|
115
|
+
'declaredRule',
|
|
116
|
+
'declaredValue',
|
|
117
|
+
'outcome',
|
|
118
|
+
'reason',
|
|
119
|
+
'resolved',
|
|
120
|
+
]);
|
|
121
|
+
const checker = ownData(row.checker, ['id', 'version']);
|
|
122
|
+
const claimIdentity = readClaimIdentity(row.claimId);
|
|
123
|
+
if (row.kind !== 'claim-verification' ||
|
|
124
|
+
typeof row.standing !== 'string' ||
|
|
125
|
+
!STANDING_VALUES.includes(row.standing) ||
|
|
126
|
+
!integer(row.iteration, 0) ||
|
|
127
|
+
(Object.hasOwn(row, 'turn') && !integer(row.turn, 1)) ||
|
|
128
|
+
checker.id !== 'claim-pair' ||
|
|
129
|
+
checker.version !== 1 ||
|
|
130
|
+
!Object.hasOwn(row, 'declaredValue') ||
|
|
131
|
+
(Object.hasOwn(row, 'declaredResult') &&
|
|
132
|
+
(typeof row.declaredResult !== 'string' ||
|
|
133
|
+
row.declaredResult.length > BINDING_LIMITS.resultIdText)) ||
|
|
134
|
+
(Object.hasOwn(row, 'declaredRule') && !boundedText(row.declaredRule)))
|
|
135
|
+
throw new TypeError('Invalid claim-verification row.');
|
|
136
|
+
copyJson(row.declaredValue, VERIFICATION_LIMITS.valueBytes, true);
|
|
137
|
+
if (row.declaredOn !== 'answer') {
|
|
138
|
+
const at = ownData(row.declaredOn, ['toolCallId']);
|
|
139
|
+
if (!boundedText(at.toolCallId))
|
|
140
|
+
throw new TypeError('Invalid claim declaration location.');
|
|
141
|
+
}
|
|
142
|
+
if (row.outcome === 'unverified') {
|
|
143
|
+
if (typeof row.reason !== 'string' ||
|
|
144
|
+
!VERIFICATION_UNVERIFIED_REASONS.includes(row.reason) ||
|
|
145
|
+
Object.hasOwn(row, 'resolved') ||
|
|
146
|
+
(row.standing === 'noise' && row.reason !== 'ineligible-noise') ||
|
|
147
|
+
(row.reason === 'ineligible-noise' && row.standing !== 'noise') ||
|
|
148
|
+
(row.reason === 'missing-check' && Object.hasOwn(row, 'declaredRule')) ||
|
|
149
|
+
(!['missing-check', 'malformed-check', 'ineligible-noise'].includes(row.reason) &&
|
|
150
|
+
(!Object.hasOwn(row, 'declaredRule') ||
|
|
151
|
+
(row.reason !== 'missing-result' && !Object.hasOwn(row, 'declaredResult')))))
|
|
152
|
+
throw new TypeError('Invalid unverified claim row.');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
if (row.standing === 'noise' ||
|
|
156
|
+
!((row.outcome === 'supported' &&
|
|
157
|
+
(row.reason === 'no-conflict' || row.reason === 'numeric-leniency')) ||
|
|
158
|
+
(row.outcome === 'contradicted' && row.reason === 'conflict')))
|
|
159
|
+
throw new TypeError('Invalid compared claim row.');
|
|
160
|
+
validateResolved(row, claimIdentity);
|
|
161
|
+
}
|
|
162
|
+
return detached;
|
|
163
|
+
}
|
|
164
|
+
/** Non-throwing checkpoint union guard; admission uses the same strict reader. */
|
|
165
|
+
export function isClaimVerificationRow(raw) {
|
|
166
|
+
try {
|
|
167
|
+
readClaimVerificationRow(raw);
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=verificationRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificationRow.js","sourceRoot":"","sources":["../../../../../src/core/agent/findings/verificationRow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { EvidenceSnapshot, ResultEvidence, ResultIdentity } from '../../../integrity/claim-binding/types.js';
|
|
2
|
+
export interface ClaimVerificationState {
|
|
3
|
+
readonly version: 1;
|
|
4
|
+
readonly evidence: EvidenceSnapshot;
|
|
5
|
+
readonly nextResultOrdinal: number;
|
|
6
|
+
readonly nextClaimOrdinal: number;
|
|
7
|
+
/** Sticky refusal: older receipts remain; later evidence is not substituted. */
|
|
8
|
+
readonly limited?: true;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Read only after the checkpoint's owner/namespace authority is established.
|
|
12
|
+
* The caller MUST derive largestClaimOrdinal from its validated claim rows;
|
|
13
|
+
* this carrier does not contain those rows and cannot infer their maximum.
|
|
14
|
+
* Stage commits clone changed state. At entry, admit the tracked raw value
|
|
15
|
+
* and publish this detached carrier before the batch; subsequent raw reads
|
|
16
|
+
* can reuse its immutable evidence. A live scope proxy is not that identity.
|
|
17
|
+
*/
|
|
18
|
+
export declare function readVerificationState(raw: unknown, largestClaimOrdinal: number): ClaimVerificationState;
|
|
19
|
+
/** Called only when opted in. No randomness is consumed at module load. */
|
|
20
|
+
export declare function createVerificationState(runId: string, namespaceSource?: () => string): ClaimVerificationState;
|
|
21
|
+
/** A resume keeps its namespace/counters, including when a process reuses runId. */
|
|
22
|
+
export declare function continueVerificationState(state: ClaimVerificationState, runId: string): ClaimVerificationState;
|
|
23
|
+
/** Publish the returned state before awaiting execution, even if it later fails. */
|
|
24
|
+
export declare function reserveResultIdentity(state: ClaimVerificationState, runId: string): {
|
|
25
|
+
readonly state: ClaimVerificationState;
|
|
26
|
+
readonly identity: ResultIdentity;
|
|
27
|
+
readonly id: string;
|
|
28
|
+
};
|
|
29
|
+
/** One occurrence, not a text key. The caller publishes state before evaluation. */
|
|
30
|
+
export declare function reserveClaimIdentity(state: ClaimVerificationState, runId: string): {
|
|
31
|
+
readonly state: ClaimVerificationState;
|
|
32
|
+
readonly ordinal: number;
|
|
33
|
+
readonly id: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Retain only a finalized, previously reserved receipt. Capacity refusal is
|
|
37
|
+
* sticky and never replaces an earlier result; the writer reports the limit.
|
|
38
|
+
*/
|
|
39
|
+
export declare function retainVerificationEvidence(state: ClaimVerificationState, receipt: ResultEvidence): ClaimVerificationState;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Private, immutable evidence carrier for the explicit findings verifier.
|
|
3
|
+
* Role: reservation and bounded retention; no schema, events or Agent wiring.
|
|
4
|
+
* The checkpoint owner authenticates provenance and supplies the ledger's
|
|
5
|
+
* largest claim ordinal. Shape validation alone never authorizes a record.
|
|
6
|
+
*/
|
|
7
|
+
import { appendEvidenceSnapshot, readEvidenceSnapshot, } from '../../../integrity/claim-binding/admit.js';
|
|
8
|
+
import { resultIdentityOf } from '../../../integrity/claim-binding/capture.js';
|
|
9
|
+
import { BINDING_LIMITS, boundedText } from '../../../integrity/claim-binding/scope.js';
|
|
10
|
+
import { ownData } from '../../../lib/boundedJson.js';
|
|
11
|
+
import { claimIdentityOf } from './verificationRow.js';
|
|
12
|
+
const positiveOrdinal = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
|
|
13
|
+
/**
|
|
14
|
+
* Read only after the checkpoint's owner/namespace authority is established.
|
|
15
|
+
* The caller MUST derive largestClaimOrdinal from its validated claim rows;
|
|
16
|
+
* this carrier does not contain those rows and cannot infer their maximum.
|
|
17
|
+
* Stage commits clone changed state. At entry, admit the tracked raw value
|
|
18
|
+
* and publish this detached carrier before the batch; subsequent raw reads
|
|
19
|
+
* can reuse its immutable evidence. A live scope proxy is not that identity.
|
|
20
|
+
*/
|
|
21
|
+
export function readVerificationState(raw, largestClaimOrdinal) {
|
|
22
|
+
const source = ownData(raw, [
|
|
23
|
+
'version',
|
|
24
|
+
'evidence',
|
|
25
|
+
'nextResultOrdinal',
|
|
26
|
+
'nextClaimOrdinal',
|
|
27
|
+
'limited',
|
|
28
|
+
]);
|
|
29
|
+
if (source.version !== 1 ||
|
|
30
|
+
!positiveOrdinal(source.nextResultOrdinal) ||
|
|
31
|
+
!positiveOrdinal(source.nextClaimOrdinal) ||
|
|
32
|
+
!Number.isSafeInteger(largestClaimOrdinal) ||
|
|
33
|
+
largestClaimOrdinal < 0 ||
|
|
34
|
+
source.nextClaimOrdinal <= largestClaimOrdinal ||
|
|
35
|
+
(Object.hasOwn(source, 'limited') && source.limited !== true))
|
|
36
|
+
throw new Error('Invalid findings verification carrier.');
|
|
37
|
+
const evidence = readEvidenceSnapshot(source.evidence);
|
|
38
|
+
if (evidence.runIds.length === 0)
|
|
39
|
+
throw new Error('Verification carrier requires its recorded run lineage.');
|
|
40
|
+
const ordinals = new Set();
|
|
41
|
+
for (const result of evidence.results) {
|
|
42
|
+
if (result.identity.namespace !== evidence.namespace ||
|
|
43
|
+
!evidence.runIds.includes(result.identity.runId) ||
|
|
44
|
+
result.identity.ordinal >= source.nextResultOrdinal ||
|
|
45
|
+
ordinals.has(result.identity.ordinal))
|
|
46
|
+
throw new Error('Invalid verification receipt lineage or ordinal.');
|
|
47
|
+
ordinals.add(result.identity.ordinal);
|
|
48
|
+
}
|
|
49
|
+
return Object.freeze({
|
|
50
|
+
version: 1,
|
|
51
|
+
evidence,
|
|
52
|
+
nextResultOrdinal: source.nextResultOrdinal,
|
|
53
|
+
nextClaimOrdinal: source.nextClaimOrdinal,
|
|
54
|
+
...(source.limited === true && { limited: true }),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Called only when opted in. No randomness is consumed at module load. */
|
|
58
|
+
export function createVerificationState(runId, namespaceSource = () => globalThis.crypto.randomUUID()) {
|
|
59
|
+
const namespace = namespaceSource();
|
|
60
|
+
if (!boundedText(runId) || !boundedText(namespace))
|
|
61
|
+
throw new Error('Invalid verification recording identity.');
|
|
62
|
+
return readVerificationState({
|
|
63
|
+
version: 1,
|
|
64
|
+
evidence: { version: 1, namespace, runIds: [runId], results: [] },
|
|
65
|
+
nextResultOrdinal: 1,
|
|
66
|
+
nextClaimOrdinal: 1,
|
|
67
|
+
}, 0);
|
|
68
|
+
}
|
|
69
|
+
const limited = (state) => state.limited === true ? state : Object.freeze({ ...state, limited: true });
|
|
70
|
+
/** A resume keeps its namespace/counters, including when a process reuses runId. */
|
|
71
|
+
export function continueVerificationState(state, runId) {
|
|
72
|
+
if (!boundedText(runId))
|
|
73
|
+
throw new Error('Invalid verification run identity.');
|
|
74
|
+
if (state.evidence.runIds.includes(runId))
|
|
75
|
+
return state;
|
|
76
|
+
if (state.evidence.runIds.length >= BINDING_LIMITS.results)
|
|
77
|
+
throw new Error('Verification run lineage capacity exhausted.');
|
|
78
|
+
try {
|
|
79
|
+
const evidence = readEvidenceSnapshot({
|
|
80
|
+
...state.evidence,
|
|
81
|
+
runIds: [...state.evidence.runIds, runId],
|
|
82
|
+
});
|
|
83
|
+
return Object.freeze({ ...state, evidence });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Identity cannot be reserved for an unrecorded run. The input is an
|
|
87
|
+
// admitted carrier; adding one bounded run can exceed only its budget.
|
|
88
|
+
// Refuse this continuation rather than evicting old lineage or evidence.
|
|
89
|
+
throw new Error('Verification run lineage capacity exhausted.');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Publish the returned state before awaiting execution, even if it later fails. */
|
|
93
|
+
export function reserveResultIdentity(state, runId) {
|
|
94
|
+
state = continueVerificationState(state, runId);
|
|
95
|
+
const ordinal = state.nextResultOrdinal;
|
|
96
|
+
if (!positiveOrdinal(ordinal) || ordinal === Number.MAX_SAFE_INTEGER)
|
|
97
|
+
throw new Error('Verification result identity capacity exhausted.');
|
|
98
|
+
const identity = Object.freeze({ namespace: state.evidence.namespace, runId, ordinal });
|
|
99
|
+
return Object.freeze({
|
|
100
|
+
state: Object.freeze({ ...state, nextResultOrdinal: ordinal + 1 }),
|
|
101
|
+
identity,
|
|
102
|
+
id: resultIdentityOf(identity),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** One occurrence, not a text key. The caller publishes state before evaluation. */
|
|
106
|
+
export function reserveClaimIdentity(state, runId) {
|
|
107
|
+
state = continueVerificationState(state, runId);
|
|
108
|
+
const ordinal = state.nextClaimOrdinal;
|
|
109
|
+
if (!positiveOrdinal(ordinal) || ordinal === Number.MAX_SAFE_INTEGER)
|
|
110
|
+
throw new Error('Verification claim identity capacity exhausted.');
|
|
111
|
+
return Object.freeze({
|
|
112
|
+
state: Object.freeze({ ...state, nextClaimOrdinal: ordinal + 1 }),
|
|
113
|
+
ordinal,
|
|
114
|
+
id: claimIdentityOf({ namespace: state.evidence.namespace, runId, ordinal }),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Retain only a finalized, previously reserved receipt. Capacity refusal is
|
|
119
|
+
* sticky and never replaces an earlier result; the writer reports the limit.
|
|
120
|
+
*/
|
|
121
|
+
export function retainVerificationEvidence(state, receipt) {
|
|
122
|
+
if (state.limited === true)
|
|
123
|
+
return state;
|
|
124
|
+
const singleton = readEvidenceSnapshot({ ...state.evidence, results: [receipt] });
|
|
125
|
+
const admitted = singleton.results[0];
|
|
126
|
+
if (admitted.identity.namespace !== state.evidence.namespace ||
|
|
127
|
+
!state.evidence.runIds.includes(admitted.identity.runId) ||
|
|
128
|
+
admitted.identity.ordinal >= state.nextResultOrdinal ||
|
|
129
|
+
state.evidence.results.some((prior) => prior.identity.ordinal === admitted.identity.ordinal))
|
|
130
|
+
throw new Error('Verification receipt was not uniquely reserved in this recording.');
|
|
131
|
+
if (state.evidence.results.length >= BINDING_LIMITS.results)
|
|
132
|
+
return limited(state);
|
|
133
|
+
try {
|
|
134
|
+
const evidence = appendEvidenceSnapshot(state.evidence, singleton);
|
|
135
|
+
return Object.freeze({ ...state, evidence });
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Both the carrier and individual receipt were already admitted. Their
|
|
139
|
+
// combined bytes exceed the snapshot cap; preserve the earlier snapshot.
|
|
140
|
+
return limited(state);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=verificationState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificationState.js","sourceRoot":"","sources":["../../../../../src/core/agent/findings/verificationState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ClaimBinding } from '../../../integrity/claim-binding/types.js';
|
|
2
|
+
import type { ClaimPairEvaluation } from '../../../integrity/unsupported-claim/evaluate.js';
|
|
3
|
+
import type { DeclaredOn, Standing } from './types.js';
|
|
4
|
+
export declare const VERIFICATION_UNVERIFIED_REASONS: readonly ["invalid-claim", "unknown-rule", "invalid-rule", "missing-result", "ambiguous-result", "foreign-result", "incomplete-result", "withheld-evidence", "unassociated-result", "invalid-evidence", "missing-scope", "scope-mismatch", "scope-version-mismatch", "missing-fact", "ambiguous-fact", "unasserted-value", "coverage-undeclared", "coverage-partial", "coverage-unknown", "coverage-stale", "missing-check", "malformed-check", "ineligible-noise", "assertion-mismatch", "retention-limit", "evidence-unavailable", "claim-nonparticipating", "doubt-against-value", "both-doubt"];
|
|
5
|
+
export type ClaimVerificationUnverifiedReason = (typeof VERIFICATION_UNVERIFIED_REASONS)[number];
|
|
6
|
+
export type ClaimVerificationReason = ClaimVerificationUnverifiedReason | ClaimPairEvaluation;
|
|
7
|
+
/** The model may cite a rule, never provide scope or resolved evidence. */
|
|
8
|
+
export interface FindingClaimRequest {
|
|
9
|
+
readonly value: unknown;
|
|
10
|
+
readonly check?: {
|
|
11
|
+
readonly rule: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** A legacy full assertion adds identity, not authority to choose evidence. */
|
|
15
|
+
export interface FullFindingClaimRequest extends FindingClaimRequest {
|
|
16
|
+
readonly subject: {
|
|
17
|
+
readonly kind: string;
|
|
18
|
+
readonly id: string;
|
|
19
|
+
};
|
|
20
|
+
readonly predicate: string;
|
|
21
|
+
}
|
|
22
|
+
export type ClaimVerificationAssociation = Omit<Extract<ClaimBinding, {
|
|
23
|
+
kind: 'bound';
|
|
24
|
+
}>, 'kind'>;
|
|
25
|
+
interface ClaimVerificationBase {
|
|
26
|
+
readonly kind: 'claim-verification';
|
|
27
|
+
/** Runtime-reserved declaration occurrence, not a provider tool id. */
|
|
28
|
+
readonly claimId: string;
|
|
29
|
+
readonly declaredOn: DeclaredOn;
|
|
30
|
+
readonly standing: Standing;
|
|
31
|
+
readonly iteration: number;
|
|
32
|
+
readonly turn?: number;
|
|
33
|
+
readonly checker: {
|
|
34
|
+
readonly id: 'claim-pair';
|
|
35
|
+
readonly version: 1;
|
|
36
|
+
};
|
|
37
|
+
readonly declaredResult?: string;
|
|
38
|
+
readonly declaredRule?: string;
|
|
39
|
+
/** The literal bounded JSON declaration, never replaced by a resolved value. */
|
|
40
|
+
readonly declaredValue: unknown;
|
|
41
|
+
}
|
|
42
|
+
export type ClaimVerificationRow = ClaimVerificationBase & ({
|
|
43
|
+
readonly outcome: 'supported';
|
|
44
|
+
readonly reason: 'no-conflict' | 'numeric-leniency';
|
|
45
|
+
readonly resolved: ClaimVerificationAssociation;
|
|
46
|
+
} | {
|
|
47
|
+
readonly outcome: 'contradicted';
|
|
48
|
+
readonly reason: 'conflict';
|
|
49
|
+
readonly resolved: ClaimVerificationAssociation;
|
|
50
|
+
} | {
|
|
51
|
+
readonly outcome: 'unverified';
|
|
52
|
+
readonly reason: ClaimVerificationUnverifiedReason;
|
|
53
|
+
readonly resolved?: never;
|
|
54
|
+
});
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal typed-finding protocol: model declarations and library checks stay
|
|
3
|
+
* separate. A supported row concerns only its resolved rule and executed scope;
|
|
4
|
+
* it is not verification of arbitrary prose or an entire answer.
|
|
5
|
+
* Role: plain data shared by the pure writer and the strict saved-row reader.
|
|
6
|
+
*/
|
|
7
|
+
import { BINDING_REASONS } from '../../../integrity/claim-binding/types.js';
|
|
8
|
+
export const VERIFICATION_UNVERIFIED_REASONS = Object.freeze([
|
|
9
|
+
...BINDING_REASONS,
|
|
10
|
+
'missing-check',
|
|
11
|
+
'malformed-check',
|
|
12
|
+
'ineligible-noise',
|
|
13
|
+
'assertion-mismatch',
|
|
14
|
+
'retention-limit',
|
|
15
|
+
'evidence-unavailable',
|
|
16
|
+
'claim-nonparticipating',
|
|
17
|
+
'doubt-against-value',
|
|
18
|
+
'both-doubt',
|
|
19
|
+
]);
|
|
20
|
+
//# sourceMappingURL=verificationTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificationTypes.js","sourceRoot":"","sources":["../../../../../src/core/agent/findings/verificationTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAK5E,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3D,GAAG,eAAe;IAClB,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,oBAAoB;IACpB,iBAAiB;IACjB,sBAAsB;IACtB,wBAAwB;IACxB,qBAAqB;IACrB,YAAY;CACJ,CAAC,CAAC"}
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
import { fnv1a } from '../slots/helpers.js';
|
|
37
37
|
import { applyOutputSchema } from '../outputSchema.js';
|
|
38
38
|
import { SCHEMA_CHECK_FRAME_PREFIX } from '../../lib/saidByPerson.js';
|
|
39
|
+
import { formatToolArgIssues, streamedToolArgIssues } from './toolArgsValidation.js';
|
|
39
40
|
/**
|
|
40
41
|
* Append one row to the run's output-attempt ledger.
|
|
41
42
|
*
|
|
@@ -133,6 +134,10 @@ export function readSchemaToolAnswer(response) {
|
|
|
133
134
|
const call = response.toolCalls.find((tc) => tc.name === SCHEMA_TOOL_NAME);
|
|
134
135
|
if (!call)
|
|
135
136
|
return undefined;
|
|
137
|
+
// A fixed non-JSON refusal follows the existing output-attempt/retry path.
|
|
138
|
+
// Even a parser accepting {} must never validate an SDK repair as an answer.
|
|
139
|
+
if (call.argumentsFailure !== undefined)
|
|
140
|
+
return formatToolArgIssues(call.name, streamedToolArgIssues(call.argumentsFailure));
|
|
136
141
|
return JSON.stringify(call.args);
|
|
137
142
|
}
|
|
138
143
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outputEnforcement.js","sourceRoot":"","sources":["../../../../src/core/agent/outputEnforcement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAA2B,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"outputEnforcement.js","sourceRoot":"","sources":["../../../../src/core/agent/outputEnforcement.ts"],"names":[],"mappings":"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"}
|
|
@@ -88,7 +88,7 @@ import { withUnsettledRows } from '../findings/unsettled.js';
|
|
|
88
88
|
import { sourceClockRow, sourceClocksOf } from '../../time/rows.js';
|
|
89
89
|
import { evidenceFromHistory, exemptFromRun, } from '../evidence/evidenceIndex.js';
|
|
90
90
|
import { noteRepeatedCall, repeatedCallLedgers } from '../repeatedCall.js';
|
|
91
|
-
import { formatToolArgIssues, validateToolArgs, } from '../toolArgsValidation.js';
|
|
91
|
+
import { formatToolArgIssues, streamedToolArgIssues, validateToolArgs, } from '../toolArgsValidation.js';
|
|
92
92
|
import { safeStringify } from '../validators.js';
|
|
93
93
|
import { capToolResult } from '../toolResultCap.js';
|
|
94
94
|
import { applyResultCeiling } from '../resultCeiling.js';
|
|
@@ -3131,7 +3131,19 @@ export function buildToolCallsHandler(deps) {
|
|
|
3131
3131
|
}
|
|
3132
3132
|
// Tool-args validation (#9) and the inputs layer's refusals share one
|
|
3133
3133
|
// flag: the call is refused for its ARGUMENTS and lands in one shape.
|
|
3134
|
-
let argsRejected =
|
|
3134
|
+
let argsRejected = tc.argumentsFailure !== undefined;
|
|
3135
|
+
if (!denied && tc.argumentsFailure !== undefined) {
|
|
3136
|
+
const issues = streamedToolArgIssues(tc.argumentsFailure);
|
|
3137
|
+
typedEmit(scope, 'agentfootprint.validation.args_invalid', {
|
|
3138
|
+
toolName: tc.name,
|
|
3139
|
+
toolCallId: tc.id,
|
|
3140
|
+
iteration,
|
|
3141
|
+
issues,
|
|
3142
|
+
enforced: true,
|
|
3143
|
+
});
|
|
3144
|
+
error = true;
|
|
3145
|
+
result = formatToolArgIssues(tc.name, issues);
|
|
3146
|
+
}
|
|
3135
3147
|
// A check-in that tripped in a batch whose one human question was the
|
|
3136
3148
|
// inputs layer's ask (`oneQuestionAsked`) — refused, never asked.
|
|
3137
3149
|
let checkInRefused = false;
|
|
@@ -3146,9 +3158,11 @@ export function buildToolCallsHandler(deps) {
|
|
|
3146
3158
|
// the layer NOT mounted — any call whose tool declares rules (fail
|
|
3147
3159
|
// closed). Neither applies to a tool that declares nothing — and
|
|
3148
3160
|
// neither awaits for one (`unmountedRules` answers it synchronously).
|
|
3149
|
-
const unmounted = unmountedRules(tool, tc.name);
|
|
3161
|
+
const unmounted = argsRejected ? undefined : unmountedRules(tool, tc.name);
|
|
3150
3162
|
warnUnmountedToolPeriod(tool, tc.name);
|
|
3151
|
-
const rulesRefusal =
|
|
3163
|
+
const rulesRefusal = argsRejected
|
|
3164
|
+
? undefined
|
|
3165
|
+
: resolution?.refused ?? (unmounted === undefined ? undefined : await unmounted);
|
|
3152
3166
|
if (!denied && rulesRefusal !== undefined) {
|
|
3153
3167
|
argsRejected = true;
|
|
3154
3168
|
error = true;
|
|
@@ -4241,6 +4255,9 @@ export function buildToolCallsHandler(deps) {
|
|
|
4241
4255
|
toolCallId: tc.id,
|
|
4242
4256
|
toolName: tc.name,
|
|
4243
4257
|
...(layerNote !== '' && { toolChars: deliveredResult.length }),
|
|
4258
|
+
...(tc.argumentsFailure !== undefined && {
|
|
4259
|
+
toolArgumentsFailure: { ...tc.argumentsFailure },
|
|
4260
|
+
}),
|
|
4244
4261
|
});
|
|
4245
4262
|
// ── Dynamic ReAct wiring ───────────────────────────────
|
|
4246
4263
|
//
|