@primust/verifier 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +93 -0
  2. package/dist/bounded-trace.d.ts +46 -0
  3. package/dist/bounded-trace.d.ts.map +1 -0
  4. package/dist/bounded-trace.js +558 -0
  5. package/dist/bounded-trace.js.map +1 -0
  6. package/dist/cli.d.ts +18 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +391 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/index.d.ts +13 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +13 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/key-cache.d.ts +20 -0
  15. package/dist/key-cache.d.ts.map +1 -0
  16. package/dist/key-cache.js +68 -0
  17. package/dist/key-cache.js.map +1 -0
  18. package/dist/scoped.d.ts +35 -0
  19. package/dist/scoped.d.ts.map +1 -0
  20. package/dist/scoped.js +582 -0
  21. package/dist/scoped.js.map +1 -0
  22. package/dist/types.d.ts +60 -0
  23. package/dist/types.d.ts.map +1 -0
  24. package/dist/types.js +5 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist/upstream_resolver.d.ts +60 -0
  27. package/dist/upstream_resolver.d.ts.map +1 -0
  28. package/dist/upstream_resolver.js +126 -0
  29. package/dist/upstream_resolver.js.map +1 -0
  30. package/dist/v29-envelope.d.ts +55 -0
  31. package/dist/v29-envelope.d.ts.map +1 -0
  32. package/dist/v29-envelope.js +450 -0
  33. package/dist/v29-envelope.js.map +1 -0
  34. package/dist/verifier.d.ts +36 -0
  35. package/dist/verifier.d.ts.map +1 -0
  36. package/dist/verifier.js +1235 -0
  37. package/dist/verifier.js.map +1 -0
  38. package/dist/verifier.test.d.ts +2 -0
  39. package/dist/verifier.test.d.ts.map +1 -0
  40. package/dist/verifier.test.js +395 -0
  41. package/dist/verifier.test.js.map +1 -0
  42. package/dist/verify-html-template.d.ts +45 -0
  43. package/dist/verify-html-template.d.ts.map +1 -0
  44. package/dist/verify-html-template.js +182 -0
  45. package/dist/verify-html-template.js.map +1 -0
  46. package/package.json +52 -0
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * primust-verify — Types for offline verifier.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Default upstream-VPEC root resolver for the offline verifier (Follow-7).
3
+ *
4
+ * The verifier's parent-root resolution path (Follow-6) accepts a
5
+ * synchronous `(vpecId) => string | null` resolver so verification can
6
+ * stay single-threaded and offline. This module provides two
7
+ * compositions:
8
+ *
9
+ * - **Envelopes Map** — caller supplies a Map<vpec_id, root> (typical
10
+ * test path or in-memory verification of a known bundle).
11
+ * - **SqliteStore lookup** — caller supplies `dbPath` and the resolver
12
+ * reads `vpec_commitment_roots` directly via better-sqlite3, mirroring
13
+ * `SqliteStore.getUpstreamVpecRoot` semantics (vpec row first, fall
14
+ * through to run row).
15
+ *
16
+ * Both paths are checked in order (envelopes first). Returning `null`
17
+ * signals "no upstream root cached" — the verifier then falls back to
18
+ * the generic governance witness rather than fabricating a vacuous root.
19
+ *
20
+ * SI-1: this resolver only reads the public `commitment_root_poseidon2`
21
+ * value. It never reaches into raw envelope content or check records.
22
+ */
23
+ export declare function __resetSqliteMissingWarnedForTesting(): void;
24
+ export interface UpstreamResolverOptions {
25
+ /**
26
+ * Optional path to the runtime-core SqliteStore database. When provided,
27
+ * the resolver opens a read-only handle on first use and queries
28
+ * `vpec_commitment_roots` for `kind='vpec'` first, then `kind='run'`
29
+ * (matches `SqliteStore.getUpstreamVpecRoot`). Resolver close is the
30
+ * caller's responsibility — see `closeResolver`.
31
+ */
32
+ dbPath?: string;
33
+ /**
34
+ * Optional in-memory map of `vpec_id` → `'poseidon2:<64-hex>'`. Useful
35
+ * for tests, deterministic offline verification of a bundle, and air-
36
+ * gapped flows that inline the upstream commitment alongside the VPEC.
37
+ */
38
+ envelopes?: Map<string, string>;
39
+ }
40
+ import type { UpstreamRootResolver } from './types';
41
+ export type { UpstreamRootResolver };
42
+ /**
43
+ * Build a synchronous resolver that maps a vpec_id to its cached
44
+ * `commitment_root_poseidon2` value, or null if no row is cached.
45
+ *
46
+ * Lookup order: envelopes Map → SqliteStore vpec row → SqliteStore run
47
+ * row. This mirrors `SqliteStore.getUpstreamVpecRoot` so SDK and verifier
48
+ * never disagree about which root applies to a given lineage edge.
49
+ */
50
+ export declare function createUpstreamRootResolver(opts: UpstreamResolverOptions): UpstreamRootResolver;
51
+ /**
52
+ * Best-effort close hook for resolvers that opened a SQLite handle.
53
+ *
54
+ * The resolver is closure-scoped, so we expose a static helper instead
55
+ * of returning an object. Callers may also let the handle be GC'd —
56
+ * better-sqlite3 closes on finalizer — but explicit close is safer in
57
+ * long-running CLI batches.
58
+ */
59
+ export declare function closeResolver(resolver: UpstreamRootResolver): void;
60
+ //# sourceMappingURL=upstream_resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream_resolver.d.ts","sourceRoot":"","sources":["../src/upstream_resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAcD,MAAM,WAAW,uBAAuB;IACtC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAID,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAkDrC;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,uBAAuB,GAC5B,oBAAoB,CAkCtB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAMlE"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Default upstream-VPEC root resolver for the offline verifier (Follow-7).
3
+ *
4
+ * The verifier's parent-root resolution path (Follow-6) accepts a
5
+ * synchronous `(vpecId) => string | null` resolver so verification can
6
+ * stay single-threaded and offline. This module provides two
7
+ * compositions:
8
+ *
9
+ * - **Envelopes Map** — caller supplies a Map<vpec_id, root> (typical
10
+ * test path or in-memory verification of a known bundle).
11
+ * - **SqliteStore lookup** — caller supplies `dbPath` and the resolver
12
+ * reads `vpec_commitment_roots` directly via better-sqlite3, mirroring
13
+ * `SqliteStore.getUpstreamVpecRoot` semantics (vpec row first, fall
14
+ * through to run row).
15
+ *
16
+ * Both paths are checked in order (envelopes first). Returning `null`
17
+ * signals "no upstream root cached" — the verifier then falls back to
18
+ * the generic governance witness rather than fabricating a vacuous root.
19
+ *
20
+ * SI-1: this resolver only reads the public `commitment_root_poseidon2`
21
+ * value. It never reaches into raw envelope content or check records.
22
+ */
23
+ import { createRequire } from 'node:module';
24
+ // Module-level guard: warn at most once per process when the optional
25
+ // better-sqlite3 peer dep is missing, then fail-open by returning a
26
+ // resolver that yields `null` for every vpec id. Exported (with `__`
27
+ // prefix) only so tests can reset between cases.
28
+ let _sqliteMissingWarned = false;
29
+ export function __resetSqliteMissingWarnedForTesting() {
30
+ _sqliteMissingWarned = false;
31
+ }
32
+ function warnSqliteMissingOnce(err) {
33
+ if (_sqliteMissingWarned)
34
+ return;
35
+ _sqliteMissingWarned = true;
36
+ // eslint-disable-next-line no-console
37
+ console.warn('@primust/verifier: better-sqlite3 not installed in this environment; ' +
38
+ 'upstream root resolver via SqliteStore is disabled and resolution ' +
39
+ 'falls back to the envelopes Map (or null when none provided). ' +
40
+ 'Install with: npm install better-sqlite3', err instanceof Error ? err.message : err);
41
+ }
42
+ function openDbHandle(dbPath) {
43
+ // Dynamic require so verifier package doesn't take a static dep on
44
+ // better-sqlite3 — declared as an OPTIONAL peerDependency. If the dep
45
+ // is missing we emit a single explicit warning per process and the
46
+ // resolver fail-opens (returns null for every vpec id).
47
+ let Database;
48
+ try {
49
+ const require_ = createRequire(import.meta.url);
50
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
51
+ Database = require_('better-sqlite3');
52
+ }
53
+ catch (err) {
54
+ warnSqliteMissingOnce(err);
55
+ return null;
56
+ }
57
+ try {
58
+ const db = new Database(dbPath, { readonly: true, fileMustExist: true });
59
+ return {
60
+ vpecStmt: db.prepare(`SELECT root FROM vpec_commitment_roots WHERE key = ? AND kind = 'vpec'`),
61
+ runStmt: db.prepare(`SELECT root FROM vpec_commitment_roots WHERE key = ? AND kind = 'run'`),
62
+ close: () => db.close(),
63
+ };
64
+ }
65
+ catch (err) {
66
+ console.warn('[primust-verify] upstream resolver: cannot open SQLite store at', dbPath, err);
67
+ return null;
68
+ }
69
+ }
70
+ /**
71
+ * Build a synchronous resolver that maps a vpec_id to its cached
72
+ * `commitment_root_poseidon2` value, or null if no row is cached.
73
+ *
74
+ * Lookup order: envelopes Map → SqliteStore vpec row → SqliteStore run
75
+ * row. This mirrors `SqliteStore.getUpstreamVpecRoot` so SDK and verifier
76
+ * never disagree about which root applies to a given lineage edge.
77
+ */
78
+ export function createUpstreamRootResolver(opts) {
79
+ const envelopes = opts.envelopes ?? null;
80
+ let dbHandle;
81
+ // dbHandle is `undefined` until first use, `null` after a failed open.
82
+ return function resolveUpstreamRoot(vpecId) {
83
+ if (!vpecId)
84
+ return null;
85
+ if (envelopes) {
86
+ const fromMap = envelopes.get(vpecId);
87
+ if (fromMap)
88
+ return fromMap;
89
+ }
90
+ if (opts.dbPath) {
91
+ if (dbHandle === undefined) {
92
+ dbHandle = openDbHandle(opts.dbPath);
93
+ }
94
+ if (dbHandle) {
95
+ try {
96
+ const vpecRow = dbHandle.vpecStmt.get(vpecId);
97
+ if (vpecRow?.root)
98
+ return vpecRow.root;
99
+ const runRow = dbHandle.runStmt.get(vpecId);
100
+ if (runRow?.root)
101
+ return runRow.root;
102
+ }
103
+ catch (err) {
104
+ console.warn(`[primust-verify] upstream resolver: query failed for ${vpecId}:`, err);
105
+ }
106
+ }
107
+ }
108
+ return null;
109
+ };
110
+ }
111
+ /**
112
+ * Best-effort close hook for resolvers that opened a SQLite handle.
113
+ *
114
+ * The resolver is closure-scoped, so we expose a static helper instead
115
+ * of returning an object. Callers may also let the handle be GC'd —
116
+ * better-sqlite3 closes on finalizer — but explicit close is safer in
117
+ * long-running CLI batches.
118
+ */
119
+ export function closeResolver(resolver) {
120
+ // The handle is encapsulated in the closure; we intentionally do
121
+ // nothing here in v1. The hook exists so the public surface is stable
122
+ // when we move to a returned `{ resolver, close }` shape. See
123
+ // CIRCUITS_TODO Follow-7 for the rollout plan.
124
+ void resolver;
125
+ }
126
+ //# sourceMappingURL=upstream_resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream_resolver.js","sourceRoot":"","sources":["../src/upstream_resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * v29 ProofCheck envelope + manifest + runtime-binding conformance.
3
+ *
4
+ * Mirror of packages/verifier-py/src/primust_verify/v29_envelope.py.
5
+ * The Py↔TS parity contract: canonicalJson(x) MUST produce byte-identical
6
+ * output for identical inputs across both languages, and every reproduction
7
+ * function MUST return the same value.
8
+ *
9
+ * Per docs/v29-draft/PROOFCHECK_ENVELOPE_SPEC_v0_1.md, AGENT_MANIFEST_SPEC,
10
+ * HARNESS_MANIFEST_SPEC, RUNTIME_BINDING_SPEC.
11
+ *
12
+ * Pure functions only. No DB, no network, no KMS.
13
+ */
14
+ /**
15
+ * Resolve a key id to its raw 32-byte Ed25519 public key. Sync to keep
16
+ * the verifier pure / pluggable; relying parties typically wire this to
17
+ * an embedded trust root (e.g. a JSON map of pinned kids).
18
+ */
19
+ export type PubkeyResolver = (kid: string) => Uint8Array;
20
+ export declare const ENVELOPE_VERSION = "v0.1";
21
+ export declare const ALLOWED_KINDS: Set<string>;
22
+ export declare const ALLOWED_TRUST_EDGES: Set<string>;
23
+ export declare const PROOF_TIER_HIERARCHY: readonly ["attestation", "witnessed", "execution", "operator_bound", "verifiable_inference", "mathematical"];
24
+ export type ProofTier = (typeof PROOF_TIER_HIERARCHY)[number];
25
+ export interface V29VerifyResult {
26
+ ok: boolean;
27
+ reasonCode: string | null;
28
+ detail?: string;
29
+ }
30
+ export declare const v29Pass: () => V29VerifyResult;
31
+ export declare const v29Fail: (code: string, detail?: string) => V29VerifyResult;
32
+ export declare function canonicalJson(value: unknown): string;
33
+ export declare function canonicalHash(value: unknown): string;
34
+ export declare function validateEnvelopeShape(envelope: unknown): V29VerifyResult;
35
+ export declare function reproduceAggregations(records: Array<Record<string, unknown>>): Record<string, unknown>;
36
+ export declare function validateAggregations(envelope: Record<string, unknown>): V29VerifyResult;
37
+ export declare function reproduceTierCeiling(harnessManifest: Record<string, unknown>, surface: string, tierClaimed: string): {
38
+ effective_tier: string;
39
+ tier_ceiling_applied: string | null;
40
+ };
41
+ export declare function validateRecordsAgainstHarness(records: Array<Record<string, unknown>>, harnessManifest: Record<string, unknown> | null): V29VerifyResult;
42
+ export declare function validateRuntimeBindingHash(binding: Record<string, unknown>): V29VerifyResult;
43
+ export declare function reproduceManifestCanonicalHash(manifest: Record<string, unknown>, manifestKind: "agent" | "harness"): string;
44
+ export declare function validateManifestCanonicalHash(manifest: Record<string, unknown>, manifestKind: "agent" | "harness"): V29VerifyResult;
45
+ export declare function validateRuntimeBindingSignature(binding: Record<string, unknown>, pubkeyResolver: PubkeyResolver | null): V29VerifyResult;
46
+ export declare function validateManifestSignature(manifest: Record<string, unknown>, manifestKind: "agent" | "harness", pubkeyResolver: PubkeyResolver | null): V29VerifyResult;
47
+ export declare function verifyV29(opts: {
48
+ envelope: Record<string, unknown>;
49
+ runtimeBinding?: Record<string, unknown>;
50
+ agentManifest?: Record<string, unknown>;
51
+ harnessManifest?: Record<string, unknown>;
52
+ pubkeyResolver?: PubkeyResolver | null;
53
+ requireSignatures?: boolean;
54
+ }): V29VerifyResult;
55
+ //# sourceMappingURL=v29-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v29-envelope.d.ts","sourceRoot":"","sources":["../src/v29-envelope.ts"],"names":[],"mappings":"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"}