@grantex/sdk 0.5.1 → 0.7.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/LICENSE +185 -0
- package/NOTICE +16 -0
- package/README.md +34 -2
- package/dist/authorization-details.d.ts +86 -0
- package/dist/authorization-details.d.ts.map +1 -0
- package/dist/authorization-details.js +209 -0
- package/dist/authorization-details.js.map +1 -0
- package/dist/canonical.d.ts +47 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +163 -0
- package/dist/canonical.js.map +1 -0
- package/dist/caps/index.d.ts +19 -0
- package/dist/caps/index.d.ts.map +1 -0
- package/dist/caps/index.js +19 -0
- package/dist/caps/index.js.map +1 -0
- package/dist/caps/limits.d.ts +40 -0
- package/dist/caps/limits.d.ts.map +1 -0
- package/dist/caps/limits.js +109 -0
- package/dist/caps/limits.js.map +1 -0
- package/dist/caps/memory.d.ts +15 -0
- package/dist/caps/memory.d.ts.map +1 -0
- package/dist/caps/memory.js +57 -0
- package/dist/caps/memory.js.map +1 -0
- package/dist/caps/meter.d.ts +107 -0
- package/dist/caps/meter.d.ts.map +1 -0
- package/dist/caps/meter.js +200 -0
- package/dist/caps/meter.js.map +1 -0
- package/dist/caps/postgres.d.ts +64 -0
- package/dist/caps/postgres.d.ts.map +1 -0
- package/dist/caps/postgres.js +221 -0
- package/dist/caps/postgres.js.map +1 -0
- package/dist/caps/redis.d.ts +45 -0
- package/dist/caps/redis.d.ts.map +1 -0
- package/dist/caps/redis.js +173 -0
- package/dist/caps/redis.js.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +517 -57
- package/dist/client.js.map +1 -1
- package/dist/decisions/action.d.ts +51 -0
- package/dist/decisions/action.d.ts.map +1 -0
- package/dist/decisions/action.js +237 -0
- package/dist/decisions/action.js.map +1 -0
- package/dist/decisions/index.d.ts +11 -0
- package/dist/decisions/index.d.ts.map +1 -0
- package/dist/decisions/index.js +8 -0
- package/dist/decisions/index.js.map +1 -0
- package/dist/decisions/verify.d.ts +103 -0
- package/dist/decisions/verify.d.ts.map +1 -0
- package/dist/decisions/verify.js +277 -0
- package/dist/decisions/verify.js.map +1 -0
- package/dist/denials.d.ts +132 -0
- package/dist/denials.d.ts.map +1 -0
- package/dist/denials.js +129 -0
- package/dist/denials.js.map +1 -0
- package/dist/evidence/build.d.ts +63 -0
- package/dist/evidence/build.d.ts.map +1 -0
- package/dist/evidence/build.js +201 -0
- package/dist/evidence/build.js.map +1 -0
- package/dist/evidence/canonical.d.ts +3 -0
- package/dist/evidence/canonical.d.ts.map +1 -0
- package/dist/evidence/canonical.js +3 -0
- package/dist/evidence/canonical.js.map +1 -0
- package/dist/evidence/checks.d.ts +13 -0
- package/dist/evidence/checks.d.ts.map +1 -0
- package/dist/evidence/checks.js +406 -0
- package/dist/evidence/checks.js.map +1 -0
- package/dist/evidence/document.d.ts +8 -0
- package/dist/evidence/document.d.ts.map +1 -0
- package/dist/evidence/document.js +298 -0
- package/dist/evidence/document.js.map +1 -0
- package/dist/evidence/hashing.d.ts +37 -0
- package/dist/evidence/hashing.d.ts.map +1 -0
- package/dist/evidence/hashing.js +106 -0
- package/dist/evidence/hashing.js.map +1 -0
- package/dist/evidence/index.d.ts +24 -0
- package/dist/evidence/index.d.ts.map +1 -0
- package/dist/evidence/index.js +24 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/result.d.ts +88 -0
- package/dist/evidence/result.d.ts.map +1 -0
- package/dist/evidence/result.js +88 -0
- package/dist/evidence/result.js.map +1 -0
- package/dist/evidence/schema-1.0.d.ts +2 -0
- package/dist/evidence/schema-1.0.d.ts.map +1 -0
- package/dist/evidence/schema-1.0.js +1398 -0
- package/dist/evidence/schema-1.0.js.map +1 -0
- package/dist/evidence/schema.d.ts +13 -0
- package/dist/evidence/schema.d.ts.map +1 -0
- package/dist/evidence/schema.js +264 -0
- package/dist/evidence/schema.js.map +1 -0
- package/dist/evidence/signature.d.ts +23 -0
- package/dist/evidence/signature.d.ts.map +1 -0
- package/dist/evidence/signature.js +136 -0
- package/dist/evidence/signature.js.map +1 -0
- package/dist/evidence/trace.d.ts +23 -0
- package/dist/evidence/trace.d.ts.map +1 -0
- package/dist/evidence/trace.js +69 -0
- package/dist/evidence/trace.js.map +1 -0
- package/dist/evidence/verify.d.ts +29 -0
- package/dist/evidence/verify.d.ts.map +1 -0
- package/dist/evidence/verify.js +163 -0
- package/dist/evidence/verify.js.map +1 -0
- package/dist/http.d.ts +12 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +11 -5
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +16 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +178 -9
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +379 -16
- package/dist/manifest.js.map +1 -1
- package/dist/prepaid-wallets.d.ts +21 -0
- package/dist/prepaid-wallets.d.ts.map +1 -1
- package/dist/prepaid-wallets.js +6 -0
- package/dist/prepaid-wallets.js.map +1 -1
- package/dist/purpose.d.ts +29 -0
- package/dist/purpose.d.ts.map +1 -0
- package/dist/purpose.js +60 -0
- package/dist/purpose.js.map +1 -0
- package/dist/resources/agents.js +3 -3
- package/dist/resources/agents.js.map +1 -1
- package/dist/resources/anomalies.d.ts +3 -1
- package/dist/resources/anomalies.d.ts.map +1 -1
- package/dist/resources/anomalies.js +7 -1
- package/dist/resources/anomalies.js.map +1 -1
- package/dist/resources/audit.js +1 -1
- package/dist/resources/audit.js.map +1 -1
- package/dist/resources/budgets.js +2 -2
- package/dist/resources/budgets.js.map +1 -1
- package/dist/resources/credentials.js +1 -1
- package/dist/resources/credentials.js.map +1 -1
- package/dist/resources/decisions.d.ts +69 -0
- package/dist/resources/decisions.d.ts.map +1 -0
- package/dist/resources/decisions.js +115 -0
- package/dist/resources/decisions.js.map +1 -0
- package/dist/resources/domains.js +2 -2
- package/dist/resources/domains.js.map +1 -1
- package/dist/resources/dpdp.js +4 -4
- package/dist/resources/dpdp.js.map +1 -1
- package/dist/resources/grants.js +2 -2
- package/dist/resources/grants.js.map +1 -1
- package/dist/resources/policies.js +3 -3
- package/dist/resources/policies.js.map +1 -1
- package/dist/resources/scim.js +5 -5
- package/dist/resources/scim.js.map +1 -1
- package/dist/resources/tokens.d.ts.map +1 -1
- package/dist/resources/tokens.js +5 -1
- package/dist/resources/tokens.js.map +1 -1
- package/dist/resources/vault.js +2 -2
- package/dist/resources/vault.js.map +1 -1
- package/dist/resources/webauthn.d.ts +6 -1
- package/dist/resources/webauthn.d.ts.map +1 -1
- package/dist/resources/webauthn.js +5 -1
- package/dist/resources/webauthn.js.map +1 -1
- package/dist/resources/webhooks.js +1 -1
- package/dist/resources/webhooks.js.map +1 -1
- package/dist/revocations/feed.d.ts +61 -0
- package/dist/revocations/feed.d.ts.map +1 -0
- package/dist/revocations/feed.js +282 -0
- package/dist/revocations/feed.js.map +1 -0
- package/dist/revocations/index.d.ts +20 -0
- package/dist/revocations/index.d.ts.map +1 -0
- package/dist/revocations/index.js +19 -0
- package/dist/revocations/index.js.map +1 -0
- package/dist/revocations/set.d.ts +59 -0
- package/dist/revocations/set.d.ts.map +1 -0
- package/dist/revocations/set.js +87 -0
- package/dist/revocations/set.js.map +1 -0
- package/dist/scopes.d.ts +26 -0
- package/dist/scopes.d.ts.map +1 -0
- package/dist/scopes.js +37 -0
- package/dist/scopes.js.map +1 -0
- package/dist/types.d.ts +121 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/verify.d.ts +31 -2
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +236 -29
- package/dist/verify.js.map +1 -1
- package/package.json +13 -4
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy, hash-chain and cross-entry checks on a parsed evidence package.
|
|
3
|
+
* Each check throws `VerificationFailure` at the first problem. The order of
|
|
4
|
+
* checks is part of the specification and mirrors `grantex.evidence._checks`.
|
|
5
|
+
*/
|
|
6
|
+
import { IDENTIFIER_CLASSES, chainRoot, decisionActionHash, entryHash, headerHash, isActionReference, isPseudonym } from './hashing.js';
|
|
7
|
+
import { VerificationCode as Code, VerificationFailure } from './result.js';
|
|
8
|
+
import { timestampMs } from './schema.js';
|
|
9
|
+
/** Tolerated difference between producer clocks and the recording service (5 minutes). */
|
|
10
|
+
export const MAX_CLOCK_SKEW_MS = 300_000;
|
|
11
|
+
const PLATFORM_TYPES = new Set(['grant', 'decision', 'decision_consumption', 'revocation']);
|
|
12
|
+
const ID_FIELDS = {
|
|
13
|
+
run_context: 'run_id',
|
|
14
|
+
tool_call: 'call_id',
|
|
15
|
+
policy_evaluation: 'evaluation_id',
|
|
16
|
+
recommendation: 'recommendation_id',
|
|
17
|
+
disposition: 'disposition_id',
|
|
18
|
+
};
|
|
19
|
+
const entryPath = (index, rest = '') => `entries[${index}]${rest ? `.${rest}` : ''}`;
|
|
20
|
+
function fail(code, message, index, path, expected = null, actual = null) {
|
|
21
|
+
return new VerificationFailure(code, message, { entryIndex: index, fieldPath: path, expected, actual });
|
|
22
|
+
}
|
|
23
|
+
// ── Privacy ──────────────────────────────────────────────────────────────
|
|
24
|
+
function evidenceRefs(data, kind) {
|
|
25
|
+
const refs = [];
|
|
26
|
+
if (kind === 'policy_evaluation') {
|
|
27
|
+
data['inputs'].forEach((item, i) => item['evidence'].forEach((ref, j) => refs.push([`data.inputs[${i}].evidence[${j}]`, ref])));
|
|
28
|
+
}
|
|
29
|
+
else if (kind === 'recommendation') {
|
|
30
|
+
data['sections'].forEach((section, i) => section['evidence'].forEach((ref, j) => refs.push([`data.sections[${i}].evidence[${j}]`, ref])));
|
|
31
|
+
}
|
|
32
|
+
else if (kind === 'disposition') {
|
|
33
|
+
data['comparisons'].forEach((comparison, i) => comparison['evidence'].forEach((ref, j) => refs.push([`data.comparisons[${i}].evidence[${j}]`, ref])));
|
|
34
|
+
refs.push(['data.hit', data['hit']]);
|
|
35
|
+
}
|
|
36
|
+
return refs;
|
|
37
|
+
}
|
|
38
|
+
export function checkPrivacy(pkg) {
|
|
39
|
+
const privacy = pkg['privacy'];
|
|
40
|
+
const disclosed = privacy['disclosed'];
|
|
41
|
+
if (disclosed.join('\n') !== [...disclosed].sort().join('\n')) {
|
|
42
|
+
throw fail(Code.PRIVACY_VIOLATION, 'privacy.disclosed must be sorted', null, 'privacy.disclosed');
|
|
43
|
+
}
|
|
44
|
+
const all = disclosed.join('\n') === IDENTIFIER_CLASSES.join('\n');
|
|
45
|
+
if (privacy['scheme'] === 'none') {
|
|
46
|
+
if (!all)
|
|
47
|
+
throw fail(Code.PRIVACY_VIOLATION, 'scheme none requires every class to be disclosed', null, 'privacy.disclosed');
|
|
48
|
+
if ('key_id' in privacy)
|
|
49
|
+
throw fail(Code.PRIVACY_VIOLATION, 'scheme none has no key_id', null, 'privacy.key_id');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
if (!('key_id' in privacy))
|
|
53
|
+
throw fail(Code.PRIVACY_VIOLATION, 'a pseudonymisation scheme requires key_id', null, 'privacy.key_id');
|
|
54
|
+
if (all)
|
|
55
|
+
throw fail(Code.PRIVACY_VIOLATION, 'every class is disclosed; the scheme must be none', null, 'privacy.scheme');
|
|
56
|
+
}
|
|
57
|
+
const identifier = (cls, value, index, path) => {
|
|
58
|
+
if (!disclosed.includes(cls) && !isPseudonym(value)) {
|
|
59
|
+
throw fail(Code.PRIVACY_VIOLATION, `${cls} value is not pseudonymised and ${cls} is not disclosed`, index, path);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const content = (value, index, path) => {
|
|
63
|
+
if (value === null)
|
|
64
|
+
return;
|
|
65
|
+
const wanted = disclosed.includes('content') ? 'sha256:' : 'hmac-sha256:';
|
|
66
|
+
if (!String(value).startsWith(wanted)) {
|
|
67
|
+
throw fail(Code.PRIVACY_VIOLATION, `content digest must be ${wanted} while content is ${wanted === 'sha256:' ? 'disclosed' : 'not disclosed'}`, index, path);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const actionKey = (data, index) => {
|
|
71
|
+
if (disclosed.includes('subject')) {
|
|
72
|
+
if (!('action_hash' in data))
|
|
73
|
+
throw fail(Code.PRIVACY_VIOLATION, 'action_hash is required when the subject is disclosed', index, entryPath(index, 'data.action_hash'));
|
|
74
|
+
if ('action_ref' in data)
|
|
75
|
+
throw fail(Code.PRIVACY_VIOLATION, 'action_ref is used only while the subject is pseudonymised', index, entryPath(index, 'data.action_ref'));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if ('action_hash' in data)
|
|
79
|
+
throw fail(Code.PRIVACY_VIOLATION, 'an unkeyed action_hash would reveal the pseudonymised subject', index, entryPath(index, 'data.action_hash'));
|
|
80
|
+
if (!isActionReference(data['action_ref']))
|
|
81
|
+
throw fail(Code.PRIVACY_VIOLATION, 'action_ref is required while the subject is pseudonymised', index, entryPath(index, 'data.action_ref'));
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const kase = pkg['case'];
|
|
85
|
+
if ('subject' in kase)
|
|
86
|
+
identifier('subject', kase['subject'], null, 'case.subject');
|
|
87
|
+
pkg['entries'].forEach((entry, index) => {
|
|
88
|
+
const kind = entry['type'];
|
|
89
|
+
const data = entry['data'];
|
|
90
|
+
if (kind === 'grant') {
|
|
91
|
+
identifier('principal', data['principal'], index, entryPath(index, 'data.principal'));
|
|
92
|
+
}
|
|
93
|
+
else if (kind === 'tool_call') {
|
|
94
|
+
content(data['input_hash'], index, entryPath(index, 'data.input_hash'));
|
|
95
|
+
content(data['output_hash'], index, entryPath(index, 'data.output_hash'));
|
|
96
|
+
data['upstream_records'].forEach((record, k) => identifier('record', record['record_id'], index, entryPath(index, `data.upstream_records[${k}].record_id`)));
|
|
97
|
+
}
|
|
98
|
+
else if (kind === 'decision') {
|
|
99
|
+
identifier('subject', data['action']['subject'], index, entryPath(index, 'data.action.subject'));
|
|
100
|
+
actionKey(data, index);
|
|
101
|
+
identifier('approver', data['approver'], index, entryPath(index, 'data.approver'));
|
|
102
|
+
}
|
|
103
|
+
else if (kind === 'decision_consumption') {
|
|
104
|
+
actionKey(data, index);
|
|
105
|
+
}
|
|
106
|
+
for (const [path, ref] of evidenceRefs(data, kind)) {
|
|
107
|
+
if ('excerpt_ref' in ref)
|
|
108
|
+
identifier('record', ref['excerpt_ref'], index, entryPath(index, `${path}.excerpt_ref`));
|
|
109
|
+
identifier('record', ref['record_id'], index, entryPath(index, `${path}.record_id`));
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// ── Chain ────────────────────────────────────────────────────────────────
|
|
114
|
+
export function checkChain(pkg) {
|
|
115
|
+
const chain = pkg['chain'];
|
|
116
|
+
const entries = pkg['entries'];
|
|
117
|
+
const genesis = headerHash(pkg);
|
|
118
|
+
if (chain['genesis'] !== genesis)
|
|
119
|
+
throw fail(Code.GENESIS_MISMATCH, 'chain.genesis is not the hash of the package header', null, 'chain.genesis', genesis, chain['genesis']);
|
|
120
|
+
let previous = genesis;
|
|
121
|
+
entries.forEach((entry, index) => {
|
|
122
|
+
if (entry['seq'] !== index)
|
|
123
|
+
throw fail(Code.SEQUENCE_MISMATCH, `entry ${index} has seq ${String(entry['seq'])}`, index, entryPath(index, 'seq'), String(index), String(entry['seq']));
|
|
124
|
+
if (entry['prev'] !== previous)
|
|
125
|
+
throw fail(Code.LINK_MISMATCH, `entry ${index} does not link to the hash before it`, index, entryPath(index, 'prev'), previous, entry['prev']);
|
|
126
|
+
const computed = entryHash(entry);
|
|
127
|
+
if (entry['hash'] !== computed)
|
|
128
|
+
throw fail(Code.ENTRY_HASH_MISMATCH, `entry ${index} content does not match its hash`, index, entryPath(index, 'hash'), computed, entry['hash']);
|
|
129
|
+
previous = computed;
|
|
130
|
+
});
|
|
131
|
+
if (chain['head'] !== previous)
|
|
132
|
+
throw fail(Code.HEAD_MISMATCH, 'chain.head is not the hash of the last entry', null, 'chain.head', previous, chain['head']);
|
|
133
|
+
if (chain['length'] !== entries.length)
|
|
134
|
+
throw fail(Code.LENGTH_MISMATCH, 'chain.length is not the number of entries', null, 'chain.length', String(entries.length), String(chain['length']));
|
|
135
|
+
const root = chainRoot(chain);
|
|
136
|
+
if (chain['root'] !== root)
|
|
137
|
+
throw fail(Code.ROOT_MISMATCH, 'chain.root is not the hash of the chain summary', null, 'chain.root', root, chain['root']);
|
|
138
|
+
}
|
|
139
|
+
const recordKey = (kind, id) => `${kind}\n${id}`;
|
|
140
|
+
const actionKeyOf = (data) => ('action_hash' in data ? data['action_hash'] : data['action_ref']);
|
|
141
|
+
const actionPath = (data) => ('action_hash' in data ? 'data.action_hash' : 'data.action_ref');
|
|
142
|
+
export function checkSemantics(pkg) {
|
|
143
|
+
const kase = pkg['case'];
|
|
144
|
+
const disclosed = pkg['privacy']['disclosed'];
|
|
145
|
+
const entries = pkg['entries'];
|
|
146
|
+
const state = {
|
|
147
|
+
grants: new Map(), grantRevokedAt: new Map(), records: new Map(), voided: new Set(),
|
|
148
|
+
decisions: new Map(), consumed: new Set(), allCallIds: new Set(), consumptionSeen: false,
|
|
149
|
+
};
|
|
150
|
+
const summary = { unsourcedInputs: 0, lateEntries: 0, tenantAssertedEntries: 0 };
|
|
151
|
+
for (const entry of entries)
|
|
152
|
+
if (entry['type'] === 'tool_call')
|
|
153
|
+
state.allCallIds.add(entry['data']['call_id']);
|
|
154
|
+
let grantBlock = true;
|
|
155
|
+
let lastGrant = null;
|
|
156
|
+
let lastRecorded = null;
|
|
157
|
+
entries.forEach((entry, index) => {
|
|
158
|
+
const kind = entry['type'];
|
|
159
|
+
const data = entry['data'];
|
|
160
|
+
const source = entry['source'];
|
|
161
|
+
const at = timestampMs(entry['at']);
|
|
162
|
+
const recorded = timestampMs(source['recorded_at']);
|
|
163
|
+
if (PLATFORM_TYPES.has(kind) && source['authority'] !== 'platform') {
|
|
164
|
+
throw fail(Code.AUTHORITY_VIOLATION, `a ${kind} entry must be recorded by the platform`, index, entryPath(index, 'source.authority'), 'platform', source['authority']);
|
|
165
|
+
}
|
|
166
|
+
if (source['authority'] === 'tenant')
|
|
167
|
+
summary.tenantAssertedEntries += 1;
|
|
168
|
+
if (source['late'] === true)
|
|
169
|
+
summary.lateEntries += 1;
|
|
170
|
+
if (at > recorded + MAX_CLOCK_SKEW_MS) {
|
|
171
|
+
throw fail(Code.VALIDITY_VIOLATION, 'entry time is later than when it was recorded', index, entryPath(index, 'at'), `<= ${String(source['recorded_at'])} + ${MAX_CLOCK_SKEW_MS} ms`, entry['at']);
|
|
172
|
+
}
|
|
173
|
+
if (kind === 'grant') {
|
|
174
|
+
checkGrant(entry, index, grantBlock, lastGrant, state);
|
|
175
|
+
lastGrant = data['grant_id'];
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (index === 0)
|
|
179
|
+
throw fail(Code.GRANT_CHAIN_BROKEN, 'the first entry must be the root grant', 0, entryPath(0, 'type'));
|
|
180
|
+
grantBlock = false;
|
|
181
|
+
if (lastRecorded !== null && recorded < lastRecorded) {
|
|
182
|
+
throw fail(Code.ENTRIES_OUT_OF_ORDER, 'entries after the grant chain must be in recording order', index, entryPath(index, 'source.recorded_at'));
|
|
183
|
+
}
|
|
184
|
+
lastRecorded = recorded;
|
|
185
|
+
if (state.consumptionSeen && source['authority'] === 'tenant' && source['late'] !== true) {
|
|
186
|
+
throw fail(Code.VALIDITY_VIOLATION, 'a tenant record made after the decision was consumed must be marked late', index, entryPath(index, 'source.late'), 'true', null);
|
|
187
|
+
}
|
|
188
|
+
const idField = ID_FIELDS[kind];
|
|
189
|
+
if (idField !== undefined) {
|
|
190
|
+
if (state.records.has(recordKey(kind, data[idField]))) {
|
|
191
|
+
throw fail(Code.DUPLICATE_IDENTIFIER, `${String(data[idField])} appears in more than one entry`, index, entryPath(index, `data.${idField}`));
|
|
192
|
+
}
|
|
193
|
+
if ('run_id' in data && kind !== 'run_context')
|
|
194
|
+
requireRecord(state, 'run_context', data['run_id'], index, 'data.run_id');
|
|
195
|
+
}
|
|
196
|
+
if (kind === 'tool_call') {
|
|
197
|
+
checkToolCall(data, index, at, state);
|
|
198
|
+
}
|
|
199
|
+
else if (kind === 'policy_evaluation') {
|
|
200
|
+
data['inputs'].forEach((item, i) => {
|
|
201
|
+
if ((item['evidence'].length > 0) === (item['unsourced'] === true)) {
|
|
202
|
+
throw fail(Code.SCHEMA_VIOLATION, 'an input cites evidence or is marked unsourced, not both or neither', index, entryPath(index, `data.inputs[${i}].unsourced`));
|
|
203
|
+
}
|
|
204
|
+
if (item['unsourced'] === true)
|
|
205
|
+
summary.unsourcedInputs += 1;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
else if (kind === 'recommendation') {
|
|
209
|
+
data['evaluation_ids'].forEach((id, i) => requireRecord(state, 'policy_evaluation', id, index, `data.evaluation_ids[${i}]`));
|
|
210
|
+
data['sections'].forEach((section, i) => {
|
|
211
|
+
if (section['status'] !== 'not_available' && section['evidence'].length === 0) {
|
|
212
|
+
throw fail(Code.SCHEMA_VIOLATION, 'a section that is not not_available must cite evidence', index, entryPath(index, `data.sections[${i}].evidence`));
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else if (kind === 'decision') {
|
|
217
|
+
checkDecision(data, index, kase, disclosed, state);
|
|
218
|
+
}
|
|
219
|
+
else if (kind === 'decision_consumption') {
|
|
220
|
+
checkConsumption(data, index, state);
|
|
221
|
+
}
|
|
222
|
+
else if (kind === 'revocation') {
|
|
223
|
+
if (!state.grants.has(data['grant_id']))
|
|
224
|
+
throw fail(Code.DANGLING_REFERENCE, 'revoked grant is not in the grant chain', index, entryPath(index, 'data.grant_id'));
|
|
225
|
+
const revokedAt = state.grantRevokedAt.get(data['grant_id']) ?? null;
|
|
226
|
+
if (revokedAt !== data['revoked_at']) {
|
|
227
|
+
throw fail(Code.VALIDITY_VIOLATION, "revocation time differs from the grant's revoked_at", index, entryPath(index, 'data.revoked_at'), revokedAt, data['revoked_at']);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else if (kind === 'void') {
|
|
231
|
+
const target = recordKey(data['target_type'], data['target_id']);
|
|
232
|
+
if (!state.records.has(target))
|
|
233
|
+
throw fail(Code.DANGLING_REFERENCE, 'void names no earlier record', index, entryPath(index, 'data.target_id'));
|
|
234
|
+
if (state.voided.has(target))
|
|
235
|
+
throw fail(Code.DUPLICATE_IDENTIFIER, 'record is already void', index, entryPath(index, 'data.target_id'));
|
|
236
|
+
state.voided.add(target);
|
|
237
|
+
}
|
|
238
|
+
for (const [path, ref] of evidenceRefs(data, kind))
|
|
239
|
+
checkRef(ref, index, path, state);
|
|
240
|
+
if (idField !== undefined)
|
|
241
|
+
state.records.set(recordKey(kind, data[idField]), data);
|
|
242
|
+
});
|
|
243
|
+
return summary;
|
|
244
|
+
}
|
|
245
|
+
function requireRecord(state, kind, id, index, path) {
|
|
246
|
+
const record = state.records.get(recordKey(kind, id));
|
|
247
|
+
if (!record)
|
|
248
|
+
throw fail(Code.DANGLING_REFERENCE, `no earlier ${kind} has this id`, index, entryPath(index, path));
|
|
249
|
+
if (state.voided.has(recordKey(kind, id)))
|
|
250
|
+
throw fail(Code.DANGLING_REFERENCE, `${kind} ${id} is void`, index, entryPath(index, path));
|
|
251
|
+
return record;
|
|
252
|
+
}
|
|
253
|
+
function checkGrant(entry, index, grantBlock, lastGrant, state) {
|
|
254
|
+
const data = entry['data'];
|
|
255
|
+
if (!grantBlock)
|
|
256
|
+
throw fail(Code.GRANT_CHAIN_BROKEN, 'grant entries must come first, root to leaf', index, entryPath(index, 'type'));
|
|
257
|
+
if (state.grants.has(data['grant_id']))
|
|
258
|
+
throw fail(Code.DUPLICATE_IDENTIFIER, `${String(data['grant_id'])} appears in more than one entry`, index, entryPath(index, 'data.grant_id'));
|
|
259
|
+
if (data['depth'] !== index)
|
|
260
|
+
throw fail(Code.GRANT_CHAIN_BROKEN, `grant at position ${index} has depth ${String(data['depth'])}`, index, entryPath(index, 'data.depth'), String(index), String(data['depth']));
|
|
261
|
+
if (data['parent_grant_id'] !== lastGrant)
|
|
262
|
+
throw fail(Code.GRANT_CHAIN_BROKEN, 'parent_grant_id is not the previous grant in the chain', index, entryPath(index, 'data.parent_grant_id'), lastGrant, data['parent_grant_id']);
|
|
263
|
+
if (entry['at'] !== data['issued_at'])
|
|
264
|
+
throw fail(Code.GRANT_CHAIN_BROKEN, "a grant entry's time is the grant's issue time", index, entryPath(index, 'at'), data['issued_at'], entry['at']);
|
|
265
|
+
const issued = timestampMs(data['issued_at']);
|
|
266
|
+
const expires = timestampMs(data['expires_at']);
|
|
267
|
+
const revoked = data['revoked_at'];
|
|
268
|
+
if ((data['status'] === 'revoked') !== (revoked !== null))
|
|
269
|
+
throw fail(Code.VALIDITY_VIOLATION, 'revoked_at is set exactly when the grant is revoked', index, entryPath(index, 'data.revoked_at'));
|
|
270
|
+
if (expires < issued)
|
|
271
|
+
throw fail(Code.VALIDITY_VIOLATION, 'grant expires before it was issued', index, entryPath(index, 'data.expires_at'));
|
|
272
|
+
let end = expires;
|
|
273
|
+
if (revoked !== null) {
|
|
274
|
+
if (timestampMs(revoked) < issued)
|
|
275
|
+
throw fail(Code.VALIDITY_VIOLATION, 'grant revoked before it was issued', index, entryPath(index, 'data.revoked_at'));
|
|
276
|
+
end = Math.min(end, timestampMs(revoked));
|
|
277
|
+
}
|
|
278
|
+
if (lastGrant !== null) {
|
|
279
|
+
const [parentIssued, parentEnd] = state.grants.get(lastGrant);
|
|
280
|
+
if (issued < parentIssued - MAX_CLOCK_SKEW_MS || issued > parentEnd + MAX_CLOCK_SKEW_MS) {
|
|
281
|
+
throw fail(Code.VALIDITY_VIOLATION, "delegated grant issued outside its parent's validity", index, entryPath(index, 'data.issued_at'));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
state.grants.set(data['grant_id'], [issued, end]);
|
|
285
|
+
state.grantRevokedAt.set(data['grant_id'], revoked);
|
|
286
|
+
}
|
|
287
|
+
function checkRef(ref, index, path, state) {
|
|
288
|
+
const call = state.records.get(recordKey('tool_call', ref['call_id']));
|
|
289
|
+
if (!call)
|
|
290
|
+
throw fail(Code.DANGLING_REFERENCE, 'evidence cites no earlier tool call', index, entryPath(index, `${path}.call_id`));
|
|
291
|
+
if (state.voided.has(recordKey('tool_call', ref['call_id'])))
|
|
292
|
+
throw fail(Code.DANGLING_REFERENCE, 'evidence cites a void tool call', index, entryPath(index, `${path}.call_id`));
|
|
293
|
+
if (call['provider'] !== ref['provider'])
|
|
294
|
+
throw fail(Code.DANGLING_REFERENCE, 'evidence provider differs from the tool call', index, entryPath(index, `${path}.provider`));
|
|
295
|
+
const records = call['upstream_records'];
|
|
296
|
+
if (!records.some((r) => r['record_id'] === ref['record_id']))
|
|
297
|
+
throw fail(Code.DANGLING_REFERENCE, 'the tool call returned no such upstream record', index, entryPath(index, `${path}.record_id`));
|
|
298
|
+
if (!records.some((r) => r['record_id'] === ref['record_id'] && r['retrieved_at'] === ref['retrieved_at'])) {
|
|
299
|
+
throw fail(Code.DANGLING_REFERENCE, 'evidence retrieval time differs from the upstream record', index, entryPath(index, `${path}.retrieved_at`));
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
function checkToolCall(data, index, at, state) {
|
|
303
|
+
if (!state.grants.has(data['grant_id']))
|
|
304
|
+
throw fail(Code.DANGLING_REFERENCE, 'tool call grant is not in the grant chain', index, entryPath(index, 'data.grant_id'));
|
|
305
|
+
const inconsistent = (path, message) => fail(Code.TOOL_CALL_INCONSISTENT, message, index, entryPath(index, path));
|
|
306
|
+
const outcome = data['outcome'];
|
|
307
|
+
if (outcome === 'allowed') {
|
|
308
|
+
if ('denial' in data)
|
|
309
|
+
throw inconsistent('data.denial', 'an allowed call has no denial');
|
|
310
|
+
if (data['output_hash'] === null)
|
|
311
|
+
throw inconsistent('data.output_hash', 'an allowed call has an output hash');
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
if (outcome === 'denied' && !('denial' in data))
|
|
315
|
+
throw inconsistent('data.denial', 'a denied call names its denial reason');
|
|
316
|
+
if (outcome === 'error' && 'denial' in data)
|
|
317
|
+
throw inconsistent('data.denial', 'a failed call has no denial');
|
|
318
|
+
if (data['output_hash'] !== null)
|
|
319
|
+
throw inconsistent('data.output_hash', 'a call that did not run has no output');
|
|
320
|
+
if (data['upstream_records'].length > 0)
|
|
321
|
+
throw inconsistent('data.upstream_records', 'a call that did not run has no upstream records');
|
|
322
|
+
}
|
|
323
|
+
if ('completed_at' in data && timestampMs(data['completed_at']) < timestampMs(data['started_at']))
|
|
324
|
+
throw inconsistent('data.completed_at', 'completed before it started');
|
|
325
|
+
if (outcome === 'allowed') {
|
|
326
|
+
const [issued, end] = state.grants.get(data['grant_id']);
|
|
327
|
+
if (at < issued - MAX_CLOCK_SKEW_MS || at > end + MAX_CLOCK_SKEW_MS) {
|
|
328
|
+
throw fail(Code.VALIDITY_VIOLATION, "an allowed call falls outside its grant's validity", index, entryPath(index, 'at'));
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
function checkDecision(data, index, kase, disclosed, state) {
|
|
333
|
+
if (state.decisions.has(data['jti']))
|
|
334
|
+
throw fail(Code.DUPLICATE_IDENTIFIER, `${String(data['jti'])} appears in more than one entry`, index, entryPath(index, 'data.jti'));
|
|
335
|
+
const action = data['action'];
|
|
336
|
+
if (action['case_id'] !== kase['case_id'])
|
|
337
|
+
throw fail(Code.CASE_MISMATCH, 'decision approves an action on another case', index, entryPath(index, 'data.action.case_id'), kase['case_id'], action['case_id']);
|
|
338
|
+
if ('subject' in kase && action['subject'] !== kase['subject']) {
|
|
339
|
+
throw fail(Code.CASE_MISMATCH, 'decision subject differs from the case subject', index, entryPath(index, 'data.action.subject'), kase['subject'], action['subject']);
|
|
340
|
+
}
|
|
341
|
+
if (disclosed.includes('subject')) {
|
|
342
|
+
const computed = decisionActionHash(action);
|
|
343
|
+
if (computed !== data['action_hash'])
|
|
344
|
+
throw fail(Code.ACTION_HASH_MISMATCH, 'action_hash is not the hash of the semantic action', index, entryPath(index, 'data.action_hash'), computed, data['action_hash']);
|
|
345
|
+
}
|
|
346
|
+
const inconsistent = (path, message) => fail(Code.DECISION_INCONSISTENT, message, index, entryPath(index, path));
|
|
347
|
+
const position = data['approval_position'];
|
|
348
|
+
if (position > data['approvals_required'])
|
|
349
|
+
throw inconsistent('data.approval_position', 'more approvals than required');
|
|
350
|
+
if (timestampMs(data['expires_at']) < timestampMs(data['issued_at']))
|
|
351
|
+
throw fail(Code.VALIDITY_VIOLATION, 'decision expires before it was issued', index, entryPath(index, 'data.expires_at'));
|
|
352
|
+
if (position === 1) {
|
|
353
|
+
if ('first_jti' in data)
|
|
354
|
+
throw inconsistent('data.first_jti', 'a first approval has no first_jti');
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
if (!('first_jti' in data))
|
|
358
|
+
throw inconsistent('data.first_jti', 'a second approval names the first');
|
|
359
|
+
const first = state.decisions.get(data['first_jti']);
|
|
360
|
+
if (!first)
|
|
361
|
+
throw fail(Code.DANGLING_REFERENCE, 'no earlier decision has this jti', index, entryPath(index, 'data.first_jti'));
|
|
362
|
+
const checks = [
|
|
363
|
+
['data.first_jti', first['approval_position'] === 1],
|
|
364
|
+
['data.first_jti', !state.consumed.has(data['first_jti'])],
|
|
365
|
+
[actionPath(data), actionKeyOf(first) === actionKeyOf(data)],
|
|
366
|
+
['data.approvals_required', first['approvals_required'] === 2],
|
|
367
|
+
['data.approver', first['approver'] !== data['approver']],
|
|
368
|
+
];
|
|
369
|
+
for (const [path, ok] of checks) {
|
|
370
|
+
if (!ok)
|
|
371
|
+
throw inconsistent(path, 'second approval does not pair with an unconsumed first approval');
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
state.decisions.set(data['jti'], data);
|
|
375
|
+
}
|
|
376
|
+
function checkConsumption(data, index, state) {
|
|
377
|
+
const consumedAt = timestampMs(data['consumed_at']);
|
|
378
|
+
const decisions = [];
|
|
379
|
+
data['jtis'].forEach((jti, position) => {
|
|
380
|
+
const path = `data.jtis[${position}]`;
|
|
381
|
+
const decision = state.decisions.get(jti);
|
|
382
|
+
if (!decision)
|
|
383
|
+
throw fail(Code.DANGLING_REFERENCE, 'no earlier decision has this jti', index, entryPath(index, path));
|
|
384
|
+
if (state.consumed.has(jti))
|
|
385
|
+
throw fail(Code.DECISION_INCONSISTENT, 'decision grant consumed more than once', index, entryPath(index, path));
|
|
386
|
+
if (actionKeyOf(decision) !== actionKeyOf(data)) {
|
|
387
|
+
throw fail(Code.DECISION_INCONSISTENT, 'consumed decision approved a different action', index, entryPath(index, actionPath(data)), String(actionKeyOf(decision)), String(actionKeyOf(data)));
|
|
388
|
+
}
|
|
389
|
+
if (consumedAt > timestampMs(decision['expires_at']) || consumedAt < timestampMs(decision['issued_at']) - MAX_CLOCK_SKEW_MS) {
|
|
390
|
+
throw fail(Code.VALIDITY_VIOLATION, "consumed outside the decision grant's validity", index, entryPath(index, 'data.consumed_at'), `${String(decision['issued_at'])}..${String(decision['expires_at'])}`, data['consumed_at']);
|
|
391
|
+
}
|
|
392
|
+
decisions.push(decision);
|
|
393
|
+
});
|
|
394
|
+
const required = decisions[0]['approvals_required'];
|
|
395
|
+
const positions = decisions.map((d) => d['approval_position']).sort((a, b) => a - b);
|
|
396
|
+
const expectedPositions = Array.from({ length: required }, (_, i) => i + 1);
|
|
397
|
+
if (decisions.some((d) => d['approvals_required'] !== required) || positions.join(',') !== expectedPositions.join(',')) {
|
|
398
|
+
throw fail(Code.DECISION_INCONSISTENT, 'a consumption presents every required approval exactly once', index, entryPath(index, 'data.jtis'), String(required), String(decisions.length));
|
|
399
|
+
}
|
|
400
|
+
if ('call_id' in data && !state.allCallIds.has(data['call_id']))
|
|
401
|
+
throw fail(Code.DANGLING_REFERENCE, 'no tool call has this call_id', index, entryPath(index, 'data.call_id'));
|
|
402
|
+
for (const jti of data['jtis'])
|
|
403
|
+
state.consumed.add(jti);
|
|
404
|
+
state.consumptionSeen = true;
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/evidence/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const DEFAULT_MAX_BYTES: number;
|
|
2
|
+
/** A string as RFC 8785 writes it (used for paths and messages). */
|
|
3
|
+
export declare function jsonText(value: string): string;
|
|
4
|
+
/** Append a member name or array index to a field path. */
|
|
5
|
+
export declare function formatPath(base: string, key: string | number): string;
|
|
6
|
+
/** Parse package bytes, refusing anything that is not canonical JSON. */
|
|
7
|
+
export declare function parseCanonical(data: Uint8Array, maxBytes?: number): unknown;
|
|
8
|
+
//# sourceMappingURL=document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/evidence/document.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AAMlD,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIrE;AAkLD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,GAAE,MAA0B,GAAG,OAAO,CAkE9F"}
|