@sourcey/catalog-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.
- package/CHANGELOG.md +3 -0
- package/LICENSE +21 -0
- package/README.md +64 -0
- package/SBOM.cdx.json +177 -0
- package/SECURITY.md +8 -0
- package/SOURCEY-CLOSURE.json +1559 -0
- package/SOURCEY-DISTRIBUTION.json +24 -0
- package/SOURCEY-LICENSE-POLICY.json +5 -0
- package/SOURCEY-TOOLCHAIN.json +8 -0
- package/SUPPORT.md +5 -0
- package/THIRD_PARTY_NOTICES.json +69 -0
- package/dist/contracts/agent-readiness/src/declaration-acquisition.d.ts +548 -0
- package/dist/contracts/agent-readiness/src/declaration-acquisition.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/declaration-acquisition.js +159 -0
- package/dist/contracts/agent-readiness/src/declaration-acquisition.js.map +1 -0
- package/dist/contracts/agent-readiness/src/declaration-reference.d.ts +48 -0
- package/dist/contracts/agent-readiness/src/declaration-reference.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/declaration-reference.js +42 -0
- package/dist/contracts/agent-readiness/src/declaration-reference.js.map +1 -0
- package/dist/contracts/agent-readiness/src/declaration.d.ts +1357 -0
- package/dist/contracts/agent-readiness/src/declaration.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/declaration.js +659 -0
- package/dist/contracts/agent-readiness/src/declaration.js.map +1 -0
- package/dist/contracts/agent-readiness/src/evidence.d.ts +146 -0
- package/dist/contracts/agent-readiness/src/evidence.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/evidence.js +154 -0
- package/dist/contracts/agent-readiness/src/evidence.js.map +1 -0
- package/dist/contracts/agent-readiness/src/index.d.ts +6487 -0
- package/dist/contracts/agent-readiness/src/index.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/index.js +1487 -0
- package/dist/contracts/agent-readiness/src/index.js.map +1 -0
- package/dist/contracts/agent-readiness/src/interaction.d.ts +26 -0
- package/dist/contracts/agent-readiness/src/interaction.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/interaction.js +24 -0
- package/dist/contracts/agent-readiness/src/interaction.js.map +1 -0
- package/dist/contracts/agent-readiness/src/method-pack.d.ts +391 -0
- package/dist/contracts/agent-readiness/src/method-pack.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/method-pack.js +181 -0
- package/dist/contracts/agent-readiness/src/method-pack.js.map +1 -0
- package/dist/contracts/agent-readiness/src/shared.d.ts +119 -0
- package/dist/contracts/agent-readiness/src/shared.d.ts.map +1 -0
- package/dist/contracts/agent-readiness/src/shared.js +144 -0
- package/dist/contracts/agent-readiness/src/shared.js.map +1 -0
- package/dist/contracts/api/src/index.d.ts +48463 -0
- package/dist/contracts/api/src/index.d.ts.map +1 -0
- package/dist/contracts/api/src/index.js +1150 -0
- package/dist/contracts/api/src/index.js.map +1 -0
- package/dist/contracts/artifact/src/index.d.ts +1467 -0
- package/dist/contracts/artifact/src/index.d.ts.map +1 -0
- package/dist/contracts/artifact/src/index.js +325 -0
- package/dist/contracts/artifact/src/index.js.map +1 -0
- package/dist/contracts/assets/src/index.d.ts +1397 -0
- package/dist/contracts/assets/src/index.d.ts.map +1 -0
- package/dist/contracts/assets/src/index.js +560 -0
- package/dist/contracts/assets/src/index.js.map +1 -0
- package/dist/contracts/authoring/src/index.d.ts +1084 -0
- package/dist/contracts/authoring/src/index.d.ts.map +1 -0
- package/dist/contracts/authoring/src/index.js +211 -0
- package/dist/contracts/authoring/src/index.js.map +1 -0
- package/dist/contracts/authority/src/index.d.ts +135 -0
- package/dist/contracts/authority/src/index.d.ts.map +1 -0
- package/dist/contracts/authority/src/index.js +130 -0
- package/dist/contracts/authority/src/index.js.map +1 -0
- package/dist/contracts/billing/src/index.d.ts +587 -0
- package/dist/contracts/billing/src/index.d.ts.map +1 -0
- package/dist/contracts/billing/src/index.js +322 -0
- package/dist/contracts/billing/src/index.js.map +1 -0
- package/dist/contracts/catalog-verifier/src/index.d.ts +390 -0
- package/dist/contracts/catalog-verifier/src/index.d.ts.map +1 -0
- package/dist/contracts/catalog-verifier/src/index.js +222 -0
- package/dist/contracts/catalog-verifier/src/index.js.map +1 -0
- package/dist/contracts/commercial-work/src/index.d.ts +835 -0
- package/dist/contracts/commercial-work/src/index.d.ts.map +1 -0
- package/dist/contracts/commercial-work/src/index.js +510 -0
- package/dist/contracts/commercial-work/src/index.js.map +1 -0
- package/dist/contracts/events/src/index.d.ts +700 -0
- package/dist/contracts/events/src/index.d.ts.map +1 -0
- package/dist/contracts/events/src/index.js +553 -0
- package/dist/contracts/events/src/index.js.map +1 -0
- package/dist/contracts/evidence/src/index.d.ts +487 -0
- package/dist/contracts/evidence/src/index.d.ts.map +1 -0
- package/dist/contracts/evidence/src/index.js +342 -0
- package/dist/contracts/evidence/src/index.js.map +1 -0
- package/dist/contracts/feed/src/index.d.ts +159 -0
- package/dist/contracts/feed/src/index.d.ts.map +1 -0
- package/dist/contracts/feed/src/index.js +79 -0
- package/dist/contracts/feed/src/index.js.map +1 -0
- package/dist/contracts/funded-work/src/index.d.ts +64 -0
- package/dist/contracts/funded-work/src/index.d.ts.map +1 -0
- package/dist/contracts/funded-work/src/index.js +67 -0
- package/dist/contracts/funded-work/src/index.js.map +1 -0
- package/dist/contracts/observations/src/index.d.ts +134 -0
- package/dist/contracts/observations/src/index.d.ts.map +1 -0
- package/dist/contracts/observations/src/index.js +112 -0
- package/dist/contracts/observations/src/index.js.map +1 -0
- package/dist/contracts/policies/src/index.d.ts +151 -0
- package/dist/contracts/policies/src/index.d.ts.map +1 -0
- package/dist/contracts/policies/src/index.js +121 -0
- package/dist/contracts/policies/src/index.js.map +1 -0
- package/dist/contracts/publication/src/index.d.ts +4066 -0
- package/dist/contracts/publication/src/index.d.ts.map +1 -0
- package/dist/contracts/publication/src/index.js +535 -0
- package/dist/contracts/publication/src/index.js.map +1 -0
- package/dist/contracts/release/src/index.d.ts +2032 -0
- package/dist/contracts/release/src/index.d.ts.map +1 -0
- package/dist/contracts/release/src/index.js +252 -0
- package/dist/contracts/release/src/index.js.map +1 -0
- package/dist/contracts/revisions/src/index.d.ts +1405 -0
- package/dist/contracts/revisions/src/index.d.ts.map +1 -0
- package/dist/contracts/revisions/src/index.js +493 -0
- package/dist/contracts/revisions/src/index.js.map +1 -0
- package/dist/contracts/routes/src/index.d.ts +103 -0
- package/dist/contracts/routes/src/index.d.ts.map +1 -0
- package/dist/contracts/routes/src/index.js +163 -0
- package/dist/contracts/routes/src/index.js.map +1 -0
- package/dist/contracts/routes/src/public-route-allocations.generated.d.ts +2 -0
- package/dist/contracts/routes/src/public-route-allocations.generated.d.ts.map +1 -0
- package/dist/contracts/routes/src/public-route-allocations.generated.js +56 -0
- package/dist/contracts/routes/src/public-route-allocations.generated.js.map +1 -0
- package/dist/contracts/standards/src/index.d.ts +1482 -0
- package/dist/contracts/standards/src/index.d.ts.map +1 -0
- package/dist/contracts/standards/src/index.js +626 -0
- package/dist/contracts/standards/src/index.js.map +1 -0
- package/dist/contracts/taxonomy/src/index.d.ts +7 -0
- package/dist/contracts/taxonomy/src/index.d.ts.map +1 -0
- package/dist/contracts/taxonomy/src/index.js +25 -0
- package/dist/contracts/taxonomy/src/index.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/current-policy-metrics.d.ts +20 -0
- package/dist/modules/agent-readiness-policy/src/current-policy-metrics.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/current-policy-metrics.js +604 -0
- package/dist/modules/agent-readiness-policy/src/current-policy-metrics.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/current-policy.d.ts +249 -0
- package/dist/modules/agent-readiness-policy/src/current-policy.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/current-policy.js +470 -0
- package/dist/modules/agent-readiness-policy/src/current-policy.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/grading.d.ts +39 -0
- package/dist/modules/agent-readiness-policy/src/grading.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/grading.js +40 -0
- package/dist/modules/agent-readiness-policy/src/grading.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/impact.d.ts +103 -0
- package/dist/modules/agent-readiness-policy/src/impact.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/impact.js +249 -0
- package/dist/modules/agent-readiness-policy/src/impact.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/index.d.ts +811 -0
- package/dist/modules/agent-readiness-policy/src/index.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/index.js +499 -0
- package/dist/modules/agent-readiness-policy/src/index.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/offer-relations.d.ts +12 -0
- package/dist/modules/agent-readiness-policy/src/offer-relations.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/offer-relations.js +65 -0
- package/dist/modules/agent-readiness-policy/src/offer-relations.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/policy-validation.d.ts +4 -0
- package/dist/modules/agent-readiness-policy/src/policy-validation.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/policy-validation.js +59 -0
- package/dist/modules/agent-readiness-policy/src/policy-validation.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/projection-lineage.d.ts +3 -0
- package/dist/modules/agent-readiness-policy/src/projection-lineage.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/projection-lineage.js +12 -0
- package/dist/modules/agent-readiness-policy/src/projection-lineage.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/revision.d.ts +4 -0
- package/dist/modules/agent-readiness-policy/src/revision.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/revision.js +46 -0
- package/dist/modules/agent-readiness-policy/src/revision.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/standard-mapping.d.ts +7 -0
- package/dist/modules/agent-readiness-policy/src/standard-mapping.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/standard-mapping.js +13 -0
- package/dist/modules/agent-readiness-policy/src/standard-mapping.js.map +1 -0
- package/dist/modules/agent-readiness-policy/src/surface-selection.d.ts +36 -0
- package/dist/modules/agent-readiness-policy/src/surface-selection.d.ts.map +1 -0
- package/dist/modules/agent-readiness-policy/src/surface-selection.js +214 -0
- package/dist/modules/agent-readiness-policy/src/surface-selection.js.map +1 -0
- package/dist/modules/agent-readiness-repository/src/admission.d.ts +35 -0
- package/dist/modules/agent-readiness-repository/src/admission.d.ts.map +1 -0
- package/dist/modules/agent-readiness-repository/src/admission.js +56 -0
- package/dist/modules/agent-readiness-repository/src/admission.js.map +1 -0
- package/dist/modules/agent-readiness-repository/src/change.d.ts +62 -0
- package/dist/modules/agent-readiness-repository/src/change.d.ts.map +1 -0
- package/dist/modules/agent-readiness-repository/src/change.js +218 -0
- package/dist/modules/agent-readiness-repository/src/change.js.map +1 -0
- package/dist/modules/agent-readiness-repository/src/declaration-blob.d.ts +29 -0
- package/dist/modules/agent-readiness-repository/src/declaration-blob.d.ts.map +1 -0
- package/dist/modules/agent-readiness-repository/src/declaration-blob.js +126 -0
- package/dist/modules/agent-readiness-repository/src/declaration-blob.js.map +1 -0
- package/dist/modules/agent-readiness-repository/src/index.d.ts +102 -0
- package/dist/modules/agent-readiness-repository/src/index.d.ts.map +1 -0
- package/dist/modules/agent-readiness-repository/src/index.js +208 -0
- package/dist/modules/agent-readiness-repository/src/index.js.map +1 -0
- package/dist/modules/artifact/src/agent-readiness-closure.d.ts +24 -0
- package/dist/modules/artifact/src/agent-readiness-closure.d.ts.map +1 -0
- package/dist/modules/artifact/src/agent-readiness-closure.js +98 -0
- package/dist/modules/artifact/src/agent-readiness-closure.js.map +1 -0
- package/dist/modules/artifact/src/asset-closure.d.ts +12 -0
- package/dist/modules/artifact/src/asset-closure.d.ts.map +1 -0
- package/dist/modules/artifact/src/asset-closure.js +40 -0
- package/dist/modules/artifact/src/asset-closure.js.map +1 -0
- package/dist/modules/artifact/src/authoring-closure.d.ts +4 -0
- package/dist/modules/artifact/src/authoring-closure.d.ts.map +1 -0
- package/dist/modules/artifact/src/authoring-closure.js +19 -0
- package/dist/modules/artifact/src/authoring-closure.js.map +1 -0
- package/dist/modules/artifact/src/index.d.ts +46 -0
- package/dist/modules/artifact/src/index.d.ts.map +1 -0
- package/dist/modules/artifact/src/index.js +563 -0
- package/dist/modules/artifact/src/index.js.map +1 -0
- package/dist/modules/artifact/src/trust-history.d.ts +3 -0
- package/dist/modules/artifact/src/trust-history.d.ts.map +1 -0
- package/dist/modules/artifact/src/trust-history.js +134 -0
- package/dist/modules/artifact/src/trust-history.js.map +1 -0
- package/dist/modules/assets/src/authority-bundle.d.ts +36 -0
- package/dist/modules/assets/src/authority-bundle.d.ts.map +1 -0
- package/dist/modules/assets/src/authority-bundle.js +206 -0
- package/dist/modules/assets/src/authority-bundle.js.map +1 -0
- package/dist/modules/assets/src/delta.d.ts +18 -0
- package/dist/modules/assets/src/delta.d.ts.map +1 -0
- package/dist/modules/assets/src/delta.js +183 -0
- package/dist/modules/assets/src/delta.js.map +1 -0
- package/dist/modules/assets/src/disposition.d.ts +3 -0
- package/dist/modules/assets/src/disposition.d.ts.map +1 -0
- package/dist/modules/assets/src/disposition.js +30 -0
- package/dist/modules/assets/src/disposition.js.map +1 -0
- package/dist/modules/assets/src/index.d.ts +25 -0
- package/dist/modules/assets/src/index.d.ts.map +1 -0
- package/dist/modules/assets/src/index.js +234 -0
- package/dist/modules/assets/src/index.js.map +1 -0
- package/dist/modules/assets/src/ingestion.d.ts +69 -0
- package/dist/modules/assets/src/ingestion.d.ts.map +1 -0
- package/dist/modules/assets/src/ingestion.js +169 -0
- package/dist/modules/assets/src/ingestion.js.map +1 -0
- package/dist/modules/authority/src/index.d.ts +47 -0
- package/dist/modules/authority/src/index.d.ts.map +1 -0
- package/dist/modules/authority/src/index.js +349 -0
- package/dist/modules/authority/src/index.js.map +1 -0
- package/dist/modules/authority-state/src/index.d.ts +43 -0
- package/dist/modules/authority-state/src/index.d.ts.map +1 -0
- package/dist/modules/authority-state/src/index.js +194 -0
- package/dist/modules/authority-state/src/index.js.map +1 -0
- package/dist/modules/catalog-admission/src/admission-conflicts.d.ts +424 -0
- package/dist/modules/catalog-admission/src/admission-conflicts.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/admission-conflicts.js +369 -0
- package/dist/modules/catalog-admission/src/admission-conflicts.js.map +1 -0
- package/dist/modules/catalog-admission/src/index.d.ts +248 -0
- package/dist/modules/catalog-admission/src/index.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/index.js +601 -0
- package/dist/modules/catalog-admission/src/index.js.map +1 -0
- package/dist/modules/catalog-admission/src/machine-admission.d.ts +1273 -0
- package/dist/modules/catalog-admission/src/machine-admission.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/machine-admission.js +529 -0
- package/dist/modules/catalog-admission/src/machine-admission.js.map +1 -0
- package/dist/modules/catalog-admission/src/publication-assets.d.ts +5 -0
- package/dist/modules/catalog-admission/src/publication-assets.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/publication-assets.js +26 -0
- package/dist/modules/catalog-admission/src/publication-assets.js.map +1 -0
- package/dist/modules/catalog-admission/src/publication-dependencies.d.ts +96 -0
- package/dist/modules/catalog-admission/src/publication-dependencies.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/publication-dependencies.js +177 -0
- package/dist/modules/catalog-admission/src/publication-dependencies.js.map +1 -0
- package/dist/modules/catalog-admission/src/publication-entities.d.ts +9 -0
- package/dist/modules/catalog-admission/src/publication-entities.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/publication-entities.js +48 -0
- package/dist/modules/catalog-admission/src/publication-entities.js.map +1 -0
- package/dist/modules/catalog-admission/src/publication-recomposition.d.ts +42 -0
- package/dist/modules/catalog-admission/src/publication-recomposition.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/publication-recomposition.js +163 -0
- package/dist/modules/catalog-admission/src/publication-recomposition.js.map +1 -0
- package/dist/modules/catalog-admission/src/publication.d.ts +92 -0
- package/dist/modules/catalog-admission/src/publication.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/publication.js +605 -0
- package/dist/modules/catalog-admission/src/publication.js.map +1 -0
- package/dist/modules/catalog-admission/src/submission.d.ts +47 -0
- package/dist/modules/catalog-admission/src/submission.d.ts.map +1 -0
- package/dist/modules/catalog-admission/src/submission.js +289 -0
- package/dist/modules/catalog-admission/src/submission.js.map +1 -0
- package/dist/modules/catalog-authoring-validation/src/index.d.ts +46 -0
- package/dist/modules/catalog-authoring-validation/src/index.d.ts.map +1 -0
- package/dist/modules/catalog-authoring-validation/src/index.js +98 -0
- package/dist/modules/catalog-authoring-validation/src/index.js.map +1 -0
- package/dist/modules/catalog-model/src/index.d.ts +26 -0
- package/dist/modules/catalog-model/src/index.d.ts.map +1 -0
- package/dist/modules/catalog-model/src/index.js +80 -0
- package/dist/modules/catalog-model/src/index.js.map +1 -0
- package/dist/modules/cli/src/index.d.ts +10 -0
- package/dist/modules/cli/src/index.d.ts.map +1 -0
- package/dist/modules/cli/src/index.js +31 -0
- package/dist/modules/cli/src/index.js.map +1 -0
- package/dist/modules/compiler/src/index.d.ts +23 -0
- package/dist/modules/compiler/src/index.d.ts.map +1 -0
- package/dist/modules/compiler/src/index.js +75 -0
- package/dist/modules/compiler/src/index.js.map +1 -0
- package/dist/modules/evidence-operations/src/dependency-versions.d.ts +2 -0
- package/dist/modules/evidence-operations/src/dependency-versions.d.ts.map +1 -0
- package/dist/modules/evidence-operations/src/dependency-versions.js +17 -0
- package/dist/modules/evidence-operations/src/dependency-versions.js.map +1 -0
- package/dist/modules/evidence-operations/src/evidence-normalization.d.ts +111 -0
- package/dist/modules/evidence-operations/src/evidence-normalization.d.ts.map +1 -0
- package/dist/modules/evidence-operations/src/evidence-normalization.js +309 -0
- package/dist/modules/evidence-operations/src/evidence-normalization.js.map +1 -0
- package/dist/modules/evidence-operations/src/proof-graph.d.ts +22 -0
- package/dist/modules/evidence-operations/src/proof-graph.d.ts.map +1 -0
- package/dist/modules/evidence-operations/src/proof-graph.js +188 -0
- package/dist/modules/evidence-operations/src/proof-graph.js.map +1 -0
- package/dist/modules/evidence-operations/src/source-authority.d.ts +31 -0
- package/dist/modules/evidence-operations/src/source-authority.d.ts.map +1 -0
- package/dist/modules/evidence-operations/src/source-authority.js +60 -0
- package/dist/modules/evidence-operations/src/source-authority.js.map +1 -0
- package/dist/modules/evidence-operations/src/submission-verifier.d.ts +318 -0
- package/dist/modules/evidence-operations/src/submission-verifier.d.ts.map +1 -0
- package/dist/modules/evidence-operations/src/submission-verifier.js +392 -0
- package/dist/modules/evidence-operations/src/submission-verifier.js.map +1 -0
- package/dist/modules/evidence-operations/src/url-canonicalization.d.ts +3 -0
- package/dist/modules/evidence-operations/src/url-canonicalization.d.ts.map +1 -0
- package/dist/modules/evidence-operations/src/url-canonicalization.js +7 -0
- package/dist/modules/evidence-operations/src/url-canonicalization.js.map +1 -0
- package/dist/modules/primitives/src/index.d.ts +40 -0
- package/dist/modules/primitives/src/index.d.ts.map +1 -0
- package/dist/modules/primitives/src/index.js +154 -0
- package/dist/modules/primitives/src/index.js.map +1 -0
- package/dist/modules/provenance/src/evidence-bindings.d.ts +10 -0
- package/dist/modules/provenance/src/evidence-bindings.d.ts.map +1 -0
- package/dist/modules/provenance/src/evidence-bindings.js +49 -0
- package/dist/modules/provenance/src/evidence-bindings.js.map +1 -0
- package/dist/modules/provenance/src/evidence-coverage.d.ts +35 -0
- package/dist/modules/provenance/src/evidence-coverage.d.ts.map +1 -0
- package/dist/modules/provenance/src/evidence-coverage.js +131 -0
- package/dist/modules/provenance/src/evidence-coverage.js.map +1 -0
- package/dist/modules/provenance/src/index.d.ts +68 -0
- package/dist/modules/provenance/src/index.d.ts.map +1 -0
- package/dist/modules/provenance/src/index.js +536 -0
- package/dist/modules/provenance/src/index.js.map +1 -0
- package/dist/modules/provenance/src/material-claims.d.ts +381 -0
- package/dist/modules/provenance/src/material-claims.d.ts.map +1 -0
- package/dist/modules/provenance/src/material-claims.js +375 -0
- package/dist/modules/provenance/src/material-claims.js.map +1 -0
- package/dist/modules/provenance/src/prospective-evidence.d.ts +6 -0
- package/dist/modules/provenance/src/prospective-evidence.d.ts.map +1 -0
- package/dist/modules/provenance/src/prospective-evidence.js +61 -0
- package/dist/modules/provenance/src/prospective-evidence.js.map +1 -0
- package/dist/modules/release/src/asset-delta-verifier.d.ts +12 -0
- package/dist/modules/release/src/asset-delta-verifier.d.ts.map +1 -0
- package/dist/modules/release/src/asset-delta-verifier.js +82 -0
- package/dist/modules/release/src/asset-delta-verifier.js.map +1 -0
- package/dist/modules/release/src/changes.d.ts +23 -0
- package/dist/modules/release/src/changes.d.ts.map +1 -0
- package/dist/modules/release/src/changes.js +389 -0
- package/dist/modules/release/src/changes.js.map +1 -0
- package/dist/modules/release/src/identity.d.ts +17 -0
- package/dist/modules/release/src/identity.d.ts.map +1 -0
- package/dist/modules/release/src/identity.js +433 -0
- package/dist/modules/release/src/identity.js.map +1 -0
- package/dist/modules/release/src/inputs.d.ts +89 -0
- package/dist/modules/release/src/inputs.d.ts.map +1 -0
- package/dist/modules/release/src/inputs.js +514 -0
- package/dist/modules/release/src/inputs.js.map +1 -0
- package/dist/modules/release/src/publication-inputs.d.ts +9 -0
- package/dist/modules/release/src/publication-inputs.d.ts.map +1 -0
- package/dist/modules/release/src/publication-inputs.js +67 -0
- package/dist/modules/release/src/publication-inputs.js.map +1 -0
- package/dist/modules/release/src/release-directory-files.d.ts +7 -0
- package/dist/modules/release/src/release-directory-files.d.ts.map +1 -0
- package/dist/modules/release/src/release-directory-files.js +49 -0
- package/dist/modules/release/src/release-directory-files.js.map +1 -0
- package/dist/modules/release/src/release-revision-parser.d.ts +5 -0
- package/dist/modules/release/src/release-revision-parser.d.ts.map +1 -0
- package/dist/modules/release/src/release-revision-parser.js +19 -0
- package/dist/modules/release/src/release-revision-parser.js.map +1 -0
- package/dist/modules/release/src/transition.d.ts +36 -0
- package/dist/modules/release/src/transition.d.ts.map +1 -0
- package/dist/modules/release/src/transition.js +263 -0
- package/dist/modules/release/src/transition.js.map +1 -0
- package/dist/modules/release/src/verification-policies.d.ts +278 -0
- package/dist/modules/release/src/verification-policies.d.ts.map +1 -0
- package/dist/modules/release/src/verification-policies.js +38 -0
- package/dist/modules/release/src/verification-policies.js.map +1 -0
- package/dist/modules/release/src/verification-transitions.d.ts +14 -0
- package/dist/modules/release/src/verification-transitions.d.ts.map +1 -0
- package/dist/modules/release/src/verification-transitions.js +26 -0
- package/dist/modules/release/src/verification-transitions.js.map +1 -0
- package/dist/modules/release/src/verifier.d.ts +41 -0
- package/dist/modules/release/src/verifier.d.ts.map +1 -0
- package/dist/modules/release/src/verifier.js +577 -0
- package/dist/modules/release/src/verifier.js.map +1 -0
- package/dist/modules/standard-adapter-runtime/src/index.d.ts +16 -0
- package/dist/modules/standard-adapter-runtime/src/index.d.ts.map +1 -0
- package/dist/modules/standard-adapter-runtime/src/index.js +43 -0
- package/dist/modules/standard-adapter-runtime/src/index.js.map +1 -0
- package/dist/modules/standard-evidence/src/index.d.ts +33 -0
- package/dist/modules/standard-evidence/src/index.d.ts.map +1 -0
- package/dist/modules/standard-evidence/src/index.js +149 -0
- package/dist/modules/standard-evidence/src/index.js.map +1 -0
- package/dist/packages/catalog-verifier/src/application.d.ts +89 -0
- package/dist/packages/catalog-verifier/src/application.d.ts.map +1 -0
- package/dist/packages/catalog-verifier/src/application.js +363 -0
- package/dist/packages/catalog-verifier/src/application.js.map +1 -0
- package/dist/packages/catalog-verifier/src/index.d.ts +7 -0
- package/dist/packages/catalog-verifier/src/index.d.ts.map +1 -0
- package/dist/packages/catalog-verifier/src/index.js +7 -0
- package/dist/packages/catalog-verifier/src/index.js.map +1 -0
- package/dist/packages/catalog-verifier/src/program.d.ts +4 -0
- package/dist/packages/catalog-verifier/src/program.d.ts.map +1 -0
- package/dist/packages/catalog-verifier/src/program.js +203 -0
- package/dist/packages/catalog-verifier/src/program.js.map +1 -0
- package/package.json +63 -0
- package/sourcey-catalog-verify.js +7 -0
- package/taxonomy.json +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../modules/authority/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { createPublicKey, verify } from "node:crypto";
|
|
2
|
+
import { rootSetTransitionCoreSchema, rootSetTransitionSchema, signerRegistryCoreSchema, signerRegistrySchema, } from "../../../contracts/authority/src/index.js";
|
|
3
|
+
import { catalogVerifierIdentityContextCoreSchema, catalogVerifierIdentityContextSchema, } from "../../../contracts/catalog-verifier/src/index.js";
|
|
4
|
+
import { catalogEventCoreSchema, catalogEventSchema, } from "../../../contracts/events/src/index.js";
|
|
5
|
+
import { captureReceiptCoreSchema, captureReceiptSchema, evidenceReviewDecisionCoreSchema, } from "../../../contracts/evidence/src/index.js";
|
|
6
|
+
import { changeCursorCoreSchema, changeCursorSchema, searchCursorCoreSchema, searchCursorSchema, } from "../../../contracts/feed/src/index.js";
|
|
7
|
+
import { releasePublicationCoreSchema, releasePublicationSchema, } from "../../../contracts/release/src/index.js";
|
|
8
|
+
import { canonicalJson, digest } from "../../primitives/src/index.js";
|
|
9
|
+
const REGISTRY_DOMAIN = "sourcey:signer-registry:v1alpha1";
|
|
10
|
+
const CAPTURE_RECEIPT_DOMAIN = "sourcey:capture-receipt:v1alpha1";
|
|
11
|
+
const EVENT_DOMAIN = "sourcey:catalog-event:v1alpha1";
|
|
12
|
+
const RELEASE_DOMAIN = "sourcey:release-publication:v1alpha1";
|
|
13
|
+
const FEED_CURSOR_DOMAIN = "sourcey:change-cursor:v1alpha1";
|
|
14
|
+
const ROOT_TRANSITION_DOMAIN = "sourcey:root-set-transition:v1alpha1";
|
|
15
|
+
const VERIFIER_IDENTITY_CONTEXT_DOMAIN = "sourcey:catalog-verifier-identity-context:v1alpha1";
|
|
16
|
+
export function signaturePurposeForKind(kind) {
|
|
17
|
+
if (kind === "evidence.bound" ||
|
|
18
|
+
kind === "evidence.retracted" ||
|
|
19
|
+
kind === "discrepancy.resolved") {
|
|
20
|
+
return "catalog-evidence";
|
|
21
|
+
}
|
|
22
|
+
if (kind.startsWith("authority."))
|
|
23
|
+
return "catalog-authority";
|
|
24
|
+
if (kind === "subject.attested" || kind === "attestation.revoked") {
|
|
25
|
+
return "catalog-attestation";
|
|
26
|
+
}
|
|
27
|
+
if (kind.startsWith("verification."))
|
|
28
|
+
return "catalog-verification";
|
|
29
|
+
if (kind.startsWith("freshness."))
|
|
30
|
+
return "catalog-policy";
|
|
31
|
+
if (kind.startsWith("dispute."))
|
|
32
|
+
return "catalog-dispute";
|
|
33
|
+
return "catalog-identity";
|
|
34
|
+
}
|
|
35
|
+
export function signerRegistryPreimage(core) {
|
|
36
|
+
return Buffer.from(`${REGISTRY_DOMAIN}\0${canonicalJson(core)}`, "utf8");
|
|
37
|
+
}
|
|
38
|
+
export function rootSetTransitionPreimage(core) {
|
|
39
|
+
return Buffer.from(`${ROOT_TRANSITION_DOMAIN}\0${canonicalJson(core)}`, "utf8");
|
|
40
|
+
}
|
|
41
|
+
export function validateRootSetTransition(input) {
|
|
42
|
+
const transition = rootSetTransitionSchema.parse(input.transition);
|
|
43
|
+
const { transition_digest: transitionDigest, previous_root_signatures: previousSignatures, next_root_signatures: nextSignatures, ...coreInput } = transition;
|
|
44
|
+
const core = rootSetTransitionCoreSchema.parse(coreInput);
|
|
45
|
+
if (digest(core) !== transitionDigest)
|
|
46
|
+
throw new Error("Root-set transition digest mismatch.");
|
|
47
|
+
if (core.previous_root_set_digest !== digest(input.previousRootSet) ||
|
|
48
|
+
core.next_root_set_digest !== digest(input.nextRootSet) ||
|
|
49
|
+
core.previous_generation !== input.previousRootSet.generation ||
|
|
50
|
+
core.next_generation !== input.nextRootSet.generation ||
|
|
51
|
+
core.next_generation !== core.previous_generation + 1 ||
|
|
52
|
+
core.effective_release_sequence !== input.releaseSequence) {
|
|
53
|
+
throw new Error("Root-set transition does not bind the exact adjacent trust generations.");
|
|
54
|
+
}
|
|
55
|
+
const preimage = rootSetTransitionPreimage(core);
|
|
56
|
+
assertRootThreshold(input.previousRootSet, previousSignatures, preimage, "previous");
|
|
57
|
+
assertRootThreshold(input.nextRootSet, nextSignatures, preimage, "next");
|
|
58
|
+
return transition;
|
|
59
|
+
}
|
|
60
|
+
function assertRootThreshold(roots, signatures, preimage, label) {
|
|
61
|
+
const keys = new Map(roots.keys.map((key) => [key.key_id, key]));
|
|
62
|
+
const valid = new Set();
|
|
63
|
+
for (const signature of signatures) {
|
|
64
|
+
const key = keys.get(signature.key_id);
|
|
65
|
+
if (key &&
|
|
66
|
+
!valid.has(key.key_id) &&
|
|
67
|
+
verify(null, preimage, createPublicKey(key.public_key_pem), Buffer.from(signature.signature, "base64"))) {
|
|
68
|
+
valid.add(key.key_id);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (valid.size < roots.threshold) {
|
|
72
|
+
throw new Error(`Root-set transition has ${valid.size} valid ${label} signatures; ${roots.threshold} required.`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function eventSignaturePreimage(core, eventId, protectedHeader) {
|
|
76
|
+
return Buffer.from(`${EVENT_DOMAIN}\0${protectedHeader.signature_purpose}\0${canonicalJson({
|
|
77
|
+
event_id: eventId,
|
|
78
|
+
event_core_digest: digest(core),
|
|
79
|
+
protected: protectedHeader,
|
|
80
|
+
})}`, "utf8");
|
|
81
|
+
}
|
|
82
|
+
export function captureReceiptSignaturePreimage(core, receiptDigest, protectedHeader) {
|
|
83
|
+
return Buffer.from(`${CAPTURE_RECEIPT_DOMAIN}\0${protectedHeader.signature_purpose}\0${canonicalJson({
|
|
84
|
+
receipt_digest: receiptDigest,
|
|
85
|
+
receipt_core_digest: digest(core),
|
|
86
|
+
protected: protectedHeader,
|
|
87
|
+
})}`, "utf8");
|
|
88
|
+
}
|
|
89
|
+
export function releasePublicationSignaturePreimage(core, publicationDigest, protectedHeader) {
|
|
90
|
+
return Buffer.from(`${RELEASE_DOMAIN}\0${protectedHeader.signature_purpose}\0${canonicalJson({
|
|
91
|
+
publication_digest: publicationDigest,
|
|
92
|
+
publication_core_digest: digest(core),
|
|
93
|
+
protected: protectedHeader,
|
|
94
|
+
})}`, "utf8");
|
|
95
|
+
}
|
|
96
|
+
export function changeCursorSignaturePreimage(core, cursorDigest, protectedHeader) {
|
|
97
|
+
return Buffer.from(`${FEED_CURSOR_DOMAIN}\0${protectedHeader.signature_purpose}\0${canonicalJson({
|
|
98
|
+
cursor_digest: cursorDigest,
|
|
99
|
+
cursor_core_digest: digest(core),
|
|
100
|
+
protected: protectedHeader,
|
|
101
|
+
})}`, "utf8");
|
|
102
|
+
}
|
|
103
|
+
export function catalogVerifierIdentityContextSignaturePreimage(core, contextDigest, protectedHeader) {
|
|
104
|
+
return Buffer.from(`${VERIFIER_IDENTITY_CONTEXT_DOMAIN}\0${protectedHeader.signature_purpose}\0${canonicalJson({
|
|
105
|
+
context_digest: contextDigest,
|
|
106
|
+
context_core_digest: digest(core),
|
|
107
|
+
protected: protectedHeader,
|
|
108
|
+
})}`, "utf8");
|
|
109
|
+
}
|
|
110
|
+
export function validateCatalogVerifierIdentityContext(input, registry, verifiedAt) {
|
|
111
|
+
const context = catalogVerifierIdentityContextSchema.parse(input);
|
|
112
|
+
const { context_digest: contextDigest, protected: protectedSignature, ...coreInput } = context;
|
|
113
|
+
const core = catalogVerifierIdentityContextCoreSchema.parse(coreInput);
|
|
114
|
+
if (digest(core) !== contextDigest) {
|
|
115
|
+
throw new Error("Catalog verifier identity context digest mismatch.");
|
|
116
|
+
}
|
|
117
|
+
if (protectedSignature.signature_purpose !== "catalog-identity" ||
|
|
118
|
+
protectedSignature.signer_registry_digest !== registry.registry_digest) {
|
|
119
|
+
throw new Error("Catalog verifier identity context uses invalid protected authority.");
|
|
120
|
+
}
|
|
121
|
+
const issuer = registry.issuers.find((candidate) => candidate.keys.some((key) => key.key_id === protectedSignature.key_id));
|
|
122
|
+
const key = issuer?.keys.find((candidate) => candidate.key_id === protectedSignature.key_id);
|
|
123
|
+
if (!key?.purposes.includes("catalog-identity")) {
|
|
124
|
+
throw new Error("Catalog verifier identity context signer lacks catalog-identity authority.");
|
|
125
|
+
}
|
|
126
|
+
if (context.issued_at < key.valid_from ||
|
|
127
|
+
(key.valid_until && context.issued_at >= key.valid_until) ||
|
|
128
|
+
(key.compromised_after_sequence !== undefined &&
|
|
129
|
+
context.live_parent_release_sequence >= key.compromised_after_sequence)) {
|
|
130
|
+
throw new Error("Catalog verifier identity context uses an ineligible signing key.");
|
|
131
|
+
}
|
|
132
|
+
const verificationInstant = Date.parse(verifiedAt);
|
|
133
|
+
if (!Number.isFinite(verificationInstant) ||
|
|
134
|
+
verificationInstant < Date.parse(context.issued_at) ||
|
|
135
|
+
verificationInstant >= Date.parse(context.expires_at)) {
|
|
136
|
+
throw new Error("Catalog verifier identity context is outside its signed freshness interval.");
|
|
137
|
+
}
|
|
138
|
+
const { signature, ...protectedHeader } = protectedSignature;
|
|
139
|
+
if (!verify(null, catalogVerifierIdentityContextSignaturePreimage(core, contextDigest, protectedHeader), createPublicKey(key.public_key_pem), Buffer.from(signature, "base64"))) {
|
|
140
|
+
throw new Error("Catalog verifier identity context has an invalid protected signature.");
|
|
141
|
+
}
|
|
142
|
+
return context;
|
|
143
|
+
}
|
|
144
|
+
export function validateSearchCursor(input, registry, context) {
|
|
145
|
+
const cursor = searchCursorSchema.parse(input);
|
|
146
|
+
const { cursor_digest: cursorDigest, protected: protectedSignature, ...coreInput } = cursor;
|
|
147
|
+
const core = searchCursorCoreSchema.parse(coreInput);
|
|
148
|
+
if (cursorDigest !== digest(core))
|
|
149
|
+
throw new Error("Search cursor digest mismatch.");
|
|
150
|
+
if (protectedSignature.signature_purpose !== "catalog-feed" ||
|
|
151
|
+
protectedSignature.signer_registry_digest !== registry.registry_digest) {
|
|
152
|
+
throw new Error("Search cursor uses invalid protected authority.");
|
|
153
|
+
}
|
|
154
|
+
const issuer = registry.issuers.find((candidate) => candidate.keys.some((key) => key.key_id === protectedSignature.key_id));
|
|
155
|
+
const key = issuer?.keys.find((candidate) => candidate.key_id === protectedSignature.key_id);
|
|
156
|
+
if (!key?.purposes.includes("catalog-feed")) {
|
|
157
|
+
throw new Error("Search cursor signer is not authorized for catalog-feed.");
|
|
158
|
+
}
|
|
159
|
+
if (key.compromised_after_sequence !== undefined &&
|
|
160
|
+
(context === undefined || context.releaseSequence >= key.compromised_after_sequence)) {
|
|
161
|
+
throw new Error("Search cursor uses a key rejected for this release.");
|
|
162
|
+
}
|
|
163
|
+
const { signature, ...protectedHeader } = protectedSignature;
|
|
164
|
+
if (!verify(null, changeCursorSignaturePreimage(core, cursorDigest, protectedHeader), createPublicKey(key.public_key_pem), Buffer.from(signature, "base64"))) {
|
|
165
|
+
throw new Error("Search cursor signature is invalid.");
|
|
166
|
+
}
|
|
167
|
+
return cursor;
|
|
168
|
+
}
|
|
169
|
+
export function validateSignerRegistry(rootSet, input) {
|
|
170
|
+
const registry = signerRegistrySchema.parse(input);
|
|
171
|
+
const { registry_digest: registryDigest, root_signatures: signatures, ...coreInput } = registry;
|
|
172
|
+
const core = signerRegistryCoreSchema.parse(coreInput);
|
|
173
|
+
const expectedDigest = digest(core);
|
|
174
|
+
if (registryDigest !== expectedDigest) {
|
|
175
|
+
throw new Error(`Signer registry digest mismatch: expected ${expectedDigest}, received ${registryDigest}.`);
|
|
176
|
+
}
|
|
177
|
+
const roots = new Map(rootSet.keys.map((key) => [key.key_id, key]));
|
|
178
|
+
const valid = new Set();
|
|
179
|
+
const preimage = signerRegistryPreimage(core);
|
|
180
|
+
for (const signature of signatures) {
|
|
181
|
+
const root = roots.get(signature.key_id);
|
|
182
|
+
if (!root || valid.has(root.key_id))
|
|
183
|
+
continue;
|
|
184
|
+
if (verify(null, preimage, createPublicKey(root.public_key_pem), Buffer.from(signature.signature, "base64"))) {
|
|
185
|
+
valid.add(root.key_id);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (valid.size < rootSet.threshold) {
|
|
189
|
+
throw new Error(`Signer registry has ${valid.size} valid root signatures; ${rootSet.threshold} required.`);
|
|
190
|
+
}
|
|
191
|
+
return registry;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Resolve the one registry authority that may issue a purpose-bound object at
|
|
195
|
+
* an exact instant and release. This is deliberately independent of private
|
|
196
|
+
* key custody: callers learn only the public issuer/key identity that their
|
|
197
|
+
* immutable object must name.
|
|
198
|
+
*/
|
|
199
|
+
export function resolveActiveSignerAuthority(registry, input) {
|
|
200
|
+
const instant = Date.parse(input.at);
|
|
201
|
+
if (!Number.isFinite(instant))
|
|
202
|
+
throw new Error("Signer authority time is invalid.");
|
|
203
|
+
if (!Number.isInteger(input.releaseSequence) || input.releaseSequence <= 0) {
|
|
204
|
+
throw new Error("Signer authority release sequence must be a positive integer.");
|
|
205
|
+
}
|
|
206
|
+
const candidates = registry.issuers.flatMap((issuer) => issuer.keys
|
|
207
|
+
.filter((key) => key.purposes.includes(input.purpose) &&
|
|
208
|
+
Date.parse(key.valid_from) <= instant &&
|
|
209
|
+
(key.valid_until === undefined || instant < Date.parse(key.valid_until)) &&
|
|
210
|
+
(key.compromised_after_sequence === undefined ||
|
|
211
|
+
input.releaseSequence < key.compromised_after_sequence))
|
|
212
|
+
.map((key) => ({ issuerId: issuer.issuer_id, keyId: key.key_id })));
|
|
213
|
+
if (candidates.length !== 1 || !candidates[0]) {
|
|
214
|
+
throw new Error(`Signer registry must resolve exactly one ${input.purpose} authority at ${input.at}.`);
|
|
215
|
+
}
|
|
216
|
+
return candidates[0];
|
|
217
|
+
}
|
|
218
|
+
export function validateProtectedEvent(input, registry, releaseSequence) {
|
|
219
|
+
const event = catalogEventSchema.parse(input);
|
|
220
|
+
const { event_id: eventId, protected: protectedSignature, ...coreInput } = event;
|
|
221
|
+
const core = catalogEventCoreSchema.parse(coreInput);
|
|
222
|
+
const expectedEventId = digest(core);
|
|
223
|
+
if (eventId !== expectedEventId) {
|
|
224
|
+
throw new Error(`Event ID mismatch: expected ${expectedEventId}, received ${eventId}.`);
|
|
225
|
+
}
|
|
226
|
+
if (protectedSignature.signer_registry_digest !== registry.registry_digest) {
|
|
227
|
+
throw new Error(`Event ${eventId} does not use the release-pinned signer registry.`);
|
|
228
|
+
}
|
|
229
|
+
const expectedPurpose = signaturePurposeForKind(event.kind);
|
|
230
|
+
if (protectedSignature.signature_purpose !== expectedPurpose) {
|
|
231
|
+
throw new Error(`Event ${eventId} uses ${protectedSignature.signature_purpose}; ${expectedPurpose} required.`);
|
|
232
|
+
}
|
|
233
|
+
const issuer = registry.issuers.find((candidate) => candidate.issuer_id === event.issuer_id);
|
|
234
|
+
const key = issuer?.keys.find((candidate) => candidate.key_id === protectedSignature.key_id);
|
|
235
|
+
if (!issuer || !key) {
|
|
236
|
+
throw new Error(`Event ${eventId} signer is absent from the pinned registry.`);
|
|
237
|
+
}
|
|
238
|
+
if (!key.purposes.includes(expectedPurpose)) {
|
|
239
|
+
throw new Error(`Event ${eventId} signer is not authorized for ${expectedPurpose}.`);
|
|
240
|
+
}
|
|
241
|
+
if (event.occurred_at < key.valid_from ||
|
|
242
|
+
(key.valid_until && event.occurred_at >= key.valid_until)) {
|
|
243
|
+
throw new Error(`Event ${eventId} falls outside its signer's validity interval.`);
|
|
244
|
+
}
|
|
245
|
+
if (key.compromised_after_sequence !== undefined &&
|
|
246
|
+
releaseSequence >= key.compromised_after_sequence) {
|
|
247
|
+
throw new Error(`Event ${eventId} uses a key rejected at this release sequence.`);
|
|
248
|
+
}
|
|
249
|
+
const { signature, ...protectedHeader } = protectedSignature;
|
|
250
|
+
if (!verify(null, eventSignaturePreimage(core, eventId, protectedHeader), createPublicKey(key.public_key_pem), Buffer.from(signature, "base64"))) {
|
|
251
|
+
throw new Error(`Event ${eventId} has an invalid protected signature.`);
|
|
252
|
+
}
|
|
253
|
+
return event;
|
|
254
|
+
}
|
|
255
|
+
export function validateProtectedCaptureReceipt(input, registry, releaseSequence) {
|
|
256
|
+
const receipt = captureReceiptSchema.parse(input);
|
|
257
|
+
const { receipt_digest: receiptDigest, protected: protectedSignature, ...coreInput } = receipt;
|
|
258
|
+
const core = captureReceiptCoreSchema.parse(coreInput);
|
|
259
|
+
const expectedDigest = digest(core);
|
|
260
|
+
if (receiptDigest !== expectedDigest) {
|
|
261
|
+
throw new Error(`Capture receipt digest mismatch: expected ${expectedDigest}, received ${receiptDigest}.`);
|
|
262
|
+
}
|
|
263
|
+
const { decision_digest: decisionDigest, ...decisionCore } = receipt.review_decision;
|
|
264
|
+
if (digest(evidenceReviewDecisionCoreSchema.parse(decisionCore)) !== decisionDigest ||
|
|
265
|
+
receipt.review_decision.decision !== "approved") {
|
|
266
|
+
throw new Error(`Capture receipt ${receiptDigest} lacks its exact approved review decision.`);
|
|
267
|
+
}
|
|
268
|
+
if (protectedSignature.signature_purpose !== "catalog-capture" ||
|
|
269
|
+
protectedSignature.signer_registry_digest !== registry.registry_digest) {
|
|
270
|
+
throw new Error(`Capture receipt ${receiptDigest} uses invalid protected authority.`);
|
|
271
|
+
}
|
|
272
|
+
const issuer = registry.issuers.find((candidate) => candidate.issuer_id === receipt.issuer_id);
|
|
273
|
+
const key = issuer?.keys.find((candidate) => candidate.key_id === protectedSignature.key_id);
|
|
274
|
+
if (!issuer || !key?.purposes.includes("catalog-capture")) {
|
|
275
|
+
throw new Error(`Capture receipt ${receiptDigest} signer lacks catalog-capture authority.`);
|
|
276
|
+
}
|
|
277
|
+
if (receipt.issued_at < key.valid_from ||
|
|
278
|
+
(key.valid_until && receipt.issued_at >= key.valid_until)) {
|
|
279
|
+
throw new Error(`Capture receipt ${receiptDigest} falls outside signer validity.`);
|
|
280
|
+
}
|
|
281
|
+
if (key.compromised_after_sequence !== undefined &&
|
|
282
|
+
releaseSequence >= key.compromised_after_sequence) {
|
|
283
|
+
throw new Error(`Capture receipt ${receiptDigest} uses a rejected key.`);
|
|
284
|
+
}
|
|
285
|
+
const { signature, ...protectedHeader } = protectedSignature;
|
|
286
|
+
if (!verify(null, captureReceiptSignaturePreimage(core, receiptDigest, protectedHeader), createPublicKey(key.public_key_pem), Buffer.from(signature, "base64"))) {
|
|
287
|
+
throw new Error(`Capture receipt ${receiptDigest} has an invalid protected signature.`);
|
|
288
|
+
}
|
|
289
|
+
return receipt;
|
|
290
|
+
}
|
|
291
|
+
export function validateReleasePublication(input, registry) {
|
|
292
|
+
const publication = releasePublicationSchema.parse(input);
|
|
293
|
+
const { publication_digest: publicationDigest, protected: protectedSignature, ...coreInput } = publication;
|
|
294
|
+
const core = releasePublicationCoreSchema.parse(coreInput);
|
|
295
|
+
const expectedDigest = digest(core);
|
|
296
|
+
if (publicationDigest !== expectedDigest) {
|
|
297
|
+
throw new Error(`Publication digest mismatch: expected ${expectedDigest}, received ${publicationDigest}.`);
|
|
298
|
+
}
|
|
299
|
+
if (protectedSignature.signature_purpose !== "catalog-release") {
|
|
300
|
+
throw new Error("Release publication requires a catalog-release signature.");
|
|
301
|
+
}
|
|
302
|
+
if (protectedSignature.signer_registry_digest !== registry.registry_digest) {
|
|
303
|
+
throw new Error("Release publication does not use the bundle-pinned signer registry.");
|
|
304
|
+
}
|
|
305
|
+
const issuer = registry.issuers.find((candidate) => candidate.keys.some((key) => key.key_id === protectedSignature.key_id));
|
|
306
|
+
const key = issuer?.keys.find((candidate) => candidate.key_id === protectedSignature.key_id);
|
|
307
|
+
if (!issuer || !key?.purposes.includes("catalog-release")) {
|
|
308
|
+
throw new Error("Release publication signer is not authorized for catalog-release.");
|
|
309
|
+
}
|
|
310
|
+
if (publication.published_at < key.valid_from ||
|
|
311
|
+
(key.valid_until && publication.published_at >= key.valid_until)) {
|
|
312
|
+
throw new Error("Release publication falls outside its signer's validity interval.");
|
|
313
|
+
}
|
|
314
|
+
if (key.compromised_after_sequence !== undefined &&
|
|
315
|
+
publication.release_sequence >= key.compromised_after_sequence) {
|
|
316
|
+
throw new Error("Release publication uses a key rejected at this release sequence.");
|
|
317
|
+
}
|
|
318
|
+
const { signature, ...protectedHeader } = protectedSignature;
|
|
319
|
+
if (!verify(null, releasePublicationSignaturePreimage(core, publicationDigest, protectedHeader), createPublicKey(key.public_key_pem), Buffer.from(signature, "base64"))) {
|
|
320
|
+
throw new Error("Release publication has an invalid protected signature.");
|
|
321
|
+
}
|
|
322
|
+
return publication;
|
|
323
|
+
}
|
|
324
|
+
export function validateChangeCursor(input, registry, context) {
|
|
325
|
+
const cursor = changeCursorSchema.parse(input);
|
|
326
|
+
const { cursor_digest: cursorDigest, protected: protectedSignature, ...coreInput } = cursor;
|
|
327
|
+
const core = changeCursorCoreSchema.parse(coreInput);
|
|
328
|
+
if (cursorDigest !== digest(core))
|
|
329
|
+
throw new Error("Change cursor digest mismatch.");
|
|
330
|
+
if (protectedSignature.signature_purpose !== "catalog-feed" ||
|
|
331
|
+
protectedSignature.signer_registry_digest !== registry.registry_digest) {
|
|
332
|
+
throw new Error("Change cursor uses invalid protected authority.");
|
|
333
|
+
}
|
|
334
|
+
const issuer = registry.issuers.find((candidate) => candidate.keys.some((key) => key.key_id === protectedSignature.key_id));
|
|
335
|
+
const key = issuer?.keys.find((candidate) => candidate.key_id === protectedSignature.key_id);
|
|
336
|
+
if (!key?.purposes.includes("catalog-feed")) {
|
|
337
|
+
throw new Error("Change cursor signer is not authorized for catalog-feed.");
|
|
338
|
+
}
|
|
339
|
+
if (key.compromised_after_sequence !== undefined &&
|
|
340
|
+
(context === undefined || context.releaseSequence >= key.compromised_after_sequence)) {
|
|
341
|
+
throw new Error("Change cursor uses a key rejected for this release.");
|
|
342
|
+
}
|
|
343
|
+
const { signature, ...protectedHeader } = protectedSignature;
|
|
344
|
+
if (!verify(null, changeCursorSignaturePreimage(core, cursorDigest, protectedHeader), createPublicKey(key.public_key_pem), Buffer.from(signature, "base64"))) {
|
|
345
|
+
throw new Error("Change cursor signature is invalid.");
|
|
346
|
+
}
|
|
347
|
+
return cursor;
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../modules/authority/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { CatalogEvent } from "../../../contracts/events/src/index.js";
|
|
2
|
+
import type { EntityRevision } from "../../../contracts/revisions/src/index.js";
|
|
3
|
+
import { type Digest } from "../../primitives/src/index.js";
|
|
4
|
+
export interface ActiveAuthorityClaim {
|
|
5
|
+
readonly authorityClaimId: string;
|
|
6
|
+
readonly entityId: string;
|
|
7
|
+
readonly authorizedIssuerId: string;
|
|
8
|
+
readonly controlledDomain: string;
|
|
9
|
+
readonly validUntil: string;
|
|
10
|
+
readonly eventIds: readonly Digest[];
|
|
11
|
+
}
|
|
12
|
+
export interface AuthorityState {
|
|
13
|
+
readonly activeClaims: ReadonlyMap<string, ActiveAuthorityClaim>;
|
|
14
|
+
readonly activeAttestations: readonly CatalogEvent[];
|
|
15
|
+
}
|
|
16
|
+
export interface EntityIdentityAuthorityClosure {
|
|
17
|
+
readonly canonical_entity_resolutions: Readonly<Record<string, string>>;
|
|
18
|
+
readonly split_relationships: Readonly<Record<string, readonly string[]>>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The canonical domain used when opening a new authority claim. A claim is
|
|
22
|
+
* bound to the Entity revision, so this comes from its domain contract rather
|
|
23
|
+
* than from a presentation URL that may use `www` or another site hostname.
|
|
24
|
+
*/
|
|
25
|
+
export declare function currentEntityPrimaryDomain(revision: EntityRevision): string;
|
|
26
|
+
/**
|
|
27
|
+
* Exact current hostnames that can support authority for an Entity revision.
|
|
28
|
+
* The primary domain is canonical. The recorded site hostname is retained as
|
|
29
|
+
* an authority domain only when it is the primary domain or one of its
|
|
30
|
+
* subdomains; this admits an exact official `www` proof without treating an
|
|
31
|
+
* arbitrary or cross-domain link as vendor authority.
|
|
32
|
+
*/
|
|
33
|
+
export declare function entityClaimAuthorityDomains(revision: EntityRevision): readonly string[];
|
|
34
|
+
export declare function entityAcceptsClaimAuthorityDomain(revision: EntityRevision, domain: string): boolean;
|
|
35
|
+
export declare function deriveAuthorityState(events: readonly CatalogEvent[]): AuthorityState;
|
|
36
|
+
/** A connected Entity identity lineage may carry only one live claim authority. */
|
|
37
|
+
export declare function assertEntityIdentityAuthorityClosure(input: {
|
|
38
|
+
readonly activeClaims: ReadonlyMap<string, {
|
|
39
|
+
readonly entityId: string;
|
|
40
|
+
}>;
|
|
41
|
+
readonly identities: EntityIdentityAuthorityClosure;
|
|
42
|
+
}): void;
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../modules/authority-state/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACjE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,YAAY,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,4BAA4B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAC3E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAY3E;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,MAAM,EAAE,CAMvF;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAET;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,cAAc,CA0HpF;AAED,mFAAmF;AACnF,wBAAgB,oCAAoC,CAAC,KAAK,EAAE;IAC1D,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;CACrD,GAAG,IAAI,CA4CP"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { compareCanonicalStrings } from "../../primitives/src/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* The canonical domain used when opening a new authority claim. A claim is
|
|
4
|
+
* bound to the Entity revision, so this comes from its domain contract rather
|
|
5
|
+
* than from a presentation URL that may use `www` or another site hostname.
|
|
6
|
+
*/
|
|
7
|
+
export function currentEntityPrimaryDomain(revision) {
|
|
8
|
+
const domains = revision.content.domains.filter((domain) => domain.role === "primary" && domain.valid_until === undefined);
|
|
9
|
+
if (domains.length !== 1) {
|
|
10
|
+
throw new Error(`Entity revision ${revision.revision_digest} must have exactly one current primary domain.`);
|
|
11
|
+
}
|
|
12
|
+
const primary = domains[0];
|
|
13
|
+
if (!primary)
|
|
14
|
+
throw new Error("Entity primary domain selection failed.");
|
|
15
|
+
return primary.value.toLowerCase();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Exact current hostnames that can support authority for an Entity revision.
|
|
19
|
+
* The primary domain is canonical. The recorded site hostname is retained as
|
|
20
|
+
* an authority domain only when it is the primary domain or one of its
|
|
21
|
+
* subdomains; this admits an exact official `www` proof without treating an
|
|
22
|
+
* arbitrary or cross-domain link as vendor authority.
|
|
23
|
+
*/
|
|
24
|
+
export function entityClaimAuthorityDomains(revision) {
|
|
25
|
+
const primary = currentEntityPrimaryDomain(revision);
|
|
26
|
+
const site = new URL(revision.content.links.site).hostname.toLowerCase();
|
|
27
|
+
return [
|
|
28
|
+
...new Set([primary, ...(site === primary || site.endsWith(`.${primary}`) ? [site] : [])]),
|
|
29
|
+
].sort();
|
|
30
|
+
}
|
|
31
|
+
export function entityAcceptsClaimAuthorityDomain(revision, domain) {
|
|
32
|
+
return entityClaimAuthorityDomains(revision).includes(domain.toLowerCase());
|
|
33
|
+
}
|
|
34
|
+
export function deriveAuthorityState(events) {
|
|
35
|
+
const claims = events.filter((event) => event.kind === "authority.claimed");
|
|
36
|
+
const rechecks = indexByClaimId(events.filter((event) => event.kind === "authority.rechecked"), "authority_claim_id");
|
|
37
|
+
const revocations = indexByClaimId(events.filter((event) => event.kind === "authority.revoked"), "authority_claim_id");
|
|
38
|
+
const supersessions = indexByClaimId(events.filter((event) => event.kind === "authority.superseded"), "old_authority_claim_id");
|
|
39
|
+
const claimsById = new Map();
|
|
40
|
+
const activeClaims = new Map();
|
|
41
|
+
const revokedAttestationIds = new Set(events
|
|
42
|
+
.filter((event) => event.kind === "attestation.revoked")
|
|
43
|
+
.map((event) => payloadString(event, "target_event_id")));
|
|
44
|
+
const activeAttestations = events.filter((event) => event.kind === "subject.attested" && !revokedAttestationIds.has(event.event_id));
|
|
45
|
+
for (const claim of claims) {
|
|
46
|
+
const claimId = payloadString(claim, "authority_claim_id");
|
|
47
|
+
if (claimsById.has(claimId))
|
|
48
|
+
throw new Error(`Duplicate authority claim ID ${claimId}.`);
|
|
49
|
+
claimsById.set(claimId, claim);
|
|
50
|
+
const claimRevocations = revocations.get(claimId) ?? [];
|
|
51
|
+
const claimSupersessions = supersessions.get(claimId) ?? [];
|
|
52
|
+
for (const transition of [...claimRevocations, ...claimSupersessions]) {
|
|
53
|
+
if (transition.subject.entity_id !== claim.subject.entity_id) {
|
|
54
|
+
throw new Error(`Authority transition for ${claimId} targets another entity.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (claimRevocations.length > 1 || claimSupersessions.length > 1) {
|
|
58
|
+
throw new Error(`Authority claim ${claimId} has conflicting terminal transitions.`);
|
|
59
|
+
}
|
|
60
|
+
if (claimRevocations.length > 0 || claimSupersessions.length > 0)
|
|
61
|
+
continue;
|
|
62
|
+
const claimRechecks = [...(rechecks.get(claimId) ?? [])].sort((left, right) => compareCanonicalStrings(payloadString(left, "checked_at"), payloadString(right, "checked_at")));
|
|
63
|
+
for (const recheck of claimRechecks) {
|
|
64
|
+
if (recheck.subject.entity_id !== claim.subject.entity_id) {
|
|
65
|
+
throw new Error(`Authority recheck for ${claimId} targets another entity.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const [index, recheck] of claimRechecks.entries()) {
|
|
69
|
+
const previousBoundary = index === 0
|
|
70
|
+
? payloadString(claim, "recheck_due_at")
|
|
71
|
+
: payloadString(claimRechecks[index - 1], "next_recheck_due_at");
|
|
72
|
+
const checkedAt = payloadString(recheck, "checked_at");
|
|
73
|
+
const nextBoundary = payloadString(recheck, "next_recheck_due_at");
|
|
74
|
+
if (checkedAt > previousBoundary || nextBoundary <= checkedAt) {
|
|
75
|
+
throw new Error(`Authority claim ${claimId} has a non-contiguous recheck chain.`);
|
|
76
|
+
}
|
|
77
|
+
const peer = claimRechecks[index + 1];
|
|
78
|
+
if (peer && payloadString(peer, "checked_at") === checkedAt) {
|
|
79
|
+
throw new Error(`Authority claim ${claimId} has conflicting rechecks at ${checkedAt}.`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
activeClaims.set(claimId, {
|
|
83
|
+
authorityClaimId: claimId,
|
|
84
|
+
entityId: claim.subject.entity_id,
|
|
85
|
+
authorizedIssuerId: payloadString(claim, "authorized_issuer_id"),
|
|
86
|
+
controlledDomain: payloadString(claim, "controlled_domain"),
|
|
87
|
+
validUntil: claimRechecks.length > 0
|
|
88
|
+
? payloadString(claimRechecks.at(-1), "next_recheck_due_at")
|
|
89
|
+
: payloadString(claim, "recheck_due_at"),
|
|
90
|
+
eventIds: [
|
|
91
|
+
claim.event_id,
|
|
92
|
+
...claimRechecks.map((event) => event.event_id),
|
|
93
|
+
].sort(),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
for (const transition of [
|
|
97
|
+
...events.filter((event) => event.kind === "authority.rechecked"),
|
|
98
|
+
...events.filter((event) => event.kind === "authority.revoked"),
|
|
99
|
+
]) {
|
|
100
|
+
const claimId = payloadString(transition, "authority_claim_id");
|
|
101
|
+
if (!claimsById.has(claimId)) {
|
|
102
|
+
throw new Error(`${transition.kind} targets missing authority claim ${claimId}.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
for (const transition of events.filter((event) => event.kind === "authority.superseded")) {
|
|
106
|
+
const oldClaimId = payloadString(transition, "old_authority_claim_id");
|
|
107
|
+
const newClaimId = payloadString(transition, "new_authority_claim_id");
|
|
108
|
+
const oldClaim = claimsById.get(oldClaimId);
|
|
109
|
+
const newClaim = claimsById.get(newClaimId);
|
|
110
|
+
if (!oldClaim || !newClaim) {
|
|
111
|
+
throw new Error(`Authority supersession targets missing replacement claim ${newClaimId}.`);
|
|
112
|
+
}
|
|
113
|
+
if (oldClaim.subject.entity_id !== transition.subject.entity_id ||
|
|
114
|
+
newClaim.subject.entity_id !== transition.subject.entity_id) {
|
|
115
|
+
throw new Error("Authority supersession claims must belong to its exact entity.");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const activeByEntity = new Map();
|
|
119
|
+
for (const claim of activeClaims.values()) {
|
|
120
|
+
const prior = activeByEntity.get(claim.entityId);
|
|
121
|
+
if (prior) {
|
|
122
|
+
throw new Error(`Entity ${claim.entityId} has conflicting active authority claims ${prior} and ${claim.authorityClaimId}.`);
|
|
123
|
+
}
|
|
124
|
+
activeByEntity.set(claim.entityId, claim.authorityClaimId);
|
|
125
|
+
}
|
|
126
|
+
return { activeClaims, activeAttestations };
|
|
127
|
+
}
|
|
128
|
+
/** A connected Entity identity lineage may carry only one live claim authority. */
|
|
129
|
+
export function assertEntityIdentityAuthorityClosure(input) {
|
|
130
|
+
const adjacency = new Map();
|
|
131
|
+
const connect = (left, right) => {
|
|
132
|
+
const leftEdges = adjacency.get(left) ?? new Set();
|
|
133
|
+
const rightEdges = adjacency.get(right) ?? new Set();
|
|
134
|
+
leftEdges.add(right);
|
|
135
|
+
rightEdges.add(left);
|
|
136
|
+
adjacency.set(left, leftEdges);
|
|
137
|
+
adjacency.set(right, rightEdges);
|
|
138
|
+
};
|
|
139
|
+
for (const [source, target] of Object.entries(input.identities.canonical_entity_resolutions)) {
|
|
140
|
+
connect(source, target);
|
|
141
|
+
}
|
|
142
|
+
for (const [source, targets] of Object.entries(input.identities.split_relationships)) {
|
|
143
|
+
for (const target of targets)
|
|
144
|
+
connect(source, target);
|
|
145
|
+
}
|
|
146
|
+
const claimsByEntity = new Map();
|
|
147
|
+
for (const [claimId, claim] of input.activeClaims) {
|
|
148
|
+
claimsByEntity.set(claim.entityId, { claimId, entityId: claim.entityId });
|
|
149
|
+
}
|
|
150
|
+
const visited = new Set();
|
|
151
|
+
for (const entityId of claimsByEntity.keys()) {
|
|
152
|
+
if (visited.has(entityId))
|
|
153
|
+
continue;
|
|
154
|
+
const queue = [entityId];
|
|
155
|
+
const claims = [];
|
|
156
|
+
while (queue.length > 0) {
|
|
157
|
+
const current = queue.pop();
|
|
158
|
+
if (!current || visited.has(current))
|
|
159
|
+
continue;
|
|
160
|
+
visited.add(current);
|
|
161
|
+
const claim = claimsByEntity.get(current);
|
|
162
|
+
if (claim)
|
|
163
|
+
claims.push(claim);
|
|
164
|
+
for (const connected of adjacency.get(current) ?? []) {
|
|
165
|
+
if (!visited.has(connected))
|
|
166
|
+
queue.push(connected);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (claims.length > 1) {
|
|
170
|
+
throw new Error(`Connected Entity identities have conflicting active authority claims: ${claims
|
|
171
|
+
.map((claim) => `${claim.entityId}:${claim.claimId}`)
|
|
172
|
+
.sort(compareCanonicalStrings)
|
|
173
|
+
.join(", ")}.`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function indexByClaimId(events, field) {
|
|
178
|
+
const index = new Map();
|
|
179
|
+
for (const event of events) {
|
|
180
|
+
const key = payloadString(event, field);
|
|
181
|
+
const entries = index.get(key) ?? [];
|
|
182
|
+
entries.push(event);
|
|
183
|
+
index.set(key, entries);
|
|
184
|
+
}
|
|
185
|
+
return index;
|
|
186
|
+
}
|
|
187
|
+
function payloadString(event, field) {
|
|
188
|
+
const value = event.payload[field];
|
|
189
|
+
if (typeof value !== "string") {
|
|
190
|
+
throw new Error(`Event ${event.event_id} lacks string payload ${field}.`);
|
|
191
|
+
}
|
|
192
|
+
return value;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=index.js.map
|