@coderifts/agent-guard 8.4.0 → 8.5.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/README.md +2 -0
- package/dist/cjs/auto-derive.d.ts +74 -0
- package/dist/cjs/auto-derive.d.ts.map +1 -0
- package/dist/cjs/auto-derive.js +272 -0
- package/dist/cjs/auto-derive.js.map +1 -0
- package/dist/cjs/auto-recheck.d.ts +76 -0
- package/dist/cjs/auto-recheck.d.ts.map +1 -0
- package/dist/cjs/auto-recheck.js +240 -0
- package/dist/cjs/auto-recheck.js.map +1 -0
- package/dist/cjs/cas-attestation.d.ts +35 -2
- package/dist/cjs/cas-attestation.d.ts.map +1 -1
- package/dist/cjs/cas-attestation.js +105 -2
- package/dist/cjs/cas-attestation.js.map +1 -1
- package/dist/cjs/execution-proof.d.ts +25 -0
- package/dist/cjs/execution-proof.d.ts.map +1 -1
- package/dist/cjs/execution-proof.js +6 -0
- package/dist/cjs/execution-proof.js.map +1 -1
- package/dist/cjs/final-answer-proof.d.ts.map +1 -1
- package/dist/cjs/final-answer-proof.js +20 -1
- package/dist/cjs/final-answer-proof.js.map +1 -1
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +10 -1
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +6 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +17 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/tool-registry.d.ts.map +1 -1
- package/dist/cjs/tool-registry.js +36 -6
- package/dist/cjs/tool-registry.js.map +1 -1
- package/dist/cjs/types.d.ts +45 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.d.ts +16 -0
- package/dist/cjs/with-coderifts.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.js +9 -0
- package/dist/cjs/with-coderifts.js.map +1 -1
- package/dist/esm/auto-derive.d.ts +74 -0
- package/dist/esm/auto-derive.d.ts.map +1 -0
- package/dist/esm/auto-derive.js +265 -0
- package/dist/esm/auto-derive.js.map +1 -0
- package/dist/esm/auto-recheck.d.ts +76 -0
- package/dist/esm/auto-recheck.d.ts.map +1 -0
- package/dist/esm/auto-recheck.js +234 -0
- package/dist/esm/auto-recheck.js.map +1 -0
- package/dist/esm/cas-attestation.d.ts +35 -2
- package/dist/esm/cas-attestation.d.ts.map +1 -1
- package/dist/esm/cas-attestation.js +103 -2
- package/dist/esm/cas-attestation.js.map +1 -1
- package/dist/esm/execution-proof.d.ts +25 -0
- package/dist/esm/execution-proof.d.ts.map +1 -1
- package/dist/esm/execution-proof.js +6 -0
- package/dist/esm/execution-proof.js.map +1 -1
- package/dist/esm/final-answer-proof.d.ts.map +1 -1
- package/dist/esm/final-answer-proof.js +20 -1
- package/dist/esm/final-answer-proof.js.map +1 -1
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +11 -2
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +6 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tool-registry.d.ts.map +1 -1
- package/dist/esm/tool-registry.js +36 -6
- package/dist/esm/tool-registry.js.map +1 -1
- package/dist/esm/types.d.ts +45 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/with-coderifts.d.ts +16 -0
- package/dist/esm/with-coderifts.d.ts.map +1 -1
- package/dist/esm/with-coderifts.js +9 -0
- package/dist/esm/with-coderifts.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S6 auto-recheck loop — host-side orchestration AFTER a BLOCK with a remediation_transaction.
|
|
3
|
+
*
|
|
4
|
+
* Default OFF. The frozen guardToolCall is unchanged; this wraps it. The guard never writes
|
|
5
|
+
* artifacts: the host's applyFix applies the fix (honesty line). After applyFix true, artifacts
|
|
6
|
+
* are re-resolved FRESH (resolve() from artifact-resolver when resolveInput is supplied, else
|
|
7
|
+
* the host-updated call / rebind).
|
|
8
|
+
*
|
|
9
|
+
* recheck_scope is an OUTPUT on the BLOCK envelope (app remediation-transaction.js). The
|
|
10
|
+
* preflight request does not accept a scope hint (measured SDK / authorizeChangeSet) — so
|
|
11
|
+
* each attempt is a FULL re-preflight. Noted, not faked.
|
|
12
|
+
*
|
|
13
|
+
* Nothing here enters a fingerprint preimage (host orchestration only).
|
|
14
|
+
*/
|
|
15
|
+
import type { GuardConfig, GuardOutcome, ToolCallDescriptor, ExecuteFactory, GuardToolCallContext } from './types.js';
|
|
16
|
+
import type { RemediationTransactionView } from './remediation-loop-attestation.js';
|
|
17
|
+
import type { ResolveInput, ResolveConfig } from './artifact-resolver.js';
|
|
18
|
+
/** Hard cap on RE-preflights per original call. */
|
|
19
|
+
export declare const AUTO_RECHECK_MAX_CAP = 3;
|
|
20
|
+
export type RecheckTrailEntry = {
|
|
21
|
+
attempt: number;
|
|
22
|
+
decision_id: string | null;
|
|
23
|
+
fingerprint: string | null;
|
|
24
|
+
execution_action: string | null;
|
|
25
|
+
};
|
|
26
|
+
export type RecheckStopReason = 'no_progress' | 'apply_fix_declined' | 'apply_fix_threw' | 'exhausted';
|
|
27
|
+
export type RecheckObservation = {
|
|
28
|
+
recheck_trail?: ReadonlyArray<RecheckTrailEntry>;
|
|
29
|
+
/** 849 metric feed. Present only when the loop ran. value true iff a recheck landed allow-class. */
|
|
30
|
+
fixed_after_block?: {
|
|
31
|
+
value: true | null;
|
|
32
|
+
attempt_count: number | null;
|
|
33
|
+
};
|
|
34
|
+
recheck_stop_reason?: RecheckStopReason;
|
|
35
|
+
};
|
|
36
|
+
export type AutoRecheckApplyFixContext = {
|
|
37
|
+
call: ToolCallDescriptor;
|
|
38
|
+
attempt: number;
|
|
39
|
+
outcome: GuardOutcome<unknown>;
|
|
40
|
+
};
|
|
41
|
+
export type AutoRecheckConfig = {
|
|
42
|
+
/**
|
|
43
|
+
* Bound on RE-preflights per original call. Allowed 1–3; values above 3 clamp to 3.
|
|
44
|
+
* Values below 1 disable the loop.
|
|
45
|
+
*/
|
|
46
|
+
maxAttempts: number;
|
|
47
|
+
/**
|
|
48
|
+
* HOST applies the fix. The guard never writes artifacts.
|
|
49
|
+
* false / throw → loop ends, original BLOCK stands.
|
|
50
|
+
*/
|
|
51
|
+
applyFix: (remediation: RemediationTransactionView, context: AutoRecheckApplyFixContext) => boolean | Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Optional. After applyFix true, produce a fresh git snapshot for resolve() (CAP-202).
|
|
54
|
+
* When absent, the loop re-runs `rebind` / uses artifacts the host attached on context.call.
|
|
55
|
+
*/
|
|
56
|
+
resolveInput?: () => ResolveInput | Promise<ResolveInput>;
|
|
57
|
+
resolveConfig?: ResolveConfig;
|
|
58
|
+
};
|
|
59
|
+
export declare function clampMaxAttempts(n: unknown): number;
|
|
60
|
+
export declare function normalizeAutoRecheck(raw: unknown): AutoRecheckConfig | null;
|
|
61
|
+
export type AutoRecheckLoopArgs<T> = {
|
|
62
|
+
call: ToolCallDescriptor;
|
|
63
|
+
factory: ExecuteFactory<T>;
|
|
64
|
+
config: GuardConfig;
|
|
65
|
+
callContext?: GuardToolCallContext;
|
|
66
|
+
rebind: () => ToolCallDescriptor | Promise<ToolCallDescriptor>;
|
|
67
|
+
/** Re-collect freshness VALUES from the FRESH call (full re-preflight). */
|
|
68
|
+
refreshContext?: (call: ToolCallDescriptor) => Promise<GuardToolCallContext | undefined>;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* First call is always a normal guardToolCall. The loop runs only when autoRecheck is
|
|
72
|
+
* normalized (applyFix present, maxAttempts in 1–3) AND the outcome is BLOCK with a
|
|
73
|
+
* remediation_transaction.
|
|
74
|
+
*/
|
|
75
|
+
export declare function runAutoRecheckLoop<T>(args: AutoRecheckLoopArgs<T>): Promise<GuardOutcome<T>>;
|
|
76
|
+
//# sourceMappingURL=auto-recheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-recheck.d.ts","sourceRoot":"","sources":["../../src/auto-recheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,kBAAkB,EAClB,cAAc,EAEd,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE1E,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,oBAAoB,GACpB,iBAAiB,GACjB,WAAW,CAAC;AAEhB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACjD,oGAAoG;IACpG,iBAAiB,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzE,mBAAmB,CAAC,EAAE,iBAAiB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,EAAE,CACR,WAAW,EAAE,0BAA0B,EACvC,OAAO,EAAE,0BAA0B,KAChC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAMnD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAU3E;AAuHD,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,MAAM,EAAE,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/D,2EAA2E;IAC3E,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;CAC1F,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA4ElG"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S6 auto-recheck loop — host-side orchestration AFTER a BLOCK with a remediation_transaction.
|
|
3
|
+
*
|
|
4
|
+
* Default OFF. The frozen guardToolCall is unchanged; this wraps it. The guard never writes
|
|
5
|
+
* artifacts: the host's applyFix applies the fix (honesty line). After applyFix true, artifacts
|
|
6
|
+
* are re-resolved FRESH (resolve() from artifact-resolver when resolveInput is supplied, else
|
|
7
|
+
* the host-updated call / rebind).
|
|
8
|
+
*
|
|
9
|
+
* recheck_scope is an OUTPUT on the BLOCK envelope (app remediation-transaction.js). The
|
|
10
|
+
* preflight request does not accept a scope hint (measured SDK / authorizeChangeSet) — so
|
|
11
|
+
* each attempt is a FULL re-preflight. Noted, not faked.
|
|
12
|
+
*
|
|
13
|
+
* Nothing here enters a fingerprint preimage (host orchestration only).
|
|
14
|
+
*/
|
|
15
|
+
import { guardToolCall } from './guard.js';
|
|
16
|
+
import { readRemediationTransaction } from './remediation-loop-attestation.js';
|
|
17
|
+
import { resolve as resolveArtifacts } from './artifact-resolver.js';
|
|
18
|
+
/** Hard cap on RE-preflights per original call. */
|
|
19
|
+
export const AUTO_RECHECK_MAX_CAP = 3;
|
|
20
|
+
function iso() {
|
|
21
|
+
return new Date().toISOString();
|
|
22
|
+
}
|
|
23
|
+
function emit(config, e) {
|
|
24
|
+
if (config.onEvent) {
|
|
25
|
+
try {
|
|
26
|
+
config.onEvent(e);
|
|
27
|
+
}
|
|
28
|
+
catch { /* onEvent never throws out */ }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function clampMaxAttempts(n) {
|
|
32
|
+
const v = typeof n === 'number' ? n : Number(n);
|
|
33
|
+
if (!Number.isFinite(v))
|
|
34
|
+
return 0;
|
|
35
|
+
const i = Math.floor(v);
|
|
36
|
+
if (i < 1)
|
|
37
|
+
return 0;
|
|
38
|
+
return i > AUTO_RECHECK_MAX_CAP ? AUTO_RECHECK_MAX_CAP : i;
|
|
39
|
+
}
|
|
40
|
+
export function normalizeAutoRecheck(raw) {
|
|
41
|
+
if (!raw || typeof raw !== 'object')
|
|
42
|
+
return null;
|
|
43
|
+
const o = raw;
|
|
44
|
+
if (typeof o.applyFix !== 'function')
|
|
45
|
+
return null;
|
|
46
|
+
const maxAttempts = clampMaxAttempts(o.maxAttempts);
|
|
47
|
+
if (maxAttempts < 1)
|
|
48
|
+
return null;
|
|
49
|
+
const cfg = { maxAttempts, applyFix: o.applyFix };
|
|
50
|
+
if (typeof o.resolveInput === 'function')
|
|
51
|
+
cfg.resolveInput = o.resolveInput;
|
|
52
|
+
if (o.resolveConfig && typeof o.resolveConfig === 'object')
|
|
53
|
+
cfg.resolveConfig = o.resolveConfig;
|
|
54
|
+
return cfg;
|
|
55
|
+
}
|
|
56
|
+
function envelopeOf(outcome) {
|
|
57
|
+
const v = outcome.verdict;
|
|
58
|
+
if (v && 'envelope' in v && v.envelope && typeof v.envelope === 'object') {
|
|
59
|
+
return v.envelope;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
function fingerprintOf(outcome) {
|
|
64
|
+
const env = envelopeOf(outcome);
|
|
65
|
+
if (env && typeof env.fingerprint === 'string' && env.fingerprint)
|
|
66
|
+
return env.fingerprint;
|
|
67
|
+
const fp = outcome.proof && outcome.proof.binds_to && outcome.proof.binds_to.change_fp;
|
|
68
|
+
return typeof fp === 'string' && fp ? fp : null;
|
|
69
|
+
}
|
|
70
|
+
function decisionIdOf(outcome) {
|
|
71
|
+
const env = envelopeOf(outcome);
|
|
72
|
+
if (env && typeof env.decision_id === 'string' && env.decision_id)
|
|
73
|
+
return env.decision_id;
|
|
74
|
+
const id = outcome.proof && outcome.proof.decision_id;
|
|
75
|
+
return typeof id === 'string' && id ? id : null;
|
|
76
|
+
}
|
|
77
|
+
function executionActionOf(outcome) {
|
|
78
|
+
const v = outcome.verdict;
|
|
79
|
+
if (v && 'action' in v && typeof v.action === 'string')
|
|
80
|
+
return v.action;
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
function isAllowClass(outcome) {
|
|
84
|
+
const v = outcome.verdict;
|
|
85
|
+
if (!v || typeof v !== 'object')
|
|
86
|
+
return false;
|
|
87
|
+
// Kind only — UnavailableVerdict can carry action CONTINUE / CONTINUE_WITH_MONITORING
|
|
88
|
+
// on OPEN_PASSTHROUGH / LKG_SUBSTITUTION; that is not allow-class.
|
|
89
|
+
return v.kind === 'ALLOW' || v.kind === 'MONITOR';
|
|
90
|
+
}
|
|
91
|
+
function isBlockWithRemediation(outcome) {
|
|
92
|
+
const v = outcome.verdict;
|
|
93
|
+
if (!v || v.kind !== 'BLOCK')
|
|
94
|
+
return null;
|
|
95
|
+
return readRemediationTransaction(envelopeOf(outcome));
|
|
96
|
+
}
|
|
97
|
+
function trailEntry(outcome, attempt) {
|
|
98
|
+
return Object.freeze({
|
|
99
|
+
attempt,
|
|
100
|
+
decision_id: decisionIdOf(outcome),
|
|
101
|
+
fingerprint: fingerprintOf(outcome),
|
|
102
|
+
execution_action: executionActionOf(outcome),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function attachObservation(outcome, trail, extras) {
|
|
106
|
+
const frozenTrail = Object.freeze(trail.map((e) => Object.freeze({ ...e })));
|
|
107
|
+
const proof = Object.freeze({
|
|
108
|
+
...outcome.proof,
|
|
109
|
+
recheck_trail: frozenTrail,
|
|
110
|
+
});
|
|
111
|
+
const obs = { recheck_trail: frozenTrail };
|
|
112
|
+
if (extras.stop)
|
|
113
|
+
obs.recheck_stop_reason = extras.stop;
|
|
114
|
+
const recheckCount = Math.max(0, trail.length - 1);
|
|
115
|
+
if (extras.fixed === true) {
|
|
116
|
+
obs.fixed_after_block = { value: true, attempt_count: recheckCount };
|
|
117
|
+
}
|
|
118
|
+
else if (trail.length > 0) {
|
|
119
|
+
obs.fixed_after_block = { value: null, attempt_count: recheckCount > 0 ? recheckCount : null };
|
|
120
|
+
}
|
|
121
|
+
return { ...outcome, proof, ...obs };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Keep T2's hashed artifacts and the factory's arguments.artifacts the same array.
|
|
125
|
+
* wrapWithGuard executes `redacted.arguments`; a descriptor that preflights ART_FIXED
|
|
126
|
+
* while arguments still hold the BLOCK-era payload would authorize one change set and
|
|
127
|
+
* apply another.
|
|
128
|
+
*/
|
|
129
|
+
function withFreshArtifacts(call, artifacts) {
|
|
130
|
+
const next = { ...call, artifacts };
|
|
131
|
+
const args = next.arguments;
|
|
132
|
+
if (args && typeof args === 'object' && !Array.isArray(args)) {
|
|
133
|
+
next.arguments = { ...args, artifacts };
|
|
134
|
+
}
|
|
135
|
+
return next;
|
|
136
|
+
}
|
|
137
|
+
async function freshCall(cfg, current, rebind, artifactsBeforeFix) {
|
|
138
|
+
// Host-updated call first so applyFix mutations of arguments / filesTouched / diff survive.
|
|
139
|
+
let next = { ...current };
|
|
140
|
+
if (typeof cfg.resolveInput === 'function') {
|
|
141
|
+
const input = await cfg.resolveInput();
|
|
142
|
+
const resolved = resolveArtifacts(input, cfg.resolveConfig);
|
|
143
|
+
if (resolved.artifacts && resolved.artifacts.length > 0) {
|
|
144
|
+
return withFreshArtifacts(next, resolved.artifacts);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const hostReplacedArtifacts = Array.isArray(current.artifacts)
|
|
148
|
+
&& current.artifacts !== artifactsBeforeFix;
|
|
149
|
+
if (hostReplacedArtifacts) {
|
|
150
|
+
return withFreshArtifacts(next, current.artifacts);
|
|
151
|
+
}
|
|
152
|
+
const rebound = await Promise.resolve(rebind());
|
|
153
|
+
if (Array.isArray(rebound.artifacts) && rebound.artifacts.length > 0) {
|
|
154
|
+
return withFreshArtifacts(next, rebound.artifacts);
|
|
155
|
+
}
|
|
156
|
+
return next;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* First call is always a normal guardToolCall. The loop runs only when autoRecheck is
|
|
160
|
+
* normalized (applyFix present, maxAttempts in 1–3) AND the outcome is BLOCK with a
|
|
161
|
+
* remediation_transaction.
|
|
162
|
+
*/
|
|
163
|
+
export async function runAutoRecheckLoop(args) {
|
|
164
|
+
const cfg = normalizeAutoRecheck(args.config.autoRecheck);
|
|
165
|
+
const first = await guardToolCall(args.call, args.factory, args.config, args.callContext);
|
|
166
|
+
if (!cfg)
|
|
167
|
+
return first;
|
|
168
|
+
const remediation0 = isBlockWithRemediation(first);
|
|
169
|
+
if (!remediation0)
|
|
170
|
+
return first;
|
|
171
|
+
const trail = [trailEntry(first, 0)];
|
|
172
|
+
let currentCall = args.call;
|
|
173
|
+
let previous = first;
|
|
174
|
+
let previousFp = fingerprintOf(first);
|
|
175
|
+
let remediation = remediation0;
|
|
176
|
+
for (let i = 1; i <= cfg.maxAttempts; i++) {
|
|
177
|
+
const artifactsBeforeFix = currentCall.artifacts;
|
|
178
|
+
const ctx = {
|
|
179
|
+
call: currentCall,
|
|
180
|
+
attempt: i,
|
|
181
|
+
outcome: previous,
|
|
182
|
+
};
|
|
183
|
+
let applied = false;
|
|
184
|
+
try {
|
|
185
|
+
applied = (await cfg.applyFix(remediation, ctx)) === true;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
emit(args.config, {
|
|
189
|
+
type: 'recheck_attempt',
|
|
190
|
+
at: iso(),
|
|
191
|
+
attempt: i,
|
|
192
|
+
decisionId: decisionIdOf(previous) ?? undefined,
|
|
193
|
+
from_fp: previousFp,
|
|
194
|
+
to_fp: previousFp,
|
|
195
|
+
cause: 'apply_fix_threw',
|
|
196
|
+
});
|
|
197
|
+
return attachObservation(first, trail, { stop: 'apply_fix_threw' });
|
|
198
|
+
}
|
|
199
|
+
if (!applied) {
|
|
200
|
+
return attachObservation(first, trail, { stop: 'apply_fix_declined' });
|
|
201
|
+
}
|
|
202
|
+
currentCall = await freshCall(cfg, ctx.call, args.rebind, artifactsBeforeFix);
|
|
203
|
+
const nextCtx = args.refreshContext
|
|
204
|
+
? await args.refreshContext(currentCall)
|
|
205
|
+
: args.callContext;
|
|
206
|
+
const next = await guardToolCall(currentCall, args.factory, args.config, nextCtx);
|
|
207
|
+
const toFp = fingerprintOf(next);
|
|
208
|
+
trail.push(trailEntry(next, i));
|
|
209
|
+
emit(args.config, {
|
|
210
|
+
type: 'recheck_attempt',
|
|
211
|
+
at: iso(),
|
|
212
|
+
attempt: i,
|
|
213
|
+
decisionId: decisionIdOf(next) ?? undefined,
|
|
214
|
+
from_fp: previousFp,
|
|
215
|
+
to_fp: toFp,
|
|
216
|
+
});
|
|
217
|
+
// Same fingerprint as the previous attempt → no progress. Stop; last decision stands.
|
|
218
|
+
if (previousFp != null && toFp != null && previousFp === toFp) {
|
|
219
|
+
return attachObservation(next, trail, { stop: 'no_progress' });
|
|
220
|
+
}
|
|
221
|
+
if (isAllowClass(next)) {
|
|
222
|
+
return attachObservation(next, trail, { fixed: true });
|
|
223
|
+
}
|
|
224
|
+
const remNext = isBlockWithRemediation(next);
|
|
225
|
+
if (!remNext) {
|
|
226
|
+
return attachObservation(next, trail, {});
|
|
227
|
+
}
|
|
228
|
+
previous = next;
|
|
229
|
+
previousFp = toFp;
|
|
230
|
+
remediation = remNext;
|
|
231
|
+
}
|
|
232
|
+
return attachObservation(previous, trail, { stop: 'exhausted' });
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=auto-recheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-recheck.js","sourceRoot":"","sources":["../../src/auto-recheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* CAS attestation binder (ID781 option A follow-on) — separate record linking a frozen
|
|
3
3
|
* GuardExecutionProof (v1) with an ExecuteIfUnchangedOutcome.
|
|
4
4
|
*
|
|
5
|
-
* Does NOT
|
|
5
|
+
* Does NOT mutate execution-proof assembly or conditional-write outcome types.
|
|
6
|
+
* Additive `cas_evidence` is observation-only (optional on the proof / outcome).
|
|
6
7
|
* Does NOT claim that the host write is unique, that version tokens equal change_fp, or that
|
|
7
8
|
* committed_stale_detected is "safe". Those non-claims are always set on `limits`.
|
|
8
9
|
*
|
|
@@ -10,6 +11,7 @@
|
|
|
10
11
|
* this module is the separate attestation surface that pairs proof + CAS outcome without
|
|
11
12
|
* widening the proof spec.
|
|
12
13
|
*/
|
|
14
|
+
import type { ExecutorKeyRegistry } from '@coderifts/sdk';
|
|
13
15
|
import type { GuardExecutionProof, ExecutionResultHash } from './execution-proof.js';
|
|
14
16
|
import type { ExecuteIfUnchangedOutcome, VersionToken } from './conditional-write.js';
|
|
15
17
|
/** Machine-readable schema id — mirrors EXECUTION_PROOF_SPEC style. */
|
|
@@ -78,8 +80,39 @@ export type CasAttestation = {
|
|
|
78
80
|
/** outcome.status === 'refused'. */
|
|
79
81
|
refused: boolean;
|
|
80
82
|
};
|
|
83
|
+
/**
|
|
84
|
+
* Observation-side CAS evidence class (S2-F2a R3). Never a verdict/preimage field.
|
|
85
|
+
* executor_attested only after a customer-pinned registry verifies the token.
|
|
86
|
+
* A lying/invalid attestation stays host_claimed with attest_status visible
|
|
87
|
+
* (same principle as N-4's lying sink). No registry → host_claimed, no penalty.
|
|
88
|
+
*/
|
|
89
|
+
cas_evidence: CasEvidence;
|
|
81
90
|
limits: CasAttestationLimits;
|
|
82
91
|
};
|
|
92
|
+
/** Tri-state CAS evidence (N-4 monitoring_delivery is the pattern). */
|
|
93
|
+
export type CasEvidenceClass = 'executor_attested' | 'host_claimed' | 'absent';
|
|
94
|
+
export type CasEvidence = {
|
|
95
|
+
class: CasEvidenceClass;
|
|
96
|
+
attest_status: string | null;
|
|
97
|
+
executor_kid: string | null;
|
|
98
|
+
grant_jti: string | null;
|
|
99
|
+
};
|
|
100
|
+
export type ExecutorAttestationConfig = {
|
|
101
|
+
/** Customer-pinned executor key registry. Required to attempt verification. */
|
|
102
|
+
registry: ExecutorKeyRegistry;
|
|
103
|
+
};
|
|
104
|
+
export type EvaluateCasEvidenceOpts = {
|
|
105
|
+
registry?: ExecutorKeyRegistry | null;
|
|
106
|
+
grant?: string | null;
|
|
107
|
+
receipt_digest?: string | null;
|
|
108
|
+
};
|
|
109
|
+
/** Pull the attestation token from the CAS outcome or the mutation response body. */
|
|
110
|
+
export declare function extractExecutorAttestationToken(outcome: unknown): string | null;
|
|
111
|
+
/**
|
|
112
|
+
* Observation-side CAS evidence. Does not change authorized_and_committed.
|
|
113
|
+
* Invalid attestation never upgrades the class (lying token stays host_claimed).
|
|
114
|
+
*/
|
|
115
|
+
export declare function evaluateCasEvidence(outcome: unknown, opts?: EvaluateCasEvidenceOpts): CasEvidence;
|
|
83
116
|
/** Type guard: object carries the frozen v1 proof_spec. */
|
|
84
117
|
export declare function isGuardExecutionProof(x: unknown): x is GuardExecutionProof;
|
|
85
118
|
/** Type guard: object is one of the three ExecuteIfUnchangedOutcome branches. */
|
|
@@ -90,5 +123,5 @@ export declare function isExecuteIfUnchangedOutcome(x: unknown): x is ExecuteIfU
|
|
|
90
123
|
* Validation-first: rejects non-v1 proofs and non-outcome shapes (throws TypeError —
|
|
91
124
|
* builders fail closed; the human render layer soft-fails instead).
|
|
92
125
|
*/
|
|
93
|
-
export declare function buildCasAttestation(proof: GuardExecutionProof, outcome: ExecuteIfUnchangedOutcome<unknown
|
|
126
|
+
export declare function buildCasAttestation(proof: GuardExecutionProof, outcome: ExecuteIfUnchangedOutcome<unknown>, opts?: EvaluateCasEvidenceOpts): CasAttestation;
|
|
94
127
|
//# sourceMappingURL=cas-attestation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cas-attestation.d.ts","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cas-attestation.d.ts","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* CAS attestation binder (ID781 option A follow-on) — separate record linking a frozen
|
|
3
3
|
* GuardExecutionProof (v1) with an ExecuteIfUnchangedOutcome.
|
|
4
4
|
*
|
|
5
|
-
* Does NOT
|
|
5
|
+
* Does NOT mutate execution-proof assembly or conditional-write outcome types.
|
|
6
|
+
* Additive `cas_evidence` is observation-only (optional on the proof / outcome).
|
|
6
7
|
* Does NOT claim that the host write is unique, that version tokens equal change_fp, or that
|
|
7
8
|
* committed_stale_detected is "safe". Those non-claims are always set on `limits`.
|
|
8
9
|
*
|
|
@@ -10,6 +11,7 @@
|
|
|
10
11
|
* this module is the separate attestation surface that pairs proof + CAS outcome without
|
|
11
12
|
* widening the proof spec.
|
|
12
13
|
*/
|
|
14
|
+
import { verifyExecutionAttestation } from '@coderifts/sdk';
|
|
13
15
|
import { EXECUTION_PROOF_SPEC } from './execution-proof.js';
|
|
14
16
|
/** Machine-readable schema id — mirrors EXECUTION_PROOF_SPEC style. */
|
|
15
17
|
export const CAS_ATTESTATION_SPEC = 'cas-attestation.v1';
|
|
@@ -21,6 +23,104 @@ const LIMITS = Object.freeze({
|
|
|
21
23
|
does_not_claim_host_cannot_bypass: true,
|
|
22
24
|
does_not_claim_governance_redecision: true,
|
|
23
25
|
});
|
|
26
|
+
const ABSENT_EVIDENCE = Object.freeze({
|
|
27
|
+
class: 'absent',
|
|
28
|
+
attest_status: null,
|
|
29
|
+
executor_kid: null,
|
|
30
|
+
grant_jti: null,
|
|
31
|
+
});
|
|
32
|
+
function hostClaimed(status, kid, jti) {
|
|
33
|
+
return Object.freeze({
|
|
34
|
+
class: 'host_claimed',
|
|
35
|
+
attest_status: status,
|
|
36
|
+
executor_kid: kid,
|
|
37
|
+
grant_jti: jti,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** Pull the attestation token from the CAS outcome or the mutation response body. */
|
|
41
|
+
export function extractExecutorAttestationToken(outcome) {
|
|
42
|
+
if (!outcome || typeof outcome !== 'object')
|
|
43
|
+
return null;
|
|
44
|
+
const o = outcome;
|
|
45
|
+
if (typeof o.executor_attestation === 'string' && o.executor_attestation.length > 0) {
|
|
46
|
+
return o.executor_attestation;
|
|
47
|
+
}
|
|
48
|
+
const r = o.result;
|
|
49
|
+
if (r && typeof r === 'object') {
|
|
50
|
+
const tok = r.executor_attestation;
|
|
51
|
+
if (typeof tok === 'string' && tok.length > 0)
|
|
52
|
+
return tok;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function intendedFromOutcome(outcome) {
|
|
57
|
+
const intended = {};
|
|
58
|
+
if (!outcome || typeof outcome !== 'object')
|
|
59
|
+
return intended;
|
|
60
|
+
const o = outcome;
|
|
61
|
+
const r = o.result && typeof o.result === 'object' ? o.result : o;
|
|
62
|
+
if (typeof r.grant === 'string' && r.grant.length > 0)
|
|
63
|
+
intended.grant = r.grant;
|
|
64
|
+
else if (typeof r.execution_grant === 'string' && r.execution_grant.length > 0) {
|
|
65
|
+
intended.grant = r.execution_grant;
|
|
66
|
+
}
|
|
67
|
+
if (typeof r.receipt_digest === 'string' && r.receipt_digest.length > 0) {
|
|
68
|
+
intended.receipt_digest = r.receipt_digest;
|
|
69
|
+
}
|
|
70
|
+
return intended;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Observation-side CAS evidence. Does not change authorized_and_committed.
|
|
74
|
+
* Invalid attestation never upgrades the class (lying token stays host_claimed).
|
|
75
|
+
*/
|
|
76
|
+
export function evaluateCasEvidence(outcome, opts = {}) {
|
|
77
|
+
if (!isExecuteIfUnchangedOutcome(outcome))
|
|
78
|
+
return ABSENT_EVIDENCE;
|
|
79
|
+
if (outcome.status === 'refused')
|
|
80
|
+
return ABSENT_EVIDENCE;
|
|
81
|
+
const token = extractExecutorAttestationToken(outcome);
|
|
82
|
+
const registry = opts.registry;
|
|
83
|
+
const fromOutcome = intendedFromOutcome(outcome);
|
|
84
|
+
const grant = opts.grant || fromOutcome.grant || null;
|
|
85
|
+
const receipt_digest = opts.receipt_digest || fromOutcome.receipt_digest || null;
|
|
86
|
+
if (!registry || !Array.isArray(registry.keys)) {
|
|
87
|
+
return hostClaimed(null, null, null);
|
|
88
|
+
}
|
|
89
|
+
if (!token) {
|
|
90
|
+
return hostClaimed(null, null, null);
|
|
91
|
+
}
|
|
92
|
+
const intended = {};
|
|
93
|
+
if (grant)
|
|
94
|
+
intended.grant = grant;
|
|
95
|
+
if (receipt_digest)
|
|
96
|
+
intended.receipt_digest = receipt_digest;
|
|
97
|
+
const wantsIntended = Object.keys(intended).length > 0;
|
|
98
|
+
let verified;
|
|
99
|
+
try {
|
|
100
|
+
verified = verifyExecutionAttestation(token, {
|
|
101
|
+
registry,
|
|
102
|
+
...(wantsIntended ? { intended } : {}),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return hostClaimed('ATTEST_MALFORMED', null, null);
|
|
107
|
+
}
|
|
108
|
+
const payload = verified.payload && typeof verified.payload === 'object'
|
|
109
|
+
? verified.payload
|
|
110
|
+
: null;
|
|
111
|
+
const kid = payload && typeof payload.executor_kid === 'string' ? payload.executor_kid : null;
|
|
112
|
+
const jti = payload && typeof payload.grant_jti === 'string' ? payload.grant_jti : null;
|
|
113
|
+
if (verified.valid === true
|
|
114
|
+
&& (verified.status === 'ATTEST_VALID' || verified.status === 'ATTEST_RETIRED_KEY_VALID_AT_ISSUE')) {
|
|
115
|
+
return Object.freeze({
|
|
116
|
+
class: 'executor_attested',
|
|
117
|
+
attest_status: verified.status,
|
|
118
|
+
executor_kid: kid,
|
|
119
|
+
grant_jti: jti,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return hostClaimed(verified.status, kid, jti);
|
|
123
|
+
}
|
|
24
124
|
/** Type guard: object carries the frozen v1 proof_spec. */
|
|
25
125
|
export function isGuardExecutionProof(x) {
|
|
26
126
|
if (!x || typeof x !== 'object')
|
|
@@ -86,7 +186,7 @@ function projectCas(outcome) {
|
|
|
86
186
|
* Validation-first: rejects non-v1 proofs and non-outcome shapes (throws TypeError —
|
|
87
187
|
* builders fail closed; the human render layer soft-fails instead).
|
|
88
188
|
*/
|
|
89
|
-
export function buildCasAttestation(proof, outcome) {
|
|
189
|
+
export function buildCasAttestation(proof, outcome, opts = {}) {
|
|
90
190
|
if (!isGuardExecutionProof(proof)) {
|
|
91
191
|
throw new TypeError('@coderifts/agent-guard: buildCasAttestation requires a valid guard-execution-proof.v1 object '
|
|
92
192
|
+ '(proof_spec mismatch or missing required fields)');
|
|
@@ -117,6 +217,7 @@ export function buildCasAttestation(proof, outcome) {
|
|
|
117
217
|
stale_during_commit,
|
|
118
218
|
refused,
|
|
119
219
|
}),
|
|
220
|
+
cas_evidence: evaluateCasEvidence(outcome, opts),
|
|
120
221
|
limits: LIMITS,
|
|
121
222
|
};
|
|
122
223
|
return freezeAttestation(attestation);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cas-attestation.js","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cas-attestation.js","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import type { GuardVerdict } from './types.js';
|
|
21
21
|
import type { CommitObservation } from './commit-observation.js';
|
|
22
22
|
import type { MonitoringDelivery } from './monitoring-delivery.js';
|
|
23
|
+
import type { CasEvidence } from './cas-attestation.js';
|
|
23
24
|
/** Machine-readable schema id for this block. */
|
|
24
25
|
export declare const EXECUTION_PROOF_SPEC: "guard-execution-proof.v1";
|
|
25
26
|
/**
|
|
@@ -119,6 +120,21 @@ export type GuardExecutionProof = {
|
|
|
119
120
|
* Observation-side — never a verdict/preimage field. delivered_acked ≠ human attention.
|
|
120
121
|
*/
|
|
121
122
|
monitoring_delivery?: MonitoringDelivery;
|
|
123
|
+
/**
|
|
124
|
+
* S2-F2a R3 CAS evidence class (observation). Present when a CAS outcome was
|
|
125
|
+
* observed. Not a preimage field. executor_attested only after registry verify.
|
|
126
|
+
*/
|
|
127
|
+
cas_evidence?: CasEvidence;
|
|
128
|
+
/**
|
|
129
|
+
* S6 auto-recheck trail (observation). Present when the wrap-layer loop ran.
|
|
130
|
+
* Additive; not a preimage field. Final outcome is the last decision.
|
|
131
|
+
*/
|
|
132
|
+
recheck_trail?: ReadonlyArray<{
|
|
133
|
+
attempt: number;
|
|
134
|
+
decision_id: string | null;
|
|
135
|
+
fingerprint: string | null;
|
|
136
|
+
execution_action: string | null;
|
|
137
|
+
}>;
|
|
122
138
|
};
|
|
123
139
|
export type ProofBuildInput = {
|
|
124
140
|
preflighted: boolean;
|
|
@@ -140,6 +156,15 @@ export type ProofBuildInput = {
|
|
|
140
156
|
commitObservation?: CommitObservation;
|
|
141
157
|
/** CWM delivery evidence; omit on non-MONITOR arms. */
|
|
142
158
|
monitoringDelivery?: MonitoringDelivery;
|
|
159
|
+
/** S2-F2a R3 CAS evidence (observation). */
|
|
160
|
+
casEvidence?: CasEvidence;
|
|
161
|
+
/** S6 trail passthrough (observation). */
|
|
162
|
+
recheckTrail?: ReadonlyArray<{
|
|
163
|
+
attempt: number;
|
|
164
|
+
decision_id: string | null;
|
|
165
|
+
fingerprint: string | null;
|
|
166
|
+
execution_action: string | null;
|
|
167
|
+
}>;
|
|
143
168
|
};
|
|
144
169
|
/**
|
|
145
170
|
* Runtime twin of the type-level enforced⟺receiptVerified invariant.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-proof.d.ts","sourceRoot":"","sources":["../../src/execution-proof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-proof.d.ts","sourceRoot":"","sources":["../../src/execution-proof.ts"],"names":[],"mappings":"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"}
|
|
@@ -160,6 +160,12 @@ export function buildExecutionProof(input) {
|
|
|
160
160
|
if (input.monitoringDelivery && typeof input.monitoringDelivery === 'object') {
|
|
161
161
|
proof.monitoring_delivery = freezeMonitoringDelivery(input.monitoringDelivery);
|
|
162
162
|
}
|
|
163
|
+
if (input.casEvidence && typeof input.casEvidence === 'object') {
|
|
164
|
+
proof.cas_evidence = Object.freeze({ ...input.casEvidence });
|
|
165
|
+
}
|
|
166
|
+
if (Array.isArray(input.recheckTrail) && input.recheckTrail.length > 0) {
|
|
167
|
+
proof.recheck_trail = Object.freeze(input.recheckTrail.map((e) => Object.freeze({ ...e })));
|
|
168
|
+
}
|
|
163
169
|
return freezeProof(proof);
|
|
164
170
|
}
|
|
165
171
|
function freezeMonitoringDelivery(d) {
|