@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 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/cas-adapters/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
import { tokensEqual, type ExecuteIfUnchangedOutcome, type VersionToken } from '../conditional-write.js';
|
|
18
|
+
/** Prefix for this adapter's opaque tokens (equality-only outside this module). */
|
|
19
|
+
export declare const REGISTRY_VERSION_TOKEN_PREFIX = "registry:v1:";
|
|
20
|
+
/**
|
|
21
|
+
* Token used when the registry key is absent / unversioned.
|
|
22
|
+
* Hosts that measured absence should pass this as expected_token for first put.
|
|
23
|
+
*/
|
|
24
|
+
export declare const REGISTRY_ABSENT_TOKEN: VersionToken;
|
|
25
|
+
/**
|
|
26
|
+
* Build a VersionToken from a host registry revision / generation / etag-like value.
|
|
27
|
+
* null / undefined / empty → REGISTRY_ABSENT_TOKEN.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createRegistryVersionToken(token: string | number | bigint | null | undefined): VersionToken;
|
|
30
|
+
/** Raw value embedded in a registry:v1: token (for host CAS APIs). Absent → null. */
|
|
31
|
+
export declare function registryTokenRaw(token: VersionToken | null | undefined): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Host report after compareAndSwap (or equivalent).
|
|
34
|
+
*/
|
|
35
|
+
export type RegistryHostCasReport<T = unknown> = {
|
|
36
|
+
swapped: true;
|
|
37
|
+
/** New registry token after successful swap; null/omit when unknown. */
|
|
38
|
+
new_token?: string | number | bigint | null;
|
|
39
|
+
result?: T;
|
|
40
|
+
} | {
|
|
41
|
+
swapped: false;
|
|
42
|
+
/** Current token if observed on conflict; omit → null (no invented token). */
|
|
43
|
+
current_token?: string | number | bigint | null;
|
|
44
|
+
} | {
|
|
45
|
+
status: 'committed';
|
|
46
|
+
new_token?: string | number | bigint | null;
|
|
47
|
+
result?: T;
|
|
48
|
+
} | {
|
|
49
|
+
status: 'conflict';
|
|
50
|
+
current_token?: string | number | bigint | null;
|
|
51
|
+
};
|
|
52
|
+
export type WriteRegistryIfUnchangedArgs<T = unknown> = {
|
|
53
|
+
/** Token measured before the host decided to write (from createRegistryVersionToken). */
|
|
54
|
+
expected_token: VersionToken;
|
|
55
|
+
/** Re-read the registry key's current token. Pre-write and post-write when detect is on. */
|
|
56
|
+
current_token: () => string | number | bigint | null | Promise<string | number | bigint | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Host compareAndSwap. Receives the raw expected token for the CAS call.
|
|
59
|
+
* Adapter does not invoke any registry client.
|
|
60
|
+
*/
|
|
61
|
+
compareAndSwap: (ctx: {
|
|
62
|
+
expected: string | null;
|
|
63
|
+
expected_token: VersionToken;
|
|
64
|
+
}) => RegistryHostCasReport<T> | Promise<RegistryHostCasReport<T>>;
|
|
65
|
+
/**
|
|
66
|
+
* Opt-in post-commit detection (default false).
|
|
67
|
+
* When host omits new_token on success, detection is a no-op.
|
|
68
|
+
*/
|
|
69
|
+
detect_stale_during_commit?: boolean;
|
|
70
|
+
};
|
|
71
|
+
export type RegistryWriteResult<T = unknown> = {
|
|
72
|
+
new_token: string | null;
|
|
73
|
+
result: T | undefined;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Conditional registry write: re-read token; if matches → host compareAndSwap.
|
|
77
|
+
*
|
|
78
|
+
* Mapping (host report → ExecuteIfUnchangedOutcome):
|
|
79
|
+
* swapped:true / status:committed → committed
|
|
80
|
+
* swapped:false / status:conflict → refused / stale_version_token
|
|
81
|
+
* current_token from host when supplied, else null
|
|
82
|
+
*
|
|
83
|
+
* Wired through executeIfUnchanged — not a parallel path.
|
|
84
|
+
*/
|
|
85
|
+
export declare function writeRegistryIfUnchanged<T = unknown>(args: WriteRegistryIfUnchangedArgs<T>): Promise<ExecuteIfUnchangedOutcome<RegistryWriteResult<T>>>;
|
|
86
|
+
/** Re-export equality helper for hosts comparing tokens without importing core module. */
|
|
87
|
+
export { tokensEqual };
|
|
88
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cas-adapters/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAGL,WAAW,EACX,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC,mFAAmF;AACnF,eAAO,MAAM,6BAA6B,iBAAiB,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAAmC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACjD,YAAY,CAMd;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAOtF;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,GAAG,OAAO,IACzC;IACE,OAAO,EAAE,IAAI,CAAC;IACd,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACjD,GACD;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5C,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,GACD;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACjD,CAAC;AAEN,MAAM,MAAM,4BAA4B,CAAC,CAAC,GAAG,OAAO,IAAI;IACtD,yFAAyF;IACzF,cAAc,EAAE,YAAY,CAAC;IAC7B,4FAA4F;IAC5F,aAAa,EAAE,MACX,MAAM,GACN,MAAM,GACN,MAAM,GACN,IAAI,GACJ,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,cAAc,EAAE,CAAC,GAAG,EAAE;QACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,cAAc,EAAE,YAAY,CAAC;KAC9B,KAAK,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE;;;OAGG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC7C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;CACvB,CAAC;AA0BF;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAAC,CAAC,GAAG,OAAO,EACxD,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,yBAAyB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAsC5D;AAED,0FAA0F;AAC1F,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
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
|
+
import { executeIfUnchanged, StaleVersionTokenAbort, tokensEqual, } from '../conditional-write.js';
|
|
19
|
+
/** Prefix for this adapter's opaque tokens (equality-only outside this module). */
|
|
20
|
+
export const REGISTRY_VERSION_TOKEN_PREFIX = 'registry:v1:';
|
|
21
|
+
/**
|
|
22
|
+
* Token used when the registry key is absent / unversioned.
|
|
23
|
+
* Hosts that measured absence should pass this as expected_token for first put.
|
|
24
|
+
*/
|
|
25
|
+
export const REGISTRY_ABSENT_TOKEN = 'registry:v1:absent';
|
|
26
|
+
/**
|
|
27
|
+
* Build a VersionToken from a host registry revision / generation / etag-like value.
|
|
28
|
+
* null / undefined / empty → REGISTRY_ABSENT_TOKEN.
|
|
29
|
+
*/
|
|
30
|
+
export function createRegistryVersionToken(token) {
|
|
31
|
+
if (token == null)
|
|
32
|
+
return REGISTRY_ABSENT_TOKEN;
|
|
33
|
+
if (typeof token === 'number' && !Number.isFinite(token))
|
|
34
|
+
return REGISTRY_ABSENT_TOKEN;
|
|
35
|
+
const s = String(token).trim();
|
|
36
|
+
if (s.length === 0)
|
|
37
|
+
return REGISTRY_ABSENT_TOKEN;
|
|
38
|
+
return `${REGISTRY_VERSION_TOKEN_PREFIX}${s}`;
|
|
39
|
+
}
|
|
40
|
+
/** Raw value embedded in a registry:v1: token (for host CAS APIs). Absent → null. */
|
|
41
|
+
export function registryTokenRaw(token) {
|
|
42
|
+
if (typeof token !== 'string' || !token.startsWith(REGISTRY_VERSION_TOKEN_PREFIX)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
if (token === REGISTRY_ABSENT_TOKEN)
|
|
46
|
+
return null;
|
|
47
|
+
const raw = token.slice(REGISTRY_VERSION_TOKEN_PREFIX.length);
|
|
48
|
+
return raw.length > 0 ? raw : null;
|
|
49
|
+
}
|
|
50
|
+
function normalizeRegistryReport(report) {
|
|
51
|
+
if (!report || typeof report !== 'object') {
|
|
52
|
+
throw new Error('writeRegistryIfUnchanged: host compareAndSwap must return RegistryHostCasReport');
|
|
53
|
+
}
|
|
54
|
+
if ('swapped' in report) {
|
|
55
|
+
if (report.swapped === true) {
|
|
56
|
+
return { kind: 'committed', new_token: report.new_token, result: report.result };
|
|
57
|
+
}
|
|
58
|
+
return { kind: 'conflict', current_token: report.current_token };
|
|
59
|
+
}
|
|
60
|
+
if (report.status === 'committed') {
|
|
61
|
+
return { kind: 'committed', new_token: report.new_token, result: report.result };
|
|
62
|
+
}
|
|
63
|
+
if (report.status === 'conflict') {
|
|
64
|
+
return { kind: 'conflict', current_token: report.current_token };
|
|
65
|
+
}
|
|
66
|
+
throw new Error('writeRegistryIfUnchanged: unknown host report shape');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Conditional registry write: re-read token; if matches → host compareAndSwap.
|
|
70
|
+
*
|
|
71
|
+
* Mapping (host report → ExecuteIfUnchangedOutcome):
|
|
72
|
+
* swapped:true / status:committed → committed
|
|
73
|
+
* swapped:false / status:conflict → refused / stale_version_token
|
|
74
|
+
* current_token from host when supplied, else null
|
|
75
|
+
*
|
|
76
|
+
* Wired through executeIfUnchanged — not a parallel path.
|
|
77
|
+
*/
|
|
78
|
+
export async function writeRegistryIfUnchanged(args) {
|
|
79
|
+
const detect = args.detect_stale_during_commit === true;
|
|
80
|
+
return executeIfUnchanged({
|
|
81
|
+
expected_token: args.expected_token,
|
|
82
|
+
current_token: async () => createRegistryVersionToken(await args.current_token()),
|
|
83
|
+
detect_stale_during_commit: detect,
|
|
84
|
+
expected_after_commit: detect
|
|
85
|
+
? async (written) => {
|
|
86
|
+
if (typeof written.new_token === 'string' && written.new_token.trim().length > 0) {
|
|
87
|
+
return createRegistryVersionToken(written.new_token);
|
|
88
|
+
}
|
|
89
|
+
return createRegistryVersionToken(await args.current_token());
|
|
90
|
+
}
|
|
91
|
+
: undefined,
|
|
92
|
+
write: async () => {
|
|
93
|
+
const report = await args.compareAndSwap({
|
|
94
|
+
expected: registryTokenRaw(args.expected_token),
|
|
95
|
+
expected_token: args.expected_token,
|
|
96
|
+
});
|
|
97
|
+
const norm = normalizeRegistryReport(report);
|
|
98
|
+
if (norm.kind === 'conflict') {
|
|
99
|
+
const cur = norm.current_token !== undefined
|
|
100
|
+
? createRegistryVersionToken(norm.current_token)
|
|
101
|
+
: null;
|
|
102
|
+
throw new StaleVersionTokenAbort(cur);
|
|
103
|
+
}
|
|
104
|
+
const new_token = norm.new_token === undefined || norm.new_token === null
|
|
105
|
+
? null
|
|
106
|
+
: String(norm.new_token);
|
|
107
|
+
return {
|
|
108
|
+
new_token,
|
|
109
|
+
result: norm.result,
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/** Re-export equality helper for hosts comparing tokens without importing core module. */
|
|
115
|
+
export { tokensEqual };
|
|
116
|
+
//# 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,127 @@
|
|
|
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 { EXECUTION_PROOF_SPEC } from './execution-proof.js';
|
|
14
|
+
/** Machine-readable schema id — mirrors EXECUTION_PROOF_SPEC style. */
|
|
15
|
+
export const CAS_ATTESTATION_SPEC = 'cas-attestation.v1';
|
|
16
|
+
const LIMITS = Object.freeze({
|
|
17
|
+
does_not_claim_only_write_on_host: true,
|
|
18
|
+
does_not_claim_version_token_proves_change_fp_match: true,
|
|
19
|
+
does_not_claim_committed_stale_is_safe: true,
|
|
20
|
+
does_not_claim_execution_result_hash_equals_cas_bytes: true,
|
|
21
|
+
does_not_claim_host_cannot_bypass: true,
|
|
22
|
+
does_not_claim_governance_redecision: true,
|
|
23
|
+
});
|
|
24
|
+
/** Type guard: object carries the frozen v1 proof_spec. */
|
|
25
|
+
export function isGuardExecutionProof(x) {
|
|
26
|
+
if (!x || typeof x !== 'object')
|
|
27
|
+
return false;
|
|
28
|
+
const p = x;
|
|
29
|
+
return p.proof_spec === EXECUTION_PROOF_SPEC
|
|
30
|
+
&& p.receipt != null
|
|
31
|
+
&& typeof p.receipt === 'object'
|
|
32
|
+
&& p.execution_result_hash != null
|
|
33
|
+
&& typeof p.execution_result_hash === 'object';
|
|
34
|
+
}
|
|
35
|
+
/** Type guard: object is one of the three ExecuteIfUnchangedOutcome branches. */
|
|
36
|
+
export function isExecuteIfUnchangedOutcome(x) {
|
|
37
|
+
if (!x || typeof x !== 'object')
|
|
38
|
+
return false;
|
|
39
|
+
const o = x;
|
|
40
|
+
if (o.status === 'committed') {
|
|
41
|
+
const c = x;
|
|
42
|
+
return typeof c.version_token === 'string';
|
|
43
|
+
}
|
|
44
|
+
if (o.status === 'refused') {
|
|
45
|
+
const r = x;
|
|
46
|
+
return r.reason === 'stale_version_token' && typeof r.expected_token === 'string';
|
|
47
|
+
}
|
|
48
|
+
if (o.status === 'committed_stale_detected') {
|
|
49
|
+
const s = x;
|
|
50
|
+
return s.reason === 'stale_during_commit' && typeof s.expected_token === 'string';
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
function freezeExecutionResultHash(h) {
|
|
55
|
+
return Object.freeze({ ...h });
|
|
56
|
+
}
|
|
57
|
+
function projectCas(outcome) {
|
|
58
|
+
if (outcome.status === 'committed') {
|
|
59
|
+
return Object.freeze({
|
|
60
|
+
status: 'committed',
|
|
61
|
+
write_ran: true,
|
|
62
|
+
version_token: outcome.version_token,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (outcome.status === 'refused') {
|
|
66
|
+
return Object.freeze({
|
|
67
|
+
status: 'refused',
|
|
68
|
+
write_ran: false,
|
|
69
|
+
reason: 'stale_version_token',
|
|
70
|
+
expected_token: outcome.expected_token,
|
|
71
|
+
current_token: outcome.current_token == null ? null : outcome.current_token,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// committed_stale_detected
|
|
75
|
+
return Object.freeze({
|
|
76
|
+
status: 'committed_stale_detected',
|
|
77
|
+
write_ran: true,
|
|
78
|
+
reason: 'stale_during_commit',
|
|
79
|
+
expected_token: outcome.expected_token,
|
|
80
|
+
post_commit_token: outcome.post_commit_token == null ? null : outcome.post_commit_token,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Bind a frozen GuardExecutionProof with an ExecuteIfUnchangedOutcome into a cas-attestation.v1.
|
|
85
|
+
*
|
|
86
|
+
* Validation-first: rejects non-v1 proofs and non-outcome shapes (throws TypeError —
|
|
87
|
+
* builders fail closed; the human render layer soft-fails instead).
|
|
88
|
+
*/
|
|
89
|
+
export function buildCasAttestation(proof, outcome) {
|
|
90
|
+
if (!isGuardExecutionProof(proof)) {
|
|
91
|
+
throw new TypeError('@coderifts/agent-guard: buildCasAttestation requires a valid guard-execution-proof.v1 object '
|
|
92
|
+
+ '(proof_spec mismatch or missing required fields)');
|
|
93
|
+
}
|
|
94
|
+
if (!isExecuteIfUnchangedOutcome(outcome)) {
|
|
95
|
+
throw new TypeError('@coderifts/agent-guard: buildCasAttestation requires a valid ExecuteIfUnchangedOutcome '
|
|
96
|
+
+ '(status committed | refused | committed_stale_detected with branch fields)');
|
|
97
|
+
}
|
|
98
|
+
const receipt_verified = proof.receipt.verified === true;
|
|
99
|
+
const cas = projectCas(outcome);
|
|
100
|
+
const write_ran = cas.write_ran === true;
|
|
101
|
+
const stale_during_commit = cas.status === 'committed_stale_detected';
|
|
102
|
+
const refused = cas.status === 'refused';
|
|
103
|
+
const authorized_and_committed = receipt_verified && cas.status === 'committed';
|
|
104
|
+
const attestation = {
|
|
105
|
+
attestation_spec: CAS_ATTESTATION_SPEC,
|
|
106
|
+
references: Object.freeze({
|
|
107
|
+
decision_id: proof.decision_id,
|
|
108
|
+
change_fp: proof.binds_to != null ? proof.binds_to.change_fp : null,
|
|
109
|
+
operation: proof.binds_to != null ? proof.binds_to.operation : null,
|
|
110
|
+
execution_result_hash: freezeExecutionResultHash(proof.execution_result_hash),
|
|
111
|
+
receipt_verified,
|
|
112
|
+
}),
|
|
113
|
+
cas,
|
|
114
|
+
derived: Object.freeze({
|
|
115
|
+
authorized_and_committed,
|
|
116
|
+
write_ran,
|
|
117
|
+
stale_during_commit,
|
|
118
|
+
refused,
|
|
119
|
+
}),
|
|
120
|
+
limits: LIMITS,
|
|
121
|
+
};
|
|
122
|
+
return freezeAttestation(attestation);
|
|
123
|
+
}
|
|
124
|
+
function freezeAttestation(a) {
|
|
125
|
+
return Object.freeze(a);
|
|
126
|
+
}
|
|
127
|
+
//# 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/esm/deploy-gate.js
CHANGED
|
@@ -79,7 +79,9 @@ export function deployGate(input) {
|
|
|
79
79
|
operation: receipt && receipt.operation != null ? String(receipt.operation) : null,
|
|
80
80
|
};
|
|
81
81
|
const deny = (state, reason) => ({
|
|
82
|
-
deploy_allowed: false, state, reason, enforcement_state, inescapable_deploy: false,
|
|
82
|
+
deploy_allowed: false, state, reason, enforcement_state, inescapable_deploy: false,
|
|
83
|
+
residuals: [],
|
|
84
|
+
detail,
|
|
83
85
|
});
|
|
84
86
|
// 0) incomplete target → pending/failure (fail-closed on missing evaluation input).
|
|
85
87
|
if (!target.environment || String(target.environment).trim() === ''
|
|
@@ -141,26 +143,28 @@ export function deployGate(input) {
|
|
|
141
143
|
// 10) inescapable_deploy claim (STRICT, §1.4 step 10 / D8): only when the pipeline actually enforces
|
|
142
144
|
// the step AND no bypass is possible. Never true otherwise.
|
|
143
145
|
const inescapable_deploy = enforcement_state === 'ENFORCING' && enf.bypass_possible === false;
|
|
144
|
-
|
|
146
|
+
// Collect ALL applicable honesty residuals in evaluation order (no overwrite).
|
|
147
|
+
// Singular residual = residuals[0] (enforcement-axis before change_set_not_rebound).
|
|
148
|
+
const residuals = [];
|
|
145
149
|
if (!inescapable_deploy) {
|
|
146
150
|
if (enforcement_state === 'ENFORCING')
|
|
147
|
-
|
|
151
|
+
residuals.push('bypass_open'); // enforced, but a bypass exists
|
|
148
152
|
else
|
|
149
|
-
|
|
153
|
+
residuals.push('enforcement_not_configured'); // ADVISORY / ABSENT / UNKNOWN
|
|
150
154
|
}
|
|
151
|
-
// Optional change-set re-bind skipped:
|
|
152
|
-
//
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (rc.expected_fingerprint == null && residual === undefined) {
|
|
156
|
-
residual = 'change_set_not_rebound';
|
|
155
|
+
// Optional change-set re-bind skipped: co-occurs with enforcement residuals
|
|
156
|
+
// (previously dropped when singular residual was already set). Distinct from fingerprint_mismatch.
|
|
157
|
+
if (rc.expected_fingerprint == null) {
|
|
158
|
+
residuals.push('change_set_not_rebound');
|
|
157
159
|
}
|
|
160
|
+
const residual = residuals.length > 0 ? residuals[0] : undefined;
|
|
158
161
|
return {
|
|
159
162
|
deploy_allowed: true,
|
|
160
163
|
state: 'success',
|
|
161
164
|
reason: 'allow_current_deploy',
|
|
162
165
|
enforcement_state,
|
|
163
166
|
inescapable_deploy,
|
|
167
|
+
residuals,
|
|
164
168
|
...(residual ? { residual } : {}),
|
|
165
169
|
detail,
|
|
166
170
|
};
|
|
@@ -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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"}
|