@agentguard-run/spend 0.11.0 → 0.12.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.
@@ -0,0 +1,501 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.signDagNode = signDagNode;
37
+ exports.computeDagEntryHash = computeDagEntryHash;
38
+ exports.msgHashForDecision = msgHashForDecision;
39
+ exports.deriveTrustScore = deriveTrustScore;
40
+ exports.deriveCapability = deriveCapability;
41
+ exports.verifyReceiptDag = verifyReceiptDag;
42
+ exports.gateCapability = gateCapability;
43
+ exports.merkleRoot = merkleRoot;
44
+ exports.compressReceiptDag = compressReceiptDag;
45
+ exports.merkleInclusionProof = merkleInclusionProof;
46
+ exports.verifyInclusion = verifyInclusion;
47
+ exports.dagEnvelopeFromEntries = dagEnvelopeFromEntries;
48
+ const ed = __importStar(require("@noble/ed25519"));
49
+ const decision_log_1 = require("../decision-log");
50
+ const DEFAULT_THRESHOLDS = {
51
+ READ_ONLY: { minTrust: 0.5, minDepth: 1 },
52
+ TRANSACT: { minTrust: 0.72, minDepth: 1 },
53
+ ADMIN: { minTrust: 0.82, minDepth: 2 },
54
+ ORCHESTRATE: { minTrust: 0.9, minDepth: 3 },
55
+ };
56
+ const DATA_PLANE_KEYS = /^(prompt|completion|messages|content|source|pii|raw|rawPrompt|rawCompletion|apiKey|secret)$/i;
57
+ async function signDagNode(args) {
58
+ const decision = sanitizeMetadata(args.decision);
59
+ const parents = (args.parents ?? []).map(parentHash);
60
+ const unsigned = {
61
+ version: args.version ?? 2,
62
+ sequence: args.sequence,
63
+ decision,
64
+ workflowId: args.workflowId ?? stringOrNull(decision.workflowId) ?? stringOrNull(decision.workflow_id),
65
+ parents,
66
+ topology: args.topology ?? topologyForParentCount(parents.length),
67
+ msgHash: msgHashForDecision(decision),
68
+ trustScore: clampTrust(args.trustScore ?? deriveTrustScore(decision)),
69
+ blocked: args.blocked ?? decision.action === 'block',
70
+ capability: args.capability ?? deriveCapability(decision),
71
+ signerFingerprint: (0, decision_log_1.computeSignerFingerprint)(args.publicKey),
72
+ builderCode: args.builderCode ?? null,
73
+ timestamp: args.timestamp ?? stringOrNull(decision.timestamp) ?? new Date().toISOString(),
74
+ };
75
+ const entryHash = computeDagEntryHash(unsigned);
76
+ const signature = Buffer.from(await ed.signAsync(Buffer.from(entryHash, 'hex'), args.privateKey)).toString('hex');
77
+ return { ...unsigned, entryHash, signature };
78
+ }
79
+ function computeDagEntryHash(node) {
80
+ const { entryHash: _entryHash, signature: _signature, previousHash: _previousHash, legacyPreviousHash: _legacyPreviousHash, legacy: _legacy, ...payload } = node;
81
+ return (0, decision_log_1.sha256Hex)((0, decision_log_1.canonicalJson)(payload));
82
+ }
83
+ function msgHashForDecision(decision) {
84
+ assertMetadataOnly(decision);
85
+ return (0, decision_log_1.sha256Hex)((0, decision_log_1.canonicalJson)(decision)).slice(0, 16);
86
+ }
87
+ function deriveTrustScore(decision) {
88
+ const action = typeof decision.action === 'string' ? decision.action : '';
89
+ const entryType = typeof decision.entryType === 'string' ? decision.entryType : '';
90
+ const reasons = Array.isArray(decision.reasons) ? decision.reasons.map(String).join(' ').toLowerCase() : '';
91
+ if (action === 'block' || reasons.includes('blocked') || reasons.includes('cap reached'))
92
+ return 0.2;
93
+ if (entryType === 'settlement' && decision.partial === true)
94
+ return 0.55;
95
+ if (entryType === 'governance')
96
+ return 0.78;
97
+ if (entryType === 'outcome')
98
+ return decision.partial === true ? 0.62 : 0.88;
99
+ if (action === 'shadow')
100
+ return 0.74;
101
+ if (action === 'downgrade')
102
+ return 0.82;
103
+ if (action === 'allow')
104
+ return 0.94;
105
+ return 0.7;
106
+ }
107
+ function deriveCapability(decision) {
108
+ const raw = String(decision.capability ??
109
+ decision.capabilityClaim ??
110
+ decision.requiredCapability ??
111
+ (decision.outcomeReceipt?.metadata?.capability) ??
112
+ '').toLowerCase();
113
+ if (raw.includes('orchestrate'))
114
+ return 'ORCHESTRATE';
115
+ if (raw.includes('payment'))
116
+ return 'TRANSACT';
117
+ if (raw.includes('transaction') || raw.includes('transact'))
118
+ return 'TRANSACT';
119
+ if (raw.includes('admin') || raw.includes('data_write') || raw.includes('write'))
120
+ return 'ADMIN';
121
+ return 'READ_ONLY';
122
+ }
123
+ async function verifyReceiptDag(nodes, signerKeys) {
124
+ const inputs = Array.isArray(nodes) ? nodes : nodes.nodes;
125
+ if (inputs.length === 0)
126
+ return { valid: true, compositeTrust: 1, depth: 0, topologySummary: emptyTopologySummary() };
127
+ let normalized;
128
+ try {
129
+ normalized = inputs.map(normalizeDagNode);
130
+ }
131
+ catch (err) {
132
+ return failure(String(err.message || err));
133
+ }
134
+ const byHash = new Map();
135
+ for (const node of normalized) {
136
+ if (byHash.has(node.entryHash))
137
+ return failure('DUPLICATE_NODE_HASH');
138
+ byHash.set(node.entryHash, node);
139
+ }
140
+ const kahn = topologicalOrder(normalized, byHash);
141
+ if (!kahn.valid)
142
+ return failure(kahn.reason ?? 'CYCLE_DETECTED');
143
+ for (const node of normalized) {
144
+ const key = keyForNode(node, signerKeys);
145
+ if (!key)
146
+ return failure('SIGNER_KEY_NOT_FOUND');
147
+ const publicKey = normalizePublicKey(key);
148
+ if (node.legacy) {
149
+ const legacyOk = await (0, decision_log_1.verifyEntry)({
150
+ sequence: node.sequence,
151
+ decision: node.decision,
152
+ previousHash: node.legacyPreviousHash ?? decision_log_1.GENESIS_PREVIOUS_HASH,
153
+ entryHash: node.entryHash,
154
+ signature: node.signature,
155
+ signerFingerprint: node.signerFingerprint,
156
+ }, publicKey);
157
+ if (!legacyOk)
158
+ return failure('LEGACY_SIGNATURE_OR_HASH_INVALID');
159
+ continue;
160
+ }
161
+ assertMetadataOnly(node.decision);
162
+ const expectedHash = computeDagEntryHash(node);
163
+ if (expectedHash !== node.entryHash)
164
+ return failure('HASH_INVALID');
165
+ if ((0, decision_log_1.computeSignerFingerprint)(publicKey) !== node.signerFingerprint)
166
+ return failure('SIGNER_FINGERPRINT_MISMATCH');
167
+ const ok = await ed.verifyAsync(Buffer.from(node.signature, 'hex'), Buffer.from(node.entryHash, 'hex'), publicKey);
168
+ if (!ok)
169
+ return failure('SIGNATURE_INVALID');
170
+ }
171
+ const diamond = verifyDiamondCorrelation(normalized, byHash);
172
+ if (!diamond.valid)
173
+ return failure(diamond.reason ?? 'DIAMOND_ANCESTOR_MISMATCH');
174
+ const depths = computeDepths(kahn.order, byHash);
175
+ const maxDepth = Math.max(...Array.from(depths.values()), 1);
176
+ const topologySummary = summarizeTopology(normalized, byHash);
177
+ return {
178
+ valid: true,
179
+ compositeTrust: Math.min(...normalized.map((node) => node.trustScore)),
180
+ depth: maxDepth,
181
+ topologySummary,
182
+ };
183
+ }
184
+ function gateCapability(requestedLevel, dagVerificationResult, thresholds = {}) {
185
+ const merged = { ...DEFAULT_THRESHOLDS[requestedLevel], ...(thresholds[requestedLevel] ?? {}) };
186
+ const threshold = { minTrust: merged.minTrust ?? 0, minDepth: merged.minDepth ?? 0 };
187
+ if (!dagVerificationResult.valid) {
188
+ return {
189
+ granted: false,
190
+ requestedLevel,
191
+ compositeTrust: dagVerificationResult.compositeTrust,
192
+ depth: dagVerificationResult.depth,
193
+ reason: dagVerificationResult.reason ?? 'DAG_VERIFICATION_FAILED',
194
+ };
195
+ }
196
+ if (dagVerificationResult.compositeTrust < threshold.minTrust) {
197
+ return {
198
+ granted: false,
199
+ requestedLevel,
200
+ compositeTrust: dagVerificationResult.compositeTrust,
201
+ depth: dagVerificationResult.depth,
202
+ reason: 'TRUST_BELOW_THRESHOLD',
203
+ };
204
+ }
205
+ if (dagVerificationResult.depth < threshold.minDepth) {
206
+ return {
207
+ granted: false,
208
+ requestedLevel,
209
+ compositeTrust: dagVerificationResult.compositeTrust,
210
+ depth: dagVerificationResult.depth,
211
+ reason: 'DEPTH_BELOW_THRESHOLD',
212
+ };
213
+ }
214
+ return {
215
+ granted: true,
216
+ requestedLevel,
217
+ compositeTrust: dagVerificationResult.compositeTrust,
218
+ depth: dagVerificationResult.depth,
219
+ };
220
+ }
221
+ function merkleRoot(nodes) {
222
+ const leaves = nodes.map((node) => normalizeDagNode(node).entryHash).sort();
223
+ return merkleRootFromLeaves(leaves);
224
+ }
225
+ function compressReceiptDag(nodes, threshold = 10) {
226
+ return {
227
+ compressed: nodes.length > threshold,
228
+ root: merkleRoot(nodes),
229
+ nodeCount: nodes.length,
230
+ };
231
+ }
232
+ function merkleInclusionProof(nodes, node) {
233
+ let leaves = nodes.map((item) => normalizeDagNode(item).entryHash).sort();
234
+ const target = typeof node === 'string' ? node : normalizeDagNode(node).entryHash;
235
+ let index = leaves.indexOf(target);
236
+ if (index < 0)
237
+ throw new Error('Merkle target node not found');
238
+ const proof = [];
239
+ while (leaves.length > 1) {
240
+ if (leaves.length % 2 === 1)
241
+ leaves = [...leaves, leaves[leaves.length - 1]];
242
+ const siblingIndex = index % 2 === 0 ? index + 1 : index - 1;
243
+ proof.push({ siblingHash: leaves[siblingIndex], position: index % 2 === 0 ? 'right' : 'left' });
244
+ const next = [];
245
+ for (let i = 0; i < leaves.length; i += 2)
246
+ next.push(hashPair(leaves[i], leaves[i + 1]));
247
+ index = Math.floor(index / 2);
248
+ leaves = next;
249
+ }
250
+ return proof;
251
+ }
252
+ function verifyInclusion(node, proof, root) {
253
+ let hash = typeof node === 'string' ? node : normalizeDagNode(node).entryHash;
254
+ for (const step of proof) {
255
+ hash = step.position === 'left' ? hashPair(step.siblingHash, hash) : hashPair(hash, step.siblingHash);
256
+ }
257
+ return hash === root;
258
+ }
259
+ function dagEnvelopeFromEntries(entries, workflowId = null) {
260
+ const nodes = entries.map((entry) => normalizeDagNode(entry));
261
+ const rootId = nodes[nodes.length - 1]?.entryHash ?? decision_log_1.GENESIS_PREVIOUS_HASH;
262
+ return { nodes, rootId, workflowId };
263
+ }
264
+ function normalizeDagNode(input) {
265
+ const candidate = input;
266
+ if (candidate.legacy !== true && Array.isArray(candidate.parents) && candidate.msgHash && candidate.topology) {
267
+ return {
268
+ version: numberOr(candidate.version, 2),
269
+ sequence: candidate.sequence,
270
+ decision: sanitizeMetadata(candidate.decision),
271
+ workflowId: candidate.workflowId ?? null,
272
+ parents: [...candidate.parents],
273
+ topology: candidate.topology,
274
+ msgHash: candidate.msgHash,
275
+ trustScore: clampTrust(candidate.trustScore),
276
+ blocked: Boolean(candidate.blocked),
277
+ capability: candidate.capability ?? deriveCapability(candidate.decision),
278
+ entryHash: candidate.entryHash,
279
+ signature: candidate.signature,
280
+ signerFingerprint: candidate.signerFingerprint,
281
+ builderCode: candidate.builderCode ?? null,
282
+ timestamp: candidate.timestamp ?? new Date(0).toISOString(),
283
+ previousHash: candidate.previousHash,
284
+ legacyPreviousHash: null,
285
+ legacy: false,
286
+ };
287
+ }
288
+ const previousHash = candidate.previousHash ?? decision_log_1.GENESIS_PREVIOUS_HASH;
289
+ const parents = previousHash === decision_log_1.GENESIS_PREVIOUS_HASH ? [] : [previousHash];
290
+ const decision = sanitizeMetadata(candidate.decision);
291
+ return {
292
+ version: 1,
293
+ sequence: candidate.sequence,
294
+ decision,
295
+ workflowId: stringOrNull(decision.workflowId) ?? stringOrNull(decision.workflow_id),
296
+ parents,
297
+ topology: 'linear',
298
+ msgHash: msgHashForDecision(decision),
299
+ trustScore: deriveTrustScore(decision),
300
+ blocked: decision.action === 'block',
301
+ capability: deriveCapability(decision),
302
+ entryHash: candidate.entryHash,
303
+ signature: candidate.signature,
304
+ signerFingerprint: candidate.signerFingerprint,
305
+ timestamp: stringOrNull(decision.timestamp) ?? new Date(0).toISOString(),
306
+ previousHash,
307
+ legacyPreviousHash: previousHash,
308
+ legacy: true,
309
+ };
310
+ }
311
+ function topologicalOrder(nodes, byHash) {
312
+ const indegree = new Map();
313
+ const children = new Map();
314
+ for (const node of nodes) {
315
+ const parentRefs = node.parents.filter((parent) => parent !== decision_log_1.GENESIS_PREVIOUS_HASH);
316
+ for (const parent of parentRefs) {
317
+ if (!byHash.has(parent))
318
+ return { valid: false, order: [], reason: 'MISSING_PARENT' };
319
+ const list = children.get(parent) ?? [];
320
+ list.push(node.entryHash);
321
+ children.set(parent, list);
322
+ }
323
+ indegree.set(node.entryHash, parentRefs.length);
324
+ }
325
+ const queue = Array.from(indegree.entries()).filter(([, degree]) => degree === 0).map(([hash]) => hash);
326
+ const order = [];
327
+ while (queue.length) {
328
+ const current = queue.shift();
329
+ order.push(current);
330
+ for (const child of children.get(current) ?? []) {
331
+ const next = (indegree.get(child) ?? 0) - 1;
332
+ indegree.set(child, next);
333
+ if (next === 0)
334
+ queue.push(child);
335
+ }
336
+ }
337
+ if (order.length !== nodes.length)
338
+ return { valid: false, order, reason: 'CYCLE_DETECTED' };
339
+ return { valid: true, order };
340
+ }
341
+ function verifyDiamondCorrelation(nodes, byHash) {
342
+ for (const node of nodes) {
343
+ if (node.parents.length < 2)
344
+ continue;
345
+ const parentNodes = node.parents.map((parent) => byHash.get(parent)).filter(Boolean);
346
+ if (parentNodes.length < 2)
347
+ continue;
348
+ const ancestorSets = parentNodes.map((parent) => ancestorsOf(parent.entryHash, byHash));
349
+ const common = [...ancestorSets[0]].filter((hash) => ancestorSets.every((set) => set.has(hash)));
350
+ const isDiamond = node.topology === 'diamond' || common.length > 0;
351
+ if (!isDiamond)
352
+ continue;
353
+ if (!common.length)
354
+ return { valid: false, reason: 'DIAMOND_ANCESTOR_MISMATCH' };
355
+ const correlated = common.some((ancestorHash) => {
356
+ const ancestor = byHash.get(ancestorHash);
357
+ return ancestor ? parentNodes.every((parent) => correlatesToAncestor(parent, ancestor)) : false;
358
+ });
359
+ if (!correlated)
360
+ return { valid: false, reason: 'DIAMOND_MSGHASH_MISMATCH' };
361
+ }
362
+ return { valid: true };
363
+ }
364
+ function ancestorsOf(hash, byHash, seen = new Set()) {
365
+ const node = byHash.get(hash);
366
+ if (!node)
367
+ return seen;
368
+ for (const parent of node.parents) {
369
+ if (seen.has(parent))
370
+ continue;
371
+ seen.add(parent);
372
+ ancestorsOf(parent, byHash, seen);
373
+ }
374
+ return seen;
375
+ }
376
+ function correlatesToAncestor(node, ancestor) {
377
+ if (node.msgHash === ancestor.msgHash)
378
+ return true;
379
+ const flattened = flattenValues(node.decision);
380
+ return flattened.includes(ancestor.msgHash) || flattened.includes(ancestor.entryHash);
381
+ }
382
+ function flattenValues(value) {
383
+ if (value == null)
384
+ return [];
385
+ if (typeof value === 'string')
386
+ return [value];
387
+ if (typeof value === 'number' || typeof value === 'boolean')
388
+ return [String(value)];
389
+ if (Array.isArray(value))
390
+ return value.flatMap(flattenValues);
391
+ if (typeof value === 'object')
392
+ return Object.values(value).flatMap(flattenValues);
393
+ return [];
394
+ }
395
+ function computeDepths(order, byHash) {
396
+ const depths = new Map();
397
+ for (const hash of order) {
398
+ const node = byHash.get(hash);
399
+ const parentDepth = node.parents.length
400
+ ? Math.max(0, ...node.parents.map((parent) => depths.get(parent) ?? 0))
401
+ : 0;
402
+ depths.set(hash, parentDepth + 1);
403
+ }
404
+ return depths;
405
+ }
406
+ function summarizeTopology(nodes, byHash) {
407
+ const childCounts = new Map();
408
+ for (const node of nodes) {
409
+ for (const parent of node.parents)
410
+ childCounts.set(parent, (childCounts.get(parent) ?? 0) + 1);
411
+ }
412
+ const summary = emptyTopologySummary();
413
+ for (const node of nodes) {
414
+ let topology = node.topology;
415
+ if (node.parents.length > 1) {
416
+ const parentNodes = node.parents.map((parent) => byHash.get(parent)).filter(Boolean);
417
+ const common = parentNodes.length > 1
418
+ ? [...ancestorsOf(parentNodes[0].entryHash, byHash)].filter((hash) => parentNodes.every((parent) => ancestorsOf(parent.entryHash, byHash).has(hash)))
419
+ : [];
420
+ topology = common.length ? 'diamond' : 'fan_in';
421
+ }
422
+ else if (childCounts.get(node.entryHash) > 1) {
423
+ topology = 'fan_out';
424
+ }
425
+ summary[topology] += 1;
426
+ }
427
+ return summary;
428
+ }
429
+ function emptyTopologySummary() {
430
+ return { linear: 0, fan_in: 0, fan_out: 0, diamond: 0 };
431
+ }
432
+ function failure(reason) {
433
+ return { valid: false, compositeTrust: 0, depth: 0, topologySummary: emptyTopologySummary(), reason };
434
+ }
435
+ function keyForNode(node, keys) {
436
+ if (typeof keys === 'string' || keys instanceof Uint8Array)
437
+ return keys;
438
+ return keys[node.signerFingerprint] ?? null;
439
+ }
440
+ function normalizePublicKey(key) {
441
+ if (key instanceof Uint8Array)
442
+ return key;
443
+ const clean = key.replace(/^0x/, '');
444
+ return Uint8Array.from(Buffer.from(clean, 'hex'));
445
+ }
446
+ function parentHash(parent) {
447
+ return typeof parent === 'string' ? parent : parent.entryHash;
448
+ }
449
+ function topologyForParentCount(count) {
450
+ if (count === 0 || count === 1)
451
+ return 'linear';
452
+ return 'fan_in';
453
+ }
454
+ function merkleRootFromLeaves(input) {
455
+ if (input.length === 0)
456
+ return (0, decision_log_1.sha256Hex)('');
457
+ let leaves = [...input].sort();
458
+ while (leaves.length > 1) {
459
+ if (leaves.length % 2 === 1)
460
+ leaves.push(leaves[leaves.length - 1]);
461
+ const next = [];
462
+ for (let i = 0; i < leaves.length; i += 2)
463
+ next.push(hashPair(leaves[i], leaves[i + 1]));
464
+ leaves = next;
465
+ }
466
+ return leaves[0];
467
+ }
468
+ function hashPair(left, right) {
469
+ return (0, decision_log_1.sha256Hex)(left + right);
470
+ }
471
+ function sanitizeMetadata(value) {
472
+ assertMetadataOnly(value);
473
+ return JSON.parse(JSON.stringify(value));
474
+ }
475
+ function assertMetadataOnly(value, path = 'decision') {
476
+ if (value == null)
477
+ return;
478
+ if (Array.isArray(value)) {
479
+ value.forEach((child, index) => assertMetadataOnly(child, `${path}[${index}]`));
480
+ return;
481
+ }
482
+ if (typeof value !== 'object')
483
+ return;
484
+ for (const [key, child] of Object.entries(value)) {
485
+ if (DATA_PLANE_KEYS.test(key)) {
486
+ throw new Error('DAG receipt metadata cannot include data-plane field: ' + path + '.' + key);
487
+ }
488
+ assertMetadataOnly(child, path + '.' + key);
489
+ }
490
+ }
491
+ function numberOr(value, fallback) {
492
+ return Number.isSafeInteger(value) ? value : fallback;
493
+ }
494
+ function stringOrNull(value) {
495
+ return typeof value === 'string' && value ? value : null;
496
+ }
497
+ function clampTrust(value) {
498
+ const numeric = typeof value === 'number' && Number.isFinite(value) ? value : 0;
499
+ return Math.max(0, Math.min(1, numeric));
500
+ }
501
+ //# sourceMappingURL=dag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag.js","sourceRoot":"","sources":["../../src/receipts/dag.ts"],"names":[],"mappings":"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"}
package/dist/telemetry.js CHANGED
@@ -43,7 +43,7 @@ const https = __importStar(require("https"));
43
43
  const os = __importStar(require("os"));
44
44
  const path = __importStar(require("path"));
45
45
  const crypto_1 = require("crypto");
46
- const AGENTGUARD_SPEND_VERSION = '0.11.0';
46
+ const AGENTGUARD_SPEND_VERSION = '0.12.0';
47
47
  const STATE_DIR = path.join(os.homedir(), '.agentguard');
48
48
  const INSTALL_PATH = path.join(STATE_DIR, 'install.json');
49
49
  const BEACON_URL = 'https://agentguard.run/api/beacon';
@@ -0,0 +1,37 @@
1
+ # DAG Receipt Tree Claim Mapping
2
+
3
+ Internal reduction-to-practice mapping. Confirm claim scope with counsel before external assertion.
4
+
5
+ ## Claim 2: DAG Trust Attestation verification
6
+
7
+ - TAT node fields: `ReceiptDagNode` defines version, timestamp, msgHash, trustScore, blocked, signerFingerprint, topology, parents, entryHash, and signature in `packages/agentguard-spend/src/receipts/dag.ts:8`.
8
+ - Signature verification against signer keys: `verifyReceiptDag()` resolves the signer public key and verifies Ed25519 signatures in `packages/agentguard-spend/src/receipts/dag.ts:182`.
9
+ - Kahn topological sort and cycle failure: `topologicalOrder()` computes in-degree, visits zero-parent nodes, and returns `CYCLE_DETECTED` in `packages/agentguard-spend/src/receipts/dag.ts:358`.
10
+ - Diamond common-ancestor and msgHash correlation: `verifyDiamondCorrelation()` traverses parent ancestry and checks correlation values in `packages/agentguard-spend/src/receipts/dag.ts:386`.
11
+ - Minimum-of-chain composite trust: `verifyReceiptDag()` returns `Math.min(...trustScore)` in `packages/agentguard-spend/src/receipts/dag.ts:215`.
12
+ - Legacy linear chain compatibility: `normalizeDagNode()` maps `previousHash` to `parents` and preserves old entry verification in `packages/agentguard-spend/src/receipts/dag.ts:310`.
13
+
14
+ Python mirror:
15
+
16
+ - TAT node signing and canonical fields: `agentguard_spend/receipts/dag.py:45`.
17
+ - Verification, topological sort, and composite trust: `agentguard_spend/receipts/dag.py:115` and `agentguard_spend/receipts/dag.py:236`.
18
+
19
+ ## Claim 3: Attestation-gated capability escalation
20
+
21
+ - Capability levels are the ordered enum `READ_ONLY`, `TRANSACT`, `ADMIN`, `ORCHESTRATE` in `packages/agentguard-spend/src/receipts/dag.ts:6`.
22
+ - Default trust and depth thresholds are defined in `packages/agentguard-spend/src/receipts/dag.ts:69`.
23
+ - `gateCapability()` denies invalid DAGs, trust below threshold, or insufficient DAG depth before granting a requested capability in `packages/agentguard-spend/src/receipts/dag.ts:223`.
24
+ - Python parity lives in `agentguard_spend/receipts/dag.py:165`.
25
+
26
+ ## Claim 7: Merkle compression and inclusion proofs
27
+
28
+ - DAGs over the default threshold are compressed by `compressReceiptDag()` in `packages/agentguard-spend/src/receipts/dag.ts:270`.
29
+ - Inclusion proofs are produced by `merkleInclusionProof()` in `packages/agentguard-spend/src/receipts/dag.ts:278`.
30
+ - Inclusion proofs are verified by `verifyInclusion()` in `packages/agentguard-spend/src/receipts/dag.ts:296`.
31
+ - Python parity lives in `agentguard_spend/receipts/dag.py:181`, `agentguard_spend/receipts/dag.py:185`, and `agentguard_spend/receipts/dag.py:202`.
32
+
33
+ ## Workflow and Reviewer Cascade practice points
34
+
35
+ - Outcome runtime attaches a DAG envelope to signed outcome receipts when drafter, reviewer, or final signed entries exist in `packages/agentguard-spend/src/outcomes/runtime.ts:168`.
36
+ - The DAG envelope uses only metadata signed entries. It excludes prompt, completion, source, and PII fields through the data-plane guard in `packages/agentguard-spend/src/receipts/dag.ts:514`.
37
+ - The public verifier renders DAG topology, composite trust, depth, and capability status in `agentguard-site/verify/index.html`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentguard-run/spend",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "All terminology and labels used in AgentGuard materials are descriptive of software functionality only, not legal definitions or guarantees of compliance. Terms like receipt, audit log, evidence, audit trail, and attestation refer solely to cryptographically-signed records produced by the software. Full functional-use disclaimer in README.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -74,6 +74,11 @@
74
74
  "types": "./dist/byo/index.d.ts",
75
75
  "require": "./dist/byo/index.js",
76
76
  "default": "./dist/byo/index.js"
77
+ },
78
+ "./receipts/dag": {
79
+ "types": "./dist/receipts/dag.d.ts",
80
+ "require": "./dist/receipts/dag.js",
81
+ "default": "./dist/receipts/dag.js"
77
82
  }
78
83
  },
79
84
  "bin": {
@@ -105,7 +110,8 @@
105
110
  "src/verticals",
106
111
  "src/governance.ts",
107
112
  "src/byo",
108
- "src/cli/byo.ts"
113
+ "src/cli/byo.ts",
114
+ "docs/patents/CLAIM_MAPPING.md"
109
115
  ],
110
116
  "scripts": {
111
117
  "build": "tsc",
@@ -92,7 +92,7 @@ export function normalizeLearningMetadataRow(input: Record<string, unknown>): Le
92
92
  guardrail_tier: clean(input.guardrail_tier, 'unknown', 64),
93
93
  feedback_verdict: verdict,
94
94
  feedback_reason: reason,
95
- timestamp: new Date(String(input.timestamp || Date.now())).toISOString(),
95
+ timestamp: normalizeTimestamp(input.timestamp),
96
96
  };
97
97
  }
98
98
 
@@ -133,6 +133,11 @@ export function revisionSuggestion(reasons: Record<string, number>): string {
133
133
  return ({ missing_citation: 'tighten cite-or-refuse instruction', wrong_format: 'make output schema stricter', wrong_category: 'add category examples', too_long: 'shorten answer format', missed_clause: 'expand clause watchlist', needs_review: 'lower reviewer cascade threshold', great: 'preserve current template' } as Record<string, string>)[top || ''] || 'keep collecting metadata';
134
134
  }
135
135
 
136
+ function normalizeTimestamp(value: unknown) {
137
+ const time = value == null ? Date.now() : new Date(String(value)).getTime();
138
+ return new Date(Number.isFinite(time) ? time : Date.now()).toISOString();
139
+ }
140
+
136
141
  function pick(a: LearningAggregate) { return { prompt_version: a.prompt_version, model_id: a.model_id, effort: a.effort, fit_score: fitScore(a) }; }
137
142
  function fitScore(a: LearningAggregate) { return round(a.pass_rate * 0.32 + a.mean_quality_score * 0.28 + a.feedback_distribution.accept_rate * 0.24 - a.feedback_distribution.reject_rate * 0.18 - a.escalation_rate * 0.08 - Math.min(0.12, a.mean_cost_cents / 2000) - Math.min(0.08, a.mean_latency_ms / 120000)); }
138
143
  function clean(value: unknown, fallback: any, max: number) { const raw = value == null ? fallback : String(value).toLowerCase().replace(/[^a-z0-9_./:-]/g, '_').slice(0, max); return raw || fallback; }
@@ -1,4 +1,5 @@
1
1
  import { randomUUID } from 'crypto';
2
+ import { dagEnvelopeFromEntries } from '../receipts/dag';
2
3
  import { buildScopeKey } from '../policy';
3
4
  import { computeCallCents, inferProvider } from '../cost-table';
4
5
  import { recommend, type ModelRouteRecommendation } from '../router';
@@ -164,8 +165,12 @@ export async function executeOutcomeTask(options: ExecuteOutcomeTaskOptions): Pr
164
165
  posture,
165
166
  budgetTier,
166
167
  });
167
- await receiptStore.append(receipt);
168
168
  const signedReceipt = await options.guard.recordOutcomeReceipt(receiptToMetadata(receipt));
169
+ if (signedReceipt.signed) {
170
+ const dagEntries = [drafter?.signed, reviewer?.signed, signedReceipt.signed].filter(Boolean) as NonNullable<ModelRunResult['signed']>[];
171
+ receipt.dag = dagEnvelopeFromEntries(dagEntries, receipt.scopeKey);
172
+ }
173
+ await receiptStore.append(receipt);
169
174
  return { receipt, signed: signedReceipt.signed, outputText, reviewerOutputText };
170
175
  }
171
176