@emilia-protocol/gate 0.11.0 → 0.14.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/CHANGELOG.md +80 -0
- package/README.md +310 -0
- package/action-control-manifest.js +3 -268
- package/action-escrow-custodian.js +3 -394
- package/action-escrow-evidence.js +3 -858
- package/action-escrow-package.js +3 -1668
- package/action-escrow-postgres.js +3 -337
- package/action-escrow-state.js +3 -396
- package/action-escrow-verifiers.js +3 -331
- package/action-escrow.js +3 -2447
- package/action-packs.js +3 -140
- package/adapters/_kit.js +3 -104
- package/adapters/aws.js +3 -108
- package/adapters/cloudflare.js +3 -54
- package/adapters/gcp.js +3 -70
- package/adapters/github.js +3 -109
- package/adapters/jira.js +3 -55
- package/adapters/k8s.js +3 -70
- package/adapters/linear.js +3 -55
- package/adapters/salesforce.js +3 -55
- package/adapters/stripe.js +3 -81
- package/adapters/supabase.js +3 -121
- package/adapters/terraform.js +3 -59
- package/adapters/vercel.js +3 -84
- package/aec-execution.js +3 -312
- package/breakglass.js +3 -582
- package/capability-receipt.js +4 -0
- package/cf1-conformance.js +3 -106
- package/challenge-store.js +3 -69
- package/control-plane.js +3 -340
- package/coverage.js +3 -721
- package/demo.mjs +1 -1
- package/deployment-attestation.js +3 -247
- package/dist/action-control-manifest.d.ts +82 -0
- package/dist/action-control-manifest.d.ts.map +1 -0
- package/dist/action-control-manifest.js +422 -0
- package/dist/action-control-manifest.js.map +1 -0
- package/dist/action-escrow-custodian.d.ts +74 -0
- package/dist/action-escrow-custodian.d.ts.map +1 -0
- package/dist/action-escrow-custodian.js +363 -0
- package/dist/action-escrow-custodian.js.map +1 -0
- package/dist/action-escrow-evidence.d.ts +130 -0
- package/dist/action-escrow-evidence.d.ts.map +1 -0
- package/dist/action-escrow-evidence.js +1012 -0
- package/dist/action-escrow-evidence.js.map +1 -0
- package/dist/action-escrow-package.d.ts +10 -0
- package/dist/action-escrow-package.d.ts.map +1 -0
- package/dist/action-escrow-package.js +1583 -0
- package/dist/action-escrow-package.js.map +1 -0
- package/dist/action-escrow-postgres.d.ts +62 -0
- package/dist/action-escrow-postgres.d.ts.map +1 -0
- package/dist/action-escrow-postgres.js +339 -0
- package/dist/action-escrow-postgres.js.map +1 -0
- package/dist/action-escrow-state.d.ts +141 -0
- package/dist/action-escrow-state.d.ts.map +1 -0
- package/dist/action-escrow-state.js +413 -0
- package/dist/action-escrow-state.js.map +1 -0
- package/dist/action-escrow-verifiers.d.ts +65 -0
- package/dist/action-escrow-verifiers.d.ts.map +1 -0
- package/dist/action-escrow-verifiers.js +421 -0
- package/dist/action-escrow-verifiers.js.map +1 -0
- package/dist/action-escrow.d.ts +112 -0
- package/dist/action-escrow.d.ts.map +1 -0
- package/dist/action-escrow.js +2661 -0
- package/dist/action-escrow.js.map +1 -0
- package/dist/action-packs.d.ts +54 -0
- package/dist/action-packs.d.ts.map +1 -0
- package/dist/action-packs.js +143 -0
- package/dist/action-packs.js.map +1 -0
- package/dist/adapters/_kit.d.ts +50 -0
- package/dist/adapters/_kit.d.ts.map +1 -0
- package/dist/adapters/_kit.js +98 -0
- package/dist/adapters/_kit.js.map +1 -0
- package/dist/adapters/aws.d.ts +158 -0
- package/dist/adapters/aws.d.ts.map +1 -0
- package/dist/adapters/aws.js +136 -0
- package/dist/adapters/aws.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +116 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +75 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/gcp.d.ts +139 -0
- package/dist/adapters/gcp.d.ts.map +1 -0
- package/dist/adapters/gcp.js +69 -0
- package/dist/adapters/gcp.js.map +1 -0
- package/dist/adapters/github.d.ts +123 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +105 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/jira.d.ts +109 -0
- package/dist/adapters/jira.d.ts.map +1 -0
- package/dist/adapters/jira.js +54 -0
- package/dist/adapters/jira.js.map +1 -0
- package/dist/adapters/k8s.d.ts +139 -0
- package/dist/adapters/k8s.d.ts.map +1 -0
- package/dist/adapters/k8s.js +69 -0
- package/dist/adapters/k8s.js.map +1 -0
- package/dist/adapters/linear.d.ts +109 -0
- package/dist/adapters/linear.d.ts.map +1 -0
- package/dist/adapters/linear.js +54 -0
- package/dist/adapters/linear.js.map +1 -0
- package/dist/adapters/salesforce.d.ts +109 -0
- package/dist/adapters/salesforce.d.ts.map +1 -0
- package/dist/adapters/salesforce.js +54 -0
- package/dist/adapters/salesforce.js.map +1 -0
- package/dist/adapters/stripe.d.ts +116 -0
- package/dist/adapters/stripe.d.ts.map +1 -0
- package/dist/adapters/stripe.js +77 -0
- package/dist/adapters/stripe.js.map +1 -0
- package/dist/adapters/supabase.d.ts +127 -0
- package/dist/adapters/supabase.d.ts.map +1 -0
- package/dist/adapters/supabase.js +112 -0
- package/dist/adapters/supabase.js.map +1 -0
- package/dist/adapters/terraform.d.ts +109 -0
- package/dist/adapters/terraform.d.ts.map +1 -0
- package/dist/adapters/terraform.js +58 -0
- package/dist/adapters/terraform.js.map +1 -0
- package/dist/adapters/vercel.d.ts +114 -0
- package/dist/adapters/vercel.d.ts.map +1 -0
- package/dist/adapters/vercel.js +81 -0
- package/dist/adapters/vercel.js.map +1 -0
- package/dist/aec-execution.d.ts +107 -0
- package/dist/aec-execution.d.ts.map +1 -0
- package/dist/aec-execution.js +334 -0
- package/dist/aec-execution.js.map +1 -0
- package/dist/breakglass.d.ts +205 -0
- package/dist/breakglass.d.ts.map +1 -0
- package/dist/breakglass.js +627 -0
- package/dist/breakglass.js.map +1 -0
- package/dist/capability-receipt.d.ts +601 -0
- package/dist/capability-receipt.d.ts.map +1 -0
- package/dist/capability-receipt.js +1177 -0
- package/dist/capability-receipt.js.map +1 -0
- package/dist/cf1-conformance.d.ts +83 -0
- package/dist/cf1-conformance.d.ts.map +1 -0
- package/dist/cf1-conformance.js +94 -0
- package/dist/cf1-conformance.js.map +1 -0
- package/dist/challenge-store.d.ts +20 -0
- package/dist/challenge-store.d.ts.map +1 -0
- package/dist/challenge-store.js +62 -0
- package/dist/challenge-store.js.map +1 -0
- package/dist/control-plane.d.ts +136 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +349 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/coverage.d.ts +156 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +768 -0
- package/dist/coverage.js.map +1 -0
- package/dist/deployment-attestation.d.ts +93 -0
- package/dist/deployment-attestation.d.ts.map +1 -0
- package/dist/deployment-attestation.js +262 -0
- package/dist/deployment-attestation.js.map +1 -0
- package/dist/eg1-conformance.d.ts +286 -0
- package/dist/eg1-conformance.d.ts.map +1 -0
- package/dist/eg1-conformance.js +379 -0
- package/dist/eg1-conformance.js.map +1 -0
- package/dist/enterprise.d.ts +88 -0
- package/dist/enterprise.d.ts.map +1 -0
- package/dist/enterprise.js +194 -0
- package/dist/enterprise.js.map +1 -0
- package/dist/evidence-postgres.d.ts +123 -0
- package/dist/evidence-postgres.d.ts.map +1 -0
- package/dist/evidence-postgres.js +343 -0
- package/dist/evidence-postgres.js.map +1 -0
- package/dist/evidence.d.ts +113 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +369 -0
- package/dist/evidence.js.map +1 -0
- package/dist/execution-binding.d.ts +49 -0
- package/dist/execution-binding.d.ts.map +1 -0
- package/dist/execution-binding.js +243 -0
- package/dist/execution-binding.js.map +1 -0
- package/dist/formal-runtime-map.d.ts +42 -0
- package/dist/formal-runtime-map.d.ts.map +1 -0
- package/dist/formal-runtime-map.js +23 -0
- package/dist/formal-runtime-map.js.map +1 -0
- package/dist/index.d.ts +1003 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1737 -0
- package/dist/index.js.map +1 -0
- package/dist/key-registry.d.ts +60 -0
- package/dist/key-registry.d.ts.map +1 -0
- package/dist/key-registry.js +144 -0
- package/dist/key-registry.js.map +1 -0
- package/dist/mcp.d.ts +53 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +112 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metering.d.ts +80 -0
- package/dist/metering.d.ts.map +1 -0
- package/dist/metering.js +227 -0
- package/dist/metering.js.map +1 -0
- package/dist/metrics.d.ts +68 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +242 -0
- package/dist/metrics.js.map +1 -0
- package/dist/network-witness.d.ts +167 -0
- package/dist/network-witness.d.ts.map +1 -0
- package/dist/network-witness.js +520 -0
- package/dist/network-witness.js.map +1 -0
- package/dist/proposal-to-effect.d.ts +146 -0
- package/dist/proposal-to-effect.d.ts.map +1 -0
- package/dist/proposal-to-effect.js +427 -0
- package/dist/proposal-to-effect.js.map +1 -0
- package/dist/protocol-state.d.ts +141 -0
- package/dist/protocol-state.d.ts.map +1 -0
- package/dist/protocol-state.js +106 -0
- package/dist/protocol-state.js.map +1 -0
- package/dist/receipt-program.d.ts +59 -0
- package/dist/receipt-program.d.ts.map +1 -0
- package/dist/receipt-program.js +1053 -0
- package/dist/receipt-program.js.map +1 -0
- package/dist/reliance-kernel.d.ts +66 -0
- package/dist/reliance-kernel.d.ts.map +1 -0
- package/dist/reliance-kernel.js +103 -0
- package/dist/reliance-kernel.js.map +1 -0
- package/dist/reliance-packet.d.ts +67 -0
- package/dist/reliance-packet.d.ts.map +1 -0
- package/dist/reliance-packet.js +176 -0
- package/dist/reliance-packet.js.map +1 -0
- package/dist/remedy-program-postgres.d.ts +37 -0
- package/dist/remedy-program-postgres.d.ts.map +1 -0
- package/dist/remedy-program-postgres.js +291 -0
- package/dist/remedy-program-postgres.js.map +1 -0
- package/dist/remedy-program-receipt.d.ts +97 -0
- package/dist/remedy-program-receipt.d.ts.map +1 -0
- package/dist/remedy-program-receipt.js +817 -0
- package/dist/remedy-program-receipt.js.map +1 -0
- package/dist/remedy-program.d.ts +76 -0
- package/dist/remedy-program.d.ts.map +1 -0
- package/dist/remedy-program.js +1346 -0
- package/dist/remedy-program.js.map +1 -0
- package/dist/reports/art14.d.ts +101 -0
- package/dist/reports/art14.d.ts.map +1 -0
- package/dist/reports/art14.js +340 -0
- package/dist/reports/art14.js.map +1 -0
- package/dist/reports/assurance-package.d.ts +197 -0
- package/dist/reports/assurance-package.d.ts.map +1 -0
- package/dist/reports/assurance-package.js +313 -0
- package/dist/reports/assurance-package.js.map +1 -0
- package/dist/reports/auditor-workpaper.d.ts +194 -0
- package/dist/reports/auditor-workpaper.d.ts.map +1 -0
- package/dist/reports/auditor-workpaper.js +545 -0
- package/dist/reports/auditor-workpaper.js.map +1 -0
- package/dist/reports/external-verification.d.ts +76 -0
- package/dist/reports/external-verification.d.ts.map +1 -0
- package/dist/reports/external-verification.js +209 -0
- package/dist/reports/external-verification.js.map +1 -0
- package/dist/reports/reperform.d.ts +122 -0
- package/dist/reports/reperform.d.ts.map +1 -0
- package/dist/reports/reperform.js +432 -0
- package/dist/reports/reperform.js.map +1 -0
- package/dist/reports/underwriter.d.ts +127 -0
- package/dist/reports/underwriter.d.ts.map +1 -0
- package/dist/reports/underwriter.js +348 -0
- package/dist/reports/underwriter.js.map +1 -0
- package/dist/retention.d.ts +88 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +90 -0
- package/dist/retention.js.map +1 -0
- package/dist/roster.d.ts +113 -0
- package/dist/roster.d.ts.map +1 -0
- package/dist/roster.js +261 -0
- package/dist/roster.js.map +1 -0
- package/dist/runtime-monitor.d.ts +132 -0
- package/dist/runtime-monitor.d.ts.map +1 -0
- package/dist/runtime-monitor.js +197 -0
- package/dist/runtime-monitor.js.map +1 -0
- package/dist/settlement.d.ts +68 -0
- package/dist/settlement.d.ts.map +1 -0
- package/dist/settlement.js +306 -0
- package/dist/settlement.js.map +1 -0
- package/dist/siem.d.ts +261 -0
- package/dist/siem.d.ts.map +1 -0
- package/dist/siem.js +247 -0
- package/dist/siem.js.map +1 -0
- package/dist/store-postgres.d.ts +107 -0
- package/dist/store-postgres.d.ts.map +1 -0
- package/dist/store-postgres.js +152 -0
- package/dist/store-postgres.js.map +1 -0
- package/dist/store.d.ts +95 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +202 -0
- package/dist/store.js.map +1 -0
- package/dist/strict-json.d.ts +14 -0
- package/dist/strict-json.d.ts.map +1 -0
- package/dist/strict-json.js +132 -0
- package/dist/strict-json.js.map +1 -0
- package/dist/trust-program-adapters.d.ts +122 -0
- package/dist/trust-program-adapters.d.ts.map +1 -0
- package/dist/trust-program-adapters.js +802 -0
- package/dist/trust-program-adapters.js.map +1 -0
- package/dist/trust-program-postgres.d.ts +41 -0
- package/dist/trust-program-postgres.d.ts.map +1 -0
- package/dist/trust-program-postgres.js +346 -0
- package/dist/trust-program-postgres.js.map +1 -0
- package/dist/trust-program-revocation.d.ts +206 -0
- package/dist/trust-program-revocation.d.ts.map +1 -0
- package/dist/trust-program-revocation.js +600 -0
- package/dist/trust-program-revocation.js.map +1 -0
- package/dist/trust-program.d.ts +197 -0
- package/dist/trust-program.d.ts.map +1 -0
- package/dist/trust-program.js +1351 -0
- package/dist/trust-program.js.map +1 -0
- package/dist/witness-postgres.d.ts +43 -0
- package/dist/witness-postgres.d.ts.map +1 -0
- package/dist/witness-postgres.js +92 -0
- package/dist/witness-postgres.js.map +1 -0
- package/dist/zk-range-proof.d.ts +78 -0
- package/dist/zk-range-proof.d.ts.map +1 -0
- package/dist/zk-range-proof.js +228 -0
- package/dist/zk-range-proof.js.map +1 -0
- package/eg1-conformance.js +3 -404
- package/enterprise.js +3 -180
- package/ep-assure.mjs +1 -0
- package/evidence-postgres.js +3 -356
- package/evidence.js +4 -360
- package/execution-binding.js +3 -212
- package/formal-runtime-map.js +4 -0
- package/index.js +4 -1249
- package/key-registry.js +3 -134
- package/mcp.js +3 -109
- package/metering.js +3 -226
- package/metrics.js +3 -231
- package/network-witness.js +3 -499
- package/package.json +35 -4
- package/proposal-to-effect.js +4 -0
- package/receipt-program.js +4 -0
- package/reliance-kernel.js +3 -112
- package/reliance-packet.js +3 -175
- package/remedy-program-postgres.js +4 -0
- package/remedy-program-receipt.js +4 -0
- package/remedy-program.js +4 -0
- package/reports/art14.js +0 -0
- package/reports/assurance-package.js +2 -312
- package/reports/auditor-workpaper.js +3 -537
- package/reports/external-verification.js +3 -222
- package/reports/reperform.js +3 -424
- package/reports/underwriter.js +3 -339
- package/retention.js +3 -84
- package/roster.js +3 -264
- package/runtime-monitor.js +4 -0
- package/settlement.js +3 -299
- package/siem.js +3 -235
- package/src/action-control-manifest.ts +424 -0
- package/src/action-escrow-custodian.ts +427 -0
- package/src/action-escrow-evidence.ts +1178 -0
- package/src/action-escrow-package.ts +1821 -0
- package/src/action-escrow-postgres.ts +366 -0
- package/src/action-escrow-state.ts +498 -0
- package/src/action-escrow-verifiers.ts +484 -0
- package/src/action-escrow.ts +3039 -0
- package/src/action-packs.ts +170 -0
- package/src/adapters/_kit.ts +117 -0
- package/src/adapters/aws.ts +142 -0
- package/src/adapters/cloudflare.ts +78 -0
- package/src/adapters/gcp.ts +71 -0
- package/src/adapters/github.ts +110 -0
- package/src/adapters/jira.ts +56 -0
- package/src/adapters/k8s.ts +71 -0
- package/src/adapters/linear.ts +56 -0
- package/src/adapters/salesforce.ts +56 -0
- package/src/adapters/stripe.ts +82 -0
- package/src/adapters/supabase.ts +122 -0
- package/src/adapters/terraform.ts +60 -0
- package/src/adapters/vercel.ts +85 -0
- package/src/aec-execution.ts +354 -0
- package/src/breakglass.ts +647 -0
- package/src/capability-receipt.ts +1258 -0
- package/src/cf1-conformance.ts +120 -0
- package/src/challenge-store.ts +70 -0
- package/src/control-plane.ts +374 -0
- package/src/coverage.ts +832 -0
- package/src/deployment-attestation.ts +259 -0
- package/src/eg1-conformance.ts +471 -0
- package/src/enterprise.ts +195 -0
- package/src/evidence-postgres.ts +374 -0
- package/src/evidence.ts +367 -0
- package/src/execution-binding.ts +236 -0
- package/src/formal-runtime-map.ts +24 -0
- package/src/index.ts +2127 -0
- package/src/key-registry.ts +150 -0
- package/src/mcp.ts +120 -0
- package/src/metering.ts +237 -0
- package/src/metrics.ts +232 -0
- package/src/network-witness.ts +585 -0
- package/src/proposal-to-effect.ts +571 -0
- package/src/protocol-state.ts +143 -0
- package/src/protocol-state.typecheck.ts +94 -0
- package/src/receipt-program.ts +1105 -0
- package/src/reliance-kernel.ts +119 -0
- package/src/reliance-packet.ts +206 -0
- package/src/remedy-program-postgres.ts +367 -0
- package/src/remedy-program-receipt.ts +891 -0
- package/src/remedy-program.ts +1388 -0
- package/src/reports/art14.ts +361 -0
- package/src/reports/assurance-package.ts +330 -0
- package/src/reports/auditor-workpaper.ts +558 -0
- package/src/reports/external-verification.ts +232 -0
- package/src/reports/reperform.ts +441 -0
- package/src/reports/underwriter.ts +356 -0
- package/src/retention.ts +100 -0
- package/src/roster.ts +273 -0
- package/src/runtime-monitor.ts +217 -0
- package/src/settlement.ts +313 -0
- package/src/siem.ts +247 -0
- package/src/store-postgres.ts +167 -0
- package/src/store.ts +214 -0
- package/src/strict-json.ts +115 -0
- package/src/trust-program-adapters.ts +847 -0
- package/src/trust-program-postgres.ts +429 -0
- package/src/trust-program-revocation.ts +751 -0
- package/src/trust-program.ts +1460 -0
- package/src/witness-postgres.ts +106 -0
- package/src/zk-range-proof.ts +250 -0
- package/store-postgres.js +3 -161
- package/store.js +4 -198
- package/strict-json.js +3 -102
- package/trust-program-adapters.js +4 -0
- package/trust-program-postgres.js +4 -0
- package/trust-program-revocation.js +4 -0
- package/trust-program.js +4 -0
- package/witness-postgres.js +3 -96
- package/zk-range-proof.js +4 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* EMILIA Gate production evidence backend for Postgres.
|
|
5
|
+
*
|
|
6
|
+
* The deployment SQL exposes one SECURITY DEFINER append function. That
|
|
7
|
+
* function locks the tenant/gate/stream head, checks the caller's expected
|
|
8
|
+
* head, inserts one immutable record, and advances the head in the same SQL
|
|
9
|
+
* statement transaction. Runtime roles receive SELECT and EXECUTE only; they
|
|
10
|
+
* cannot insert, update, delete, or truncate evidence tables directly.
|
|
11
|
+
*
|
|
12
|
+
* Database errors and malformed driver responses always propagate on the
|
|
13
|
+
* write path. A storage outage must never be mistaken for a successful append
|
|
14
|
+
* or an ordinary contention retry.
|
|
15
|
+
*/
|
|
16
|
+
import { canonicalEvidenceJson, verifyEvidenceRecord, } from './evidence.js';
|
|
17
|
+
export const PG_EVIDENCE_VERSION = 'EP-GATE-PG-EVIDENCE-v1';
|
|
18
|
+
export const EVIDENCE_SCHEMA = 'emilia_gate_evidence';
|
|
19
|
+
export const EVIDENCE_RECORDS_TABLE = `${EVIDENCE_SCHEMA}.records`;
|
|
20
|
+
export const EVIDENCE_HEADS_TABLE = `${EVIDENCE_SCHEMA}.heads`;
|
|
21
|
+
export const EVIDENCE_APPEND_FUNCTION = `${EVIDENCE_SCHEMA}.append_record`;
|
|
22
|
+
const HEX_256 = /^[0-9a-f]{64}$/;
|
|
23
|
+
// evidence.js permits 1 MiB of raw string/key bytes. JSON control-character
|
|
24
|
+
// escaping can expand those bytes by up to 6x, plus bounded container syntax.
|
|
25
|
+
const MAX_CANONICAL_BYTES = 8 * 1024 * 1024;
|
|
26
|
+
/** Exact statements issued by the adapter, exported for audit and test fakes. */
|
|
27
|
+
export const EVIDENCE_SQL = Object.freeze({
|
|
28
|
+
health: `SELECT
|
|
29
|
+
to_regclass('${EVIDENCE_RECORDS_TABLE}') IS NOT NULL AS records_ready,
|
|
30
|
+
to_regclass('${EVIDENCE_HEADS_TABLE}') IS NOT NULL AS heads_ready,
|
|
31
|
+
to_regprocedure('${EVIDENCE_APPEND_FUNCTION}(text,text,text,text,jsonb,text)') IS NOT NULL AS append_ready,
|
|
32
|
+
CASE WHEN to_regclass('${EVIDENCE_RECORDS_TABLE}') IS NULL THEN FALSE
|
|
33
|
+
ELSE has_table_privilege(current_user, to_regclass('${EVIDENCE_RECORDS_TABLE}'), 'SELECT') END AS can_read_records,
|
|
34
|
+
CASE WHEN to_regclass('${EVIDENCE_HEADS_TABLE}') IS NULL THEN FALSE
|
|
35
|
+
ELSE has_table_privilege(current_user, to_regclass('${EVIDENCE_HEADS_TABLE}'), 'SELECT') END AS can_read_heads,
|
|
36
|
+
CASE WHEN to_regclass('${EVIDENCE_RECORDS_TABLE}') IS NULL THEN FALSE ELSE (
|
|
37
|
+
has_table_privilege(current_user, to_regclass('${EVIDENCE_RECORDS_TABLE}'), 'INSERT')
|
|
38
|
+
OR has_table_privilege(current_user, to_regclass('${EVIDENCE_RECORDS_TABLE}'), 'UPDATE')
|
|
39
|
+
OR has_table_privilege(current_user, to_regclass('${EVIDENCE_RECORDS_TABLE}'), 'DELETE')
|
|
40
|
+
OR has_table_privilege(current_user, to_regclass('${EVIDENCE_RECORDS_TABLE}'), 'TRUNCATE')
|
|
41
|
+
) END AS can_write_records_directly,
|
|
42
|
+
CASE WHEN to_regclass('${EVIDENCE_HEADS_TABLE}') IS NULL THEN FALSE ELSE (
|
|
43
|
+
has_table_privilege(current_user, to_regclass('${EVIDENCE_HEADS_TABLE}'), 'INSERT')
|
|
44
|
+
OR has_table_privilege(current_user, to_regclass('${EVIDENCE_HEADS_TABLE}'), 'UPDATE')
|
|
45
|
+
OR has_table_privilege(current_user, to_regclass('${EVIDENCE_HEADS_TABLE}'), 'DELETE')
|
|
46
|
+
OR has_table_privilege(current_user, to_regclass('${EVIDENCE_HEADS_TABLE}'), 'TRUNCATE')
|
|
47
|
+
) END AS can_write_heads_directly,
|
|
48
|
+
CASE WHEN to_regprocedure('${EVIDENCE_APPEND_FUNCTION}(text,text,text,text,jsonb,text)') IS NULL THEN FALSE
|
|
49
|
+
ELSE has_function_privilege(current_user,
|
|
50
|
+
to_regprocedure('${EVIDENCE_APPEND_FUNCTION}(text,text,text,text,jsonb,text)'), 'EXECUTE') END AS can_append`,
|
|
51
|
+
readHead: `SELECT head_seq AS seq, head_hash AS hash
|
|
52
|
+
FROM ${EVIDENCE_HEADS_TABLE}
|
|
53
|
+
WHERE tenant_id = $1 AND gate_id = $2 AND stream_id = $3`,
|
|
54
|
+
getById: `SELECT seq, record_id, prev_hash, hash, record
|
|
55
|
+
FROM ${EVIDENCE_RECORDS_TABLE}
|
|
56
|
+
WHERE tenant_id = $1 AND gate_id = $2 AND stream_id = $3 AND record_id = $4`,
|
|
57
|
+
readAll: `SELECT seq, record_id, prev_hash, hash, record
|
|
58
|
+
FROM ${EVIDENCE_RECORDS_TABLE}
|
|
59
|
+
WHERE tenant_id = $1 AND gate_id = $2 AND stream_id = $3
|
|
60
|
+
ORDER BY seq ASC`,
|
|
61
|
+
// One SELECT gives verify() a single MVCC snapshot of rows and head.
|
|
62
|
+
snapshot: `SELECT
|
|
63
|
+
COALESCE((
|
|
64
|
+
SELECT jsonb_agg(jsonb_build_object(
|
|
65
|
+
'seq', r.seq,
|
|
66
|
+
'record_id', r.record_id,
|
|
67
|
+
'prev_hash', r.prev_hash,
|
|
68
|
+
'hash', r.hash,
|
|
69
|
+
'record', r.record
|
|
70
|
+
) ORDER BY r.seq ASC)
|
|
71
|
+
FROM ${EVIDENCE_RECORDS_TABLE} r
|
|
72
|
+
WHERE r.tenant_id = $1 AND r.gate_id = $2 AND r.stream_id = $3
|
|
73
|
+
), '[]'::jsonb) AS record_rows,
|
|
74
|
+
(
|
|
75
|
+
SELECT CASE WHEN h.head_seq = -1 THEN NULL ELSE jsonb_build_object(
|
|
76
|
+
'seq', h.head_seq, 'hash', h.head_hash
|
|
77
|
+
) END
|
|
78
|
+
FROM ${EVIDENCE_HEADS_TABLE} h
|
|
79
|
+
WHERE h.tenant_id = $1 AND h.gate_id = $2 AND h.stream_id = $3
|
|
80
|
+
) AS head`,
|
|
81
|
+
appendIfHead: `SELECT ${EVIDENCE_APPEND_FUNCTION}($1, $2, $3, $4, $5::jsonb, $6) AS appended`,
|
|
82
|
+
});
|
|
83
|
+
function assertScopedId(value, label, { minLength = 1, maxLength = 256 } = {}) {
|
|
84
|
+
if (typeof value !== 'string' || value.length < minLength
|
|
85
|
+
|| value.length > maxLength || value.includes('\0')) {
|
|
86
|
+
throw new Error(`${label} must be a string of ${minLength} to ${maxLength} characters`);
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
function queryRows(result, operation) {
|
|
91
|
+
if (!result || !Number.isInteger(result.rowCount) || result.rowCount < 0
|
|
92
|
+
|| !Array.isArray(result.rows) || result.rows.length !== result.rowCount) {
|
|
93
|
+
throw new Error(`${operation}: malformed Postgres result; storage outcome is unproven`);
|
|
94
|
+
}
|
|
95
|
+
return result.rows;
|
|
96
|
+
}
|
|
97
|
+
function parseSequence(value, operation, { sentinel = false } = {}) {
|
|
98
|
+
let parsed = value;
|
|
99
|
+
if (typeof value === 'string' && /^-?(0|[1-9][0-9]*)$/.test(value))
|
|
100
|
+
parsed = Number(value);
|
|
101
|
+
const minimum = sentinel ? -1 : 0;
|
|
102
|
+
if (!Number.isSafeInteger(parsed) || parsed < minimum) {
|
|
103
|
+
throw new Error(`${operation}: Postgres returned an invalid evidence sequence`);
|
|
104
|
+
}
|
|
105
|
+
return parsed;
|
|
106
|
+
}
|
|
107
|
+
function parseJson(value, operation) {
|
|
108
|
+
if (typeof value !== 'string')
|
|
109
|
+
return value;
|
|
110
|
+
try {
|
|
111
|
+
return JSON.parse(value);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new Error(`${operation}: Postgres returned malformed JSON`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function normalizeHead(value, operation) {
|
|
118
|
+
const head = parseJson(value, operation);
|
|
119
|
+
if (head === null || head === undefined)
|
|
120
|
+
return null;
|
|
121
|
+
if (!head || typeof head !== 'object' || Array.isArray(head)) {
|
|
122
|
+
throw new Error(`${operation}: Postgres returned a malformed evidence head`);
|
|
123
|
+
}
|
|
124
|
+
const seq = parseSequence(head.seq, operation, { sentinel: true });
|
|
125
|
+
if (seq === -1) {
|
|
126
|
+
if (head.hash !== null && head.hash !== undefined) {
|
|
127
|
+
throw new Error(`${operation}: empty evidence head has a hash`);
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
if (typeof head.hash !== 'string' || !HEX_256.test(head.hash)) {
|
|
132
|
+
throw new Error(`${operation}: Postgres returned a malformed evidence head hash`);
|
|
133
|
+
}
|
|
134
|
+
return { seq, hash: head.hash };
|
|
135
|
+
}
|
|
136
|
+
function normalizeRecordRow(value, operation) {
|
|
137
|
+
const row = parseJson(value, operation);
|
|
138
|
+
if (!row || typeof row !== 'object' || Array.isArray(row)) {
|
|
139
|
+
throw new Error(`${operation}: Postgres returned a malformed evidence row`);
|
|
140
|
+
}
|
|
141
|
+
const seq = parseSequence(row.seq, operation);
|
|
142
|
+
const record = parseJson(row.record, operation);
|
|
143
|
+
if (!record || typeof record !== 'object' || Array.isArray(record)
|
|
144
|
+
|| record.seq !== seq
|
|
145
|
+
|| record.record_id !== row.record_id
|
|
146
|
+
|| record.prev_hash !== row.prev_hash
|
|
147
|
+
|| record.hash !== row.hash) {
|
|
148
|
+
throw new Error(`${operation}: evidence row metadata does not match its record`);
|
|
149
|
+
}
|
|
150
|
+
return structuredClone(record);
|
|
151
|
+
}
|
|
152
|
+
function canonicalAppendPayload(record, expectedHeadHash) {
|
|
153
|
+
if (expectedHeadHash !== null && (typeof expectedHeadHash !== 'string' || !HEX_256.test(expectedHeadHash))) {
|
|
154
|
+
throw new Error('appendIfHead: expected head must be null or a lowercase SHA-256 hash');
|
|
155
|
+
}
|
|
156
|
+
if (!verifyEvidenceRecord(record, { atomicRequired: true })) {
|
|
157
|
+
throw new Error('appendIfHead: record is not a valid canonical atomic evidence record');
|
|
158
|
+
}
|
|
159
|
+
if (expectedHeadHash === null) {
|
|
160
|
+
if (record.seq !== 0 || record.prev_hash !== 'genesis') {
|
|
161
|
+
throw new Error('appendIfHead: genesis append has an invalid sequence or predecessor');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (record.seq < 1 || record.prev_hash !== expectedHeadHash) {
|
|
165
|
+
throw new Error('appendIfHead: record does not extend the expected head');
|
|
166
|
+
}
|
|
167
|
+
let persisted;
|
|
168
|
+
try {
|
|
169
|
+
persisted = JSON.parse(JSON.stringify(record));
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
throw new Error('appendIfHead: record is not losslessly JSON-serializable');
|
|
173
|
+
}
|
|
174
|
+
if (!persisted || typeof persisted !== 'object' || Array.isArray(persisted)
|
|
175
|
+
|| canonicalEvidenceJson(persisted) !== canonicalEvidenceJson(record)
|
|
176
|
+
|| !verifyEvidenceRecord(persisted, { atomicRequired: true })) {
|
|
177
|
+
throw new Error('appendIfHead: record is not losslessly JSON-serializable');
|
|
178
|
+
}
|
|
179
|
+
const { hash: _hash, ...body } = persisted;
|
|
180
|
+
const canonicalBody = canonicalEvidenceJson(body);
|
|
181
|
+
if (typeof canonicalBody !== 'string' || Buffer.byteLength(canonicalBody, 'utf8') > MAX_CANONICAL_BYTES) {
|
|
182
|
+
throw new Error('appendIfHead: canonical evidence body exceeds the Postgres limit');
|
|
183
|
+
}
|
|
184
|
+
return { canonicalBody, persisted };
|
|
185
|
+
}
|
|
186
|
+
function verifyHistory(records, head) {
|
|
187
|
+
const recordIds = new Set();
|
|
188
|
+
const sequences = new Set();
|
|
189
|
+
let previous = 'genesis';
|
|
190
|
+
for (let index = 0; index < records.length; index++) {
|
|
191
|
+
const record = records[index];
|
|
192
|
+
if (sequences.has(record.seq))
|
|
193
|
+
return { ok: false, at: record.seq, reason: 'fork_detected' };
|
|
194
|
+
sequences.add(record.seq);
|
|
195
|
+
if (record.seq !== index)
|
|
196
|
+
return { ok: false, at: index, reason: 'sequence_gap_or_rollback' };
|
|
197
|
+
if (record.prev_hash !== previous) {
|
|
198
|
+
return { ok: false, at: index, reason: 'fork_or_predecessor_mismatch' };
|
|
199
|
+
}
|
|
200
|
+
if (recordIds.has(record.record_id)) {
|
|
201
|
+
return { ok: false, at: index, reason: 'duplicate_record_id' };
|
|
202
|
+
}
|
|
203
|
+
if (!verifyEvidenceRecord(record, { atomicRequired: true })) {
|
|
204
|
+
return { ok: false, at: index, reason: 'hash_mismatch_or_malformed_record' };
|
|
205
|
+
}
|
|
206
|
+
recordIds.add(record.record_id);
|
|
207
|
+
previous = record.hash;
|
|
208
|
+
}
|
|
209
|
+
const expectedHead = records.length === 0
|
|
210
|
+
? null
|
|
211
|
+
: { seq: records.length - 1, hash: previous };
|
|
212
|
+
if ((expectedHead === null && head !== null)
|
|
213
|
+
|| (expectedHead !== null && (head === null
|
|
214
|
+
|| head.seq !== expectedHead.seq || head.hash !== expectedHead.hash))) {
|
|
215
|
+
return { ok: false, reason: 'head_rollback_or_mismatch' };
|
|
216
|
+
}
|
|
217
|
+
return { ok: true, length: records.length, head: expectedHead?.hash ?? null };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Create a tenant-and-gate-bound backend for createAtomicEvidenceLog().
|
|
221
|
+
*
|
|
222
|
+
* `query` is a node-postgres style function such as `pool.query.bind(pool)`.
|
|
223
|
+
* The migration must be installed and the connection role must inherit or SET
|
|
224
|
+
* ROLE to `emilia_gate_evidence_runtime`.
|
|
225
|
+
*
|
|
226
|
+
* @param {{ query?: (text: string, params: any[]) => Promise<{ rowCount: number, rows?: any[] }>, tenantId?: any, gateId?: any }} [options]
|
|
227
|
+
*/
|
|
228
|
+
export function createPostgresEvidenceBackend({ query, tenantId, gateId, } = {}) {
|
|
229
|
+
if (typeof query !== 'function') {
|
|
230
|
+
throw new Error('createPostgresEvidenceBackend: query must be an async pg-style function that throws on failure');
|
|
231
|
+
}
|
|
232
|
+
// Narrowed alias: `query` is a destructured parameter, so TypeScript's
|
|
233
|
+
// control-flow narrowing from the guard above does not carry into the
|
|
234
|
+
// closures declared below (readHead, getById, appendIfHead, readAll,
|
|
235
|
+
// readSnapshot). The guard already proves this is a function; this is a
|
|
236
|
+
// type-only alias with no behavioral difference from calling `query`.
|
|
237
|
+
/** @type {(text: string, params: any[]) => Promise<{ rowCount: number, rows?: any[] }>} */
|
|
238
|
+
const runQuery = query;
|
|
239
|
+
const tenant = assertScopedId(tenantId, 'tenantId');
|
|
240
|
+
const gate = assertScopedId(gateId, 'gateId');
|
|
241
|
+
const scope = Object.freeze({ tenantId: tenant, gateId: gate });
|
|
242
|
+
const scopeParams = (streamId) => [tenant, gate, assertScopedId(streamId, 'streamId')];
|
|
243
|
+
async function readHead(streamId) {
|
|
244
|
+
const rows = queryRows(await runQuery(EVIDENCE_SQL.readHead, scopeParams(streamId)), 'readHead');
|
|
245
|
+
if (rows.length > 1)
|
|
246
|
+
throw new Error('readHead: Postgres returned multiple scoped heads');
|
|
247
|
+
return rows.length === 0 ? null : normalizeHead(rows[0], 'readHead');
|
|
248
|
+
}
|
|
249
|
+
async function getById(streamId, recordId) {
|
|
250
|
+
assertScopedId(recordId, 'recordId', { minLength: 16 });
|
|
251
|
+
const rows = queryRows(await runQuery(EVIDENCE_SQL.getById, [...scopeParams(streamId), recordId]), 'getById');
|
|
252
|
+
if (rows.length > 1)
|
|
253
|
+
throw new Error('getById: Postgres returned duplicate scoped record IDs');
|
|
254
|
+
return rows.length === 0 ? null : normalizeRecordRow(rows[0], 'getById');
|
|
255
|
+
}
|
|
256
|
+
async function appendIfHead(streamId, expectedHeadHash, record) {
|
|
257
|
+
const params = scopeParams(streamId);
|
|
258
|
+
const { canonicalBody, persisted } = canonicalAppendPayload(record, expectedHeadHash);
|
|
259
|
+
const rows = queryRows(await runQuery(EVIDENCE_SQL.appendIfHead, [
|
|
260
|
+
...params,
|
|
261
|
+
expectedHeadHash,
|
|
262
|
+
persisted,
|
|
263
|
+
canonicalBody,
|
|
264
|
+
]), 'appendIfHead');
|
|
265
|
+
if (rows.length !== 1 || typeof rows[0]?.appended !== 'boolean') {
|
|
266
|
+
throw new Error('appendIfHead: Postgres did not return a definitive append verdict');
|
|
267
|
+
}
|
|
268
|
+
return rows[0].appended;
|
|
269
|
+
}
|
|
270
|
+
async function readAll(streamId) {
|
|
271
|
+
const rows = queryRows(await runQuery(EVIDENCE_SQL.readAll, scopeParams(streamId)), 'readAll');
|
|
272
|
+
return rows.map((row) => normalizeRecordRow(row, 'readAll'));
|
|
273
|
+
}
|
|
274
|
+
async function readSnapshot(streamId) {
|
|
275
|
+
const rows = queryRows(await runQuery(EVIDENCE_SQL.snapshot, scopeParams(streamId)), 'verify');
|
|
276
|
+
if (rows.length !== 1)
|
|
277
|
+
throw new Error('verify: Postgres did not return one scoped snapshot');
|
|
278
|
+
const recordRows = parseJson(rows[0].record_rows, 'verify');
|
|
279
|
+
if (!Array.isArray(recordRows))
|
|
280
|
+
throw new Error('verify: Postgres returned malformed evidence history');
|
|
281
|
+
return {
|
|
282
|
+
records: recordRows.map((row) => normalizeRecordRow(row, 'verify')),
|
|
283
|
+
head: normalizeHead(rows[0].head, 'verify'),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
durable: true,
|
|
288
|
+
persisted: true,
|
|
289
|
+
strict: true,
|
|
290
|
+
forkAware: true,
|
|
291
|
+
atomicAppend: true,
|
|
292
|
+
appendOnly: true,
|
|
293
|
+
version: PG_EVIDENCE_VERSION,
|
|
294
|
+
scope,
|
|
295
|
+
readHead,
|
|
296
|
+
head: readHead,
|
|
297
|
+
getById,
|
|
298
|
+
appendIfHead,
|
|
299
|
+
readAll,
|
|
300
|
+
all: readAll,
|
|
301
|
+
async verify(streamId) {
|
|
302
|
+
try {
|
|
303
|
+
const snapshot = await readSnapshot(streamId);
|
|
304
|
+
return verifyHistory(snapshot.records, snapshot.head);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
return { ok: false, reason: 'backend_read_failed_or_malformed' };
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
async health() {
|
|
311
|
+
const rows = queryRows(await query(EVIDENCE_SQL.health, []), 'health');
|
|
312
|
+
if (rows.length !== 1)
|
|
313
|
+
throw new Error('health: Postgres did not return one readiness row');
|
|
314
|
+
const checks = {
|
|
315
|
+
recordsReady: rows[0].records_ready === true,
|
|
316
|
+
headsReady: rows[0].heads_ready === true,
|
|
317
|
+
appendReady: rows[0].append_ready === true,
|
|
318
|
+
canReadRecords: rows[0].can_read_records === true,
|
|
319
|
+
canReadHeads: rows[0].can_read_heads === true,
|
|
320
|
+
noDirectRecordWrites: rows[0].can_write_records_directly === false,
|
|
321
|
+
noDirectHeadWrites: rows[0].can_write_heads_directly === false,
|
|
322
|
+
canAppend: rows[0].can_append === true,
|
|
323
|
+
};
|
|
324
|
+
return {
|
|
325
|
+
ok: Object.values(checks).every(Boolean),
|
|
326
|
+
version: PG_EVIDENCE_VERSION,
|
|
327
|
+
scope,
|
|
328
|
+
checks,
|
|
329
|
+
};
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const postgresEvidence = {
|
|
334
|
+
createPostgresEvidenceBackend,
|
|
335
|
+
EVIDENCE_SQL,
|
|
336
|
+
EVIDENCE_SCHEMA,
|
|
337
|
+
EVIDENCE_RECORDS_TABLE,
|
|
338
|
+
EVIDENCE_HEADS_TABLE,
|
|
339
|
+
EVIDENCE_APPEND_FUNCTION,
|
|
340
|
+
PG_EVIDENCE_VERSION,
|
|
341
|
+
};
|
|
342
|
+
export default postgresEvidence;
|
|
343
|
+
//# sourceMappingURL=evidence-postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-postgres.js","sourceRoot":"","sources":["../src/evidence-postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** Canonical JSON (recursive sorted keys) — matches @emilia-protocol/verify. */
|
|
2
|
+
export declare function canonicalEvidenceJson(v: any): any;
|
|
3
|
+
export declare function createEvidenceLog({ sink, strict }?: {
|
|
4
|
+
sink?: (record: any) => any;
|
|
5
|
+
strict?: boolean;
|
|
6
|
+
}): {
|
|
7
|
+
durable: boolean;
|
|
8
|
+
persisted: boolean;
|
|
9
|
+
strict: boolean;
|
|
10
|
+
forkAware: boolean;
|
|
11
|
+
atomicAppend: boolean;
|
|
12
|
+
record(entry: any): Promise<any>;
|
|
13
|
+
all(): Record<string, any>[];
|
|
14
|
+
/** Recompute the chain; detects any altered or removed record. */
|
|
15
|
+
verify(): {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
at: any;
|
|
18
|
+
reason: string;
|
|
19
|
+
length?: undefined;
|
|
20
|
+
head?: undefined;
|
|
21
|
+
} | {
|
|
22
|
+
ok: boolean;
|
|
23
|
+
length: number;
|
|
24
|
+
head: string | null;
|
|
25
|
+
at?: undefined;
|
|
26
|
+
reason?: undefined;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Verify one logger acknowledgement independently of the logger that emitted it.
|
|
31
|
+
*/
|
|
32
|
+
export declare function verifyEvidenceRecord(record: any, { atomicRequired, expectedEntry }?: {
|
|
33
|
+
atomicRequired?: boolean;
|
|
34
|
+
expectedEntry?: any;
|
|
35
|
+
}): boolean;
|
|
36
|
+
declare function assertLogEntry(entry: any): void;
|
|
37
|
+
declare function validateAtomicRecord(record: any, expectedId: any, expectedEntry: any, expectedRecord?: null): boolean;
|
|
38
|
+
declare function validHead(head: any): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Fleet-safe, fail-closed evidence log over an atomic shared-head backend.
|
|
41
|
+
*
|
|
42
|
+
* Backend contract (all operations are scoped by streamId):
|
|
43
|
+
* readHead(streamId) -> null | { seq, hash }
|
|
44
|
+
* getById(streamId, recordId) -> null | record
|
|
45
|
+
* appendIfHead(streamId, expectedHeadHash|null, record) -> boolean
|
|
46
|
+
* readAll(streamId) -> record[] // optional, for verify/all
|
|
47
|
+
*
|
|
48
|
+
* appendIfHead MUST atomically compare the current head, append the immutable
|
|
49
|
+
* record, reject duplicate record_id, and advance the head in one durable
|
|
50
|
+
* transaction. A true return MUST provide immediate read-after-write visibility
|
|
51
|
+
* through getById. `backend.durable === true` is a deployment capability
|
|
52
|
+
* assertion; this module tests the protocol but cannot prove storage hardware
|
|
53
|
+
* semantics.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createAtomicEvidenceLog(backend: any, { streamId, maxRetries, recordIdFactory, }?: {
|
|
56
|
+
streamId?: string | undefined;
|
|
57
|
+
maxRetries?: number | undefined;
|
|
58
|
+
recordIdFactory?: (() => `${string}-${string}-${string}-${string}-${string}`) | undefined;
|
|
59
|
+
}): {
|
|
60
|
+
durable: boolean;
|
|
61
|
+
persisted: boolean;
|
|
62
|
+
strict: boolean;
|
|
63
|
+
forkAware: boolean;
|
|
64
|
+
atomicAppend: boolean;
|
|
65
|
+
streamId: string;
|
|
66
|
+
health(): Promise<any>;
|
|
67
|
+
record(entry: any): Promise<any>;
|
|
68
|
+
all(): Promise<any[]>;
|
|
69
|
+
verify(): Promise<{
|
|
70
|
+
ok: boolean;
|
|
71
|
+
reason: string;
|
|
72
|
+
at?: undefined;
|
|
73
|
+
length?: undefined;
|
|
74
|
+
head?: undefined;
|
|
75
|
+
} | {
|
|
76
|
+
ok: boolean;
|
|
77
|
+
at: number;
|
|
78
|
+
reason: string;
|
|
79
|
+
length?: undefined;
|
|
80
|
+
head?: undefined;
|
|
81
|
+
} | {
|
|
82
|
+
ok: boolean;
|
|
83
|
+
length: number;
|
|
84
|
+
head: string | null;
|
|
85
|
+
reason?: undefined;
|
|
86
|
+
at?: undefined;
|
|
87
|
+
}>;
|
|
88
|
+
};
|
|
89
|
+
/** In-memory contract model for tests. It is intentionally not durable. */
|
|
90
|
+
export declare function createMemoryAtomicEvidenceBackend(): {
|
|
91
|
+
durable: boolean;
|
|
92
|
+
readHead(streamId: any): Promise<{
|
|
93
|
+
seq: any;
|
|
94
|
+
hash: any;
|
|
95
|
+
} | null>;
|
|
96
|
+
getById(streamId: any, recordId: any): Promise<any>;
|
|
97
|
+
appendIfHead(streamId: any, expectedHeadHash: any, record: any): Promise<boolean>;
|
|
98
|
+
readAll(streamId: any): Promise<any>;
|
|
99
|
+
};
|
|
100
|
+
export declare const __atomicEvidenceSecurityInternals: Readonly<{
|
|
101
|
+
canonical: typeof canonicalEvidenceJson;
|
|
102
|
+
assertLogEntry: typeof assertLogEntry;
|
|
103
|
+
validateAtomicRecord: typeof validateAtomicRecord;
|
|
104
|
+
validHead: typeof validHead;
|
|
105
|
+
}>;
|
|
106
|
+
declare const _default: {
|
|
107
|
+
createEvidenceLog: typeof createEvidenceLog;
|
|
108
|
+
verifyEvidenceRecord: typeof verifyEvidenceRecord;
|
|
109
|
+
createAtomicEvidenceLog: typeof createAtomicEvidenceLog;
|
|
110
|
+
createMemoryAtomicEvidenceBackend: typeof createMemoryAtomicEvidenceBackend;
|
|
111
|
+
};
|
|
112
|
+
export default _default;
|
|
113
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AA6BA,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,CAAC,KAAA,OAOtC;AAID,wBAAgB,iBAAiB,CAC/B,EAAE,IAAI,EAAE,MAAc,EAAE,GAAE;IAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO;;;;;;;;IA8C9E,kEAAkE;;;;;;;;;;;;;;EAYrE;AAKD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,GAAG,EACX,EAAE,cAAsB,EAAE,aAAa,EAAE,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,GAAG,CAAA;CAAO,WAwBlG;AAED,iBAAS,cAAc,CAAC,KAAK,KAAA,QAuC5B;AAED,iBAAS,oBAAoB,CAAC,MAAM,KAAA,EAAE,UAAU,KAAA,EAAE,aAAa,KAAA,EAAE,cAAc,OAAO,WAIrF;AAED,iBAAS,SAAS,CAAC,IAAI,KAAA,WAEtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,KAAA,EAAE,EAC/C,QAAwB,EACxB,UAAe,EACf,eAA2C,GAC5C;;;;CAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiHL;AAED,2EAA2E;AAC3E,wBAAgB,iCAAiC;;;;;;;;;EA6BhD;AAED,eAAO,MAAM,iCAAiC;;;;;EAK5C,CAAC;;;;;;;AAEH,wBAKE"}
|