@mnemom/agent-integrity-protocol 0.1.6 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +131 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +207 -1
- package/dist/index.d.ts +207 -1
- package/dist/index.js +109 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var crypto = require('crypto');
|
|
4
|
+
var ed = require('@noble/ed25519');
|
|
5
|
+
var sha2_js = require('@noble/hashes/sha2.js');
|
|
6
|
+
var utils_js = require('@noble/hashes/utils.js');
|
|
7
|
+
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var ed__namespace = /*#__PURE__*/_interopNamespace(ed);
|
|
4
27
|
|
|
5
28
|
// src/window/state.ts
|
|
6
29
|
function createWindowState(sessionId) {
|
|
@@ -91,6 +114,16 @@ var DEFAULT_CONSCIENCE_VALUES = [
|
|
|
91
114
|
content: "Risk of agreeing with the user to avoid conflict rather than providing honest assessment"
|
|
92
115
|
}
|
|
93
116
|
];
|
|
117
|
+
var EU_COMPLIANCE_WINDOW_CONFIG = {
|
|
118
|
+
max_size: 10,
|
|
119
|
+
mode: "sliding",
|
|
120
|
+
session_boundary: "reset",
|
|
121
|
+
max_age_seconds: 7200
|
|
122
|
+
};
|
|
123
|
+
var EU_COMPLIANCE_FAILURE_POLICY = {
|
|
124
|
+
mode: "fail_closed",
|
|
125
|
+
analysis_timeout_ms: 15e3
|
|
126
|
+
};
|
|
94
127
|
var CHECKPOINT_ID_PREFIX = "ic-";
|
|
95
128
|
var DRIFT_ALERT_ID_PREFIX = "ida-";
|
|
96
129
|
var REGISTRATION_ID_PREFIX = "reg-";
|
|
@@ -1447,6 +1480,7 @@ async function callAnalysisLLM(llmConfig, system, user, timeoutMs) {
|
|
|
1447
1480
|
const controller = new AbortController();
|
|
1448
1481
|
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
1449
1482
|
try {
|
|
1483
|
+
const systemPayload = llmConfig.enable_prompt_caching ? [{ type: "text", text: system, cache_control: { type: "ephemeral" } }] : system;
|
|
1450
1484
|
const response = await fetch(`${llmConfig.base_url}/v1/messages`, {
|
|
1451
1485
|
method: "POST",
|
|
1452
1486
|
headers: {
|
|
@@ -1457,7 +1491,7 @@ async function callAnalysisLLM(llmConfig, system, user, timeoutMs) {
|
|
|
1457
1491
|
body: JSON.stringify({
|
|
1458
1492
|
model: llmConfig.model,
|
|
1459
1493
|
max_tokens: llmConfig.max_tokens,
|
|
1460
|
-
system,
|
|
1494
|
+
system: systemPayload,
|
|
1461
1495
|
messages: [{ role: "user", content: user }]
|
|
1462
1496
|
}),
|
|
1463
1497
|
signal: controller.signal
|
|
@@ -1539,6 +1573,99 @@ function constantTimeEqual(a, b) {
|
|
|
1539
1573
|
}
|
|
1540
1574
|
return result === 0;
|
|
1541
1575
|
}
|
|
1576
|
+
function base64ToUint8(b64) {
|
|
1577
|
+
const binary = atob(b64);
|
|
1578
|
+
const bytes = new Uint8Array(binary.length);
|
|
1579
|
+
for (let i = 0; i < binary.length; i++) {
|
|
1580
|
+
bytes[i] = binary.charCodeAt(i);
|
|
1581
|
+
}
|
|
1582
|
+
return bytes;
|
|
1583
|
+
}
|
|
1584
|
+
var encoder = new TextEncoder();
|
|
1585
|
+
function sha256Hex(input) {
|
|
1586
|
+
const hash = sha2_js.sha256(encoder.encode(input));
|
|
1587
|
+
return utils_js.bytesToHex(hash);
|
|
1588
|
+
}
|
|
1589
|
+
function computeNodeHash(left, right) {
|
|
1590
|
+
return sha256Hex(left + right);
|
|
1591
|
+
}
|
|
1592
|
+
async function verifySignature2(certificate, publicKey) {
|
|
1593
|
+
try {
|
|
1594
|
+
const signatureBytes = base64ToUint8(certificate.proofs.signature.value);
|
|
1595
|
+
const messageBytes = encoder.encode(certificate.proofs.signature.signed_payload);
|
|
1596
|
+
const valid = await ed__namespace.verifyAsync(signatureBytes, messageBytes, publicKey);
|
|
1597
|
+
return {
|
|
1598
|
+
valid,
|
|
1599
|
+
details: valid ? "Ed25519 signature verified successfully" : "Ed25519 signature verification failed"
|
|
1600
|
+
};
|
|
1601
|
+
} catch (err) {
|
|
1602
|
+
return {
|
|
1603
|
+
valid: false,
|
|
1604
|
+
details: `Signature verification error: ${err instanceof Error ? err.message : "unknown"}`
|
|
1605
|
+
};
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
function verifyChain(certificate) {
|
|
1609
|
+
try {
|
|
1610
|
+
const chain = certificate.proofs.chain;
|
|
1611
|
+
if (!chain || !chain.chain_hash) {
|
|
1612
|
+
return { valid: false, details: "No chain proof data in certificate" };
|
|
1613
|
+
}
|
|
1614
|
+
const preimage = `${chain.prev_chain_hash || "genesis"}|${certificate.subject.checkpoint_id}|${certificate.claims.verdict}|${certificate.input_commitments.thinking_block_hash}|${certificate.input_commitments.combined_commitment}|${certificate.issued_at}`;
|
|
1615
|
+
const recomputed = sha256Hex(preimage);
|
|
1616
|
+
const valid = recomputed === chain.chain_hash;
|
|
1617
|
+
return {
|
|
1618
|
+
valid,
|
|
1619
|
+
details: valid ? "Chain hash verified successfully" : "Recomputed chain hash does not match certificate"
|
|
1620
|
+
};
|
|
1621
|
+
} catch (err) {
|
|
1622
|
+
return {
|
|
1623
|
+
valid: false,
|
|
1624
|
+
details: `Chain verification error: ${err instanceof Error ? err.message : "unknown"}`
|
|
1625
|
+
};
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
function verifyMerkle(certificate, expectedRoot) {
|
|
1629
|
+
const merkle = certificate.proofs.merkle;
|
|
1630
|
+
if (!merkle) {
|
|
1631
|
+
return null;
|
|
1632
|
+
}
|
|
1633
|
+
try {
|
|
1634
|
+
const root = expectedRoot ?? merkle.root;
|
|
1635
|
+
let current = merkle.leaf_hash;
|
|
1636
|
+
for (const sibling of merkle.inclusion_proof) {
|
|
1637
|
+
if (sibling.position === "left") {
|
|
1638
|
+
current = computeNodeHash(sibling.hash, current);
|
|
1639
|
+
} else {
|
|
1640
|
+
current = computeNodeHash(current, sibling.hash);
|
|
1641
|
+
}
|
|
1642
|
+
}
|
|
1643
|
+
const valid = current === root;
|
|
1644
|
+
return {
|
|
1645
|
+
valid,
|
|
1646
|
+
details: valid ? "Merkle inclusion proof verified successfully" : "Merkle inclusion proof verification failed \u2014 computed root does not match"
|
|
1647
|
+
};
|
|
1648
|
+
} catch (err) {
|
|
1649
|
+
return {
|
|
1650
|
+
valid: false,
|
|
1651
|
+
details: `Merkle verification error: ${err instanceof Error ? err.message : "unknown"}`
|
|
1652
|
+
};
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
async function verifyCertificate(certificate, publicKey, merkleRoot) {
|
|
1656
|
+
const signatureResult = await verifySignature2(certificate, publicKey);
|
|
1657
|
+
const chainResult = verifyChain(certificate);
|
|
1658
|
+
const merkleResult = verifyMerkle(certificate, merkleRoot);
|
|
1659
|
+
const valid = signatureResult.valid && chainResult.valid && (merkleResult === null || merkleResult.valid);
|
|
1660
|
+
return {
|
|
1661
|
+
valid,
|
|
1662
|
+
checks: {
|
|
1663
|
+
signature: signatureResult,
|
|
1664
|
+
chain: chainResult,
|
|
1665
|
+
merkle: merkleResult
|
|
1666
|
+
}
|
|
1667
|
+
};
|
|
1668
|
+
}
|
|
1542
1669
|
|
|
1543
1670
|
exports.AIP_CONTENT_TYPE = AIP_CONTENT_TYPE;
|
|
1544
1671
|
exports.AIP_SIGNATURE_HEADER = AIP_SIGNATURE_HEADER;
|
|
@@ -1560,6 +1687,8 @@ exports.DEFAULT_WINDOW_MAX_SIZE = DEFAULT_WINDOW_MAX_SIZE;
|
|
|
1560
1687
|
exports.DRIFT_ALERT_ID_PREFIX = DRIFT_ALERT_ID_PREFIX;
|
|
1561
1688
|
exports.DRIFT_SEVERITY_LOW_THRESHOLD = DRIFT_SEVERITY_LOW_THRESHOLD;
|
|
1562
1689
|
exports.DRIFT_SEVERITY_MEDIUM_THRESHOLD = DRIFT_SEVERITY_MEDIUM_THRESHOLD;
|
|
1690
|
+
exports.EU_COMPLIANCE_FAILURE_POLICY = EU_COMPLIANCE_FAILURE_POLICY;
|
|
1691
|
+
exports.EU_COMPLIANCE_WINDOW_CONFIG = EU_COMPLIANCE_WINDOW_CONFIG;
|
|
1563
1692
|
exports.FallbackAdapter = FallbackAdapter;
|
|
1564
1693
|
exports.GoogleAdapter = GoogleAdapter;
|
|
1565
1694
|
exports.MAX_EVIDENCE_LENGTH = MAX_EVIDENCE_LENGTH;
|
|
@@ -1585,6 +1714,7 @@ exports.mapVerdictToProceed = mapVerdictToProceed;
|
|
|
1585
1714
|
exports.signPayload = signPayload;
|
|
1586
1715
|
exports.summarizeCard = summarizeCard;
|
|
1587
1716
|
exports.validateAgreement = validateAgreement;
|
|
1717
|
+
exports.verifyCertificate = verifyCertificate;
|
|
1588
1718
|
exports.verifySignature = verifySignature;
|
|
1589
1719
|
//# sourceMappingURL=index.cjs.map
|
|
1590
1720
|
//# sourceMappingURL=index.cjs.map
|