@agenticprimitives/witness 0.0.0-alpha.30 → 0.0.0-alpha.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/index.d.ts +51 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -30
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -19,10 +19,13 @@ const evaluation = await evaluateDispute({
|
|
|
19
19
|
record, // the spec-306 hash-linked evidence chain
|
|
20
20
|
receipt, // the disputed spec-303 public receipt
|
|
21
21
|
detail, // optional — released to the witness via releaseMode 'witness_escrow'
|
|
22
|
-
verifyReceiptSignature,
|
|
22
|
+
verifyReceiptSignature, // REQUIRED — an unsigned receipt is refused as input
|
|
23
|
+
expectedReceiptSigner, // REQUIRED — the verifier the relationship's agreement names
|
|
24
|
+
authenticateRecord, // optional — else the attestation says recordAuthenticated: false
|
|
23
25
|
});
|
|
24
|
-
// → { outcome: 'in_scope' | 'out_of_scope' | '
|
|
25
|
-
// | 'stale_status_used' | 'insufficient_evidence', ... }
|
|
26
|
+
// → { outcome: 'in_scope' | 'out_of_scope' | 'deferred' | 'not_evaluated' | 'undetermined'
|
|
27
|
+
// | 'revoked_before_execution' | 'stale_status_used' | 'insufficient_evidence', ... }
|
|
28
|
+
// A revocation condemns only a receipt issued under THAT grant, after it in the record.
|
|
26
29
|
|
|
27
30
|
const attestation = await mintWitnessAttestation(
|
|
28
31
|
{ witness: witnessSa, relationshipId, evaluation, receipt, checkedDetail: !!detail, attestedAt },
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { type RelationshipRecordEntryV1 } from '@agenticprimitives/agreements';
|
|
2
|
-
import { type ReceiptSignatureVerifier, type Sha256, type VerificationReceiptDetailV1, type VerificationReceiptV1 } from '@agenticprimitives/verification-receipts';
|
|
2
|
+
import { type ReceiptSignatureVerifier, type ReceiptVerifyReason, type Sha256, type VerificationReceiptDetailV1, type VerificationReceiptV1 } from '@agenticprimitives/verification-receipts';
|
|
3
3
|
export declare const PACKAGE_NAME = "@agenticprimitives/witness";
|
|
4
4
|
export declare const PACKAGE_STATUS = "w1-evaluate-attest";
|
|
5
5
|
export declare const SPEC_REF = "specs/307-witness.md";
|
|
6
6
|
export type Hex = `0x${string}`;
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* One attested value per fact (DATA-5, spec 445 — no collapsing):
|
|
9
|
+
* - the four `ScopeDecision`s each keep their own name: `in_scope`, `out_of_scope`, `deferred` (tool scope
|
|
10
|
+
* passed here, record scope judged at the resource server — R917-P-7), `not_evaluated` (the pipeline denied
|
|
11
|
+
* before scope ran);
|
|
12
|
+
* - `undetermined` — the evidence verified but does not decide (an unknown scope value; a revocation in the
|
|
13
|
+
* record that cannot be attributed because the receipt names no delegation). NEVER a negative finding;
|
|
14
|
+
* - the two revocation outcomes condemn only a receipt issued under the REVOKED grant, at or after the
|
|
15
|
+
* revocation's position in the record.
|
|
16
|
+
*/
|
|
17
|
+
export type WitnessOutcome = 'in_scope' | 'out_of_scope' | 'deferred' | 'not_evaluated' | 'undetermined' | 'revoked_before_execution' | 'stale_status_used' | 'insufficient_evidence';
|
|
8
18
|
export interface WitnessProof {
|
|
9
19
|
type: string;
|
|
10
20
|
signature: string;
|
|
@@ -20,6 +30,10 @@ export interface WitnessAttestationV1 {
|
|
|
20
30
|
/** The disputed receipt. */
|
|
21
31
|
receiptHash: Sha256;
|
|
22
32
|
outcome: WitnessOutcome;
|
|
33
|
+
/** Whether the relationship RECORD was authenticated (an injected `authenticateRecord` port said yes).
|
|
34
|
+
* `false` = the record is a bare hash chain: linkage verified, authorship not. The receipt is ALWAYS
|
|
35
|
+
* signature-verified against its expected signer before any outcome other than `insufficient_evidence`. */
|
|
36
|
+
recordAuthenticated: boolean;
|
|
23
37
|
/** Whether an OPENED detail (witness-escrow release) was part of the walk. */
|
|
24
38
|
checkedDetail: boolean;
|
|
25
39
|
/** Exact time — a dispute-grade artifact, deliberately not bucketed. */
|
|
@@ -30,12 +44,18 @@ export interface WitnessAttestationV1 {
|
|
|
30
44
|
}
|
|
31
45
|
export interface DisputeEvaluation {
|
|
32
46
|
outcome: WitnessOutcome;
|
|
33
|
-
/** The typed reason trail for `insufficient_evidence`; 'ok' otherwise. */
|
|
34
|
-
evidenceReason: 'ok' | 'record_invalid' | 'receipt_invalid' | 'receipt_not_in_record' | 'detail_mismatch';
|
|
47
|
+
/** The typed reason trail for `insufficient_evidence` / `undetermined`; 'ok' otherwise. */
|
|
48
|
+
evidenceReason: 'ok' | 'record_invalid' | 'record_not_authentic' | 'receipt_verifier_missing' | 'receipt_invalid' | 'receipt_not_in_record' | 'detail_mismatch' | 'revocation_unattributable' | 'scope_unknown';
|
|
49
|
+
/** Why the receipt was refused as input (the verification-receipts reason), when it was. */
|
|
50
|
+
receiptReason?: ReceiptVerifyReason;
|
|
51
|
+
/** Whether the record's authorship was checked (see `WitnessAttestationV1.recordAuthenticated`). */
|
|
52
|
+
recordAuthenticated: boolean;
|
|
35
53
|
/** Set when the chain verified. */
|
|
36
54
|
recordHead?: Hex;
|
|
37
55
|
/** The record seq of the receipt's entry, when found. */
|
|
38
56
|
receiptSeq?: number;
|
|
57
|
+
/** The record seq of the revocation that decided a revocation outcome. */
|
|
58
|
+
revocationSeq?: number;
|
|
39
59
|
}
|
|
40
60
|
/** Deterministic JSON (sorted keys, undefined dropped) — the repo canonical form. */
|
|
41
61
|
export declare function canonicalize(v: unknown): string;
|
|
@@ -47,14 +67,27 @@ export interface EvaluateDisputeInput {
|
|
|
47
67
|
/** The opened detail — present ONLY when released to the witness
|
|
48
68
|
* (DecryptGrant `releaseMode: 'witness_escrow'`, spec 307 W2). */
|
|
49
69
|
detail?: VerificationReceiptDetailV1;
|
|
50
|
-
/**
|
|
51
|
-
|
|
70
|
+
/** REQUIRED: the injected receipt-signature check (same port as verification-receipts). Without it the
|
|
71
|
+
* receipt is refused as input — a witness does not attest over a receipt nobody signed (DATA-5). */
|
|
72
|
+
verifyReceiptSignature: ReceiptSignatureVerifier;
|
|
73
|
+
/** REQUIRED: the verifier the witness expects signed the receipt (from the relationship's agreement,
|
|
74
|
+
* never from the receipt's own `proof.signer`). */
|
|
75
|
+
expectedReceiptSigner: string;
|
|
76
|
+
/** Optional: authenticate the record's authorship against its verified head (anchored head, party
|
|
77
|
+
* signatures — the consumer's mechanism). Supplied and false → `record_not_authentic`. Absent → the walk
|
|
78
|
+
* proceeds and the attestation says `recordAuthenticated: false`. */
|
|
79
|
+
authenticateRecord?: (head: Hex, record: readonly RelationshipRecordEntryV1[]) => Promise<boolean>;
|
|
80
|
+
/** Open a pre-2026-11-10 receipt's detail (bound only by principal / args / day). Default: refused. */
|
|
81
|
+
acceptLegacyPartialDetail?: boolean;
|
|
52
82
|
}
|
|
53
83
|
/**
|
|
54
84
|
* The deterministic walk (spec 307 §design). Total + ordered — two witnesses
|
|
55
85
|
* given identical inputs MUST produce the identical outcome (INV-307-1):
|
|
56
|
-
*
|
|
57
|
-
*
|
|
86
|
+
* record chain → record authorship (when a port is given) → receipt SIGNATURE
|
|
87
|
+
* → record membership → detail opening → revocation timeline FOR THIS GRANT →
|
|
88
|
+
* scope. Every unverifiable input maps to `insufficient_evidence` (INV-307-2);
|
|
89
|
+
* verified-but-undecidable evidence maps to `undetermined`; neither is ever a
|
|
90
|
+
* negative finding.
|
|
58
91
|
*/
|
|
59
92
|
export declare function evaluateDispute(input: EvaluateDisputeInput): Promise<DisputeEvaluation>;
|
|
60
93
|
export interface MintWitnessAttestationInput {
|
|
@@ -69,11 +102,16 @@ export interface MintWitnessAttestationInput {
|
|
|
69
102
|
export declare function mintWitnessAttestation(input: MintWitnessAttestationInput, opts?: {
|
|
70
103
|
sign?: (attestationHash: Sha256) => Promise<WitnessProof>;
|
|
71
104
|
}): Promise<WitnessAttestationV1>;
|
|
72
|
-
export type AttestationVerifyReason = 'ok' | 'wrong_type' | 'hash_mismatch' | 'proof_missing' | 'proof_invalid';
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
105
|
+
export type AttestationVerifyReason = 'ok' | 'wrong_type' | 'hash_mismatch' | 'verifier_missing' | 'witness_mismatch' | 'proof_missing' | 'proof_malformed' | 'proof_invalid';
|
|
106
|
+
export type WitnessSignatureVerifier = (attestationHash: Sha256, proof: WitnessProof, expectedWitness: string) => Promise<boolean>;
|
|
107
|
+
/**
|
|
108
|
+
* Verify an attestation: hash recompute, the body's `witness` equals the EXPECTED witness, and the proof
|
|
109
|
+
* verifies against it through the injected port. Both inputs are REQUIRED for `valid: true` — an unsigned
|
|
110
|
+
* attestation, a `proof: {}`, or a call with no verifier is not valid (the same rule as DATA-8).
|
|
111
|
+
*/
|
|
112
|
+
export declare function verifyWitnessAttestation(attestation: WitnessAttestationV1, opts: {
|
|
113
|
+
verifySignature: WitnessSignatureVerifier;
|
|
114
|
+
expectedWitness: string;
|
|
77
115
|
}): Promise<{
|
|
78
116
|
valid: boolean;
|
|
79
117
|
reason: AttestationVerifyReason;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,MAAM,EACX,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC3B,MAAM,0CAA0C,CAAC;AAElD,eAAO,MAAM,YAAY,+BAA+B,CAAC;AACzD,eAAO,MAAM,cAAc,uBAAuB,CAAC;AACnD,eAAO,MAAM,QAAQ,yBAAyB,CAAC;AAE/C,MAAM,MAAM,GAAG,GAAG,KAAK,MAAM,EAAE,CAAC;AAEhC,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,cAAc,GACd,0BAA0B,GAC1B,mBAAmB,GACnB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,GAAG,CAAC;IACpB,8DAA8D;IAC9D,UAAU,EAAE,GAAG,CAAC;IAChB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,cAAc,CAAC;IACxB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -24,47 +24,90 @@ async function sha256Hex(input) {
|
|
|
24
24
|
.join('');
|
|
25
25
|
return `sha256:${hex}`;
|
|
26
26
|
}
|
|
27
|
+
const eqHex = (a, b) => a.toLowerCase() === b.toLowerCase();
|
|
27
28
|
/**
|
|
28
29
|
* The deterministic walk (spec 307 §design). Total + ordered — two witnesses
|
|
29
30
|
* given identical inputs MUST produce the identical outcome (INV-307-1):
|
|
30
|
-
*
|
|
31
|
-
*
|
|
31
|
+
* record chain → record authorship (when a port is given) → receipt SIGNATURE
|
|
32
|
+
* → record membership → detail opening → revocation timeline FOR THIS GRANT →
|
|
33
|
+
* scope. Every unverifiable input maps to `insufficient_evidence` (INV-307-2);
|
|
34
|
+
* verified-but-undecidable evidence maps to `undetermined`; neither is ever a
|
|
35
|
+
* negative finding.
|
|
32
36
|
*/
|
|
33
37
|
export async function evaluateDispute(input) {
|
|
34
38
|
// 1. The record chain must verify end-to-end.
|
|
35
39
|
const chain = verifyRecordChain(input.record);
|
|
36
40
|
if (!chain.valid || !chain.head)
|
|
37
|
-
return { outcome: 'insufficient_evidence', evidenceReason: 'record_invalid' };
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
return { outcome: 'insufficient_evidence', evidenceReason: 'record_invalid', recordAuthenticated: false };
|
|
42
|
+
const head = chain.head;
|
|
43
|
+
// 1b. Record authorship — only when the consumer has a mechanism; the result is carried either way.
|
|
44
|
+
let recordAuthenticated = false;
|
|
45
|
+
if (input.authenticateRecord) {
|
|
46
|
+
let ok = false;
|
|
47
|
+
try {
|
|
48
|
+
ok = (await input.authenticateRecord(head, input.record)) === true;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
ok = false;
|
|
52
|
+
}
|
|
53
|
+
if (!ok)
|
|
54
|
+
return { outcome: 'insufficient_evidence', evidenceReason: 'record_not_authentic', recordAuthenticated: false, recordHead: head };
|
|
55
|
+
recordAuthenticated = true;
|
|
56
|
+
}
|
|
57
|
+
const base = { recordAuthenticated, recordHead: head };
|
|
58
|
+
// 2. The receipt must VERIFY: hash, expected signer, signature. No verifier = refused, never "accepted on hash".
|
|
59
|
+
if (typeof input.verifyReceiptSignature !== 'function' || !input.expectedReceiptSigner)
|
|
60
|
+
return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_verifier_missing', ...base };
|
|
61
|
+
const verifyOpts = { verifySignature: input.verifyReceiptSignature, expectedSigner: input.expectedReceiptSigner };
|
|
62
|
+
const receiptOk = await verifyVerificationReceipt(input.receipt, verifyOpts);
|
|
42
63
|
if (!receiptOk.valid)
|
|
43
|
-
return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_invalid',
|
|
64
|
+
return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_invalid', receiptReason: receiptOk.reason, ...base };
|
|
44
65
|
// 3. The receipt must BE an entry of this record.
|
|
45
66
|
const entry = input.record.find((e) => e.kind === 'verification_receipt' && e.artifactCommitment === input.receipt.receiptHash);
|
|
46
67
|
if (!entry)
|
|
47
|
-
return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_not_in_record',
|
|
68
|
+
return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_not_in_record', ...base };
|
|
69
|
+
const at = { ...base, receiptSeq: entry.seq };
|
|
48
70
|
// 4. A supplied detail must open the receipt — a lying detail is not evidence.
|
|
49
71
|
if (input.detail) {
|
|
50
|
-
const opened = await openReceipt(input.receipt, input.detail
|
|
72
|
+
const opened = await openReceipt(input.receipt, input.detail, {
|
|
73
|
+
...verifyOpts,
|
|
74
|
+
acceptLegacyPartialBinding: input.acceptLegacyPartialDetail === true,
|
|
75
|
+
});
|
|
51
76
|
if (!opened.valid)
|
|
52
|
-
return { outcome: 'insufficient_evidence', evidenceReason: 'detail_mismatch',
|
|
77
|
+
return { outcome: 'insufficient_evidence', evidenceReason: 'detail_mismatch', receiptReason: opened.reason, ...at };
|
|
78
|
+
}
|
|
79
|
+
// 5. Revocation timeline — ONLY revocations of the grant this receipt was issued under
|
|
80
|
+
// (`artifactCommitment` = the revoked delegation's hash), and only those positioned BEFORE the
|
|
81
|
+
// receipt's entry: a receipt under grant A issued before A's revocation, and any receipt under grant B,
|
|
82
|
+
// are untouched.
|
|
83
|
+
const priorRevocations = input.record.filter((e) => e.kind === 'revocation_assertion' && e.seq < entry.seq);
|
|
84
|
+
const grant = input.receipt.delegationHash;
|
|
85
|
+
if (grant) {
|
|
86
|
+
const revocation = priorRevocations.find((e) => eqHex(e.artifactCommitment, grant));
|
|
87
|
+
if (revocation) {
|
|
88
|
+
const outcome = input.receipt.decision === 'deny' ? 'revoked_before_execution' : 'stale_status_used';
|
|
89
|
+
return { outcome, evidenceReason: 'ok', ...at, revocationSeq: revocation.seq };
|
|
90
|
+
}
|
|
53
91
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const outcome = input.receipt.decision === 'deny' ? 'revoked_before_execution' : 'stale_status_used';
|
|
59
|
-
return { outcome, evidenceReason: 'ok', recordHead: chain.head, receiptSeq: entry.seq };
|
|
92
|
+
else if (priorRevocations.length > 0) {
|
|
93
|
+
// Revocations precede the receipt and the receipt names no grant: which grant it ran under is unknown.
|
|
94
|
+
// Neither condemn it nor clear it.
|
|
95
|
+
return { outcome: 'undetermined', evidenceReason: 'revocation_unattributable', ...at };
|
|
60
96
|
}
|
|
61
97
|
// A receipt that itself recorded 'revoked' yet ALLOWED is the stale-status
|
|
62
|
-
// contradiction even without a record entry.
|
|
98
|
+
// contradiction even without a record entry (its own signed statement about its own grant).
|
|
63
99
|
if (input.receipt.status.revocation === 'revoked' && input.receipt.decision === 'allow')
|
|
64
|
-
return { outcome: 'stale_status_used', evidenceReason: 'ok',
|
|
65
|
-
// 6. Scope: the receipt's own attested verdict.
|
|
66
|
-
|
|
67
|
-
|
|
100
|
+
return { outcome: 'stale_status_used', evidenceReason: 'ok', ...at };
|
|
101
|
+
// 6. Scope: the receipt's own attested verdict, each value under its own name.
|
|
102
|
+
switch (input.receipt.scopeDecision) {
|
|
103
|
+
case 'in_scope':
|
|
104
|
+
case 'out_of_scope':
|
|
105
|
+
case 'deferred':
|
|
106
|
+
case 'not_evaluated':
|
|
107
|
+
return { outcome: input.receipt.scopeDecision, evidenceReason: 'ok', ...at };
|
|
108
|
+
default:
|
|
109
|
+
return { outcome: 'undetermined', evidenceReason: 'scope_unknown', ...at };
|
|
110
|
+
}
|
|
68
111
|
}
|
|
69
112
|
/** Assemble + hash (+ optionally sign) the attestation over a completed walk. */
|
|
70
113
|
export async function mintWitnessAttestation(input, opts) {
|
|
@@ -78,6 +121,7 @@ export async function mintWitnessAttestation(input, opts) {
|
|
|
78
121
|
recordHead: input.evaluation.recordHead ?? `0x${'0'.repeat(64)}`,
|
|
79
122
|
receiptHash: input.receipt.receiptHash,
|
|
80
123
|
outcome: input.evaluation.outcome,
|
|
124
|
+
recordAuthenticated: input.evaluation.recordAuthenticated === true,
|
|
81
125
|
checkedDetail: input.checkedDetail,
|
|
82
126
|
attestedAt: input.attestedAt,
|
|
83
127
|
};
|
|
@@ -87,19 +131,32 @@ export async function mintWitnessAttestation(input, opts) {
|
|
|
87
131
|
attestation.proof = await opts.sign(attestationHash);
|
|
88
132
|
return attestation;
|
|
89
133
|
}
|
|
90
|
-
/**
|
|
134
|
+
/**
|
|
135
|
+
* Verify an attestation: hash recompute, the body's `witness` equals the EXPECTED witness, and the proof
|
|
136
|
+
* verifies against it through the injected port. Both inputs are REQUIRED for `valid: true` — an unsigned
|
|
137
|
+
* attestation, a `proof: {}`, or a call with no verifier is not valid (the same rule as DATA-8).
|
|
138
|
+
*/
|
|
91
139
|
export async function verifyWitnessAttestation(attestation, opts) {
|
|
92
|
-
if (attestation.type !== 'WitnessAttestationV1')
|
|
140
|
+
if (!attestation || attestation.type !== 'WitnessAttestationV1')
|
|
93
141
|
return { valid: false, reason: 'wrong_type' };
|
|
94
142
|
const { attestationHash, proof, ...body } = attestation;
|
|
95
143
|
if ((await sha256Hex(canonicalize(body))) !== attestationHash)
|
|
96
144
|
return { valid: false, reason: 'hash_mismatch' };
|
|
97
|
-
if (opts?.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
145
|
+
if (typeof opts?.verifySignature !== 'function' || !opts.expectedWitness)
|
|
146
|
+
return { valid: false, reason: 'verifier_missing' };
|
|
147
|
+
if (typeof attestation.witness !== 'string' || attestation.witness.toLowerCase() !== opts.expectedWitness.toLowerCase())
|
|
148
|
+
return { valid: false, reason: 'witness_mismatch' };
|
|
149
|
+
if (proof === undefined || proof === null)
|
|
150
|
+
return { valid: false, reason: 'proof_missing' };
|
|
151
|
+
if (typeof proof !== 'object' || typeof proof.type !== 'string' || !proof.type || typeof proof.signature !== 'string' || !proof.signature)
|
|
152
|
+
return { valid: false, reason: 'proof_malformed' };
|
|
153
|
+
let ok = false;
|
|
154
|
+
try {
|
|
155
|
+
ok = (await opts.verifySignature(attestationHash, proof, opts.expectedWitness)) === true;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
ok = false;
|
|
102
159
|
}
|
|
103
|
-
return { valid: true, reason: 'ok' };
|
|
160
|
+
return ok ? { valid: true, reason: 'ok' } : { valid: false, reason: 'proof_invalid' };
|
|
104
161
|
}
|
|
105
162
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,mDAAmD;AACnD,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,6DAA6D;AAE7D,OAAO,EACL,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,WAAW,EACX,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,mDAAmD;AACnD,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,6DAA6D;AAE7D,OAAO,EACL,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,WAAW,EACX,yBAAyB,GAM1B,MAAM,0CAA0C,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAC;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,sBAAsB,CAAC;AA8E/C,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AAE9B,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,yFAAyF;IACzF,2FAA2F;IAC3F,4DAA4D;IAC5D,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAa;IACpC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAA2B,CAAC,CAAC;IAC7G,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,UAAU,GAAG,EAAE,CAAC;AACzB,CAAC;AAwBD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,CAAS,EAAW,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAErF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAA2B;IAC/D,8CAA8C;IAC9C,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI;QAC7B,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;IAC5G,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAExB,oGAAoG;IACpG,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC7B,IAAI,EAAE,GAAG,KAAK,CAAC;QACf,IAAI,CAAC;YACH,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;QACD,IAAI,CAAC,EAAE;YACL,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpI,mBAAmB,GAAG,IAAI,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAEvD,iHAAiH;IACjH,IAAI,OAAO,KAAK,CAAC,sBAAsB,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,qBAAqB;QACpF,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,0BAA0B,EAAE,GAAG,IAAI,EAAE,CAAC;IACnG,MAAM,UAAU,GAAG,EAAE,eAAe,EAAE,KAAK,CAAC,sBAAsB,EAAE,cAAc,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC;IAClH,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7E,IAAI,CAAC,SAAS,CAAC,KAAK;QAClB,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IAE3H,kDAAkD;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,IAAI,CAAC,CAAC,kBAAkB,KAAM,KAAK,CAAC,OAAO,CAAC,WAA8B,CACnH,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,uBAAuB,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1G,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAE9C,+EAA+E;IAC/E,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;YAC5D,GAAG,UAAU;YACb,0BAA0B,EAAE,KAAK,CAAC,yBAAyB,KAAK,IAAI;SACrE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK;YACf,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;IACxH,CAAC;IAED,uFAAuF;IACvF,kGAAkG;IAClG,2GAA2G;IAC3G,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC;QACpF,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,mBAAmB,CAAC;YACvF,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC;QACjF,CAAC;IACH,CAAC;SAAM,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,uGAAuG;QACvG,mCAAmC;QACnC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,2BAA2B,EAAE,GAAG,EAAE,EAAE,CAAC;IACzF,CAAC;IACD,2EAA2E;IAC3E,4FAA4F;IAC5F,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;QACrF,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;IAEvE,+EAA+E;IAC/E,QAAQ,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACpC,KAAK,UAAU,CAAC;QAChB,KAAK,cAAc,CAAC;QACpB,KAAK,UAAU,CAAC;QAChB,KAAK,eAAe;YAClB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;QAC/E;YACE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,CAAC;IAC/E,CAAC;AACH,CAAC;AAWD,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAkC,EAClC,IAAoE;IAEpE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,KAAK,gBAAgB,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,IAAI,GAA4D;QACpE,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,IAAK,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAU;QACzE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;QACtC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO;QACjC,mBAAmB,EAAE,KAAK,CAAC,UAAU,CAAC,mBAAmB,KAAK,IAAI;QAClE,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAyB,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,CAAC;IACvE,IAAI,IAAI,EAAE,IAAI;QAAE,WAAW,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACrE,OAAO,WAAW,CAAC;AACrB,CAAC;AAkBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAAiC,EACjC,IAA4E;IAE5E,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,sBAAsB;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC/G,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;IACxD,IAAI,CAAC,MAAM,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,eAAe;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAChH,IAAI,OAAO,IAAI,EAAE,eAAe,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC9H,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,IAAI,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE;QACrH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS;QACvI,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACrD,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,IAAI,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;AACxF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agenticprimitives/witness",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.32",
|
|
4
4
|
"description": "Evidentiary dispute attestation (spec 307 / G-11): deterministically walk a relationship record + verification receipt and attest in_scope / out_of_scope / revoked_before_execution / stale_status_used / insufficient_evidence. Facts, never remedies.",
|
|
5
5
|
"homepage": "https://agenticprimitives.dev",
|
|
6
6
|
"bugs": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"vitest": "^4.1.11",
|
|
38
38
|
"@types/node": "^22.7.0",
|
|
39
|
-
"@agenticprimitives/types": "1.0.0-alpha.
|
|
39
|
+
"@agenticprimitives/types": "1.0.0-alpha.47"
|
|
40
40
|
},
|
|
41
41
|
"keywords": [
|
|
42
42
|
"agentic",
|
|
@@ -52,11 +52,11 @@
|
|
|
52
52
|
"agentic-trust"
|
|
53
53
|
],
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@agenticprimitives/agreements": "0.0.0-alpha.
|
|
56
|
-
"@agenticprimitives/verification-receipts": "0.0.0-alpha.
|
|
55
|
+
"@agenticprimitives/agreements": "0.0.0-alpha.44",
|
|
56
|
+
"@agenticprimitives/verification-receipts": "0.0.0-alpha.22"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@agenticprimitives/types": "^1.0.0-alpha.
|
|
59
|
+
"@agenticprimitives/types": "^1.0.0-alpha.47"
|
|
60
60
|
},
|
|
61
61
|
"scripts": {
|
|
62
62
|
"build": "tsc -p tsconfig.build.json",
|