@coderifts/agent-guard 6.2.0 → 6.4.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 +36 -10
- package/dist/cjs/cas-adapters/api.d.ts +94 -0
- package/dist/cjs/cas-adapters/api.d.ts.map +1 -0
- package/dist/cjs/cas-adapters/api.js +120 -0
- package/dist/cjs/cas-adapters/api.js.map +1 -0
- package/dist/cjs/cas-adapters/db.d.ts +93 -0
- package/dist/cjs/cas-adapters/db.d.ts.map +1 -0
- package/dist/cjs/cas-adapters/db.js +139 -0
- package/dist/cjs/cas-adapters/db.js.map +1 -0
- package/dist/cjs/cas-adapters/registry.d.ts +88 -0
- package/dist/cjs/cas-adapters/registry.d.ts.map +1 -0
- package/dist/cjs/cas-adapters/registry.js +120 -0
- package/dist/cjs/cas-adapters/registry.js.map +1 -0
- package/dist/cjs/cas-attestation.d.ts +94 -0
- package/dist/cjs/cas-attestation.d.ts.map +1 -0
- package/dist/cjs/cas-attestation.js +133 -0
- package/dist/cjs/cas-attestation.js.map +1 -0
- package/dist/cjs/deploy-gate.d.ts +10 -1
- package/dist/cjs/deploy-gate.d.ts.map +1 -1
- package/dist/cjs/deploy-gate.js +14 -10
- package/dist/cjs/deploy-gate.js.map +1 -1
- package/dist/cjs/execute-tool-call.d.ts +100 -0
- package/dist/cjs/execute-tool-call.d.ts.map +1 -0
- package/dist/cjs/execute-tool-call.js +334 -0
- package/dist/cjs/execute-tool-call.js.map +1 -0
- package/dist/cjs/execution-time-fingerprint.d.ts +8 -0
- package/dist/cjs/execution-time-fingerprint.d.ts.map +1 -1
- package/dist/cjs/execution-time-fingerprint.js +13 -1
- package/dist/cjs/execution-time-fingerprint.js.map +1 -1
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +28 -9
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +13 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +51 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/merge-gate.d.ts +8 -0
- package/dist/cjs/merge-gate.d.ts.map +1 -1
- package/dist/cjs/merge-gate.js +19 -12
- package/dist/cjs/merge-gate.js.map +1 -1
- package/dist/cjs/remediation-loop-attestation.d.ts +125 -0
- package/dist/cjs/remediation-loop-attestation.d.ts.map +1 -0
- package/dist/cjs/remediation-loop-attestation.js +186 -0
- package/dist/cjs/remediation-loop-attestation.js.map +1 -0
- package/dist/cjs/types.d.ts +20 -3
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.d.ts +9 -0
- package/dist/cjs/with-coderifts.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.js +3 -0
- package/dist/cjs/with-coderifts.js.map +1 -1
- package/dist/esm/cas-adapters/api.d.ts +94 -0
- package/dist/esm/cas-adapters/api.d.ts.map +1 -0
- package/dist/esm/cas-adapters/api.js +116 -0
- package/dist/esm/cas-adapters/api.js.map +1 -0
- package/dist/esm/cas-adapters/db.d.ts +93 -0
- package/dist/esm/cas-adapters/db.d.ts.map +1 -0
- package/dist/esm/cas-adapters/db.js +135 -0
- package/dist/esm/cas-adapters/db.js.map +1 -0
- package/dist/esm/cas-adapters/registry.d.ts +88 -0
- package/dist/esm/cas-adapters/registry.d.ts.map +1 -0
- package/dist/esm/cas-adapters/registry.js +116 -0
- package/dist/esm/cas-adapters/registry.js.map +1 -0
- package/dist/esm/cas-attestation.d.ts +94 -0
- package/dist/esm/cas-attestation.d.ts.map +1 -0
- package/dist/esm/cas-attestation.js +127 -0
- package/dist/esm/cas-attestation.js.map +1 -0
- package/dist/esm/deploy-gate.d.ts +10 -1
- package/dist/esm/deploy-gate.d.ts.map +1 -1
- package/dist/esm/deploy-gate.js +14 -10
- package/dist/esm/deploy-gate.js.map +1 -1
- package/dist/esm/execute-tool-call.d.ts +100 -0
- package/dist/esm/execute-tool-call.d.ts.map +1 -0
- package/dist/esm/execute-tool-call.js +325 -0
- package/dist/esm/execute-tool-call.js.map +1 -0
- package/dist/esm/execution-time-fingerprint.d.ts +8 -0
- package/dist/esm/execution-time-fingerprint.d.ts.map +1 -1
- package/dist/esm/execution-time-fingerprint.js +11 -0
- package/dist/esm/execution-time-fingerprint.js.map +1 -1
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +29 -10
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +13 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +16 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/merge-gate.d.ts +8 -0
- package/dist/esm/merge-gate.d.ts.map +1 -1
- package/dist/esm/merge-gate.js +19 -12
- package/dist/esm/merge-gate.js.map +1 -1
- package/dist/esm/remediation-loop-attestation.d.ts +125 -0
- package/dist/esm/remediation-loop-attestation.d.ts.map +1 -0
- package/dist/esm/remediation-loop-attestation.js +179 -0
- package/dist/esm/remediation-loop-attestation.js.map +1 -0
- package/dist/esm/types.d.ts +20 -3
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/with-coderifts.d.ts +9 -0
- package/dist/esm/with-coderifts.d.ts.map +1 -1
- package/dist/esm/with-coderifts.js +3 -0
- package/dist/esm/with-coderifts.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry compareAndSwap CAS adapter — opaque registry/version token discipline over host-injected I/O.
|
|
3
|
+
*
|
|
4
|
+
* Uses executeIfUnchanged (conditional-write.ts). Does not invent a parallel outcome shape.
|
|
5
|
+
* Token format is opaque to the guard (string equality only).
|
|
6
|
+
*
|
|
7
|
+
* Token encoding (this adapter only; not interpreted by the core):
|
|
8
|
+
* registry:v1:<host_registry_token>
|
|
9
|
+
* Missing / empty token → REGISTRY_ABSENT_TOKEN.
|
|
10
|
+
*
|
|
11
|
+
* HONESTY: this adapter never talks to a registry client. The host callback performs
|
|
12
|
+
* compareAndSwap(expected, newValue) (or equivalent) and reports {swapped|conflict}.
|
|
13
|
+
* The adapter only normalizes tokens and maps the report onto ExecuteIfUnchangedOutcome.
|
|
14
|
+
*
|
|
15
|
+
* No registry SDKs — all I/O is host-injected.
|
|
16
|
+
*/
|
|
17
|
+
'use strict';
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.tokensEqual = exports.REGISTRY_ABSENT_TOKEN = exports.REGISTRY_VERSION_TOKEN_PREFIX = void 0;
|
|
20
|
+
exports.createRegistryVersionToken = createRegistryVersionToken;
|
|
21
|
+
exports.registryTokenRaw = registryTokenRaw;
|
|
22
|
+
exports.writeRegistryIfUnchanged = writeRegistryIfUnchanged;
|
|
23
|
+
const conditional_write_js_1 = require("../conditional-write.js");
|
|
24
|
+
Object.defineProperty(exports, "tokensEqual", { enumerable: true, get: function () { return conditional_write_js_1.tokensEqual; } });
|
|
25
|
+
/** Prefix for this adapter's opaque tokens (equality-only outside this module). */
|
|
26
|
+
exports.REGISTRY_VERSION_TOKEN_PREFIX = 'registry:v1:';
|
|
27
|
+
/**
|
|
28
|
+
* Token used when the registry key is absent / unversioned.
|
|
29
|
+
* Hosts that measured absence should pass this as expected_token for first put.
|
|
30
|
+
*/
|
|
31
|
+
exports.REGISTRY_ABSENT_TOKEN = 'registry:v1:absent';
|
|
32
|
+
/**
|
|
33
|
+
* Build a VersionToken from a host registry revision / generation / etag-like value.
|
|
34
|
+
* null / undefined / empty → REGISTRY_ABSENT_TOKEN.
|
|
35
|
+
*/
|
|
36
|
+
function createRegistryVersionToken(token) {
|
|
37
|
+
if (token == null)
|
|
38
|
+
return exports.REGISTRY_ABSENT_TOKEN;
|
|
39
|
+
if (typeof token === 'number' && !Number.isFinite(token))
|
|
40
|
+
return exports.REGISTRY_ABSENT_TOKEN;
|
|
41
|
+
const s = String(token).trim();
|
|
42
|
+
if (s.length === 0)
|
|
43
|
+
return exports.REGISTRY_ABSENT_TOKEN;
|
|
44
|
+
return `${exports.REGISTRY_VERSION_TOKEN_PREFIX}${s}`;
|
|
45
|
+
}
|
|
46
|
+
/** Raw value embedded in a registry:v1: token (for host CAS APIs). Absent → null. */
|
|
47
|
+
function registryTokenRaw(token) {
|
|
48
|
+
if (typeof token !== 'string' || !token.startsWith(exports.REGISTRY_VERSION_TOKEN_PREFIX)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
if (token === exports.REGISTRY_ABSENT_TOKEN)
|
|
52
|
+
return null;
|
|
53
|
+
const raw = token.slice(exports.REGISTRY_VERSION_TOKEN_PREFIX.length);
|
|
54
|
+
return raw.length > 0 ? raw : null;
|
|
55
|
+
}
|
|
56
|
+
function normalizeRegistryReport(report) {
|
|
57
|
+
if (!report || typeof report !== 'object') {
|
|
58
|
+
throw new Error('writeRegistryIfUnchanged: host compareAndSwap must return RegistryHostCasReport');
|
|
59
|
+
}
|
|
60
|
+
if ('swapped' in report) {
|
|
61
|
+
if (report.swapped === true) {
|
|
62
|
+
return { kind: 'committed', new_token: report.new_token, result: report.result };
|
|
63
|
+
}
|
|
64
|
+
return { kind: 'conflict', current_token: report.current_token };
|
|
65
|
+
}
|
|
66
|
+
if (report.status === 'committed') {
|
|
67
|
+
return { kind: 'committed', new_token: report.new_token, result: report.result };
|
|
68
|
+
}
|
|
69
|
+
if (report.status === 'conflict') {
|
|
70
|
+
return { kind: 'conflict', current_token: report.current_token };
|
|
71
|
+
}
|
|
72
|
+
throw new Error('writeRegistryIfUnchanged: unknown host report shape');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Conditional registry write: re-read token; if matches → host compareAndSwap.
|
|
76
|
+
*
|
|
77
|
+
* Mapping (host report → ExecuteIfUnchangedOutcome):
|
|
78
|
+
* swapped:true / status:committed → committed
|
|
79
|
+
* swapped:false / status:conflict → refused / stale_version_token
|
|
80
|
+
* current_token from host when supplied, else null
|
|
81
|
+
*
|
|
82
|
+
* Wired through executeIfUnchanged — not a parallel path.
|
|
83
|
+
*/
|
|
84
|
+
async function writeRegistryIfUnchanged(args) {
|
|
85
|
+
const detect = args.detect_stale_during_commit === true;
|
|
86
|
+
return (0, conditional_write_js_1.executeIfUnchanged)({
|
|
87
|
+
expected_token: args.expected_token,
|
|
88
|
+
current_token: async () => createRegistryVersionToken(await args.current_token()),
|
|
89
|
+
detect_stale_during_commit: detect,
|
|
90
|
+
expected_after_commit: detect
|
|
91
|
+
? async (written) => {
|
|
92
|
+
if (typeof written.new_token === 'string' && written.new_token.trim().length > 0) {
|
|
93
|
+
return createRegistryVersionToken(written.new_token);
|
|
94
|
+
}
|
|
95
|
+
return createRegistryVersionToken(await args.current_token());
|
|
96
|
+
}
|
|
97
|
+
: undefined,
|
|
98
|
+
write: async () => {
|
|
99
|
+
const report = await args.compareAndSwap({
|
|
100
|
+
expected: registryTokenRaw(args.expected_token),
|
|
101
|
+
expected_token: args.expected_token,
|
|
102
|
+
});
|
|
103
|
+
const norm = normalizeRegistryReport(report);
|
|
104
|
+
if (norm.kind === 'conflict') {
|
|
105
|
+
const cur = norm.current_token !== undefined
|
|
106
|
+
? createRegistryVersionToken(norm.current_token)
|
|
107
|
+
: null;
|
|
108
|
+
throw new conditional_write_js_1.StaleVersionTokenAbort(cur);
|
|
109
|
+
}
|
|
110
|
+
const new_token = norm.new_token === undefined || norm.new_token === null
|
|
111
|
+
? null
|
|
112
|
+
: String(norm.new_token);
|
|
113
|
+
return {
|
|
114
|
+
new_token,
|
|
115
|
+
result: norm.result,
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cas-adapters/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CAS attestation binder (ID781 option A follow-on) — separate record linking a frozen
|
|
3
|
+
* GuardExecutionProof (v1) with an ExecuteIfUnchangedOutcome.
|
|
4
|
+
*
|
|
5
|
+
* Does NOT modify execution-proof.ts, the proof shape, or conditional-write outcome types.
|
|
6
|
+
* Does NOT claim that the host write is unique, that version tokens equal change_fp, or that
|
|
7
|
+
* committed_stale_detected is "safe". Those non-claims are always set on `limits`.
|
|
8
|
+
*
|
|
9
|
+
* The proof's own limit `conditional_write_is_host_asserted_not_cas_verified` names this gap;
|
|
10
|
+
* this module is the separate attestation surface that pairs proof + CAS outcome without
|
|
11
|
+
* widening the proof spec.
|
|
12
|
+
*/
|
|
13
|
+
import type { GuardExecutionProof, ExecutionResultHash } from './execution-proof.js';
|
|
14
|
+
import type { ExecuteIfUnchangedOutcome, VersionToken } from './conditional-write.js';
|
|
15
|
+
/** Machine-readable schema id — mirrors EXECUTION_PROOF_SPEC style. */
|
|
16
|
+
export declare const CAS_ATTESTATION_SPEC: "cas-attestation.v1";
|
|
17
|
+
/**
|
|
18
|
+
* Explicit non-claims. Always set (same discipline as GuardExecutionProof.limits).
|
|
19
|
+
* Readers that treat missing fields as "ok" are wrong.
|
|
20
|
+
*/
|
|
21
|
+
export type CasAttestationLimits = {
|
|
22
|
+
/** Host may have performed other writes outside executeIfUnchanged. */
|
|
23
|
+
does_not_claim_only_write_on_host: true;
|
|
24
|
+
/** version_token / post_commit_token are opaque CAS resource versions — not change_fp identity. */
|
|
25
|
+
does_not_claim_version_token_proves_change_fp_match: true;
|
|
26
|
+
/** committed_stale_detected means write ran and post-check disagreed — not "safe" or rolled back. */
|
|
27
|
+
does_not_claim_committed_stale_is_safe: true;
|
|
28
|
+
/** execution_result_hash hashes the factory return, not CAS file bytes / token equality. */
|
|
29
|
+
does_not_claim_execution_result_hash_equals_cas_bytes: true;
|
|
30
|
+
/** Same host-bypass residual as the proof family — package cannot force host CAS use. */
|
|
31
|
+
does_not_claim_host_cannot_bypass: true;
|
|
32
|
+
/** Attestation is linkage of two inputs, not a re-decision of governance ALLOW/BLOCK. */
|
|
33
|
+
does_not_claim_governance_redecision: true;
|
|
34
|
+
};
|
|
35
|
+
/** CAS branch projection — only fields present on the measured outcome branch. */
|
|
36
|
+
export type CasAttestationCas = {
|
|
37
|
+
status: 'committed';
|
|
38
|
+
write_ran: true;
|
|
39
|
+
version_token: VersionToken;
|
|
40
|
+
} | {
|
|
41
|
+
status: 'refused';
|
|
42
|
+
write_ran: false;
|
|
43
|
+
reason: 'stale_version_token';
|
|
44
|
+
expected_token: VersionToken;
|
|
45
|
+
current_token: VersionToken | null;
|
|
46
|
+
} | {
|
|
47
|
+
status: 'committed_stale_detected';
|
|
48
|
+
write_ran: true;
|
|
49
|
+
reason: 'stale_during_commit';
|
|
50
|
+
expected_token: VersionToken;
|
|
51
|
+
post_commit_token: VersionToken | null;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Frozen cas-attestation.v1 record.
|
|
55
|
+
* References are lifted from the proof; cas is projected from the outcome; derived flags
|
|
56
|
+
* are only what is honestly computable from those two inputs.
|
|
57
|
+
*/
|
|
58
|
+
export type CasAttestation = {
|
|
59
|
+
attestation_spec: typeof CAS_ATTESTATION_SPEC;
|
|
60
|
+
references: {
|
|
61
|
+
decision_id: string | null;
|
|
62
|
+
change_fp: string | null;
|
|
63
|
+
operation: string | null;
|
|
64
|
+
execution_result_hash: ExecutionResultHash;
|
|
65
|
+
receipt_verified: boolean;
|
|
66
|
+
};
|
|
67
|
+
cas: CasAttestationCas;
|
|
68
|
+
derived: {
|
|
69
|
+
/**
|
|
70
|
+
* receipt.verified === true AND outcome.status === 'committed'
|
|
71
|
+
* (clean commit only — committed_stale_detected is NOT this flag).
|
|
72
|
+
*/
|
|
73
|
+
authorized_and_committed: boolean;
|
|
74
|
+
/** Write mutation ran: committed or committed_stale_detected. */
|
|
75
|
+
write_ran: boolean;
|
|
76
|
+
/** outcome.status === 'committed_stale_detected'. */
|
|
77
|
+
stale_during_commit: boolean;
|
|
78
|
+
/** outcome.status === 'refused'. */
|
|
79
|
+
refused: boolean;
|
|
80
|
+
};
|
|
81
|
+
limits: CasAttestationLimits;
|
|
82
|
+
};
|
|
83
|
+
/** Type guard: object carries the frozen v1 proof_spec. */
|
|
84
|
+
export declare function isGuardExecutionProof(x: unknown): x is GuardExecutionProof;
|
|
85
|
+
/** Type guard: object is one of the three ExecuteIfUnchangedOutcome branches. */
|
|
86
|
+
export declare function isExecuteIfUnchangedOutcome(x: unknown): x is ExecuteIfUnchangedOutcome<unknown>;
|
|
87
|
+
/**
|
|
88
|
+
* Bind a frozen GuardExecutionProof with an ExecuteIfUnchangedOutcome into a cas-attestation.v1.
|
|
89
|
+
*
|
|
90
|
+
* Validation-first: rejects non-v1 proofs and non-outcome shapes (throws TypeError —
|
|
91
|
+
* builders fail closed; the human render layer soft-fails instead).
|
|
92
|
+
*/
|
|
93
|
+
export declare function buildCasAttestation(proof: GuardExecutionProof, outcome: ExecuteIfUnchangedOutcome<unknown>): CasAttestation;
|
|
94
|
+
//# sourceMappingURL=cas-attestation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cas-attestation.d.ts","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAErF,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtF,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,EAAG,oBAA6B,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,uEAAuE;IACvE,iCAAiC,EAAE,IAAI,CAAC;IACxC,mGAAmG;IACnG,mDAAmD,EAAE,IAAI,CAAC;IAC1D,qGAAqG;IACrG,sCAAsC,EAAE,IAAI,CAAC;IAC7C,4FAA4F;IAC5F,qDAAqD,EAAE,IAAI,CAAC;IAC5D,yFAAyF;IACzF,iCAAiC,EAAE,IAAI,CAAC;IACxC,yFAAyF;IACzF,oCAAoC,EAAE,IAAI,CAAC;CAC5C,CAAC;AAWF,kFAAkF;AAClF,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,YAAY,CAAC;CAC7B,GACD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,cAAc,EAAE,YAAY,CAAC;IAC7B,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;CACpC,GACD;IACE,MAAM,EAAE,0BAA0B,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,cAAc,EAAE,YAAY,CAAC;IAC7B,iBAAiB,EAAE,YAAY,GAAG,IAAI,CAAC;CACxC,CAAC;AAEN;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,EAAE,OAAO,oBAAoB,CAAC;IAC9C,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,qBAAqB,EAAE,mBAAmB,CAAC;QAC3C,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,GAAG,EAAE,iBAAiB,CAAC;IACvB,OAAO,EAAE;QACP;;;WAGG;QACH,wBAAwB,EAAE,OAAO,CAAC;QAClC,iEAAiE;QACjE,SAAS,EAAE,OAAO,CAAC;QACnB,qDAAqD;QACrD,mBAAmB,EAAE,OAAO,CAAC;QAC7B,oCAAoC;QACpC,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,mBAAmB,CAQ1E;AAED,iFAAiF;AACjF,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAgB/F;AAiCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,yBAAyB,CAAC,OAAO,CAAC,GAC1C,cAAc,CAyChB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CAS attestation binder (ID781 option A follow-on) — separate record linking a frozen
|
|
4
|
+
* GuardExecutionProof (v1) with an ExecuteIfUnchangedOutcome.
|
|
5
|
+
*
|
|
6
|
+
* Does NOT modify execution-proof.ts, the proof shape, or conditional-write outcome types.
|
|
7
|
+
* Does NOT claim that the host write is unique, that version tokens equal change_fp, or that
|
|
8
|
+
* committed_stale_detected is "safe". Those non-claims are always set on `limits`.
|
|
9
|
+
*
|
|
10
|
+
* The proof's own limit `conditional_write_is_host_asserted_not_cas_verified` names this gap;
|
|
11
|
+
* this module is the separate attestation surface that pairs proof + CAS outcome without
|
|
12
|
+
* widening the proof spec.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CAS_ATTESTATION_SPEC = void 0;
|
|
16
|
+
exports.isGuardExecutionProof = isGuardExecutionProof;
|
|
17
|
+
exports.isExecuteIfUnchangedOutcome = isExecuteIfUnchangedOutcome;
|
|
18
|
+
exports.buildCasAttestation = buildCasAttestation;
|
|
19
|
+
const execution_proof_js_1 = require("./execution-proof.js");
|
|
20
|
+
/** Machine-readable schema id — mirrors EXECUTION_PROOF_SPEC style. */
|
|
21
|
+
exports.CAS_ATTESTATION_SPEC = 'cas-attestation.v1';
|
|
22
|
+
const LIMITS = Object.freeze({
|
|
23
|
+
does_not_claim_only_write_on_host: true,
|
|
24
|
+
does_not_claim_version_token_proves_change_fp_match: true,
|
|
25
|
+
does_not_claim_committed_stale_is_safe: true,
|
|
26
|
+
does_not_claim_execution_result_hash_equals_cas_bytes: true,
|
|
27
|
+
does_not_claim_host_cannot_bypass: true,
|
|
28
|
+
does_not_claim_governance_redecision: true,
|
|
29
|
+
});
|
|
30
|
+
/** Type guard: object carries the frozen v1 proof_spec. */
|
|
31
|
+
function isGuardExecutionProof(x) {
|
|
32
|
+
if (!x || typeof x !== 'object')
|
|
33
|
+
return false;
|
|
34
|
+
const p = x;
|
|
35
|
+
return p.proof_spec === execution_proof_js_1.EXECUTION_PROOF_SPEC
|
|
36
|
+
&& p.receipt != null
|
|
37
|
+
&& typeof p.receipt === 'object'
|
|
38
|
+
&& p.execution_result_hash != null
|
|
39
|
+
&& typeof p.execution_result_hash === 'object';
|
|
40
|
+
}
|
|
41
|
+
/** Type guard: object is one of the three ExecuteIfUnchangedOutcome branches. */
|
|
42
|
+
function isExecuteIfUnchangedOutcome(x) {
|
|
43
|
+
if (!x || typeof x !== 'object')
|
|
44
|
+
return false;
|
|
45
|
+
const o = x;
|
|
46
|
+
if (o.status === 'committed') {
|
|
47
|
+
const c = x;
|
|
48
|
+
return typeof c.version_token === 'string';
|
|
49
|
+
}
|
|
50
|
+
if (o.status === 'refused') {
|
|
51
|
+
const r = x;
|
|
52
|
+
return r.reason === 'stale_version_token' && typeof r.expected_token === 'string';
|
|
53
|
+
}
|
|
54
|
+
if (o.status === 'committed_stale_detected') {
|
|
55
|
+
const s = x;
|
|
56
|
+
return s.reason === 'stale_during_commit' && typeof s.expected_token === 'string';
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
function freezeExecutionResultHash(h) {
|
|
61
|
+
return Object.freeze({ ...h });
|
|
62
|
+
}
|
|
63
|
+
function projectCas(outcome) {
|
|
64
|
+
if (outcome.status === 'committed') {
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
status: 'committed',
|
|
67
|
+
write_ran: true,
|
|
68
|
+
version_token: outcome.version_token,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (outcome.status === 'refused') {
|
|
72
|
+
return Object.freeze({
|
|
73
|
+
status: 'refused',
|
|
74
|
+
write_ran: false,
|
|
75
|
+
reason: 'stale_version_token',
|
|
76
|
+
expected_token: outcome.expected_token,
|
|
77
|
+
current_token: outcome.current_token == null ? null : outcome.current_token,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// committed_stale_detected
|
|
81
|
+
return Object.freeze({
|
|
82
|
+
status: 'committed_stale_detected',
|
|
83
|
+
write_ran: true,
|
|
84
|
+
reason: 'stale_during_commit',
|
|
85
|
+
expected_token: outcome.expected_token,
|
|
86
|
+
post_commit_token: outcome.post_commit_token == null ? null : outcome.post_commit_token,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Bind a frozen GuardExecutionProof with an ExecuteIfUnchangedOutcome into a cas-attestation.v1.
|
|
91
|
+
*
|
|
92
|
+
* Validation-first: rejects non-v1 proofs and non-outcome shapes (throws TypeError —
|
|
93
|
+
* builders fail closed; the human render layer soft-fails instead).
|
|
94
|
+
*/
|
|
95
|
+
function buildCasAttestation(proof, outcome) {
|
|
96
|
+
if (!isGuardExecutionProof(proof)) {
|
|
97
|
+
throw new TypeError('@coderifts/agent-guard: buildCasAttestation requires a valid guard-execution-proof.v1 object '
|
|
98
|
+
+ '(proof_spec mismatch or missing required fields)');
|
|
99
|
+
}
|
|
100
|
+
if (!isExecuteIfUnchangedOutcome(outcome)) {
|
|
101
|
+
throw new TypeError('@coderifts/agent-guard: buildCasAttestation requires a valid ExecuteIfUnchangedOutcome '
|
|
102
|
+
+ '(status committed | refused | committed_stale_detected with branch fields)');
|
|
103
|
+
}
|
|
104
|
+
const receipt_verified = proof.receipt.verified === true;
|
|
105
|
+
const cas = projectCas(outcome);
|
|
106
|
+
const write_ran = cas.write_ran === true;
|
|
107
|
+
const stale_during_commit = cas.status === 'committed_stale_detected';
|
|
108
|
+
const refused = cas.status === 'refused';
|
|
109
|
+
const authorized_and_committed = receipt_verified && cas.status === 'committed';
|
|
110
|
+
const attestation = {
|
|
111
|
+
attestation_spec: exports.CAS_ATTESTATION_SPEC,
|
|
112
|
+
references: Object.freeze({
|
|
113
|
+
decision_id: proof.decision_id,
|
|
114
|
+
change_fp: proof.binds_to != null ? proof.binds_to.change_fp : null,
|
|
115
|
+
operation: proof.binds_to != null ? proof.binds_to.operation : null,
|
|
116
|
+
execution_result_hash: freezeExecutionResultHash(proof.execution_result_hash),
|
|
117
|
+
receipt_verified,
|
|
118
|
+
}),
|
|
119
|
+
cas,
|
|
120
|
+
derived: Object.freeze({
|
|
121
|
+
authorized_and_committed,
|
|
122
|
+
write_ran,
|
|
123
|
+
stale_during_commit,
|
|
124
|
+
refused,
|
|
125
|
+
}),
|
|
126
|
+
limits: LIMITS,
|
|
127
|
+
};
|
|
128
|
+
return freezeAttestation(attestation);
|
|
129
|
+
}
|
|
130
|
+
function freezeAttestation(a) {
|
|
131
|
+
return Object.freeze(a);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=cas-attestation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cas-attestation.js","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,8 +93,17 @@ export type DeployGateDecision = {
|
|
|
93
93
|
reason: DeployGateReason;
|
|
94
94
|
enforcement_state: EnforcementState;
|
|
95
95
|
inescapable_deploy: boolean;
|
|
96
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Named residual when the check is green but NOT inescapable (honesty channel, §3.2).
|
|
98
|
+
* Compat: FIRST residual in evaluation order (same priority as pre-array single-slot).
|
|
99
|
+
* Prefer `residuals` when co-occurrence matters.
|
|
100
|
+
*/
|
|
97
101
|
residual?: DeployGateReason;
|
|
102
|
+
/**
|
|
103
|
+
* ALL applicable honesty residuals in evaluation order (no duplicates).
|
|
104
|
+
* Empty array when none. Additive — singular `residual` remains for published callers.
|
|
105
|
+
*/
|
|
106
|
+
residuals: DeployGateReason[];
|
|
98
107
|
detail: {
|
|
99
108
|
environment: string;
|
|
100
109
|
artifact_id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-gate.d.ts","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"deploy-gate.d.ts","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/deploy-gate.js
CHANGED
|
@@ -82,7 +82,9 @@ function deployGate(input) {
|
|
|
82
82
|
operation: receipt && receipt.operation != null ? String(receipt.operation) : null,
|
|
83
83
|
};
|
|
84
84
|
const deny = (state, reason) => ({
|
|
85
|
-
deploy_allowed: false, state, reason, enforcement_state, inescapable_deploy: false,
|
|
85
|
+
deploy_allowed: false, state, reason, enforcement_state, inescapable_deploy: false,
|
|
86
|
+
residuals: [],
|
|
87
|
+
detail,
|
|
86
88
|
});
|
|
87
89
|
// 0) incomplete target → pending/failure (fail-closed on missing evaluation input).
|
|
88
90
|
if (!target.environment || String(target.environment).trim() === ''
|
|
@@ -144,26 +146,28 @@ function deployGate(input) {
|
|
|
144
146
|
// 10) inescapable_deploy claim (STRICT, §1.4 step 10 / D8): only when the pipeline actually enforces
|
|
145
147
|
// the step AND no bypass is possible. Never true otherwise.
|
|
146
148
|
const inescapable_deploy = enforcement_state === 'ENFORCING' && enf.bypass_possible === false;
|
|
147
|
-
|
|
149
|
+
// Collect ALL applicable honesty residuals in evaluation order (no overwrite).
|
|
150
|
+
// Singular residual = residuals[0] (enforcement-axis before change_set_not_rebound).
|
|
151
|
+
const residuals = [];
|
|
148
152
|
if (!inescapable_deploy) {
|
|
149
153
|
if (enforcement_state === 'ENFORCING')
|
|
150
|
-
|
|
154
|
+
residuals.push('bypass_open'); // enforced, but a bypass exists
|
|
151
155
|
else
|
|
152
|
-
|
|
156
|
+
residuals.push('enforcement_not_configured'); // ADVISORY / ABSENT / UNKNOWN
|
|
153
157
|
}
|
|
154
|
-
// Optional change-set re-bind skipped:
|
|
155
|
-
//
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (rc.expected_fingerprint == null && residual === undefined) {
|
|
159
|
-
residual = 'change_set_not_rebound';
|
|
158
|
+
// Optional change-set re-bind skipped: co-occurs with enforcement residuals
|
|
159
|
+
// (previously dropped when singular residual was already set). Distinct from fingerprint_mismatch.
|
|
160
|
+
if (rc.expected_fingerprint == null) {
|
|
161
|
+
residuals.push('change_set_not_rebound');
|
|
160
162
|
}
|
|
163
|
+
const residual = residuals.length > 0 ? residuals[0] : undefined;
|
|
161
164
|
return {
|
|
162
165
|
deploy_allowed: true,
|
|
163
166
|
state: 'success',
|
|
164
167
|
reason: 'allow_current_deploy',
|
|
165
168
|
enforcement_state,
|
|
166
169
|
inescapable_deploy,
|
|
170
|
+
residuals,
|
|
167
171
|
...(residual ? { residual } : {}),
|
|
168
172
|
detail,
|
|
169
173
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-gate.js","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;
|
|
1
|
+
{"version":3,"file":"deploy-gate.js","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Option A safe dispatcher — per-framework execute wrappers that run a tool call
|
|
3
|
+
* through the protected table AND always return a proof-bound framework message.
|
|
4
|
+
*
|
|
5
|
+
* Closes the manual-binder gap (audit D): hosts that use these faces cannot
|
|
6
|
+
* forget bind*GuardOutcome — the return type is ONLY the ProofBound* brand.
|
|
7
|
+
*
|
|
8
|
+
* MECHANISM (measured, tool-registry.ts wrapWithGuard):
|
|
9
|
+
* ProtectedTool.execute for mutators returns guardToolCall(...) → GuardOutcome.
|
|
10
|
+
* No parallel guard path: the dispatcher only calls tool.execute on the table.
|
|
11
|
+
*
|
|
12
|
+
* REACHABILITY (do not overclaim):
|
|
13
|
+
* Same residual as GuardExecutionProof.limits.calls_outside_guarded_path_invisible
|
|
14
|
+
* and withCodeRifts composition honesty — calls outside the returned table remain
|
|
15
|
+
* invisible. This dispatcher only covers calls it is given against the table.
|
|
16
|
+
*
|
|
17
|
+
* BLOCK branch: binder no-result path (never fabricates a tool result) + measured
|
|
18
|
+
* DecisionResultEnvelope fields surfaced when present (decision_id, decision,
|
|
19
|
+
* execution_action, required_action, next_actions, breaking_changes). No invented
|
|
20
|
+
* remediation (ID850 lives in the app, not here).
|
|
21
|
+
*/
|
|
22
|
+
import type { GuardOutcome, DecisionResultEnvelope } from './types.js';
|
|
23
|
+
import type { ProtectedTool } from './tool-registry.js';
|
|
24
|
+
import { type BindOpenAIGuardOutcomeArgs, type ProofBoundOpenAIToolMessage } from './adapters/openai.js';
|
|
25
|
+
import { type BindAnthropicGuardOutcomeArgs, type ProofBoundAnthropicToolResult } from './adapters/anthropic.js';
|
|
26
|
+
import { type BindGeminiGuardOutcomeArgs, type ProofBoundGeminiFunctionResponse } from './adapters/gemini.js';
|
|
27
|
+
import { type BindLangGraphGuardOutcomeArgs, type ProofBoundLangGraphToolMessage } from './adapters/langgraph.js';
|
|
28
|
+
/**
|
|
29
|
+
* Accepts a bare ProtectedTool[] or a withCodeRifts / withCodeRifts* result that
|
|
30
|
+
* carries `tools` and/or `protected_tools`.
|
|
31
|
+
*/
|
|
32
|
+
export type ProtectedToolTableInput = readonly ProtectedTool[] | {
|
|
33
|
+
tools?: readonly ProtectedTool[];
|
|
34
|
+
protected_tools?: readonly ProtectedTool[];
|
|
35
|
+
};
|
|
36
|
+
/** Measured shape: every arm has executed + executionAttempted + proof + verdict. */
|
|
37
|
+
export declare function isGuardOutcome(x: unknown): x is GuardOutcome<unknown>;
|
|
38
|
+
/**
|
|
39
|
+
* Locate tool by name on the protected table and invoke its execute.
|
|
40
|
+
* Mutators return GuardOutcome (guardToolCall); unknown → typed refusal outcome.
|
|
41
|
+
*
|
|
42
|
+
* Does NOT claim reachability outside the table
|
|
43
|
+
* (limits.calls_outside_guarded_path_invisible).
|
|
44
|
+
*/
|
|
45
|
+
export declare function executeProtectedTool(table: ProtectedToolTableInput, toolName: string, args: unknown): Promise<GuardOutcome<unknown>>;
|
|
46
|
+
/**
|
|
47
|
+
* Fields lifted only when present on DecisionResultEnvelope (producer schema).
|
|
48
|
+
* required_action is DISPLAY ONLY per schema — never a control source / remediation enginge.
|
|
49
|
+
* No invented remediation structures (ID850 is app-side).
|
|
50
|
+
*/
|
|
51
|
+
export type SurfacedEnvelopeFields = {
|
|
52
|
+
decision_id?: string;
|
|
53
|
+
decision?: string;
|
|
54
|
+
execution_action?: string;
|
|
55
|
+
required_action?: string | null;
|
|
56
|
+
next_actions?: unknown;
|
|
57
|
+
breaking_changes?: number | null;
|
|
58
|
+
};
|
|
59
|
+
export declare function surfaceEnvelopeFields(envelope: DecisionResultEnvelope | null | undefined): SurfacedEnvelopeFields | null;
|
|
60
|
+
export type ExecuteOpenAIToolCallArgs = {
|
|
61
|
+
/** Protected table or withCodeRifts / withCodeRiftsOpenAI result. */
|
|
62
|
+
tools: ProtectedToolTableInput;
|
|
63
|
+
/** Model tool_call_id this message answers. */
|
|
64
|
+
tool_call_id: string;
|
|
65
|
+
/** Function/tool name as returned by the model. */
|
|
66
|
+
name: string;
|
|
67
|
+
/** Tool arguments (object or JSON string). */
|
|
68
|
+
arguments?: unknown;
|
|
69
|
+
serialize?: BindOpenAIGuardOutcomeArgs<unknown>['serialize'];
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* OpenAI face: protected table + one tool_call → ProofBoundOpenAIToolMessage only.
|
|
73
|
+
* Return type is branded — host cannot type-check a forgotten-proof path.
|
|
74
|
+
*/
|
|
75
|
+
export declare function executeOpenAIToolCall(args: ExecuteOpenAIToolCallArgs): Promise<ProofBoundOpenAIToolMessage>;
|
|
76
|
+
export type ExecuteAnthropicToolCallArgs = {
|
|
77
|
+
tools: ProtectedToolTableInput;
|
|
78
|
+
tool_use_id: string;
|
|
79
|
+
name: string;
|
|
80
|
+
arguments?: unknown;
|
|
81
|
+
serialize?: BindAnthropicGuardOutcomeArgs<unknown>['serialize'];
|
|
82
|
+
};
|
|
83
|
+
export declare function executeAnthropicToolCall(args: ExecuteAnthropicToolCallArgs): Promise<ProofBoundAnthropicToolResult>;
|
|
84
|
+
export type ExecuteGeminiToolCallArgs = {
|
|
85
|
+
tools: ProtectedToolTableInput;
|
|
86
|
+
/** Gemini function name (also used as BindGemini name). */
|
|
87
|
+
name: string;
|
|
88
|
+
arguments?: unknown;
|
|
89
|
+
serialize?: BindGeminiGuardOutcomeArgs<unknown>['serialize'];
|
|
90
|
+
};
|
|
91
|
+
export declare function executeGeminiToolCall(args: ExecuteGeminiToolCallArgs): Promise<ProofBoundGeminiFunctionResponse>;
|
|
92
|
+
export type ExecuteLangGraphToolCallArgs = {
|
|
93
|
+
tools: ProtectedToolTableInput;
|
|
94
|
+
tool_call_id: string;
|
|
95
|
+
name: string;
|
|
96
|
+
arguments?: unknown;
|
|
97
|
+
serialize?: BindLangGraphGuardOutcomeArgs<unknown>['serialize'];
|
|
98
|
+
};
|
|
99
|
+
export declare function executeLangGraphToolCall(args: ExecuteLangGraphToolCallArgs): Promise<ProofBoundLangGraphToolMessage>;
|
|
100
|
+
//# sourceMappingURL=execute-tool-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-tool-call.d.ts","sourceRoot":"","sources":["../../src/execute-tool-call.ts"],"names":[],"mappings":"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"}
|