@coderifts/agent-guard 1.0.0 → 1.1.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.
Files changed (51) hide show
  1. package/dist/cjs/detector.d.ts +1 -1
  2. package/dist/cjs/detector.d.ts.map +1 -1
  3. package/dist/cjs/detector.js +176 -3
  4. package/dist/cjs/detector.js.map +1 -1
  5. package/dist/cjs/enforcement-gate.d.ts +42 -0
  6. package/dist/cjs/enforcement-gate.d.ts.map +1 -0
  7. package/dist/cjs/enforcement-gate.js +106 -0
  8. package/dist/cjs/enforcement-gate.js.map +1 -0
  9. package/dist/cjs/guard.d.ts.map +1 -1
  10. package/dist/cjs/guard.js +56 -29
  11. package/dist/cjs/guard.js.map +1 -1
  12. package/dist/cjs/index.d.ts +6 -0
  13. package/dist/cjs/index.d.ts.map +1 -1
  14. package/dist/cjs/index.js +24 -1
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/receipt-binding.d.ts +60 -0
  17. package/dist/cjs/receipt-binding.d.ts.map +1 -0
  18. package/dist/cjs/receipt-binding.js +110 -0
  19. package/dist/cjs/receipt-binding.js.map +1 -0
  20. package/dist/cjs/session-taint.d.ts +97 -0
  21. package/dist/cjs/session-taint.d.ts.map +1 -0
  22. package/dist/cjs/session-taint.js +317 -0
  23. package/dist/cjs/session-taint.js.map +1 -0
  24. package/dist/cjs/types.d.ts +1 -1
  25. package/dist/cjs/types.d.ts.map +1 -1
  26. package/dist/esm/detector.d.ts +1 -1
  27. package/dist/esm/detector.d.ts.map +1 -1
  28. package/dist/esm/detector.js +176 -3
  29. package/dist/esm/detector.js.map +1 -1
  30. package/dist/esm/enforcement-gate.d.ts +42 -0
  31. package/dist/esm/enforcement-gate.d.ts.map +1 -0
  32. package/dist/esm/enforcement-gate.js +101 -0
  33. package/dist/esm/enforcement-gate.js.map +1 -0
  34. package/dist/esm/guard.d.ts.map +1 -1
  35. package/dist/esm/guard.js +56 -29
  36. package/dist/esm/guard.js.map +1 -1
  37. package/dist/esm/index.d.ts +6 -0
  38. package/dist/esm/index.d.ts.map +1 -1
  39. package/dist/esm/index.js +7 -0
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/receipt-binding.d.ts +60 -0
  42. package/dist/esm/receipt-binding.d.ts.map +1 -0
  43. package/dist/esm/receipt-binding.js +105 -0
  44. package/dist/esm/receipt-binding.js.map +1 -0
  45. package/dist/esm/session-taint.d.ts +97 -0
  46. package/dist/esm/session-taint.d.ts.map +1 -0
  47. package/dist/esm/session-taint.js +305 -0
  48. package/dist/esm/session-taint.js.map +1 -0
  49. package/dist/esm/types.d.ts +1 -1
  50. package/dist/esm/types.d.ts.map +1 -1
  51. package/package.json +2 -2
@@ -7,6 +7,6 @@
7
7
  * mandatory fixture set; this detector passes all 68 (46 trigger, 22 no-trigger).
8
8
  */
9
9
  import type { TriggerDetector } from './types.js';
10
- export declare const DETECTOR_VERSION = "builtin/1.0.0";
10
+ export declare const DETECTOR_VERSION = "builtin/1.1.0";
11
11
  export declare const builtinDetector: TriggerDetector;
12
12
  //# sourceMappingURL=detector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,YAAY,CAAC;AAEhF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AA8OhD,eAAO,MAAM,eAAe,EAAE,eA4C7B,CAAC"}
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,YAAY,CAAC;AAIhF,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAkWhD,eAAO,MAAM,eAAe,EAAE,eA4D7B,CAAC"}
@@ -9,7 +9,10 @@
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
11
  exports.builtinDetector = exports.DETECTOR_VERSION = void 0;
12
- exports.DETECTOR_VERSION = 'builtin/1.0.0';
12
+ const node_zlib_1 = require("node:zlib");
13
+ // builtin/1.1.0: additive deep-argument-scan (DG-1) — walks ALL argument values (any key, depth,
14
+ // arrays) + bounded decode of encoded payloads, monotonic toward caution. Output shape unchanged.
15
+ exports.DETECTOR_VERSION = 'builtin/1.1.0';
13
16
  // ── Path classification ────────────────────────────────────────────────────────
14
17
  const CONTRACT_PATH_RE = [
15
18
  /openapi/i, /swagger/i, /asyncapi/i,
@@ -25,7 +28,7 @@ const CONTRACT_PATH_RE = [
25
28
  ];
26
29
  // Paths whose content is NOT a production SSOT — contract-looking content there does not trigger.
27
30
  const NON_SSOT_PATH_RE = [
28
- /(^|\/)tests?\//i, /(^|\/)__tests__\//i, /\/fixtures?\//i,
31
+ /(^|\/)tests?\//i, /(^|\/)__tests__\//i, /(^|\/)__mocks__\//i, /\/fixtures?\//i, /(^|\/)mocks?\//i,
29
32
  /\.test\.[jt]sx?$/i, /\.spec\.[jt]sx?$/i,
30
33
  /(^|\/)src\/internal\//i,
31
34
  /(^|\/)node_modules\//i,
@@ -71,7 +74,7 @@ const INERT_KEY_RE = [
71
74
  /^examples?\s*:/i, /^["']examples?["']\s*:/i,
72
75
  /^x-[\w-]+\s*:/i, /^["']x-[\w-]+["']\s*:/i,
73
76
  ];
74
- const READ_ONLY_TOOLS = new Set(['read', 'grep', 'glob', 'ls', 'cat', 'view', 'search', 'list']);
77
+ const READ_ONLY_TOOLS = new Set(['read', 'grep', 'glob', 'ls', 'cat', 'view', 'search', 'list', 'get']);
75
78
  const FORMATTER_RE = /\b(prettier|eslint\s+--fix|gofmt|rustfmt|black|clang-format|dprint)\b/i;
76
79
  const GATE_KEYWORD_RE = /coderifts|agent-guard|contract-check|contract\b|preflight|spectral|\bbuf\b/i;
77
80
  function anyMatch(res, s) { return res.some((r) => r.test(s)); }
@@ -297,6 +300,161 @@ function commandMutatesContract(call) {
297
300
  const mutates = /(>|>>|\bmv\b|\bcp\b|\bln\s|git\s+mv|curl|wget|-o\b|base64\s+-d|xxd|\bjq\b|\bsed\b|\btee\b|echo|printf|\bcat\b)/i.test(cmd);
298
301
  return touchesContract && mutates;
299
302
  }
303
+ // ── Deep argument scan (DG-1 hardening) — additive, bounded, monotonic toward caution ──────────
304
+ // Caps (stated): recursion depth 8; total scanned bytes 262144 (256KB); per-value decode output
305
+ // 65536 (64KB); decode chain levels 3 (base64→json→…); opacity min length 40 chars.
306
+ const DEEP_MAX_DEPTH = 8;
307
+ const DEEP_MAX_BYTES = 262144;
308
+ const DEEP_DECODE_MAX_BYTES = 65536;
309
+ const DEEP_DECODE_LEVELS = 3;
310
+ const OPAQUE_MIN_LEN = 40;
311
+ /** A short, single-line, filename-ish value we should test against the PATH regexes (never content). */
312
+ function looksLikePath(v) {
313
+ return v.length > 0 && v.length <= 256 && !/[\n\r{}<>]/.test(v) && /(^|\/)[\w.@-]+\.[A-Za-z0-9]+$/.test(v.trim());
314
+ }
315
+ /** Bounded set of decodings of a value (base64, hex, url, gzip+base64, json-string-unescape). */
316
+ function decodeCandidates(v) {
317
+ const out = [];
318
+ const push = (s) => { if (s && s.length > 0 && s.length <= DEEP_DECODE_MAX_BYTES)
319
+ out.push(s); };
320
+ const compact = v.replace(/\s+/g, '');
321
+ // base64 (charset excludes ':' so plaintext YAML/JSON contracts never match)
322
+ if (compact.length >= 16 && compact.length % 4 === 0 && /^[A-Za-z0-9+/]+={0,2}$/.test(compact)) {
323
+ try {
324
+ push(Buffer.from(compact, 'base64').toString('utf8'));
325
+ }
326
+ catch { /* ignore */ }
327
+ try {
328
+ const b = Buffer.from(compact, 'base64');
329
+ push((0, node_zlib_1.gunzipSync)(b).toString('utf8'));
330
+ }
331
+ catch { /* not gzip */ }
332
+ }
333
+ // hex
334
+ if (compact.length >= 16 && compact.length % 2 === 0 && /^[0-9a-fA-F]+$/.test(compact)) {
335
+ try {
336
+ push(Buffer.from(compact, 'hex').toString('utf8'));
337
+ }
338
+ catch { /* ignore */ }
339
+ }
340
+ // url-encoded
341
+ if (/%[0-9a-fA-F]{2}/.test(v)) {
342
+ try {
343
+ push(decodeURIComponent(v));
344
+ }
345
+ catch { /* ignore */ }
346
+ }
347
+ // JSON string literal / double-encoded (unescape one JSON level)
348
+ if (/\\["\\/]|^\s*"/.test(v)) {
349
+ try {
350
+ const p = JSON.parse(v);
351
+ if (typeof p === 'string')
352
+ push(p);
353
+ }
354
+ catch { /* ignore */ }
355
+ }
356
+ return out;
357
+ }
358
+ /** True iff a value looks encoded (long base64/hex) — used to decide opacity when unclassifiable. */
359
+ function looksEncoded(v) {
360
+ const c = v.replace(/\s+/g, '');
361
+ if (c.length < OPAQUE_MIN_LEN)
362
+ return false;
363
+ return (/^[A-Za-z0-9+/]+={0,2}$/.test(c) && c.length % 4 === 0) || (/^[0-9a-fA-F]+$/.test(c) && c.length % 2 === 0);
364
+ }
365
+ /** Recursively scan every string value in `arguments` (any key, depth, array) + bounded decode. */
366
+ function deepArgScan(call) {
367
+ const acc = { contractContent: false, pathContractSsot: false, pathNonSsot: false, pathLikeCount: 0, proseCount: 0, opaque: false, capHit: false };
368
+ let budget = DEEP_MAX_BYTES;
369
+ const scanString = (s) => {
370
+ // path-like values -> classify against path regexes (never run path regexes on content).
371
+ if (looksLikePath(s)) {
372
+ acc.pathLikeCount++;
373
+ if (anyMatch(NON_SSOT_PATH_RE, s))
374
+ acc.pathNonSsot = true;
375
+ else if (anyMatch(PROSE_PATH_RE, s))
376
+ acc.proseCount++;
377
+ else if (isContractPath(s))
378
+ acc.pathContractSsot = true;
379
+ return;
380
+ }
381
+ // content: existing contract regexes on the raw value.
382
+ if (anyMatch(CONTRACT_CONTENT_RE, s) || anyMatch(CONTRACT_STRUCTURE_RE, s)) {
383
+ acc.contractContent = true;
384
+ return;
385
+ }
386
+ // bounded decode chain (base64/hex/url/gzip/json), re-scanning each level.
387
+ let level = [s];
388
+ for (let d = 0; d < DEEP_DECODE_LEVELS && !acc.contractContent; d++) {
389
+ const next = [];
390
+ for (const val of level) {
391
+ for (const dec of decodeCandidates(val)) {
392
+ if (anyMatch(CONTRACT_CONTENT_RE, dec) || anyMatch(CONTRACT_STRUCTURE_RE, dec)) {
393
+ acc.contractContent = true;
394
+ break;
395
+ }
396
+ next.push(dec);
397
+ }
398
+ if (acc.contractContent)
399
+ break;
400
+ }
401
+ level = next;
402
+ }
403
+ // opacity: looked encoded but nothing classifiable came out -> unscannable -> caution.
404
+ if (!acc.contractContent && looksEncoded(s) && level.every((x) => !isReadableText(x)))
405
+ acc.opaque = true;
406
+ };
407
+ const walk = (node, depth) => {
408
+ if (acc.capHit || budget <= 0)
409
+ return;
410
+ if (depth > DEEP_MAX_DEPTH) {
411
+ acc.capHit = true;
412
+ return;
413
+ }
414
+ if (typeof node === 'string') {
415
+ budget -= node.length;
416
+ if (budget <= 0) {
417
+ acc.capHit = true;
418
+ return;
419
+ }
420
+ scanString(node);
421
+ }
422
+ else if (Array.isArray(node)) {
423
+ for (const el of node) {
424
+ if (acc.capHit)
425
+ break;
426
+ walk(el, depth + 1);
427
+ }
428
+ }
429
+ else if (node && typeof node === 'object') {
430
+ for (const val of Object.values(node)) {
431
+ if (acc.capHit)
432
+ break;
433
+ walk(val, depth + 1);
434
+ }
435
+ }
436
+ };
437
+ try {
438
+ walk(call.arguments, 0);
439
+ }
440
+ catch {
441
+ acc.capHit = true;
442
+ } // scan error -> fail-safe
443
+ return acc;
444
+ }
445
+ /** A decoded blob that is mostly printable text (so a failed-to-classify decode isn't "opaque"). */
446
+ function isReadableText(s) {
447
+ if (!s)
448
+ return false;
449
+ let printable = 0;
450
+ const n = Math.min(s.length, 512);
451
+ for (let i = 0; i < n; i++) {
452
+ const c = s.charCodeAt(i);
453
+ if (c === 9 || c === 10 || c === 13 || (c >= 32 && c < 127))
454
+ printable++;
455
+ }
456
+ return printable / n > 0.85;
457
+ }
300
458
  exports.builtinDetector = {
301
459
  version: exports.DETECTOR_VERSION,
302
460
  detect(call) {
@@ -341,6 +499,21 @@ exports.builtinDetector = {
341
499
  signals.push('ambiguous_contract_surface');
342
500
  return { trigger: true, artifacts, signals, confident: false };
343
501
  }
502
+ // ── DG-1: deep argument scan (runs AFTER the read-only short-circuit + whitelist surface path;
503
+ // additive, monotonic toward caution — only flips false->true / lowers confident). ──
504
+ const deep = deepArgScan(call);
505
+ if (deep.contractContent || deep.pathContractSsot) {
506
+ // Apply the SAME suppressors to the newly-seen input: non-SSOT / prose destination, inert-only.
507
+ const deepInProse = deep.pathLikeCount > 0 && deep.proseCount === deep.pathLikeCount && !deep.pathContractSsot;
508
+ if (!deep.pathNonSsot && !deepInProse && !isInertOnly(call)) {
509
+ signals.push(deep.contractContent ? 'arguments_deep_contract' : 'arguments_deep_path');
510
+ return { trigger: true, artifacts, signals, confident: false };
511
+ }
512
+ }
513
+ if (deep.opaque || deep.capHit) {
514
+ signals.push(deep.capHit ? 'arguments_scan_capped' : 'arguments_opaque');
515
+ return { trigger: true, artifacts, signals, confident: false };
516
+ }
344
517
  if (intentMentionsContract(call.intent)) {
345
518
  signals.push('intent_contract_reference');
346
519
  return { trigger: true, artifacts, signals, confident: false };
@@ -1 +1 @@
1
- {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Client-side authorization gate (P0-b/c) — mirrors the server §106 (binding), §111 (fail-closed on
3
+ * degraded) and §115 (safe_for_agent) in the guard, so the client never executes off a raw
4
+ * execution_action an attacker/proxy can flip. All checks are LOCAL and fail-closed.
5
+ *
6
+ * Composes with the P0-a receipt binding (receipt-binding.ts). This module reconciles the DECISION
7
+ * itself; receipt-binding authenticates the envelope the decision rides on.
8
+ */
9
+ import type { IntegrityCause, Artifact } from './types.js';
10
+ type Action = 'CONTINUE' | 'CONTINUE_WITH_MONITORING' | 'REQUEST_APPROVAL' | 'STOP';
11
+ /** Local artifact_digest — byte-identical to the server change-set.js algorithm (sorted by type,id). */
12
+ export declare function computeArtifactDigest(artifacts: Artifact[]): string;
13
+ /** Local bundle input_fingerprint — byte-identical to the server change-set.js algorithm. */
14
+ export declare function computeBundleFingerprint(artifacts: Artifact[]): string;
15
+ export type GateResult = {
16
+ verdict: 'allow';
17
+ kind: 'ALLOW' | 'MONITOR';
18
+ } | {
19
+ verdict: 'block-strict';
20
+ decision: 'BLOCK' | 'REQUIRE_APPROVAL';
21
+ } | {
22
+ verdict: 'fail-closed';
23
+ cause: IntegrityCause;
24
+ detail?: string;
25
+ };
26
+ /**
27
+ * Reconcile an envelope's decision fail-closed. Order:
28
+ * 1. decision present + valid enum (CE-EP-04) → DECISION_INCONSISTENT
29
+ * 2. effective decision = STRICTEST(envelope.decision, action-implied, top-level decision/action)
30
+ * (CE-EP-01, CE-CC-01) — BLOCK/REQUIRE_APPROVAL → clean block (positive control CE-EP-02 kept)
31
+ * 3. safe_for_agent === false on an allow-class decision (CE-EP-03/§115) → DECISION_INCONSISTENT
32
+ * 4. degraded / analysis_complete=false / coverage_gap (CE-CC-02/§111) → ANALYSIS_DEGRADED
33
+ * 5. artifact_digest / input_fingerprint local compare (CE-AF-03/#6) → ARTIFACT_MISMATCH
34
+ *
35
+ * @param response the raw preflight response (for the top-level decision/action, CE-CC-01)
36
+ * @param envelope the decision_result envelope
37
+ * @param executionAction rd.executionAction from readDecision
38
+ * @param sentArtifacts the artifacts the guard sent to preflight (for the digest bind)
39
+ */
40
+ export declare function evaluateEnvelope(response: unknown, envelope: Record<string, unknown>, executionAction: Action, sentArtifacts: Artifact[]): GateResult;
41
+ export {};
42
+ //# sourceMappingURL=enforcement-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforcement-gate.d.ts","sourceRoot":"","sources":["../../src/enforcement-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3D,KAAK,MAAM,GAAG,UAAU,GAAG,0BAA0B,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAoBpF,wGAAwG;AACxG,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAMnE;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAKtE;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CAAA;CAAE,GACnE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,QAAQ,EAAE,GACxB,UAAU,CAkDZ"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * Client-side authorization gate (P0-b/c) — mirrors the server §106 (binding), §111 (fail-closed on
4
+ * degraded) and §115 (safe_for_agent) in the guard, so the client never executes off a raw
5
+ * execution_action an attacker/proxy can flip. All checks are LOCAL and fail-closed.
6
+ *
7
+ * Composes with the P0-a receipt binding (receipt-binding.ts). This module reconciles the DECISION
8
+ * itself; receipt-binding authenticates the envelope the decision rides on.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.computeArtifactDigest = computeArtifactDigest;
12
+ exports.computeBundleFingerprint = computeBundleFingerprint;
13
+ exports.evaluateEnvelope = evaluateEnvelope;
14
+ const node_crypto_1 = require("node:crypto");
15
+ const DECISION_RANK = { ALLOW: 0, WARN: 1, REQUIRE_APPROVAL: 2, BLOCK: 3 };
16
+ const ACTION_TO_DECISION = {
17
+ CONTINUE: 'ALLOW', CONTINUE_WITH_MONITORING: 'WARN', REQUEST_APPROVAL: 'REQUIRE_APPROVAL', STOP: 'BLOCK',
18
+ };
19
+ const DECISION_TO_ACTION = {
20
+ ALLOW: 'CONTINUE', WARN: 'CONTINUE_WITH_MONITORING', REQUIRE_APPROVAL: 'REQUEST_APPROVAL', BLOCK: 'STOP',
21
+ };
22
+ function isDecision(v) {
23
+ return v === 'ALLOW' || v === 'WARN' || v === 'REQUIRE_APPROVAL' || v === 'BLOCK';
24
+ }
25
+ function isAction(v) {
26
+ return v === 'CONTINUE' || v === 'CONTINUE_WITH_MONITORING' || v === 'REQUEST_APPROVAL' || v === 'STOP';
27
+ }
28
+ const NUL = '\x1f'; // matches the server's change-set canonical separator
29
+ function sha256hex(s) { return (0, node_crypto_1.createHash)('sha256').update(s).digest('hex'); }
30
+ function specStr(v) { return v == null ? '' : (typeof v === 'string' ? v : JSON.stringify(v)); }
31
+ /** Local artifact_digest — byte-identical to the server change-set.js algorithm (sorted by type,id). */
32
+ function computeArtifactDigest(artifacts) {
33
+ const preimage = artifacts.slice()
34
+ .sort((a, b) => (`${a.type}${NUL}${a.id}` < `${b.type}${NUL}${b.id}` ? -1 : 1))
35
+ .map((a) => `${sha256hex(specStr(a.before))}${sha256hex(specStr(a.after))}`)
36
+ .join(NUL);
37
+ return `sha256:${sha256hex(preimage)}`;
38
+ }
39
+ /** Local bundle input_fingerprint — byte-identical to the server change-set.js algorithm. */
40
+ function computeBundleFingerprint(artifacts) {
41
+ const parts = artifacts.slice()
42
+ .sort((a, b) => (`${a.type}${NUL}${a.id}` < `${b.type}${NUL}${b.id}` ? -1 : 1))
43
+ .map((a) => [a.type, a.id, sha256hex(specStr(a.before)), sha256hex(specStr(a.after))].join(NUL));
44
+ return `sha256:${sha256hex(parts.join(NUL))}`;
45
+ }
46
+ /**
47
+ * Reconcile an envelope's decision fail-closed. Order:
48
+ * 1. decision present + valid enum (CE-EP-04) → DECISION_INCONSISTENT
49
+ * 2. effective decision = STRICTEST(envelope.decision, action-implied, top-level decision/action)
50
+ * (CE-EP-01, CE-CC-01) — BLOCK/REQUIRE_APPROVAL → clean block (positive control CE-EP-02 kept)
51
+ * 3. safe_for_agent === false on an allow-class decision (CE-EP-03/§115) → DECISION_INCONSISTENT
52
+ * 4. degraded / analysis_complete=false / coverage_gap (CE-CC-02/§111) → ANALYSIS_DEGRADED
53
+ * 5. artifact_digest / input_fingerprint local compare (CE-AF-03/#6) → ARTIFACT_MISMATCH
54
+ *
55
+ * @param response the raw preflight response (for the top-level decision/action, CE-CC-01)
56
+ * @param envelope the decision_result envelope
57
+ * @param executionAction rd.executionAction from readDecision
58
+ * @param sentArtifacts the artifacts the guard sent to preflight (for the digest bind)
59
+ */
60
+ function evaluateEnvelope(response, envelope, executionAction, sentArtifacts) {
61
+ // 1. decision required + valid enum.
62
+ const dec = envelope.decision;
63
+ if (!isDecision(dec)) {
64
+ return { verdict: 'fail-closed', cause: 'DECISION_INCONSISTENT', detail: `decision=${JSON.stringify(dec)} is missing/invalid` };
65
+ }
66
+ // 2. Strictest of every decision signal present (envelope, action-implied, top-level).
67
+ const signals = [dec, ACTION_TO_DECISION[executionAction]];
68
+ const top = (response && typeof response === 'object') ? response : {};
69
+ if (isDecision(top.decision))
70
+ signals.push(top.decision);
71
+ if (isAction(top.execution_action))
72
+ signals.push(ACTION_TO_DECISION[top.execution_action]);
73
+ const effective = signals.reduce((a, b) => (DECISION_RANK[b] > DECISION_RANK[a] ? b : a));
74
+ if (DECISION_RANK[effective] >= DECISION_RANK.REQUIRE_APPROVAL) {
75
+ // Stricter-wins: a BLOCK/RA anywhere (incl. an inconsistent BLOCK+CONTINUE) → clean block.
76
+ return { verdict: 'block-strict', decision: effective };
77
+ }
78
+ // (effective is ALLOW or WARN — but ALSO require the envelope's own action to agree, else tamper.)
79
+ if (DECISION_TO_ACTION[dec] !== executionAction) {
80
+ return { verdict: 'fail-closed', cause: 'DECISION_INCONSISTENT', detail: `decision=${dec} ≠ execution_action=${executionAction}` };
81
+ }
82
+ // 3. §115 — safe_for_agent=false is NEVER executable, regardless of action.
83
+ if (envelope.safe_for_agent === false) {
84
+ return { verdict: 'fail-closed', cause: 'DECISION_INCONSISTENT', detail: 'safe_for_agent=false on an allow-class decision' };
85
+ }
86
+ // 4. §111 — incomplete/degraded analysis is never a clean proceed.
87
+ const degradedReasons = envelope.degraded_reasons;
88
+ if (envelope.analysis_complete === false
89
+ || (Array.isArray(degradedReasons) && degradedReasons.length > 0)
90
+ || envelope.degraded === true
91
+ || envelope.coverage_gap === true) {
92
+ return { verdict: 'fail-closed', cause: 'ANALYSIS_DEGRADED', detail: 'analysis degraded / incomplete' };
93
+ }
94
+ // 5. Artifact bind (CE-AF-03) — the server must have analyzed exactly the artifacts we sent.
95
+ // LOCALLY recompute artifact_digest and compare to the envelope's when present. (input_fingerprint
96
+ // is NOT separately compared here: it is already authenticated by the P0-a receipt body-hash
97
+ // binding — it lives inside the signed decision body — and its exact per-version preimage is
98
+ // riskier to reproduce client-side, so re-deriving it here would over-block honest traffic.)
99
+ if (Array.isArray(sentArtifacts) && sentArtifacts.length > 0
100
+ && typeof envelope.artifact_digest === 'string'
101
+ && envelope.artifact_digest !== computeArtifactDigest(sentArtifacts)) {
102
+ return { verdict: 'fail-closed', cause: 'ARTIFACT_MISMATCH', detail: 'artifact_digest ≠ locally-recomputed digest of sent artifacts' };
103
+ }
104
+ return { verdict: 'allow', kind: effective === 'ALLOW' ? 'ALLOW' : 'MONITOR' };
105
+ }
106
+ //# sourceMappingURL=enforcement-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforcement-gate.js","sourceRoot":"","sources":["../../src/enforcement-gate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EAAE,YAAY,EACT,kBAAkB,EAAE,cAAc,EAEnD,MAAM,YAAY,CAAC;AAwHpB,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,kBAAkB,EACxB,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,EACjC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAuJ1B"}
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,WAAW,EAAE,YAAY,EACT,kBAAkB,EAAE,cAAc,EAEnD,MAAM,YAAY,CAAC;AA+IpB,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,kBAAkB,EACxB,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,EACjC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAqK1B"}
package/dist/cjs/guard.js CHANGED
@@ -13,6 +13,8 @@ exports.guardToolCall = guardToolCall;
13
13
  const node_crypto_1 = require("node:crypto");
14
14
  const sdk_1 = require("@coderifts/sdk");
15
15
  const detector_js_1 = require("./detector.js");
16
+ const receipt_binding_js_1 = require("./receipt-binding.js");
17
+ const enforcement_gate_js_1 = require("./enforcement-gate.js");
16
18
  // Per-config breaker state (time-window; not consecutive).
17
19
  const breakers = new WeakMap();
18
20
  const nowMs = () => Date.now();
@@ -96,22 +98,33 @@ async function preflightWithRetry(config, request) {
96
98
  }
97
99
  return { ok: false, ...last };
98
100
  }
99
- /** Verify the envelope's receipt via the SDK. Returns the BRANDED envelope only when verified. */
101
+ /**
102
+ * Verify the envelope's receipt AND bind it to THIS envelope (P0 substitution fix). Returns the
103
+ * BRANDED envelope only when the receipt is valid, current, AND the LOCALLY-recomputed decision body
104
+ * hash + fingerprint + operation/environment/audience scope all match. On a valid-but-unbound receipt
105
+ * the `cause` is RECEIPT_ENVELOPE_MISMATCH; on a bad signature it is RECEIPT_UNVERIFIED. Fail-closed:
106
+ * any mismatch returns { verified: null }.
107
+ */
100
108
  async function verifyEnvelope(config, envelope) {
101
109
  if (!envelope)
102
- return null;
110
+ return { verified: null };
103
111
  if (config.verifyReceipts === false)
104
- return null; // opt-out => cannot brand => unenforceable + LKG unusable
112
+ return { verified: null }; // opt-out => cannot brand => unenforceable + LKG unusable
105
113
  const token = envelope.receipt?.token;
106
114
  if (!token)
107
- return null;
115
+ return { verified: null };
108
116
  try {
109
117
  const r = await config.client.verifyReceipt(token);
110
- if (r && r.valid === true)
111
- return envelope;
118
+ const bind = (0, receipt_binding_js_1.bindReceiptToEnvelope)(envelope, r, { operation: config.operation, environment: config.environment, audience: config.audience });
119
+ if (bind.ok)
120
+ return { verified: envelope };
121
+ emit(config, { type: 'receipt_unverified', at: iso(), decisionId: envelope.decision_id, cause: bind.detail });
122
+ return { verified: null, cause: bind.cause };
123
+ }
124
+ catch {
125
+ // verification threw => treat as unverified (bad signature / transport)
126
+ return { verified: null, cause: 'RECEIPT_UNVERIFIED' };
112
127
  }
113
- catch { /* verification failure is handled as RECEIPT_UNVERIFIED by the caller */ }
114
- return null;
115
128
  }
116
129
  // ── Outcome builders (keep the discriminated union satisfied) ────────────────────
117
130
  async function runEnforced(config, factory, approved, redacted) {
@@ -234,29 +247,41 @@ async function guardToolCall(call, executeFactory, config) {
234
247
  const envelope = rd.envelope;
235
248
  // 5. expiry check before honoring any decision.
236
249
  const expired = isExpired(envelope);
237
- const verified = await verifyEnvelope(config, envelope);
250
+ const bindResult = await verifyEnvelope(config, envelope);
251
+ const verified = bindResult.verified;
238
252
  const receiptVerified = !!verified;
239
253
  if (!receiptVerified)
240
254
  emit(config, { type: 'receipt_unverified', at: iso(), decisionId: envelope.decision_id });
241
255
  emit(config, { type: 'preflight_result', at: iso(), action: rd.executionAction, decisionId: envelope.decision_id });
242
- // A bad signature (verifyReceipts on, token present, verify failed) is an INTEGRITY attack signal.
256
+ // A receipt that fails to verify OR fails to BIND to this envelope (P0 substitution/replay/scope) is
257
+ // an INTEGRITY attack signal => fail closed. RECEIPT_ENVELOPE_MISMATCH names a valid-but-unbound
258
+ // receipt (e.g. a real BLOCK receipt wrapped in a forged ALLOW envelope); RECEIPT_UNVERIFIED a bad
259
+ // signature. Both trip the breaker and STOP — the guard NEVER executes off an unbound receipt.
243
260
  if (config.verifyReceipts !== false && !receiptVerified && envelope.receipt?.token) {
244
261
  breakerRecord(config);
245
- return closedIntegrity(config, 'RECEIPT_UNVERIFIED', failPolicy);
262
+ return closedIntegrity(config, bindResult.cause ?? 'RECEIPT_UNVERIFIED', failPolicy);
263
+ }
264
+ // ── Client-side authorization gate (P0-b/c): mirror §106/§111/§115 before honoring any action. ──
265
+ // A raw execution_action is NEVER trusted alone. The gate reconciles decision↔action (stricter
266
+ // wins), honors safe_for_agent, fails closed on degraded, and binds the analyzed artifacts to what
267
+ // we actually sent. Only an allow-class, safe, non-degraded, artifact-bound verdict is executable.
268
+ const gate = (0, enforcement_gate_js_1.evaluateEnvelope)(pf.response, envelope, rd.executionAction, detection.artifacts);
269
+ if (gate.verdict === 'fail-closed') {
270
+ breakerRecord(config);
271
+ return closedIntegrity(config, gate.cause, failPolicy);
272
+ }
273
+ if (gate.verdict === 'block-strict') {
274
+ // A real (or stricter-reconciled) BLOCK / REQUIRE_APPROVAL — clean block; the factory never runs.
275
+ return gate.decision === 'BLOCK'
276
+ ? blocked({ kind: 'BLOCK', action: 'STOP', envelope, receiptVerified }, true)
277
+ : blocked({ kind: 'APPROVAL', action: 'REQUEST_APPROVAL', envelope, receiptVerified }, true);
246
278
  }
247
- const action = rd.executionAction;
248
- // Non-executable decisions.
249
- if (action === 'STOP')
250
- return blocked({ kind: 'BLOCK', action: 'STOP', envelope, receiptVerified }, true);
251
- if (action === 'REQUEST_APPROVAL')
252
- return blocked({ kind: 'APPROVAL', action: 'REQUEST_APPROVAL', envelope, receiptVerified }, true);
279
+ const kind = gate.kind; // 'ALLOW' | 'MONITOR' — allow-class, safe, non-degraded, artifact-bound.
253
280
  // An expired decision cannot be honored fresh => closed (integrity: wrong-time state).
254
281
  if (expired) {
255
282
  breakerRecord(config);
256
283
  return closedIntegrity(config, 'SCHEMA_INVALID', failPolicy);
257
284
  }
258
- // Executable: CONTINUE (ALLOW) or CONTINUE_WITH_MONITORING (MONITOR).
259
- const kind = action === 'CONTINUE' ? 'ALLOW' : 'MONITOR';
260
285
  const sinkWired = !!config.onEvent; // v1: onEvent is the telemetry sink for MONITOR.
261
286
  if (kind === 'MONITOR') {
262
287
  if (sinkWired)
@@ -264,15 +289,19 @@ async function guardToolCall(call, executeFactory, config) {
264
289
  else
265
290
  emit(config, { type: 'monitoring_unwired', at: iso(), decisionId: envelope.decision_id });
266
291
  }
267
- // observeOnly executes but never enforces.
292
+ // observeOnly is an EXPLICIT report-only opt-in: execute but never enforce (the one sanctioned
293
+ // unenforced-execution mode alongside failPolicy=open; both are documented opt-ins, not the default).
268
294
  if (config.observeOnly) {
269
- emit(config, { type: 'observe_only_passthrough', at: iso(), action });
295
+ emit(config, { type: 'observe_only_passthrough', at: iso(), action: rd.executionAction });
270
296
  const verdict = kind === 'ALLOW'
271
297
  ? { kind: 'ALLOW', action: 'CONTINUE', envelope, receiptVerified }
272
298
  : { kind: 'MONITOR', action: 'CONTINUE_WITH_MONITORING', envelope, receiptVerified };
273
299
  return runUnenforced(config, executeFactory, envelope, verdict, true, redacted);
274
300
  }
275
- // enforced:true requires a LIVE receipt-verified ALLOW/MONITOR, and (MONITOR) a wired sink.
301
+ // ── enforced executed INVARIANT (contract-triggering path): execute ONLY when we can ENFORCE. ──
302
+ // enforceable = a bound-verified receipt AND (MONITOR) a wired sink. Anything else FAILS CLOSED —
303
+ // the guard NEVER runs the factory unenforced on a contract change. Closes CE-EP-06 (no receipt),
304
+ // CE-EP-08 (verifyReceipts:false), CE-CC-04 (MONITOR without a monitoring sink).
276
305
  const enforceable = receiptVerified && (kind === 'ALLOW' || sinkWired);
277
306
  if (enforceable) {
278
307
  const approved = kind === 'ALLOW'
@@ -280,11 +309,8 @@ async function guardToolCall(call, executeFactory, config) {
280
309
  : { kind: 'MONITOR', action: 'CONTINUE_WITH_MONITORING', envelope, receiptVerified: true };
281
310
  return runEnforced(config, executeFactory, approved, redacted);
282
311
  }
283
- // MONITOR with no sink (monitoring_unwired): execute but enforced:false.
284
- const verdict = kind === 'ALLOW'
285
- ? { kind: 'ALLOW', action: 'CONTINUE', envelope, receiptVerified }
286
- : { kind: 'MONITOR', action: 'CONTINUE_WITH_MONITORING', envelope, receiptVerified };
287
- return runUnenforced(config, executeFactory, envelope, verdict, true, redacted);
312
+ breakerRecord(config);
313
+ return closedIntegrity(config, receiptVerified ? 'MONITORING_UNWIRED' : 'RECEIPT_MISSING', failPolicy);
288
314
  }
289
315
  function closedIntegrity(config, cause, failPolicy) {
290
316
  const count = (breakers.get(config)?.fails.length) ?? 1;
@@ -313,8 +339,9 @@ async function tryLkg(config, inputFp) {
313
339
  }
314
340
  if (!cached)
315
341
  return null;
316
- // Receipt verification is UNCONDITIONAL for LKG (with verifyReceipts:false it cannot brand => unusable).
317
- const verified = await verifyEnvelope(config, cached);
342
+ // Receipt verification + BINDING is UNCONDITIONAL for LKG (verifyReceipts:false => cannot brand =>
343
+ // unusable). An LKG envelope whose receipt does not bind to it (substitution) is also unusable.
344
+ const { verified } = await verifyEnvelope(config, cached);
318
345
  if (!verified)
319
346
  return null;
320
347
  // Eligibility (rule 15): decision ALLOW|WARN, unexpired, age<lkgMaxAgeMs, fingerprint + ruleset_hash