@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,392 @@
|
|
|
1
|
+
import { TextDecoder } from "node:util";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { EVIDENCE_LOCATORS_PER_ASSERTION_LIMIT, evidenceAssertionSchema, evidenceCaptureDeclarationSchema, evidenceDerivationRuleSchema, evidenceProofKindSchema, evidenceReceiptSubjectSchema, evidenceSourceStandingSchema, } from "../../../contracts/evidence/src/index.js";
|
|
4
|
+
import { canonicalJson, digest, IDENTIFIER_PATTERN, sha256Bytes, } from "../../primitives/src/index.js";
|
|
5
|
+
import { evidenceNormalizerSchema, normalizeEvidenceCapture } from "./evidence-normalization.js";
|
|
6
|
+
import { hostnameWithinEntityDomains } from "./source-authority.js";
|
|
7
|
+
export { EVIDENCE_NORMALIZER, EVIDENCE_NORMALIZER_CANONICAL_LINK, EVIDENCE_NORMALIZER_CANONICAL_LINK_TOOLCHAIN, EVIDENCE_NORMALIZER_FOUNDATION, EVIDENCE_NORMALIZER_FOUNDATION_TOOLCHAIN, EVIDENCE_NORMALIZER_PRE_EMPTY_HTML_VALUES_TOOLCHAIN, EVIDENCE_NORMALIZER_PRE_EMPTY_HTML_VALUES_XML_TOOLCHAIN, EVIDENCE_NORMALIZER_PRE_JSON_VARIANTS_TOOLCHAIN, EVIDENCE_NORMALIZER_TOOLCHAIN, EVIDENCE_NORMALIZER_WEB_LINK_TOOLCHAIN, EVIDENCE_NORMALIZER_XML, EVIDENCE_NORMALIZER_XML_TOOLCHAIN, evidenceNormalizerForToolchainDigest, evidenceNormalizerSchema, normalizeEvidenceCapture, } from "./evidence-normalization.js";
|
|
8
|
+
const digestSchema = z.string().regex(/^sha256:[a-f0-9]{64}$/);
|
|
9
|
+
const pointerSchema = z.string().regex(/^\/(?:[^~/]|~0|~1)+(?:\/(?:[^~/]|~0|~1)+)*$/);
|
|
10
|
+
const utf8 = new TextDecoder("utf-8", { fatal: true });
|
|
11
|
+
export const EVIDENCE_SUBMISSION_LIMITS = {
|
|
12
|
+
captureBytes: 10 * 1024 * 1024,
|
|
13
|
+
normalizedBytes: 5 * 1024 * 1024,
|
|
14
|
+
assertions: 128,
|
|
15
|
+
locatorsPerAssertion: EVIDENCE_LOCATORS_PER_ASSERTION_LIMIT,
|
|
16
|
+
redirects: 5,
|
|
17
|
+
};
|
|
18
|
+
export const evidenceSubmissionCaptureSchema = evidenceCaptureDeclarationSchema;
|
|
19
|
+
export const evidenceSubmissionNormalizationSchema = evidenceNormalizerSchema
|
|
20
|
+
.extend({ object_digest: digestSchema })
|
|
21
|
+
.strict();
|
|
22
|
+
export const evidenceSubmissionSchema = z
|
|
23
|
+
.object({
|
|
24
|
+
submission_contract: z.literal("sourcey.evidence-submission/v1alpha1"),
|
|
25
|
+
base_revision_digest: digestSchema,
|
|
26
|
+
capture: evidenceSubmissionCaptureSchema,
|
|
27
|
+
normalization: evidenceSubmissionNormalizationSchema,
|
|
28
|
+
assertions: z.array(evidenceAssertionSchema).min(1).max(EVIDENCE_SUBMISSION_LIMITS.assertions),
|
|
29
|
+
})
|
|
30
|
+
.strict();
|
|
31
|
+
const reviewValueSchema = z
|
|
32
|
+
.object({
|
|
33
|
+
start_byte: z.number().int().nonnegative(),
|
|
34
|
+
end_byte: z.number().int().positive(),
|
|
35
|
+
value_digest: digestSchema,
|
|
36
|
+
text: z.string().min(1),
|
|
37
|
+
})
|
|
38
|
+
.strict();
|
|
39
|
+
const evidenceReviewProposalCoreSchema = z
|
|
40
|
+
.object({
|
|
41
|
+
proposal_contract: z.literal("sourcey.evidence-review-proposal/v1alpha1"),
|
|
42
|
+
operation_id: digestSchema,
|
|
43
|
+
job_id: digestSchema,
|
|
44
|
+
target_id: z.string().regex(IDENTIFIER_PATTERN),
|
|
45
|
+
base_release_id: digestSchema,
|
|
46
|
+
capture_policy_digest: digestSchema,
|
|
47
|
+
coverage_policy_digest: digestSchema,
|
|
48
|
+
subject: evidenceReceiptSubjectSchema,
|
|
49
|
+
authority_entity_revision_digest: digestSchema,
|
|
50
|
+
authority_program_revision_digest: digestSchema.nullable(),
|
|
51
|
+
submission: evidenceSubmissionSchema,
|
|
52
|
+
review_projection: z
|
|
53
|
+
.object({
|
|
54
|
+
source_standing: evidenceSourceStandingSchema,
|
|
55
|
+
assertions: z.array(z
|
|
56
|
+
.object({
|
|
57
|
+
path: pointerSchema,
|
|
58
|
+
polarity: z.enum(["supports", "contradicts"]),
|
|
59
|
+
proof_kind: evidenceProofKindSchema,
|
|
60
|
+
derivation_rule: evidenceDerivationRuleSchema.nullable(),
|
|
61
|
+
values: z.array(reviewValueSchema).min(1),
|
|
62
|
+
})
|
|
63
|
+
.strict()),
|
|
64
|
+
})
|
|
65
|
+
.strict(),
|
|
66
|
+
})
|
|
67
|
+
.strict()
|
|
68
|
+
.superRefine((value, context) => {
|
|
69
|
+
const requiresProgramAuthority = value.subject.subject_type === "offer" && value.subject.program_id !== undefined;
|
|
70
|
+
if (requiresProgramAuthority !== (value.authority_program_revision_digest !== null)) {
|
|
71
|
+
context.addIssue({
|
|
72
|
+
code: "custom",
|
|
73
|
+
path: ["authority_program_revision_digest"],
|
|
74
|
+
message: requiresProgramAuthority
|
|
75
|
+
? "Program-backed Offer review proposals require the exact authority Program revision."
|
|
76
|
+
: "Only Program-backed Offer review proposals may carry an authority Program revision.",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
export const evidenceReviewProposalSchema = evidenceReviewProposalCoreSchema
|
|
81
|
+
.extend({ proposal_digest: digestSchema })
|
|
82
|
+
.strict();
|
|
83
|
+
/**
|
|
84
|
+
* Validates the self-contained proposal envelope at a persistence or provider
|
|
85
|
+
* boundary. This intentionally does not claim that the referenced evidence is
|
|
86
|
+
* true; the offline verifier below performs that stronger check from the exact
|
|
87
|
+
* capture, normalized, and revision bytes.
|
|
88
|
+
*/
|
|
89
|
+
export function validateEvidenceReviewProposalEnvelope(proposal) {
|
|
90
|
+
const parsed = evidenceReviewProposalSchema.parse(proposal);
|
|
91
|
+
const { proposal_digest: proposalDigest, ...core } = parsed;
|
|
92
|
+
if (digest(evidenceReviewProposalCoreSchema.parse(core)) !== proposalDigest) {
|
|
93
|
+
throw new Error("Evidence review proposal digest does not match its canonical core.");
|
|
94
|
+
}
|
|
95
|
+
return parsed;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The one local-byte verification kernel used by proposal preparation and CI.
|
|
99
|
+
* It has no network, filesystem, provider, signing, or mutation dependency.
|
|
100
|
+
*/
|
|
101
|
+
export function verifyEvidenceSubmission(input) {
|
|
102
|
+
const submission = evidenceSubmissionSchema.parse(input.submission);
|
|
103
|
+
assertRevisionContentAddressed(input.revision, "subject");
|
|
104
|
+
assertRevisionContentAddressed(input.authorityEntityRevision, "authority entity");
|
|
105
|
+
if (input.authorityProgramRevision) {
|
|
106
|
+
assertRevisionContentAddressed(input.authorityProgramRevision, "authority program");
|
|
107
|
+
}
|
|
108
|
+
if (submission.base_revision_digest !== input.revision.revision_digest) {
|
|
109
|
+
throw new Error("Evidence submission targets a different base revision.");
|
|
110
|
+
}
|
|
111
|
+
assertRevisionAuthorityBindings(input);
|
|
112
|
+
const verifiedCapture = verifyEvidenceCaptureObjects({
|
|
113
|
+
capture: submission.capture,
|
|
114
|
+
normalization: submission.normalization,
|
|
115
|
+
captureBytes: input.captureBytes,
|
|
116
|
+
normalizedBytes: input.normalizedBytes,
|
|
117
|
+
});
|
|
118
|
+
const assertions = verifyEvidenceAssertions({
|
|
119
|
+
assertions: submission.assertions,
|
|
120
|
+
normalizedBytes: input.normalizedBytes,
|
|
121
|
+
revision: input.revision,
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
submission,
|
|
125
|
+
sourceStanding: deriveSourceStanding(submission.capture, input.authorityEntityRevision),
|
|
126
|
+
normalizedBytes: verifiedCapture.normalizedBytes,
|
|
127
|
+
assertions,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* The one byte-level capture verifier used before claim matching and again
|
|
132
|
+
* when accepted matches enter ordinary evidence authority.
|
|
133
|
+
*/
|
|
134
|
+
export function verifyEvidenceCaptureObjects(input) {
|
|
135
|
+
const capture = evidenceSubmissionCaptureSchema.parse(input.capture);
|
|
136
|
+
const normalization = evidenceSubmissionNormalizationSchema.parse(input.normalization);
|
|
137
|
+
if (input.captureBytes.byteLength > EVIDENCE_SUBMISSION_LIMITS.captureBytes) {
|
|
138
|
+
throw new Error("Evidence capture exceeds the verifier byte limit.");
|
|
139
|
+
}
|
|
140
|
+
if (input.normalizedBytes.byteLength > EVIDENCE_SUBMISSION_LIMITS.normalizedBytes) {
|
|
141
|
+
throw new Error("Evidence normalized object exceeds the verifier byte limit.");
|
|
142
|
+
}
|
|
143
|
+
if (sha256Bytes(input.captureBytes) !== capture.digest) {
|
|
144
|
+
throw new Error("Evidence capture bytes do not match the submission digest.");
|
|
145
|
+
}
|
|
146
|
+
assertCaptureUrls(capture);
|
|
147
|
+
assertRedirectChain(capture);
|
|
148
|
+
const normalized = normalizeEvidenceCapture({
|
|
149
|
+
bytes: input.captureBytes,
|
|
150
|
+
mediaType: capture.media_type,
|
|
151
|
+
normalizerToolchainDigest: normalization.toolchain_digest,
|
|
152
|
+
});
|
|
153
|
+
if (normalized.digest !== normalization.object_digest ||
|
|
154
|
+
sha256Bytes(input.normalizedBytes) !== normalization.object_digest ||
|
|
155
|
+
Buffer.compare(Buffer.from(normalized.bytes), Buffer.from(input.normalizedBytes)) !== 0) {
|
|
156
|
+
throw new Error("Evidence normalized bytes do not reproduce the declared object.");
|
|
157
|
+
}
|
|
158
|
+
return { capture, normalization, normalizedBytes: normalized.bytes };
|
|
159
|
+
}
|
|
160
|
+
function assertRevisionContentAddressed(revision, label) {
|
|
161
|
+
const { revision_digest: revisionDigest, ...core } = revision;
|
|
162
|
+
if (digest(core) !== revisionDigest) {
|
|
163
|
+
throw new Error(`Evidence ${label} revision is not content-addressed correctly.`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function assertRevisionAuthorityBindings(input) {
|
|
167
|
+
if (input.revision.entity_id !== input.authorityEntityRevision.entity_id) {
|
|
168
|
+
throw new Error("Evidence submission authority entity does not own the revision.");
|
|
169
|
+
}
|
|
170
|
+
if (input.revision.revision_contract === "sourcey.offer-revision/v1alpha1") {
|
|
171
|
+
if (input.revision.program_id === undefined) {
|
|
172
|
+
if (input.authorityProgramRevision !== null) {
|
|
173
|
+
throw new Error("A standalone Offer cannot carry an authority Program revision.");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else if (!input.authorityProgramRevision ||
|
|
177
|
+
input.authorityProgramRevision.entity_id !== input.revision.entity_id ||
|
|
178
|
+
input.authorityProgramRevision.program_id !== input.revision.program_id) {
|
|
179
|
+
throw new Error("Evidence submission authority Program does not own the Program-backed Offer revision.");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (input.authorityProgramRevision !== null) {
|
|
183
|
+
throw new Error("Only Program-backed Offer evidence may carry a Program authority.");
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function revisionSubject(revision) {
|
|
187
|
+
if (revision.revision_contract === "sourcey.agent-readiness-revision/v1alpha1") {
|
|
188
|
+
return {
|
|
189
|
+
subject_type: "agent_readiness_profile",
|
|
190
|
+
entity_id: revision.entity_id,
|
|
191
|
+
agent_readiness_profile_id: revision.agent_readiness_profile_id,
|
|
192
|
+
revision_digest: revision.revision_digest,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
if (revision.revision_contract === "sourcey.offer-revision/v1alpha1") {
|
|
196
|
+
return {
|
|
197
|
+
subject_type: "offer",
|
|
198
|
+
entity_id: revision.entity_id,
|
|
199
|
+
...(revision.program_id === undefined ? {} : { program_id: revision.program_id }),
|
|
200
|
+
offer_id: revision.offer_id,
|
|
201
|
+
revision_digest: revision.revision_digest,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (revision.revision_contract === "sourcey.program-revision/v1alpha1") {
|
|
205
|
+
return {
|
|
206
|
+
subject_type: "program",
|
|
207
|
+
entity_id: revision.entity_id,
|
|
208
|
+
program_id: revision.program_id,
|
|
209
|
+
revision_digest: revision.revision_digest,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
subject_type: "entity",
|
|
214
|
+
entity_id: revision.entity_id,
|
|
215
|
+
revision_digest: revision.revision_digest,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
export function verifyEvidenceAssertions(input) {
|
|
219
|
+
const paths = new Set();
|
|
220
|
+
return input.assertions.map((assertion) => {
|
|
221
|
+
if (paths.has(assertion.path)) {
|
|
222
|
+
throw new Error(`Evidence submission repeats path ${assertion.path}.`);
|
|
223
|
+
}
|
|
224
|
+
paths.add(assertion.path);
|
|
225
|
+
if (!pointerExists(revisionEvidenceValue(input.revision), assertion.path)) {
|
|
226
|
+
throw new Error(`Evidence assertion targets missing revision path ${assertion.path}.`);
|
|
227
|
+
}
|
|
228
|
+
const values = assertion.locators.map((locator) => {
|
|
229
|
+
const { start_byte: start, end_byte: end } = locator;
|
|
230
|
+
if (end <= start || end > input.normalizedBytes.byteLength) {
|
|
231
|
+
throw new Error(`Evidence locator for ${assertion.path} is outside normalized bytes.`);
|
|
232
|
+
}
|
|
233
|
+
const located = input.normalizedBytes.slice(start, end);
|
|
234
|
+
if (sha256Bytes(located) !== locator.value_digest) {
|
|
235
|
+
throw new Error(`Evidence locator digest for ${assertion.path} does not match.`);
|
|
236
|
+
}
|
|
237
|
+
const text = utf8.decode(located);
|
|
238
|
+
if (!text.trim())
|
|
239
|
+
throw new Error(`Evidence locator for ${assertion.path} is empty.`);
|
|
240
|
+
return {
|
|
241
|
+
valueDigest: locator.value_digest,
|
|
242
|
+
text,
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
return {
|
|
246
|
+
path: assertion.path,
|
|
247
|
+
polarity: assertion.polarity,
|
|
248
|
+
proofKind: assertion.proof_kind,
|
|
249
|
+
derivationRule: assertion.derivation_rule,
|
|
250
|
+
values,
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function revisionEvidenceValue(revision) {
|
|
255
|
+
return revision.revision_contract === "sourcey.agent-readiness-revision/v1alpha1"
|
|
256
|
+
? revision
|
|
257
|
+
: revision.content;
|
|
258
|
+
}
|
|
259
|
+
export function prepareEvidenceReviewProposal(input) {
|
|
260
|
+
const verified = verifyEvidenceSubmission(input);
|
|
261
|
+
const core = evidenceReviewProposalCoreSchema.parse({
|
|
262
|
+
proposal_contract: "sourcey.evidence-review-proposal/v1alpha1",
|
|
263
|
+
operation_id: input.operationId,
|
|
264
|
+
job_id: input.jobId,
|
|
265
|
+
target_id: input.targetId,
|
|
266
|
+
base_release_id: input.baseReleaseId,
|
|
267
|
+
capture_policy_digest: input.capturePolicyDigest,
|
|
268
|
+
coverage_policy_digest: input.coveragePolicyDigest,
|
|
269
|
+
subject: revisionSubject(input.revision),
|
|
270
|
+
authority_entity_revision_digest: input.authorityEntityRevision.revision_digest,
|
|
271
|
+
authority_program_revision_digest: input.authorityProgramRevision?.revision_digest ?? null,
|
|
272
|
+
submission: verified.submission,
|
|
273
|
+
review_projection: {
|
|
274
|
+
source_standing: verified.sourceStanding,
|
|
275
|
+
assertions: verified.assertions.map((assertion, assertionIndex) => ({
|
|
276
|
+
path: assertion.path,
|
|
277
|
+
polarity: assertion.polarity,
|
|
278
|
+
proof_kind: assertion.proofKind,
|
|
279
|
+
derivation_rule: assertion.derivationRule,
|
|
280
|
+
values: assertion.values.map((value, valueIndex) => {
|
|
281
|
+
const locator = verified.submission.assertions[assertionIndex]?.locators[valueIndex];
|
|
282
|
+
if (!locator)
|
|
283
|
+
throw new Error("Verified evidence locator projection is incomplete.");
|
|
284
|
+
return {
|
|
285
|
+
start_byte: locator.start_byte,
|
|
286
|
+
end_byte: locator.end_byte,
|
|
287
|
+
value_digest: value.valueDigest,
|
|
288
|
+
text: value.text,
|
|
289
|
+
};
|
|
290
|
+
}),
|
|
291
|
+
})),
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
return evidenceReviewProposalSchema.parse({
|
|
295
|
+
...core,
|
|
296
|
+
proposal_digest: digest(core),
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
export function verifyEvidenceReviewProposal(input) {
|
|
300
|
+
const proposal = validateEvidenceReviewProposalEnvelope(input.proposal);
|
|
301
|
+
if (input.expectedBaseReleaseId !== undefined &&
|
|
302
|
+
proposal.base_release_id !== input.expectedBaseReleaseId) {
|
|
303
|
+
throw new Error("Evidence review proposal targets a different base release.");
|
|
304
|
+
}
|
|
305
|
+
const expected = prepareEvidenceReviewProposal({
|
|
306
|
+
operationId: proposal.operation_id,
|
|
307
|
+
jobId: proposal.job_id,
|
|
308
|
+
targetId: proposal.target_id,
|
|
309
|
+
baseReleaseId: proposal.base_release_id,
|
|
310
|
+
capturePolicyDigest: proposal.capture_policy_digest,
|
|
311
|
+
coveragePolicyDigest: proposal.coverage_policy_digest,
|
|
312
|
+
submission: proposal.submission,
|
|
313
|
+
captureBytes: input.captureBytes,
|
|
314
|
+
normalizedBytes: input.normalizedBytes,
|
|
315
|
+
revision: input.revision,
|
|
316
|
+
authorityEntityRevision: input.authorityEntityRevision,
|
|
317
|
+
authorityProgramRevision: input.authorityProgramRevision,
|
|
318
|
+
});
|
|
319
|
+
if (canonicalJson(expected) !== canonicalJson(proposal)) {
|
|
320
|
+
throw new Error("Evidence review proposal is not the deterministic proof projection.");
|
|
321
|
+
}
|
|
322
|
+
return proposal;
|
|
323
|
+
}
|
|
324
|
+
export function deriveSourceStanding(capture, authorityEntityRevision) {
|
|
325
|
+
const comparedUrl = capture.method === "archive" ? capture.subject_source_url : capture.final_url;
|
|
326
|
+
const hostname = new URL(comparedUrl).hostname.toLowerCase().replace(/\.$/, "");
|
|
327
|
+
const retrievedAt = Date.parse(capture.retrieved_at);
|
|
328
|
+
const firstParty = hostnameWithinEntityDomains(hostname, authorityEntityRevision.content.domains, retrievedAt);
|
|
329
|
+
if (capture.method === "archive") {
|
|
330
|
+
return firstParty ? "archived-first-party" : "archived-third-party";
|
|
331
|
+
}
|
|
332
|
+
if (capture.method === "manual") {
|
|
333
|
+
return firstParty ? "manual-first-party" : "manual-third-party";
|
|
334
|
+
}
|
|
335
|
+
return firstParty ? "live-first-party" : "live-third-party";
|
|
336
|
+
}
|
|
337
|
+
export function validateEvidenceCaptureDeclaration(capture) {
|
|
338
|
+
assertCaptureUrls(capture);
|
|
339
|
+
assertRedirectChain(capture);
|
|
340
|
+
return capture;
|
|
341
|
+
}
|
|
342
|
+
function assertCaptureUrls(capture) {
|
|
343
|
+
const urls = [
|
|
344
|
+
capture.subject_source_url,
|
|
345
|
+
capture.requested_url,
|
|
346
|
+
capture.final_url,
|
|
347
|
+
...capture.redirect_chain.flatMap((redirect) => [redirect.from, redirect.to]),
|
|
348
|
+
];
|
|
349
|
+
for (const value of urls) {
|
|
350
|
+
const url = new URL(value);
|
|
351
|
+
if (url.username || url.password || url.hash) {
|
|
352
|
+
throw new Error("Evidence capture URLs cannot contain credentials or fragments.");
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function assertRedirectChain(capture) {
|
|
357
|
+
if (capture.redirect_chain.length === 0) {
|
|
358
|
+
if (capture.requested_url !== capture.final_url) {
|
|
359
|
+
assertHeadlessSameOriginNavigation(capture, capture.requested_url);
|
|
360
|
+
}
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
let expected = capture.requested_url;
|
|
364
|
+
const visited = new Set([expected]);
|
|
365
|
+
for (const redirect of capture.redirect_chain) {
|
|
366
|
+
if (redirect.from !== expected || visited.has(redirect.to)) {
|
|
367
|
+
throw new Error("Evidence redirect chain is discontinuous or cyclic.");
|
|
368
|
+
}
|
|
369
|
+
visited.add(redirect.to);
|
|
370
|
+
expected = redirect.to;
|
|
371
|
+
}
|
|
372
|
+
if (expected !== capture.final_url) {
|
|
373
|
+
assertHeadlessSameOriginNavigation(capture, expected);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
function assertHeadlessSameOriginNavigation(capture, lastTransportUrl) {
|
|
377
|
+
if (capture.method !== "headless" ||
|
|
378
|
+
new URL(lastTransportUrl).origin !== new URL(capture.final_url).origin) {
|
|
379
|
+
throw new Error("Evidence capture changed URL without a complete redirect or same-origin headless navigation.");
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
function pointerExists(value, pointer) {
|
|
383
|
+
let current = value;
|
|
384
|
+
for (const encoded of pointer.slice(1).split("/")) {
|
|
385
|
+
const segment = encoded.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
386
|
+
if (typeof current !== "object" || current === null || !(segment in current))
|
|
387
|
+
return false;
|
|
388
|
+
current = current[segment];
|
|
389
|
+
}
|
|
390
|
+
return true;
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=submission-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission-verifier.js","sourceRoot":"","sources":["../../../../modules/evidence-operations/src/submission-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-canonicalization.d.ts","sourceRoot":"","sources":["../../../../modules/evidence-operations/src/url-canonicalization.ts"],"names":[],"mappings":"AAEA,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAGhE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { canonicalizePublicHttpsUrl } from "../../primitives/src/index.js";
|
|
2
|
+
/** The narrow direct-HTTP redirect authority shared by scan and PR evidence capture. */
|
|
3
|
+
export function evidenceHttpAllowedHosts(input) {
|
|
4
|
+
const hostname = new URL(canonicalizePublicHttpsUrl(input, { fragment: "remove" })).hostname;
|
|
5
|
+
return [hostname, hostname.startsWith("www.") ? hostname.slice(4) : `www.${hostname}`].sort();
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=url-canonicalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-canonicalization.js","sourceRoot":"","sources":["../../../../modules/evidence-operations/src/url-canonicalization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAE3E,wFAAwF;AACxF,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,0BAA0B,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7F,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export declare const DIGEST_PATTERN: RegExp;
|
|
2
|
+
export declare const IDENTIFIER_PATTERN: RegExp;
|
|
3
|
+
export declare const SLUG_PATTERN: RegExp;
|
|
4
|
+
export declare const ENTITY_ID_PATTERN: RegExp;
|
|
5
|
+
export declare const PROGRAM_ID_PATTERN: RegExp;
|
|
6
|
+
export declare const OFFER_ID_PATTERN: RegExp;
|
|
7
|
+
export declare const AGENT_READINESS_PROFILE_ID_PATTERN: RegExp;
|
|
8
|
+
export declare const OPERATION_ID_PATTERN: RegExp;
|
|
9
|
+
export type Digest = `sha256:${string}`;
|
|
10
|
+
export type EntityId = `ent_${string}`;
|
|
11
|
+
export type ProgramId = `prg_${string}`;
|
|
12
|
+
export type OfferId = `off_${string}`;
|
|
13
|
+
export type AgentReadinessProfileId = `arp_${string}`;
|
|
14
|
+
export type OperationId = `op_${string}`;
|
|
15
|
+
/** Query metadata that tracks acquisition rather than selecting a resource. */
|
|
16
|
+
export declare function isTrackingQueryParameter(name: string): boolean;
|
|
17
|
+
export declare function isFunctionalAccessQueryParameter(name: string): boolean;
|
|
18
|
+
/** Canonical identity for credential-free public HTTPS resources. */
|
|
19
|
+
export declare function canonicalizePublicHttpsUrl(input: string, options: {
|
|
20
|
+
readonly fragment: "reject" | "remove";
|
|
21
|
+
readonly trimTrailingPathSlash?: boolean;
|
|
22
|
+
}): string;
|
|
23
|
+
export declare function canonicalJson(value: unknown): string;
|
|
24
|
+
/** Depth-first visit of every string in a JSON-shaped value, with its path. */
|
|
25
|
+
export declare function visitStrings(value: unknown, visit: (text: string, path: readonly PropertyKey[]) => void, path?: readonly PropertyKey[]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Locale-independent lexical ordering for every byte-affecting projection.
|
|
28
|
+
* Relational string comparison is defined over UTF-16 code units and cannot
|
|
29
|
+
* change with the host locale or ICU version.
|
|
30
|
+
*/
|
|
31
|
+
export declare function compareCanonicalStrings(left: string, right: string): number;
|
|
32
|
+
export declare function sha256Bytes(bytes: Uint8Array | string): Digest;
|
|
33
|
+
export declare function digest(value: unknown): Digest;
|
|
34
|
+
export declare function deriveOperationId(operationContract: string, value: unknown): OperationId;
|
|
35
|
+
export declare function prettyJson(value: unknown): string;
|
|
36
|
+
export declare function assertDigest(value: string, label?: string): asserts value is Digest;
|
|
37
|
+
export declare function digestPathSegment(value: Digest): string;
|
|
38
|
+
export declare function digestFromPathSegment(value: string): Digest;
|
|
39
|
+
export declare function mapLimit<T, U>(values: readonly T[], concurrency: number, operation: (value: T) => Promise<U>): Promise<U[]>;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../modules/primitives/src/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,QAA0B,CAAC;AACtD,eAAO,MAAM,kBAAkB,QAA0B,CAAC;AAC1D,eAAO,MAAM,YAAY,QAA+B,CAAC;AACzD,eAAO,MAAM,iBAAiB,QAAiC,CAAC;AAChE,eAAO,MAAM,kBAAkB,QAAiC,CAAC;AACjE,eAAO,MAAM,gBAAgB,QAAiC,CAAC;AAC/D,eAAO,MAAM,kCAAkC,QAAiC,CAAC;AACjF,eAAO,MAAM,oBAAoB,QAAgC,CAAC;AAOlE,MAAM,MAAM,MAAM,GAAG,UAAU,MAAM,EAAE,CAAC;AACxC,MAAM,MAAM,QAAQ,GAAG,OAAO,MAAM,EAAE,CAAC;AACvC,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,EAAE,CAAC;AACxC,MAAM,MAAM,OAAO,GAAG,OAAO,MAAM,EAAE,CAAC;AACtC,MAAM,MAAM,uBAAuB,GAAG,OAAO,MAAM,EAAE,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,MAAM,MAAM,EAAE,CAAC;AAEzC,+EAA+E;AAC/E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,qEAAqE;AACrE,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACvC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C,GACA,MAAM,CAiBR;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAuCpD;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,WAAW,EAAE,KAAK,IAAI,EAC3D,IAAI,GAAE,SAAS,WAAW,EAAO,GAChC,IAAI,CAgBN;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAexF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAW,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAErF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,CAAC,EACjC,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,CAAC,EAAE,CAAC,CAgBd"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/;
|
|
3
|
+
export const IDENTIFIER_PATTERN = /^[a-z0-9][a-z0-9_-]*$/;
|
|
4
|
+
export const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
5
|
+
export const ENTITY_ID_PATTERN = /^ent_[0-9a-hjkmnp-tv-z]{26}$/;
|
|
6
|
+
export const PROGRAM_ID_PATTERN = /^prg_[0-9a-hjkmnp-tv-z]{26}$/;
|
|
7
|
+
export const OFFER_ID_PATTERN = /^off_[0-9a-hjkmnp-tv-z]{26}$/;
|
|
8
|
+
export const AGENT_READINESS_PROFILE_ID_PATTERN = /^arp_[0-9a-hjkmnp-tv-z]{26}$/;
|
|
9
|
+
export const OPERATION_ID_PATTERN = /^op_[0-9a-hjkmnp-tv-z]{26}$/;
|
|
10
|
+
const TRACKING_QUERY_PARAMETER_PATTERN = /^(?:utm_.+|fbclid|gclid|dclid|_gl|gad_campaignid|gad_source|gbraid|wbraid|msclkid|twclid|li_fat_id|mc_cid|mc_eid|irclickid|irgwc|click_?id|ref|referrer|referral(?:_id)?|aff|aff_id|affiliate(?:_id)?|campaign(?:_id)?|marketing(?:_id)?|partner_ref)$/iu;
|
|
11
|
+
const FUNCTIONAL_ACCESS_QUERY_PARAMETER_PATTERN = /^(?:id|offer(?:_?id)?|program(?:_?id)?|plan(?:_?id)?|product(?:_?id)?|sku|code|coupon(?:_?code)?|promo(?:_?code)?|promotion(?:_?id)?|deal(?:_?id)?|package(?:_?id)?|tier|variant|form(?:_?id)?|template(?:_?id)?|destination)$/iu;
|
|
12
|
+
/** Query metadata that tracks acquisition rather than selecting a resource. */
|
|
13
|
+
export function isTrackingQueryParameter(name) {
|
|
14
|
+
return TRACKING_QUERY_PARAMETER_PATTERN.test(name);
|
|
15
|
+
}
|
|
16
|
+
export function isFunctionalAccessQueryParameter(name) {
|
|
17
|
+
return FUNCTIONAL_ACCESS_QUERY_PARAMETER_PATTERN.test(name);
|
|
18
|
+
}
|
|
19
|
+
/** Canonical identity for credential-free public HTTPS resources. */
|
|
20
|
+
export function canonicalizePublicHttpsUrl(input, options) {
|
|
21
|
+
const url = new URL(input);
|
|
22
|
+
if (url.protocol !== "https:" || url.username || url.password) {
|
|
23
|
+
throw new Error("Public evidence URLs must be credential-free HTTPS.");
|
|
24
|
+
}
|
|
25
|
+
if (options.fragment === "reject" && url.hash) {
|
|
26
|
+
throw new Error("Public evidence URLs cannot contain fragments.");
|
|
27
|
+
}
|
|
28
|
+
url.hash = "";
|
|
29
|
+
url.hostname = url.hostname.toLowerCase().replace(/\.$/u, "");
|
|
30
|
+
if (options.trimTrailingPathSlash && url.pathname !== "/") {
|
|
31
|
+
url.pathname = url.pathname.replace(/\/+$/u, "");
|
|
32
|
+
}
|
|
33
|
+
for (const key of [...url.searchParams.keys()]) {
|
|
34
|
+
if (isTrackingQueryParameter(key))
|
|
35
|
+
url.searchParams.delete(key);
|
|
36
|
+
}
|
|
37
|
+
return url.toString();
|
|
38
|
+
}
|
|
39
|
+
const CROCKFORD = "0123456789abcdefghjkmnpqrstvwxyz";
|
|
40
|
+
export function canonicalJson(value) {
|
|
41
|
+
if (value === null || typeof value === "boolean") {
|
|
42
|
+
return JSON.stringify(value);
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === "string") {
|
|
45
|
+
return JSON.stringify(value.normalize("NFC"));
|
|
46
|
+
}
|
|
47
|
+
if (typeof value === "number") {
|
|
48
|
+
if (!Number.isFinite(value))
|
|
49
|
+
throw new TypeError("Canonical JSON rejects non-finite numbers.");
|
|
50
|
+
return JSON.stringify(value);
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(value)) {
|
|
53
|
+
return `[${value.map(canonicalJson).join(",")}]`;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === "object") {
|
|
56
|
+
const record = value;
|
|
57
|
+
const normalizedKeys = Object.keys(record).map((key) => ({
|
|
58
|
+
source: key,
|
|
59
|
+
normalized: key.normalize("NFC"),
|
|
60
|
+
}));
|
|
61
|
+
if (new Set(normalizedKeys.map(({ normalized }) => normalized)).size !== normalizedKeys.length) {
|
|
62
|
+
throw new TypeError("Canonical JSON rejects object keys that collide after NFC normalization.");
|
|
63
|
+
}
|
|
64
|
+
return `{${normalizedKeys
|
|
65
|
+
.sort((left, right) => compareCanonicalStrings(left.normalized, right.normalized))
|
|
66
|
+
.map((key) => {
|
|
67
|
+
const child = record[key.source];
|
|
68
|
+
if (child === undefined) {
|
|
69
|
+
throw new TypeError(`Canonical JSON rejects undefined at key '${key.source}'.`);
|
|
70
|
+
}
|
|
71
|
+
return `${JSON.stringify(key.normalized)}:${canonicalJson(child)}`;
|
|
72
|
+
})
|
|
73
|
+
.join(",")}}`;
|
|
74
|
+
}
|
|
75
|
+
throw new TypeError(`Canonical JSON rejects values of type '${typeof value}'.`);
|
|
76
|
+
}
|
|
77
|
+
/** Depth-first visit of every string in a JSON-shaped value, with its path. */
|
|
78
|
+
export function visitStrings(value, visit, path = []) {
|
|
79
|
+
if (typeof value === "string") {
|
|
80
|
+
visit(value, path);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (Array.isArray(value)) {
|
|
84
|
+
for (const [index, entry] of value.entries()) {
|
|
85
|
+
visitStrings(entry, visit, [...path, index]);
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (value && typeof value === "object") {
|
|
90
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
91
|
+
visitStrings(entry, visit, [...path, key]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Locale-independent lexical ordering for every byte-affecting projection.
|
|
97
|
+
* Relational string comparison is defined over UTF-16 code units and cannot
|
|
98
|
+
* change with the host locale or ICU version.
|
|
99
|
+
*/
|
|
100
|
+
export function compareCanonicalStrings(left, right) {
|
|
101
|
+
const normalizedLeft = left.normalize("NFC");
|
|
102
|
+
const normalizedRight = right.normalize("NFC");
|
|
103
|
+
return normalizedLeft < normalizedRight ? -1 : normalizedLeft > normalizedRight ? 1 : 0;
|
|
104
|
+
}
|
|
105
|
+
export function sha256Bytes(bytes) {
|
|
106
|
+
return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
107
|
+
}
|
|
108
|
+
export function digest(value) {
|
|
109
|
+
return sha256Bytes(canonicalJson(value));
|
|
110
|
+
}
|
|
111
|
+
export function deriveOperationId(operationContract, value) {
|
|
112
|
+
if (!operationContract.trim()) {
|
|
113
|
+
throw new TypeError("Operation contract must not be empty.");
|
|
114
|
+
}
|
|
115
|
+
const source = digest({ operation_contract: operationContract, value }).slice("sha256:".length, "sha256:".length + 32);
|
|
116
|
+
let remaining = BigInt(`0x${source}`);
|
|
117
|
+
let encoded = "";
|
|
118
|
+
for (let index = 0; index < 26; index += 1) {
|
|
119
|
+
encoded = `${CROCKFORD[Number(remaining & 31n)]}${encoded}`;
|
|
120
|
+
remaining >>= 5n;
|
|
121
|
+
}
|
|
122
|
+
return `op_${encoded}`;
|
|
123
|
+
}
|
|
124
|
+
export function prettyJson(value) {
|
|
125
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
126
|
+
}
|
|
127
|
+
export function assertDigest(value, label = "digest") {
|
|
128
|
+
if (!DIGEST_PATTERN.test(value))
|
|
129
|
+
throw new TypeError(`${label} must be a SHA-256 digest.`);
|
|
130
|
+
}
|
|
131
|
+
export function digestPathSegment(value) {
|
|
132
|
+
return value.replace(":", "-");
|
|
133
|
+
}
|
|
134
|
+
export function digestFromPathSegment(value) {
|
|
135
|
+
const candidate = value.replace(/^sha256-/, "sha256:");
|
|
136
|
+
assertDigest(candidate);
|
|
137
|
+
return candidate;
|
|
138
|
+
}
|
|
139
|
+
export async function mapLimit(values, concurrency, operation) {
|
|
140
|
+
if (!Number.isSafeInteger(concurrency) || concurrency <= 0) {
|
|
141
|
+
throw new TypeError("Concurrency must be a positive safe integer.");
|
|
142
|
+
}
|
|
143
|
+
const results = new Array(values.length);
|
|
144
|
+
let cursor = 0;
|
|
145
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, values.length) }, async () => {
|
|
146
|
+
while (cursor < values.length) {
|
|
147
|
+
const index = cursor;
|
|
148
|
+
cursor += 1;
|
|
149
|
+
results[index] = await operation(values[index]);
|
|
150
|
+
}
|
|
151
|
+
}));
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../modules/primitives/src/index.ts"],"names":[],"mappings":"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"}
|