@superbee/core 0.2.0-pre.4 → 0.2.0-pre.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1255 -0
- package/dist/artifact-contract.d.ts +90 -0
- package/dist/artifact-contract.d.ts.map +1 -0
- package/dist/artifact-contract.js +205 -0
- package/dist/artifact-contract.js.map +1 -0
- package/dist/backend.d.ts +22 -2
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +153 -38
- package/dist/backend.js.map +1 -1
- package/dist/blob-contract.d.ts +82 -0
- package/dist/blob-contract.d.ts.map +1 -0
- package/dist/blob-contract.js +134 -0
- package/dist/blob-contract.js.map +1 -0
- package/dist/blob-journal.d.ts +303 -0
- package/dist/blob-journal.d.ts.map +1 -0
- package/dist/blob-journal.js +541 -0
- package/dist/blob-journal.js.map +1 -0
- package/dist/body-replace-guards.d.ts +52 -0
- package/dist/body-replace-guards.d.ts.map +1 -0
- package/dist/body-replace-guards.js +176 -0
- package/dist/body-replace-guards.js.map +1 -0
- package/dist/builtin-recipes/content.d.ts +93 -0
- package/dist/builtin-recipes/content.d.ts.map +1 -0
- package/dist/builtin-recipes/content.js +288 -0
- package/dist/builtin-recipes/content.js.map +1 -0
- package/dist/builtin-recipes.d.ts +10 -0
- package/dist/builtin-recipes.d.ts.map +1 -0
- package/dist/builtin-recipes.js +97 -0
- package/dist/builtin-recipes.js.map +1 -0
- package/dist/bundle-health/index.d.ts +14 -0
- package/dist/bundle-health/index.d.ts.map +1 -0
- package/dist/bundle-health/index.js +12 -0
- package/dist/bundle-health/index.js.map +1 -0
- package/dist/bundle-health/kind-findings.d.ts +44 -0
- package/dist/bundle-health/kind-findings.d.ts.map +1 -0
- package/dist/bundle-health/kind-findings.js +68 -0
- package/dist/bundle-health/kind-findings.js.map +1 -0
- package/dist/bundle-health/legacy-page.d.ts +39 -0
- package/dist/bundle-health/legacy-page.d.ts.map +1 -0
- package/dist/bundle-health/legacy-page.js +50 -0
- package/dist/bundle-health/legacy-page.js.map +1 -0
- package/dist/bundle-health/report.d.ts +207 -0
- package/dist/bundle-health/report.d.ts.map +1 -0
- package/dist/bundle-health/report.js +454 -0
- package/dist/bundle-health/report.js.map +1 -0
- package/dist/bundle-ops.d.ts +3 -2
- package/dist/bundle-ops.d.ts.map +1 -1
- package/dist/bundle-ops.js +4 -4
- package/dist/bundle-ops.js.map +1 -1
- package/dist/bundle.d.ts +3 -4
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +5 -14
- package/dist/bundle.js.map +1 -1
- package/dist/code-point-order.d.ts +8 -0
- package/dist/code-point-order.d.ts.map +1 -0
- package/dist/code-point-order.js +20 -0
- package/dist/code-point-order.js.map +1 -0
- package/dist/code-unit-order.d.ts +15 -0
- package/dist/code-unit-order.d.ts.map +1 -0
- package/dist/code-unit-order.js +17 -0
- package/dist/code-unit-order.js.map +1 -0
- package/dist/connector-request.d.ts +112 -0
- package/dist/connector-request.d.ts.map +1 -0
- package/dist/connector-request.js +495 -0
- package/dist/connector-request.js.map +1 -0
- package/dist/connectors.d.ts +297 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +1233 -0
- package/dist/connectors.js.map +1 -0
- package/dist/cross-bundle.d.ts +135 -0
- package/dist/cross-bundle.d.ts.map +1 -0
- package/dist/cross-bundle.js +191 -0
- package/dist/cross-bundle.js.map +1 -0
- package/dist/dependencies.d.ts +94 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +180 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/document-codec.d.ts +7 -2
- package/dist/document-codec.d.ts.map +1 -1
- package/dist/document-codec.js +8 -5
- package/dist/document-codec.js.map +1 -1
- package/dist/document-field-actions.d.ts +31 -1
- package/dist/document-field-actions.d.ts.map +1 -1
- package/dist/document-field-actions.js +137 -34
- package/dist/document-field-actions.js.map +1 -1
- package/dist/document-mutation.d.ts +37 -13
- package/dist/document-mutation.d.ts.map +1 -1
- package/dist/document-mutation.js +129 -60
- package/dist/document-mutation.js.map +1 -1
- package/dist/document-transfer.d.ts +208 -0
- package/dist/document-transfer.d.ts.map +1 -0
- package/dist/document-transfer.js +928 -0
- package/dist/document-transfer.js.map +1 -0
- package/dist/document-write-policy.d.ts.map +1 -1
- package/dist/document-write-policy.js +4 -2
- package/dist/document-write-policy.js.map +1 -1
- package/dist/domain-model.d.ts +73 -0
- package/dist/domain-model.d.ts.map +1 -0
- package/dist/domain-model.js +169 -0
- package/dist/domain-model.js.map +1 -0
- package/dist/engine.d.ts +21 -9
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +72 -14
- package/dist/engine.js.map +1 -1
- package/dist/file-journaled-backend-internal.d.ts +21 -0
- package/dist/file-journaled-backend-internal.d.ts.map +1 -0
- package/dist/file-journaled-backend-internal.js +12 -0
- package/dist/file-journaled-backend-internal.js.map +1 -0
- package/dist/file-journaled-backend.d.ts +160 -0
- package/dist/file-journaled-backend.d.ts.map +1 -0
- package/dist/file-journaled-backend.js +1345 -0
- package/dist/file-journaled-backend.js.map +1 -0
- package/dist/filesystem-host.d.ts +15 -0
- package/dist/filesystem-host.d.ts.map +1 -0
- package/dist/filesystem-host.js +20 -0
- package/dist/filesystem-host.js.map +1 -0
- package/dist/filesystem-identity.d.ts +97 -21
- package/dist/filesystem-identity.d.ts.map +1 -1
- package/dist/filesystem-identity.js +398 -119
- package/dist/filesystem-identity.js.map +1 -1
- package/dist/filesystem-lock.d.ts +16 -3
- package/dist/filesystem-lock.d.ts.map +1 -1
- package/dist/filesystem-lock.js +323 -77
- package/dist/filesystem-lock.js.map +1 -1
- package/dist/filesystem-push-role.d.ts +77 -0
- package/dist/filesystem-push-role.d.ts.map +1 -0
- package/dist/filesystem-push-role.js +165 -0
- package/dist/filesystem-push-role.js.map +1 -0
- package/dist/filesystem.d.ts +17 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +18 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/frontmatter.d.ts +8 -6
- package/dist/frontmatter.d.ts.map +1 -1
- package/dist/frontmatter.js +5 -4
- package/dist/frontmatter.js.map +1 -1
- package/dist/governed-body-write.d.ts +8 -1
- package/dist/governed-body-write.d.ts.map +1 -1
- package/dist/governed-body-write.js +9 -2
- package/dist/governed-body-write.js.map +1 -1
- package/dist/heads-digest.d.ts.map +1 -1
- package/dist/heads-digest.js +2 -1
- package/dist/heads-digest.js.map +1 -1
- package/dist/host-policy-snapshot.d.ts +9 -0
- package/dist/host-policy-snapshot.d.ts.map +1 -0
- package/dist/host-policy-snapshot.js +33 -0
- package/dist/host-policy-snapshot.js.map +1 -0
- package/dist/host-text.d.ts +31 -0
- package/dist/host-text.d.ts.map +1 -0
- package/dist/host-text.js +77 -0
- package/dist/host-text.js.map +1 -0
- package/dist/hosted-client/binding.d.ts +7 -0
- package/dist/hosted-client/binding.d.ts.map +1 -0
- package/dist/hosted-client/binding.js +10 -0
- package/dist/hosted-client/binding.js.map +1 -0
- package/dist/hosted-client/blob-delivery.d.ts +68 -0
- package/dist/hosted-client/blob-delivery.d.ts.map +1 -0
- package/dist/hosted-client/blob-delivery.js +170 -0
- package/dist/hosted-client/blob-delivery.js.map +1 -0
- package/dist/hosted-client/blob-write.d.ts +387 -0
- package/dist/hosted-client/blob-write.d.ts.map +1 -0
- package/dist/hosted-client/blob-write.js +770 -0
- package/dist/hosted-client/blob-write.js.map +1 -0
- package/dist/hosted-client/bundle-listing.d.ts +46 -0
- package/dist/hosted-client/bundle-listing.d.ts.map +1 -0
- package/dist/hosted-client/bundle-listing.js +36 -0
- package/dist/hosted-client/bundle-listing.js.map +1 -0
- package/dist/hosted-client/client.d.ts +219 -0
- package/dist/hosted-client/client.d.ts.map +1 -0
- package/dist/hosted-client/client.js +309 -0
- package/dist/hosted-client/client.js.map +1 -0
- package/dist/hosted-client/directory.d.ts +46 -0
- package/dist/hosted-client/directory.d.ts.map +1 -0
- package/dist/hosted-client/directory.js +74 -0
- package/dist/hosted-client/directory.js.map +1 -0
- package/dist/hosted-client/errors.d.ts +26 -0
- package/dist/hosted-client/errors.d.ts.map +1 -0
- package/dist/hosted-client/errors.js +35 -0
- package/dist/hosted-client/errors.js.map +1 -0
- package/dist/hosted-client/inbox.d.ts +320 -0
- package/dist/hosted-client/inbox.d.ts.map +1 -0
- package/dist/hosted-client/inbox.js +379 -0
- package/dist/hosted-client/inbox.js.map +1 -0
- package/dist/hosted-client/index.d.ts +30 -0
- package/dist/hosted-client/index.d.ts.map +1 -0
- package/dist/hosted-client/index.js +32 -0
- package/dist/hosted-client/index.js.map +1 -0
- package/dist/hosted-client/journal.d.ts +103 -0
- package/dist/hosted-client/journal.d.ts.map +1 -0
- package/dist/hosted-client/journal.js +464 -0
- package/dist/hosted-client/journal.js.map +1 -0
- package/dist/hosted-client/node.d.ts +74 -0
- package/dist/hosted-client/node.d.ts.map +1 -0
- package/dist/hosted-client/node.js +219 -0
- package/dist/hosted-client/node.js.map +1 -0
- package/dist/hosted-client/reference.d.ts +12 -0
- package/dist/hosted-client/reference.d.ts.map +1 -0
- package/dist/hosted-client/reference.js +29 -0
- package/dist/hosted-client/reference.js.map +1 -0
- package/dist/hosted-client/write.d.ts +217 -0
- package/dist/hosted-client/write.d.ts.map +1 -0
- package/dist/hosted-client/write.js +418 -0
- package/dist/hosted-client/write.js.map +1 -0
- package/dist/hosted-transport/answer-rows.d.ts +243 -0
- package/dist/hosted-transport/answer-rows.d.ts.map +1 -0
- package/dist/hosted-transport/answer-rows.js +457 -0
- package/dist/hosted-transport/answer-rows.js.map +1 -0
- package/dist/hosted-transport/blob-reads.d.ts +35 -0
- package/dist/hosted-transport/blob-reads.d.ts.map +1 -0
- package/dist/hosted-transport/blob-reads.js +179 -0
- package/dist/hosted-transport/blob-reads.js.map +1 -0
- package/dist/hosted-transport/blob-write.d.ts +34 -0
- package/dist/hosted-transport/blob-write.d.ts.map +1 -0
- package/dist/hosted-transport/blob-write.js +115 -0
- package/dist/hosted-transport/blob-write.js.map +1 -0
- package/dist/hosted-transport/carrier.d.ts +151 -0
- package/dist/hosted-transport/carrier.d.ts.map +1 -0
- package/dist/hosted-transport/carrier.js +260 -0
- package/dist/hosted-transport/carrier.js.map +1 -0
- package/dist/hosted-transport/document-backend.d.ts +74 -0
- package/dist/hosted-transport/document-backend.d.ts.map +1 -0
- package/dist/hosted-transport/document-backend.js +160 -0
- package/dist/hosted-transport/document-backend.js.map +1 -0
- package/dist/hosted-transport/history-pages.d.ts +55 -0
- package/dist/hosted-transport/history-pages.d.ts.map +1 -0
- package/dist/hosted-transport/history-pages.js +69 -0
- package/dist/hosted-transport/history-pages.js.map +1 -0
- package/dist/hosted-transport/index.d.ts +19 -0
- package/dist/hosted-transport/index.d.ts.map +1 -0
- package/dist/hosted-transport/index.js +19 -0
- package/dist/hosted-transport/index.js.map +1 -0
- package/dist/hosted-transport/operations.d.ts +85 -0
- package/dist/hosted-transport/operations.d.ts.map +1 -0
- package/dist/hosted-transport/operations.js +128 -0
- package/dist/hosted-transport/operations.js.map +1 -0
- package/dist/hosted-transport/paged-reads.d.ts +87 -0
- package/dist/hosted-transport/paged-reads.d.ts.map +1 -0
- package/dist/hosted-transport/paged-reads.js +238 -0
- package/dist/hosted-transport/paged-reads.js.map +1 -0
- package/dist/hosted-transport/read-adapter.d.ts +256 -0
- package/dist/hosted-transport/read-adapter.d.ts.map +1 -0
- package/dist/hosted-transport/read-adapter.js +568 -0
- package/dist/hosted-transport/read-adapter.js.map +1 -0
- package/dist/hosted-transport/root-write.d.ts +114 -0
- package/dist/hosted-transport/root-write.d.ts.map +1 -0
- package/dist/hosted-transport/root-write.js +171 -0
- package/dist/hosted-transport/root-write.js.map +1 -0
- package/dist/hosted-transport/whole-document-transport.d.ts +204 -0
- package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -0
- package/dist/hosted-transport/whole-document-transport.js +447 -0
- package/dist/hosted-transport/whole-document-transport.js.map +1 -0
- package/dist/identity-fold.d.ts +18 -0
- package/dist/identity-fold.d.ts.map +1 -0
- package/dist/identity-fold.js +22 -0
- package/dist/identity-fold.js.map +1 -0
- package/dist/index.d.ts +41 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -9
- package/dist/index.js.map +1 -1
- package/dist/indexeddb-backend.d.ts +25 -33
- package/dist/indexeddb-backend.d.ts.map +1 -1
- package/dist/indexeddb-backend.js +264 -8
- package/dist/indexeddb-backend.js.map +1 -1
- package/dist/inventory-guard.d.ts +58 -0
- package/dist/inventory-guard.d.ts.map +1 -0
- package/dist/inventory-guard.js +169 -0
- package/dist/inventory-guard.js.map +1 -0
- package/dist/journaled-backend.d.ts +149 -9
- package/dist/journaled-backend.d.ts.map +1 -1
- package/dist/journaled-backend.js +64 -58
- package/dist/journaled-backend.js.map +1 -1
- package/dist/kind-authoring.d.ts +170 -0
- package/dist/kind-authoring.d.ts.map +1 -0
- package/dist/kind-authoring.js +452 -0
- package/dist/kind-authoring.js.map +1 -0
- package/dist/kind-changes.d.ts +45 -0
- package/dist/kind-changes.d.ts.map +1 -0
- package/dist/kind-changes.js +96 -0
- package/dist/kind-changes.js.map +1 -0
- package/dist/kind-conformance-error.d.ts +15 -0
- package/dist/kind-conformance-error.d.ts.map +1 -0
- package/dist/kind-conformance-error.js +20 -0
- package/dist/kind-conformance-error.js.map +1 -0
- package/dist/kind-coverage.d.ts +99 -0
- package/dist/kind-coverage.d.ts.map +1 -0
- package/dist/kind-coverage.js +186 -0
- package/dist/kind-coverage.js.map +1 -0
- package/dist/kind-deprecation.d.ts +32 -0
- package/dist/kind-deprecation.d.ts.map +1 -0
- package/dist/kind-deprecation.js +141 -0
- package/dist/kind-deprecation.js.map +1 -0
- package/dist/kind-field-mutation.d.ts +4 -0
- package/dist/kind-field-mutation.d.ts.map +1 -1
- package/dist/kind-field-mutation.js +28 -3
- package/dist/kind-field-mutation.js.map +1 -1
- package/dist/kinds-load.js +4 -4
- package/dist/kinds-load.js.map +1 -1
- package/dist/kinds.d.ts +111 -2
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +386 -20
- package/dist/kinds.js.map +1 -1
- package/dist/link-emit.d.ts +29 -0
- package/dist/link-emit.d.ts.map +1 -0
- package/dist/link-emit.js +39 -0
- package/dist/link-emit.js.map +1 -0
- package/dist/link-types.d.ts +27 -0
- package/dist/link-types.d.ts.map +1 -0
- package/dist/link-types.js +60 -0
- package/dist/link-types.js.map +1 -0
- package/dist/links.d.ts +52 -3
- package/dist/links.d.ts.map +1 -1
- package/dist/links.js +259 -18
- package/dist/links.js.map +1 -1
- package/dist/managed-document-metadata.d.ts +2 -0
- package/dist/managed-document-metadata.d.ts.map +1 -0
- package/dist/managed-document-metadata.js +9 -0
- package/dist/managed-document-metadata.js.map +1 -0
- package/dist/memory-backend.d.ts +3 -0
- package/dist/memory-backend.d.ts.map +1 -1
- package/dist/memory-backend.js +44 -2
- package/dist/memory-backend.js.map +1 -1
- package/dist/okf-actor.d.ts +1 -0
- package/dist/okf-actor.d.ts.map +1 -1
- package/dist/okf-actor.js +1 -0
- package/dist/okf-actor.js.map +1 -1
- package/dist/okf-authoring.d.ts +4 -0
- package/dist/okf-authoring.d.ts.map +1 -0
- package/dist/okf-authoring.js +12 -0
- package/dist/okf-authoring.js.map +1 -0
- package/dist/okf-standard-fields.d.ts +3 -0
- package/dist/okf-standard-fields.d.ts.map +1 -1
- package/dist/okf-standard-fields.js +3 -0
- package/dist/okf-standard-fields.js.map +1 -1
- package/dist/path-fold.d.ts +39 -0
- package/dist/path-fold.d.ts.map +1 -0
- package/dist/path-fold.js +41 -0
- package/dist/path-fold.js.map +1 -0
- package/dist/paths.d.ts +18 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +32 -0
- package/dist/paths.js.map +1 -1
- package/dist/platform.d.ts +13 -2
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +16 -0
- package/dist/platform.js.map +1 -1
- package/dist/portable-export.d.ts +119 -0
- package/dist/portable-export.d.ts.map +1 -0
- package/dist/portable-export.js +501 -0
- package/dist/portable-export.js.map +1 -0
- package/dist/publication-filesystem.d.ts +1 -1
- package/dist/publication-filesystem.d.ts.map +1 -1
- package/dist/publication-filesystem.js +1 -1
- package/dist/publication-filesystem.js.map +1 -1
- package/dist/qualified-links.d.ts +67 -0
- package/dist/qualified-links.d.ts.map +1 -0
- package/dist/qualified-links.js +117 -0
- package/dist/qualified-links.js.map +1 -0
- package/dist/query-filter.d.ts +16 -2
- package/dist/query-filter.d.ts.map +1 -1
- package/dist/query-filter.js +40 -1
- package/dist/query-filter.js.map +1 -1
- package/dist/query-order.d.ts +22 -0
- package/dist/query-order.d.ts.map +1 -0
- package/dist/query-order.js +43 -0
- package/dist/query-order.js.map +1 -0
- package/dist/recipe-lifecycle/errors.d.ts +96 -0
- package/dist/recipe-lifecycle/errors.d.ts.map +1 -0
- package/dist/recipe-lifecycle/errors.js +122 -0
- package/dist/recipe-lifecycle/errors.js.map +1 -0
- package/dist/recipe-lifecycle/evolution.d.ts +124 -0
- package/dist/recipe-lifecycle/evolution.d.ts.map +1 -0
- package/dist/recipe-lifecycle/evolution.js +993 -0
- package/dist/recipe-lifecycle/evolution.js.map +1 -0
- package/dist/recipe-lifecycle/index.d.ts +34 -0
- package/dist/recipe-lifecycle/index.d.ts.map +1 -0
- package/dist/recipe-lifecycle/index.js +28 -0
- package/dist/recipe-lifecycle/index.js.map +1 -0
- package/dist/recipe-lifecycle/install.d.ts +155 -0
- package/dist/recipe-lifecycle/install.d.ts.map +1 -0
- package/dist/recipe-lifecycle/install.js +604 -0
- package/dist/recipe-lifecycle/install.js.map +1 -0
- package/dist/recipe-lifecycle/legacy-aliases.d.ts +16 -0
- package/dist/recipe-lifecycle/legacy-aliases.d.ts.map +1 -0
- package/dist/recipe-lifecycle/legacy-aliases.js +51 -0
- package/dist/recipe-lifecycle/legacy-aliases.js.map +1 -0
- package/dist/recipe-lifecycle/retirement-apply.d.ts +59 -0
- package/dist/recipe-lifecycle/retirement-apply.d.ts.map +1 -0
- package/dist/recipe-lifecycle/retirement-apply.js +165 -0
- package/dist/recipe-lifecycle/retirement-apply.js.map +1 -0
- package/dist/recipe-lifecycle/retirement.d.ts +89 -0
- package/dist/recipe-lifecycle/retirement.d.ts.map +1 -0
- package/dist/recipe-lifecycle/retirement.js +347 -0
- package/dist/recipe-lifecycle/retirement.js.map +1 -0
- package/dist/recipe-lifecycle/stamp.d.ts +151 -0
- package/dist/recipe-lifecycle/stamp.d.ts.map +1 -0
- package/dist/recipe-lifecycle/stamp.js +364 -0
- package/dist/recipe-lifecycle/stamp.js.map +1 -0
- package/dist/recipe-set-preflight.d.ts +139 -0
- package/dist/recipe-set-preflight.d.ts.map +1 -0
- package/dist/recipe-set-preflight.js +536 -0
- package/dist/recipe-set-preflight.js.map +1 -0
- package/dist/recipes.d.ts +29 -1
- package/dist/recipes.d.ts.map +1 -1
- package/dist/recipes.js +137 -1
- package/dist/recipes.js.map +1 -1
- package/dist/record-overlay/apply.d.ts +43 -0
- package/dist/record-overlay/apply.d.ts.map +1 -0
- package/dist/record-overlay/apply.js +527 -0
- package/dist/record-overlay/apply.js.map +1 -0
- package/dist/record-overlay/canonical.d.ts +22 -0
- package/dist/record-overlay/canonical.d.ts.map +1 -0
- package/dist/record-overlay/canonical.js +47 -0
- package/dist/record-overlay/canonical.js.map +1 -0
- package/dist/record-overlay/digest.d.ts +4 -0
- package/dist/record-overlay/digest.d.ts.map +1 -0
- package/dist/record-overlay/digest.js +11 -0
- package/dist/record-overlay/digest.js.map +1 -0
- package/dist/record-overlay/errors.d.ts +44 -0
- package/dist/record-overlay/errors.d.ts.map +1 -0
- package/dist/record-overlay/errors.js +55 -0
- package/dist/record-overlay/errors.js.map +1 -0
- package/dist/record-overlay/findings.d.ts +5 -0
- package/dist/record-overlay/findings.d.ts.map +1 -0
- package/dist/record-overlay/findings.js +83 -0
- package/dist/record-overlay/findings.js.map +1 -0
- package/dist/record-overlay/index.d.ts +23 -0
- package/dist/record-overlay/index.d.ts.map +1 -0
- package/dist/record-overlay/index.js +21 -0
- package/dist/record-overlay/index.js.map +1 -0
- package/dist/record-overlay/plan.d.ts +12 -0
- package/dist/record-overlay/plan.d.ts.map +1 -0
- package/dist/record-overlay/plan.js +285 -0
- package/dist/record-overlay/plan.js.map +1 -0
- package/dist/record-overlay/policy.d.ts +74 -0
- package/dist/record-overlay/policy.d.ts.map +1 -0
- package/dist/record-overlay/policy.js +235 -0
- package/dist/record-overlay/policy.js.map +1 -0
- package/dist/record-overlay/redact.d.ts +3 -0
- package/dist/record-overlay/redact.d.ts.map +1 -0
- package/dist/record-overlay/redact.js +27 -0
- package/dist/record-overlay/redact.js.map +1 -0
- package/dist/record-overlay/signal-kind.d.ts +30 -0
- package/dist/record-overlay/signal-kind.d.ts.map +1 -0
- package/dist/record-overlay/signal-kind.js +38 -0
- package/dist/record-overlay/signal-kind.js.map +1 -0
- package/dist/record-overlay/signal-text.d.ts +45 -0
- package/dist/record-overlay/signal-text.d.ts.map +1 -0
- package/dist/record-overlay/signal-text.js +116 -0
- package/dist/record-overlay/signal-text.js.map +1 -0
- package/dist/record-overlay/source-index.d.ts +19 -0
- package/dist/record-overlay/source-index.d.ts.map +1 -0
- package/dist/record-overlay/source-index.js +102 -0
- package/dist/record-overlay/source-index.js.map +1 -0
- package/dist/record-overlay/types.d.ts +291 -0
- package/dist/record-overlay/types.d.ts.map +1 -0
- package/dist/record-overlay/types.js +2 -0
- package/dist/record-overlay/types.js.map +1 -0
- package/dist/remote-backend.d.ts +58 -13
- package/dist/remote-backend.d.ts.map +1 -1
- package/dist/remote-backend.js +156 -36
- package/dist/remote-backend.js.map +1 -1
- package/dist/remote-document-codec.d.ts +2 -1
- package/dist/remote-document-codec.d.ts.map +1 -1
- package/dist/remote-document-codec.js +3 -2
- package/dist/remote-document-codec.js.map +1 -1
- package/dist/remote-error.d.ts +17 -1
- package/dist/remote-error.d.ts.map +1 -1
- package/dist/remote-error.js +32 -2
- package/dist/remote-error.js.map +1 -1
- package/dist/remote-operations.d.ts +0 -40
- package/dist/remote-operations.d.ts.map +1 -1
- package/dist/remote-operations.js +26 -6
- package/dist/remote-operations.js.map +1 -1
- package/dist/remote-parsers.d.ts +1 -1
- package/dist/remote-parsers.js +1 -1
- package/dist/search/backend-source.d.ts +6 -0
- package/dist/search/backend-source.d.ts.map +1 -0
- package/dist/search/backend-source.js +33 -0
- package/dist/search/backend-source.js.map +1 -0
- package/dist/search/contract.d.ts +151 -0
- package/dist/search/contract.d.ts.map +1 -0
- package/dist/search/contract.js +78 -0
- package/dist/search/contract.js.map +1 -0
- package/dist/search/errors.d.ts +30 -0
- package/dist/search/errors.d.ts.map +1 -0
- package/dist/search/errors.js +50 -0
- package/dist/search/errors.js.map +1 -0
- package/dist/search/identity.d.ts +12 -0
- package/dist/search/identity.d.ts.map +1 -0
- package/dist/search/identity.js +90 -0
- package/dist/search/identity.js.map +1 -0
- package/dist/search/index.d.ts +16 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +15 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/memory-source.d.ts +36 -0
- package/dist/search/memory-source.d.ts.map +1 -0
- package/dist/search/memory-source.js +235 -0
- package/dist/search/memory-source.js.map +1 -0
- package/dist/search/rank.d.ts +34 -0
- package/dist/search/rank.d.ts.map +1 -0
- package/dist/search/rank.js +129 -0
- package/dist/search/rank.js.map +1 -0
- package/dist/search/row-text.d.ts +38 -0
- package/dist/search/row-text.d.ts.map +1 -0
- package/dist/search/row-text.js +88 -0
- package/dist/search/row-text.js.map +1 -0
- package/dist/search/search.d.ts +28 -0
- package/dist/search/search.d.ts.map +1 -0
- package/dist/search/search.js +257 -0
- package/dist/search/search.js.map +1 -0
- package/dist/search/source.d.ts +67 -0
- package/dist/search/source.d.ts.map +1 -0
- package/dist/search/source.js +2 -0
- package/dist/search/source.js.map +1 -0
- package/dist/search/text.d.ts +47 -0
- package/dist/search/text.d.ts.map +1 -0
- package/dist/search/text.js +150 -0
- package/dist/search/text.js.map +1 -0
- package/dist/site-capabilities.d.ts +345 -0
- package/dist/site-capabilities.d.ts.map +1 -0
- package/dist/site-capabilities.js +724 -0
- package/dist/site-capabilities.js.map +1 -0
- package/dist/source-engine/driver.d.ts +42 -0
- package/dist/source-engine/driver.d.ts.map +1 -0
- package/dist/source-engine/driver.js +529 -0
- package/dist/source-engine/driver.js.map +1 -0
- package/dist/source-engine/evidence.d.ts +39 -0
- package/dist/source-engine/evidence.d.ts.map +1 -0
- package/dist/source-engine/evidence.js +54 -0
- package/dist/source-engine/evidence.js.map +1 -0
- package/dist/source-engine/guard.d.ts +87 -0
- package/dist/source-engine/guard.d.ts.map +1 -0
- package/dist/source-engine/guard.js +427 -0
- package/dist/source-engine/guard.js.map +1 -0
- package/dist/source-engine/index.d.ts +35 -0
- package/dist/source-engine/index.d.ts.map +1 -0
- package/dist/source-engine/index.js +27 -0
- package/dist/source-engine/index.js.map +1 -0
- package/dist/source-engine/machine-state.d.ts +87 -0
- package/dist/source-engine/machine-state.d.ts.map +1 -0
- package/dist/source-engine/machine-state.js +94 -0
- package/dist/source-engine/machine-state.js.map +1 -0
- package/dist/source-engine/observe.d.ts +10 -0
- package/dist/source-engine/observe.d.ts.map +1 -0
- package/dist/source-engine/observe.js +276 -0
- package/dist/source-engine/observe.js.map +1 -0
- package/dist/source-engine/overlay.d.ts +50 -0
- package/dist/source-engine/overlay.d.ts.map +1 -0
- package/dist/source-engine/overlay.js +114 -0
- package/dist/source-engine/overlay.js.map +1 -0
- package/dist/source-engine/robots.d.ts +53 -0
- package/dist/source-engine/robots.d.ts.map +1 -0
- package/dist/source-engine/robots.js +158 -0
- package/dist/source-engine/robots.js.map +1 -0
- package/dist/source-engine/snapshot.d.ts +104 -0
- package/dist/source-engine/snapshot.d.ts.map +1 -0
- package/dist/source-engine/snapshot.js +240 -0
- package/dist/source-engine/snapshot.js.map +1 -0
- package/dist/source-engine/target-consumer.d.ts +12 -0
- package/dist/source-engine/target-consumer.d.ts.map +1 -0
- package/dist/source-engine/target-consumer.js +15 -0
- package/dist/source-engine/target-consumer.js.map +1 -0
- package/dist/source-engine/target-descriptor.d.ts +3 -0
- package/dist/source-engine/target-descriptor.d.ts.map +1 -0
- package/dist/source-engine/target-descriptor.js +26 -0
- package/dist/source-engine/target-descriptor.js.map +1 -0
- package/dist/source-engine/target.d.ts +82 -0
- package/dist/source-engine/target.d.ts.map +1 -0
- package/dist/source-engine/target.js +213 -0
- package/dist/source-engine/target.js.map +1 -0
- package/dist/source-engine/types.d.ts +296 -0
- package/dist/source-engine/types.d.ts.map +1 -0
- package/dist/source-engine/types.js +2 -0
- package/dist/source-engine/types.js.map +1 -0
- package/dist/source-harness/conformance.d.ts +16 -0
- package/dist/source-harness/conformance.d.ts.map +1 -0
- package/dist/source-harness/conformance.js +266 -0
- package/dist/source-harness/conformance.js.map +1 -0
- package/dist/source-harness/fixture.d.ts +97 -0
- package/dist/source-harness/fixture.d.ts.map +1 -0
- package/dist/source-harness/fixture.js +276 -0
- package/dist/source-harness/fixture.js.map +1 -0
- package/dist/source-harness/index.d.ts +22 -0
- package/dist/source-harness/index.d.ts.map +1 -0
- package/dist/source-harness/index.js +19 -0
- package/dist/source-harness/index.js.map +1 -0
- package/dist/source-harness/peer.d.ts +74 -0
- package/dist/source-harness/peer.d.ts.map +1 -0
- package/dist/source-harness/peer.js +106 -0
- package/dist/source-harness/peer.js.map +1 -0
- package/dist/source-profiles/index.d.ts +31 -0
- package/dist/source-profiles/index.d.ts.map +1 -0
- package/dist/source-profiles/index.js +206 -0
- package/dist/source-profiles/index.js.map +1 -0
- package/dist/source-profiles/link-header.d.ts +6 -0
- package/dist/source-profiles/link-header.d.ts.map +1 -0
- package/dist/source-profiles/link-header.js +131 -0
- package/dist/source-profiles/link-header.js.map +1 -0
- package/dist/storage.d.ts +9 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +6 -1
- package/dist/storage.js.map +1 -1
- package/dist/string-identity-agreement.d.ts +35 -0
- package/dist/string-identity-agreement.d.ts.map +1 -0
- package/dist/string-identity-agreement.js +72 -0
- package/dist/string-identity-agreement.js.map +1 -0
- package/dist/types.d.ts +41 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -10
- package/dist/types.js.map +1 -1
- package/dist/uncertain-write.d.ts +157 -17
- package/dist/uncertain-write.d.ts.map +1 -1
- package/dist/uncertain-write.js +86 -30
- package/dist/uncertain-write.js.map +1 -1
- package/dist/versioning.d.ts +9 -4
- package/dist/versioning.d.ts.map +1 -1
- package/dist/versioning.js +9 -4
- package/dist/versioning.js.map +1 -1
- package/dist/view-launch-contract.d.ts +14 -0
- package/dist/view-launch-contract.d.ts.map +1 -0
- package/dist/view-launch-contract.js +23 -0
- package/dist/view-launch-contract.js.map +1 -0
- package/dist/write-identity.d.ts +5 -0
- package/dist/write-identity.d.ts.map +1 -0
- package/dist/write-identity.js +9 -0
- package/dist/write-identity.js.map +1 -0
- package/package.json +140 -3
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The multi-document plan: read, classify or refuse, and emit steps that carry the exact version
|
|
3
|
+
* they were decided against. Pure apart from bundle reads.
|
|
4
|
+
*
|
|
5
|
+
* Two bundles: ops holds Source Feeds and Signals, content holds the overlay documents. They may be
|
|
6
|
+
* the same bundle.
|
|
7
|
+
*/
|
|
8
|
+
import { queryHeads, readDocVersioned } from "../bundle-ops.js";
|
|
9
|
+
import { parseIsoInstant } from "../verification.js";
|
|
10
|
+
import { shortHash } from "./digest.js";
|
|
11
|
+
import { OverlayRefusal, REFUSAL_CODES } from "./errors.js";
|
|
12
|
+
import { decideChange, isExcludedRecord, maxPriority, severity } from "./policy.js";
|
|
13
|
+
import { redactUrl } from "./redact.js";
|
|
14
|
+
import { resolveAttentionKind } from "./signal-kind.js";
|
|
15
|
+
import { adoptionHint, linkLine, observationLine, oneLine, overlayLine, relatedLine, signalBody, signalLinkTexts } from "./signal-text.js";
|
|
16
|
+
import { buildSourceIndex } from "./source-index.js";
|
|
17
|
+
const LABEL = { new: "New", changed: "Changed", canceled: "Canceled", disappeared: "Disappeared", "page-changed": "Page changed" };
|
|
18
|
+
const PRIORITIES = new Set(["low", "normal", "urgent"]);
|
|
19
|
+
const short = (v) => {
|
|
20
|
+
if (v === undefined)
|
|
21
|
+
return "∅";
|
|
22
|
+
const s = typeof v === "string" ? v : JSON.stringify(v);
|
|
23
|
+
return s.length > 80 ? s.slice(0, 79) + "…" : s;
|
|
24
|
+
};
|
|
25
|
+
function lastKnownInterval(fields, timeZone, interval) {
|
|
26
|
+
return interval && fields && typeof fields === "object" ? interval(fields, timeZone) : null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Where a disappeared record stood at `observedAt`: `ended` (its last known end has passed),
|
|
30
|
+
* `before-start` (it vanished before it began: possibly canceled), `ongoing`, or null when its
|
|
31
|
+
* dates are unknown. Without an interval hook the phase is always unknown, so the record is raised.
|
|
32
|
+
*/
|
|
33
|
+
export function disappearedPhase(fields, observedAt, timeZone, interval) {
|
|
34
|
+
const span = lastKnownInterval(fields, timeZone, interval);
|
|
35
|
+
const at = parseIsoInstant(observedAt);
|
|
36
|
+
if (!span || at === null)
|
|
37
|
+
return null;
|
|
38
|
+
return at >= span[1] ? "ended" : at < span[0] ? "before-start" : "ongoing";
|
|
39
|
+
}
|
|
40
|
+
export function summarizeChange(change, decision, ownedFields = [], { phase = null } = {}) {
|
|
41
|
+
const parts = [];
|
|
42
|
+
if (change.change_kind === "new") {
|
|
43
|
+
parts.push(`new record${change.after?.start ? ` @ ${change.after.start}` : ""}`);
|
|
44
|
+
// The values the feed would own, so the claimant can judge without opening the store.
|
|
45
|
+
for (const f of ownedFields.filter((k) => k !== "start" && change.after?.[k] !== undefined).slice(0, 6))
|
|
46
|
+
parts.push(`${f}: ${short(change.after[f])}`);
|
|
47
|
+
}
|
|
48
|
+
else if (change.change_kind === "disappeared") {
|
|
49
|
+
parts.push(`missing from ${change.missing_count} consecutive complete observations`);
|
|
50
|
+
if (phase === "before-start")
|
|
51
|
+
parts.push("vanished before its start: possibly canceled, check the organizer's page");
|
|
52
|
+
else if (phase === "ended")
|
|
53
|
+
parts.push("ended: gone after its last known end");
|
|
54
|
+
// The last known facts, so triage needs no store or history.
|
|
55
|
+
for (const f of ["title", "start", "end"])
|
|
56
|
+
parts.push(`last ${f}: ${short(change.before?.[f])}`);
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
for (const f of change.changed_fields)
|
|
60
|
+
parts.push(`${f}: ${short(change.before?.[f])} → ${short(change.after?.[f])}`);
|
|
61
|
+
for (const c of decision?.conflicts ?? [])
|
|
62
|
+
parts.push(`CONFLICT ${c.field}: doc has ${short(c.doc_value)}, feed was ${short(c.feed_before)}`);
|
|
63
|
+
if (decision?.editorFields?.length)
|
|
64
|
+
parts.push(`not applied (editor-owned): ${decision.editorFields.join(", ")}`);
|
|
65
|
+
// Feed text the publication gate would refuse even normalized: not written, named for a person.
|
|
66
|
+
for (const w of decision?.wording ?? [])
|
|
67
|
+
parts.push(`not applied, needs a human-safe wording: ${w.field}: ${short(w.text)} (${[...new Set(w.tells.map((t) => `${t.code} "${t.match}"`))].join(", ")})`);
|
|
68
|
+
const s = parts.join("; ");
|
|
69
|
+
return s.length > 600 ? s.slice(0, 599) + "…" : s;
|
|
70
|
+
}
|
|
71
|
+
/** Scalar `sources` properties from the hook, refused when they would name the identity or hold a list. */
|
|
72
|
+
function sourcePropertiesOf(hook, change) {
|
|
73
|
+
const props = hook?.sourceProperties?.(change);
|
|
74
|
+
if (props === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
if (props === null || typeof props !== "object" || Array.isArray(props)) {
|
|
77
|
+
throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, "sourceProperties must return a mapping of scalar properties", { external_id: change.external_id });
|
|
78
|
+
}
|
|
79
|
+
for (const [key, value] of Object.entries(props)) {
|
|
80
|
+
if (key === "resource" || key === "id") {
|
|
81
|
+
throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, `sourceProperties may not set the identity property ${key}`, { external_id: change.external_id, field: key });
|
|
82
|
+
}
|
|
83
|
+
if (typeof value !== "string" && typeof value !== "boolean" && !(typeof value === "number" && Number.isFinite(value) && !Object.is(value, -0))) {
|
|
84
|
+
throw new OverlayRefusal(REFUSAL_CODES.INVALID_INPUT, `sourceProperties property ${key} must be a string, finite number or boolean`, { external_id: change.external_id, field: key });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return Object.keys(props).length ? { ...props } : undefined;
|
|
88
|
+
}
|
|
89
|
+
export async function planRecordOverlay(input) {
|
|
90
|
+
const { ops, content, policy, changes, observedAt, records = {}, observation = {}, sameBundle = false, hooks = {} } = input;
|
|
91
|
+
const timeZone = input.timeZone ?? policy.time_zone;
|
|
92
|
+
const steps = [];
|
|
93
|
+
const refusals = [];
|
|
94
|
+
const provider = policy.provider;
|
|
95
|
+
const providerOut = redactUrl(provider);
|
|
96
|
+
const attention = resolveAttentionKind(ops.registry, ops.okfVersion, input.signals?.kind ?? "Signal", policy.target_kind);
|
|
97
|
+
if (!attention.ok)
|
|
98
|
+
throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, attention.reason, { feed: policy.feed });
|
|
99
|
+
const { name: signalName, kind: signalKind, prefix: signalPrefix, stateField: progressField, ownerField } = attention.value;
|
|
100
|
+
const { fromFeed, about } = signalLinkTexts(signalKind, policy.target_kind, input.signals?.feedKind ?? "Source Feed");
|
|
101
|
+
const feedSlug = policy.feed.split("/").pop().replace(/[^a-z0-9-]+/gi, "-").toLowerCase();
|
|
102
|
+
const overlays = policy.target_kind
|
|
103
|
+
? input.overlays ?? await buildSourceIndex(content.bundle, { type: policy.target_kind })
|
|
104
|
+
: null;
|
|
105
|
+
const existingSignals = (await queryHeads(ops.bundle, { type: signalName }))
|
|
106
|
+
.filter((h) => h.frontmatter.provider === providerOut);
|
|
107
|
+
// Records superseded by a record of this same observation (`collapse_with`): their successor
|
|
108
|
+
// carries the news, so their own disappearance needs no Signal activity.
|
|
109
|
+
const related = await correlationIndex(content.bundle, hooks.correlate);
|
|
110
|
+
const supersededNow = new Set(changes.filter((c) => c.after).flatMap((c) => c.collapse_with ?? []));
|
|
111
|
+
const touchedSignals = new Set();
|
|
112
|
+
const isOpen = (h) => h.frontmatter[progressField] === "todo" && !h.frontmatter[ownerField];
|
|
113
|
+
for (const change of changes) {
|
|
114
|
+
if (change.change_kind === "disappeared" && supersededNow.has(change.external_id)) {
|
|
115
|
+
steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, superseded: true });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// A record that drops out after its last known end has ended: no Signal. One that vanishes
|
|
119
|
+
// before its start may be canceled and is still raised. The phase is judged when it first went
|
|
120
|
+
// missing; without that time the phase is unknown and the record is raised.
|
|
121
|
+
const phase = change.change_kind === "disappeared" && change.first_missing_at ? disappearedPhase(change.before, change.first_missing_at, timeZone, hooks.interval) : null;
|
|
122
|
+
// A record with an open, unclaimed Signal is not retired quietly: that Signal is told it ended.
|
|
123
|
+
const hasOpen = existingSignals.some((h) => h.frontmatter.external_id === change.external_id && isOpen(h));
|
|
124
|
+
if (phase === "ended" && !hasOpen) {
|
|
125
|
+
const [, endMs] = lastKnownInterval(change.before, timeZone, hooks.interval);
|
|
126
|
+
steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, ended: true, reason: "ended", last_known_end: new Date(endMs).toISOString() });
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const matches = overlays ? overlays.lookup(provider, change.external_id, { type: policy.target_kind }) : [];
|
|
130
|
+
const recTitle = change.after?.title ?? change.before?.title ?? records[change.external_id]?.fields?.title;
|
|
131
|
+
if (matches.length > 1) {
|
|
132
|
+
refusals.push({ code: REFUSAL_CODES.OVERLAY_IDENTITY_AMBIGUOUS, external_id: change.external_id, targets: matches.map((m) => m.id), message: "more than one document claims this provider identity; merge or rebind needs review" });
|
|
133
|
+
}
|
|
134
|
+
const overlay = matches.length === 1 ? matches[0] : null;
|
|
135
|
+
// Editorially excluded records are observed and stored but never presented, so they never need judgment either.
|
|
136
|
+
if (isExcludedRecord(policy, change.external_id, recTitle)) {
|
|
137
|
+
steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, excluded: true });
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const decision = decideChange(policy, change, { overlay, textGate: hooks.textGate });
|
|
141
|
+
// An ended record with an open Signal only tells that Signal so: it keeps its kind, title and
|
|
142
|
+
// priority (expiry is not news), with a low-priority observation line.
|
|
143
|
+
const endedOpen = phase === "ended" && hasOpen;
|
|
144
|
+
if (endedOpen)
|
|
145
|
+
decision.signal = { priority: "low", reasons: ["update-open-signal", "ended"] };
|
|
146
|
+
if (matches.length > 1)
|
|
147
|
+
decision.signal ??= { priority: "normal", reasons: [REFUSAL_CODES.OVERLAY_IDENTITY_AMBIGUOUS] };
|
|
148
|
+
if (Object.keys(decision.apply).length) {
|
|
149
|
+
const fields = decision.apply;
|
|
150
|
+
const props = sourcePropertiesOf(hooks, change);
|
|
151
|
+
// A step that removes a field never carries the upsert: the grouped write refuses removals,
|
|
152
|
+
// so such a step is written as a patch, or as field actions when it writes a declared list.
|
|
153
|
+
const removes = Object.values(fields).some((v) => v.to === undefined);
|
|
154
|
+
steps.push({
|
|
155
|
+
op: "apply-owned-fields", target: overlay.id, expected_version: overlay.version, external_id: change.external_id, change_kind: change.change_kind, fields,
|
|
156
|
+
...(props && !removes ? { sources: props } : {}),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
for (const c of decision.conflicts) {
|
|
160
|
+
refusals.push({ code: REFUSAL_CODES.OVERLAY_DOC_CONFLICT, external_id: change.external_id, target: overlay.id, field: c.field, message: "owned field was edited in the document since the last accepted feed value" });
|
|
161
|
+
}
|
|
162
|
+
const mine = existingSignals.filter((h) => h.frontmatter.external_id === change.external_id);
|
|
163
|
+
// A record that supersedes another (`collapse_with`) joins that record's open Signal.
|
|
164
|
+
const predecessors = new Set(change.collapse_with ?? []);
|
|
165
|
+
const open = mine.find(isOpen) ?? existingSignals.find((h) => predecessors.has(h.frontmatter.external_id) && isOpen(h));
|
|
166
|
+
// A record with an open, unclaimed Signal keeps that Signal current even for changes that
|
|
167
|
+
// would otherwise be record-only, so the eventual claimant sees the latest facts.
|
|
168
|
+
if (!decision.signal && open)
|
|
169
|
+
decision.signal = { priority: "low", reasons: ["update-open-signal"] };
|
|
170
|
+
if (!decision.signal) {
|
|
171
|
+
if (!Object.keys(decision.apply).length)
|
|
172
|
+
steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind });
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const signal = decision.signal;
|
|
176
|
+
if (change.signal_priority !== undefined && PRIORITIES.has(change.signal_priority))
|
|
177
|
+
signal.priority = maxPriority(signal.priority, change.signal_priority);
|
|
178
|
+
const links = related(change.after ?? change.before ?? records[change.external_id]?.fields ?? {}, change.external_id);
|
|
179
|
+
for (const r of links) {
|
|
180
|
+
signal.priority = maxPriority(signal.priority, r.priority !== undefined && PRIORITIES.has(r.priority) ? r.priority : "normal");
|
|
181
|
+
signal.reasons.push(`related:${r.id}`);
|
|
182
|
+
}
|
|
183
|
+
const aboutDoc = links.length === 1 ? { about_doc: links[0].id } : {};
|
|
184
|
+
const summary = withRelated(summarizeChange(change, decision, policy.owned_fields, { phase }), links);
|
|
185
|
+
const line = observationLine(observedAt, change.change_kind, change.content_digest, summary);
|
|
186
|
+
// Dedupe on (feed, external_id, change_kind, content_digest): any Signal whose observation log
|
|
187
|
+
// names that change of that digest. The kind matters: a disappearance carries the digest of the
|
|
188
|
+
// record's last presence, which a `new` Signal may already have logged.
|
|
189
|
+
let duplicate = null;
|
|
190
|
+
for (const h of mine) {
|
|
191
|
+
const { doc } = await readDocVersioned(ops.bundle, h.id);
|
|
192
|
+
if (doc.body.includes(` · ${change.change_kind} · ${change.content_digest} · `)) {
|
|
193
|
+
duplicate = h;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (duplicate) {
|
|
198
|
+
steps.push({ op: "signal-duplicate", target: duplicate.id, external_id: change.external_id, content_digest: change.content_digest });
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (open && touchedSignals.has(open.id)) {
|
|
202
|
+
// One CAS write per Signal per run: a second change for the same open Signal is recorded
|
|
203
|
+
// but not logged on the Signal, rather than losing the first write to STALE_VERSION.
|
|
204
|
+
steps.push({ op: "record-only", external_id: change.external_id, change_kind: change.change_kind, collapsed_into: open.id });
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (open) {
|
|
208
|
+
touchedSignals.add(open.id);
|
|
209
|
+
const prevKind = open.frontmatter.change_kind;
|
|
210
|
+
const kind = endedOpen ? prevKind : severity(change.change_kind) >= severity(prevKind) ? change.change_kind : prevKind;
|
|
211
|
+
steps.push({
|
|
212
|
+
op: "collapse-signal", target: open.id, expected_version: open.version, external_id: change.external_id, content_digest: change.content_digest,
|
|
213
|
+
progress_field: progressField, observation_line: line,
|
|
214
|
+
set: { change_kind: kind, priority: maxPriority(open.frontmatter.priority, signal.priority), observed_at: observedAt, diff_summary: summary, title: signalTitle(kind, recTitle, change.external_id), external_id: change.external_id, ...aboutDoc },
|
|
215
|
+
});
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
// A disappearance reuses the last digest, so its Signal id also names the kind.
|
|
219
|
+
const id = `${signalPrefix}${feedSlug}-${change.change_kind === "disappeared" ? shortHash(policy.feed, change.external_id, change.content_digest, "disappeared") : shortHash(policy.feed, change.external_id, change.content_digest)}`;
|
|
220
|
+
const linkLines = [];
|
|
221
|
+
if (fromFeed)
|
|
222
|
+
linkLines.push(linkLine(fromFeed, id, policy.feed));
|
|
223
|
+
if (overlay && about && sameBundle)
|
|
224
|
+
linkLines.push(linkLine(about, id, overlay.id));
|
|
225
|
+
else if (overlay)
|
|
226
|
+
linkLines.push(overlayLine(overlay.id));
|
|
227
|
+
for (const r of links)
|
|
228
|
+
linkLines.push(relatedLine(r.id, r.reason));
|
|
229
|
+
// Record-only feeds have nothing to overlay; the claimant decides what to author from the record.
|
|
230
|
+
const hint = overlay || !policy.target_kind ? undefined : adoptionHint(policy.target_kind, providerOut, change.external_id);
|
|
231
|
+
const frontmatter = {
|
|
232
|
+
type: signalName,
|
|
233
|
+
title: signalTitle(change.change_kind, recTitle, change.external_id),
|
|
234
|
+
[progressField]: "todo",
|
|
235
|
+
change_kind: change.change_kind,
|
|
236
|
+
observed_at: observedAt,
|
|
237
|
+
provider: providerOut,
|
|
238
|
+
external_id: change.external_id,
|
|
239
|
+
diff_summary: summary,
|
|
240
|
+
priority: signal.priority,
|
|
241
|
+
...aboutDoc,
|
|
242
|
+
// A source entry's title is text on OKF v0.2; a numeric or boolean record title is written as its text.
|
|
243
|
+
sources: [{ resource: providerOut, id: change.external_id, ...(recTitle ? { title: typeof recTitle === "number" || typeof recTitle === "boolean" ? String(recTitle) : recTitle } : {}) }],
|
|
244
|
+
};
|
|
245
|
+
const body = signalBody(linkLines, hint, line);
|
|
246
|
+
steps.push({ op: "create-signal", target: id, external_id: change.external_id, content_digest: change.content_digest, reasons: signal.reasons, candidate: { frontmatter, body } });
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
feed: policy.feed,
|
|
250
|
+
provider: providerOut,
|
|
251
|
+
observed_at: observedAt,
|
|
252
|
+
baseline: observation.baseline,
|
|
253
|
+
replay: observation.replay,
|
|
254
|
+
stats: observation.stats,
|
|
255
|
+
steps,
|
|
256
|
+
refusals,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/** Build the correlation lookup once per plan: (fields, externalId) -> related documents. */
|
|
260
|
+
async function correlationIndex(contentBundle, correlate) {
|
|
261
|
+
if (!correlate || typeof correlate.match !== "function" || typeof correlate.kind !== "string")
|
|
262
|
+
return () => [];
|
|
263
|
+
const heads = await queryHeads(contentBundle, { type: correlate.kind });
|
|
264
|
+
return (fields, externalId) => {
|
|
265
|
+
const out = [];
|
|
266
|
+
for (const h of heads) {
|
|
267
|
+
const m = correlate.match(fields, h.frontmatter, externalId);
|
|
268
|
+
// The reason sits on the related line of a Signal body, so it is kept to one line.
|
|
269
|
+
if (m && m.reason)
|
|
270
|
+
out.push({ id: h.id, reason: oneLine(String(m.reason).slice(0, 120)), priority: m.priority });
|
|
271
|
+
}
|
|
272
|
+
return out.sort((a, b) => a.id.localeCompare(b.id)).slice(0, 5);
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function withRelated(summary, links) {
|
|
276
|
+
if (!links.length)
|
|
277
|
+
return summary;
|
|
278
|
+
const s = `${summary}; related: ${links.map((r) => `${r.id} (${r.reason})`).join(", ")}`;
|
|
279
|
+
return s.length > 600 ? s.slice(0, 599) + "…" : s;
|
|
280
|
+
}
|
|
281
|
+
function signalTitle(kind, title, externalId) {
|
|
282
|
+
const t = `${LABEL[kind] ?? kind}: ${title ?? externalId}`;
|
|
283
|
+
return t.length > 140 ? t.slice(0, 139) + "…" : t;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/record-overlay/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Feed policy: which fields a feed owns and what each change kind may do. Reads the feed's
|
|
3
|
+
* frontmatter and decides per change, purely.
|
|
4
|
+
*/
|
|
5
|
+
import { type KindConvention } from "../kinds.js";
|
|
6
|
+
import type { ConceptId, Frontmatter } from "../types.js";
|
|
7
|
+
import type { ChangeDecision, OverlayPolicy, PolicyContext, RecordChange, Tell, TextGate } from "./types.js";
|
|
8
|
+
export declare const DEFAULT_AUTO_APPLY: readonly string[];
|
|
9
|
+
export declare const DEFAULT_NEEDS_REVIEW: readonly string[];
|
|
10
|
+
/** Fields a feed may never own: identity, provenance and trust stay with Superbee and editors. */
|
|
11
|
+
export declare const NEVER_OWNED: ReadonlySet<string>;
|
|
12
|
+
/**
|
|
13
|
+
* The work state of a target Kind, which no feed may own whatever the Kind declares: both editions'
|
|
14
|
+
* progress storage fields and the Kind's resolved claim coordinates on the given editions.
|
|
15
|
+
*/
|
|
16
|
+
export declare function workStateFields(kind: KindConvention | undefined, editions: readonly ("0.1" | "0.2")[]): Set<string>;
|
|
17
|
+
/**
|
|
18
|
+
* The fields a target Kind declares as `string-list` or `https-url-list`. An owning feed treats each
|
|
19
|
+
* as a set: change detection compares members, and the apply writes the whole list.
|
|
20
|
+
*/
|
|
21
|
+
export declare function declaredListFields(kind: Pick<KindConvention, "fields"> | undefined): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Read the generic keys of a Source Feed document. Every refusal is `POLICY_INVALID`, its details
|
|
24
|
+
* naming the feed and, for a feed key, that `key`. A
|
|
25
|
+
* presentation-only feed never writes documents, so names a document could never own (a
|
|
26
|
+
* Condition's `status`) are plain record fields there, and its policy carries no `target_kind`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function readOverlayPolicy(doc: {
|
|
29
|
+
id: ConceptId;
|
|
30
|
+
frontmatter: Frontmatter;
|
|
31
|
+
}, ctx?: PolicyContext): OverlayPolicy;
|
|
32
|
+
/** Read the same field policy at an explicit identity coordinate, without a transport URL. */
|
|
33
|
+
export declare function readOverlayPolicyForResource(doc: {
|
|
34
|
+
id: ConceptId;
|
|
35
|
+
frontmatter: Frontmatter;
|
|
36
|
+
}, resource: string, ctx?: PolicyContext): OverlayPolicy;
|
|
37
|
+
/**
|
|
38
|
+
* Whether a record is editorially excluded: its title matches `exclude`, or its source id (or, for
|
|
39
|
+
* a recurrence occurrence `<series id>#<date>`, its series id) is in `exclude_ids`. Excluded records
|
|
40
|
+
* are never projected and never raise Signals.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isExcludedRecord(policy: OverlayPolicy, externalId: string | undefined, title: unknown): boolean;
|
|
43
|
+
export declare const severity: (kind: unknown) => number;
|
|
44
|
+
export declare const maxPriority: <T>(a: T, b: T) => T;
|
|
45
|
+
/**
|
|
46
|
+
* Decide one change. Per owned field, with B the last accepted feed value (`change.before`), N the
|
|
47
|
+
* new feed value and C the overlay document's value: C equal to N is converged (nothing to write);
|
|
48
|
+
* C equal to B writes N; anything else is `OVERLAY_DOC_CONFLICT`. Changes to fields the feed does
|
|
49
|
+
* not own are never written; on an overlay document they need judgment.
|
|
50
|
+
*
|
|
51
|
+
* A value is written as the text gate words it, and C is compared with B and N as gated too, so a
|
|
52
|
+
* document that already says the normalized value converges. A value the gate still refuses is
|
|
53
|
+
* not written: it is listed in `wording` and raises a low-priority Signal.
|
|
54
|
+
*
|
|
55
|
+
* A field in `policy.list_fields` compares as a set ({@link sameSet}), so a document holding the
|
|
56
|
+
* same members in another order converges; every other field compares whole values.
|
|
57
|
+
*/
|
|
58
|
+
export declare function decideChange(policy: OverlayPolicy, change: RecordChange, { overlay, featured, textGate }?: {
|
|
59
|
+
overlay?: {
|
|
60
|
+
frontmatter: Record<string, unknown>;
|
|
61
|
+
} | null;
|
|
62
|
+
featured?: boolean;
|
|
63
|
+
textGate?: TextGate;
|
|
64
|
+
}): ChangeDecision;
|
|
65
|
+
/**
|
|
66
|
+
* A feed value as an overlay document may carry it. A string goes through the text gate for its
|
|
67
|
+
* field and the overlay's Kind; any other value passes when every string inside it passes as it is.
|
|
68
|
+
*/
|
|
69
|
+
export declare function gateSafeValue(value: unknown, field: string, kind: string | undefined, textGate?: TextGate): {
|
|
70
|
+
value: unknown;
|
|
71
|
+
ok: boolean;
|
|
72
|
+
tells: Tell[];
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/record-overlay/policy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAiE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACjH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7G,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAA+B,CAAC;AAChF,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAsE,CAAC;AACzH,kGAAkG;AAClG,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAE1C,CAAC;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAInH;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,CAI7F;AAUD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,EAAE,GAAG,GAAE,aAAkB,GAAG,aAAa,CAE1H;AAED,8FAA8F;AAC9F,wBAAgB,4BAA4B,CAAC,GAAG,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,aAAkB,GAAG,aAAa,CAEvJ;AAyDD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAO/G;AAGD,eAAO,MAAM,QAAQ,GAAI,MAAM,OAAO,KAAG,MAAuC,CAAC;AAEjF,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAG,CAAqF,CAAC;AAElI;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,EACpB,EAAE,OAAc,EAAE,QAAgB,EAAE,QAAQ,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAO,GAC1J,cAAc,CAgDhB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,QAAQ,GAAE,QAAuB,GAChC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAiBhD"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Feed policy: which fields a feed owns and what each change kind may do. Reads the feed's
|
|
3
|
+
* frontmatter and decides per change, purely.
|
|
4
|
+
*/
|
|
5
|
+
import { claimCoordinates, isKindListField, progressStatusStorageField } from "../kinds.js";
|
|
6
|
+
import { same, sameSet } from "./canonical.js";
|
|
7
|
+
import { OverlayRefusal, REFUSAL_CODES } from "./errors.js";
|
|
8
|
+
export const DEFAULT_AUTO_APPLY = Object.freeze(["changed"]);
|
|
9
|
+
export const DEFAULT_NEEDS_REVIEW = Object.freeze(["new", "canceled", "disappeared", "page-changed"]);
|
|
10
|
+
/** Fields a feed may never own: identity, provenance and trust stay with Superbee and editors. */
|
|
11
|
+
export const NEVER_OWNED = new Set([
|
|
12
|
+
"type", "sources", "verified", "generated", "status", "stale_after", "tags", "superbee_updated_by",
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* The work state of a target Kind, which no feed may own whatever the Kind declares: both editions'
|
|
16
|
+
* progress storage fields and the Kind's resolved claim coordinates on the given editions.
|
|
17
|
+
*/
|
|
18
|
+
export function workStateFields(kind, editions) {
|
|
19
|
+
const fields = new Set([progressStatusStorageField("0.1"), progressStatusStorageField("0.2")]);
|
|
20
|
+
if (kind)
|
|
21
|
+
for (const edition of editions)
|
|
22
|
+
for (const field of claimCoordinates(edition, kind)?.fields ?? [])
|
|
23
|
+
fields.add(field);
|
|
24
|
+
return fields;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The fields a target Kind declares as `string-list` or `https-url-list`. An owning feed treats each
|
|
28
|
+
* as a set: change detection compares members, and the apply writes the whole list.
|
|
29
|
+
*/
|
|
30
|
+
export function declaredListFields(kind) {
|
|
31
|
+
if (!kind)
|
|
32
|
+
return [];
|
|
33
|
+
const declared = new Set([...kind.fields.required, ...kind.fields.optional]);
|
|
34
|
+
return [...declared].filter((field) => isKindListField(kind, field)).sort();
|
|
35
|
+
}
|
|
36
|
+
const list = (v) => (Array.isArray(v) ? v.map(String).filter(Boolean)
|
|
37
|
+
: typeof v === "string" && v ? v.split(",").map((s) => s.trim()).filter(Boolean)
|
|
38
|
+
: undefined);
|
|
39
|
+
const identityGate = (text) => ({ text, ok: true, tells: [], changed: false });
|
|
40
|
+
/**
|
|
41
|
+
* Read the generic keys of a Source Feed document. Every refusal is `POLICY_INVALID`, its details
|
|
42
|
+
* naming the feed and, for a feed key, that `key`. A
|
|
43
|
+
* presentation-only feed never writes documents, so names a document could never own (a
|
|
44
|
+
* Condition's `status`) are plain record fields there, and its policy carries no `target_kind`.
|
|
45
|
+
*/
|
|
46
|
+
export function readOverlayPolicy(doc, ctx = {}) {
|
|
47
|
+
return policyAt(doc, doc.frontmatter?.url, ctx, "url");
|
|
48
|
+
}
|
|
49
|
+
/** Read the same field policy at an explicit identity coordinate, without a transport URL. */
|
|
50
|
+
export function readOverlayPolicyForResource(doc, resource, ctx = {}) {
|
|
51
|
+
return policyAt(doc, resource, ctx, "resource");
|
|
52
|
+
}
|
|
53
|
+
function policyAt(doc, resource, ctx, coordinateKey) {
|
|
54
|
+
const fm = (doc.frontmatter ?? {});
|
|
55
|
+
const refuse = (message, details = {}) => {
|
|
56
|
+
throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, `${doc.id}: ${message}`, { feed: doc.id, ...details });
|
|
57
|
+
};
|
|
58
|
+
if (ctx.targetKind !== undefined && ctx.presentationFields !== undefined)
|
|
59
|
+
refuse("a target Kind and presentation fields are mutually exclusive");
|
|
60
|
+
const presentation = ctx.presentationFields !== undefined;
|
|
61
|
+
const owned = list(fm.owned_fields);
|
|
62
|
+
if (!owned || owned.length === 0)
|
|
63
|
+
refuse("owned_fields is required", { key: "owned_fields" });
|
|
64
|
+
const ownedFields = owned;
|
|
65
|
+
const bad = presentation ? [] : ownedFields.filter((f) => NEVER_OWNED.has(f));
|
|
66
|
+
if (bad.length)
|
|
67
|
+
refuse(`fields can never be feed-owned: ${bad.join(", ")}`, { key: "owned_fields", fields: bad });
|
|
68
|
+
if (ctx.targetKind) {
|
|
69
|
+
const work = workStateFields(ctx.targetKind, ["0.1", "0.2"]);
|
|
70
|
+
const claimed = ownedFields.filter((f) => work.has(f));
|
|
71
|
+
if (claimed.length)
|
|
72
|
+
refuse(`fields hold the work state of ${ctx.targetKind.governs} and can never be feed-owned: ${claimed.join(", ")}`, { key: "owned_fields", fields: claimed });
|
|
73
|
+
}
|
|
74
|
+
if (ctx.targetKind) {
|
|
75
|
+
const declared = new Set([...ctx.targetKind.fields.required, ...ctx.targetKind.fields.optional, "title"]);
|
|
76
|
+
const undeclared = ownedFields.filter((f) => !declared.has(f));
|
|
77
|
+
if (undeclared.length)
|
|
78
|
+
refuse(`owned_fields not declared by ${ctx.targetKind.governs}: ${undeclared.join(", ")}`, { key: "owned_fields", fields: undeclared });
|
|
79
|
+
}
|
|
80
|
+
if (presentation) {
|
|
81
|
+
const allowed = new Set(ctx.presentationFields);
|
|
82
|
+
const undeclared = ownedFields.filter((f) => !allowed.has(f));
|
|
83
|
+
if (undeclared.length)
|
|
84
|
+
refuse(`owned_fields not part of the presentation kind: ${undeclared.join(", ")}`, { key: "owned_fields", fields: undeclared });
|
|
85
|
+
}
|
|
86
|
+
const threshold = fm.missing_threshold === undefined || fm.missing_threshold === null ? undefined : Number(fm.missing_threshold);
|
|
87
|
+
if (threshold !== undefined && !(Number.isInteger(threshold) && threshold >= 1))
|
|
88
|
+
refuse("missing_threshold must be a whole number >= 1", { key: "missing_threshold" });
|
|
89
|
+
if (typeof resource !== "string" || !resource)
|
|
90
|
+
refuse(`${coordinateKey} (provider identity) is required`, { key: coordinateKey });
|
|
91
|
+
const zone = fm.wall_time_zone === undefined || fm.wall_time_zone === null ? undefined : String(fm.wall_time_zone).trim();
|
|
92
|
+
const targetKind = !presentation && typeof fm.target_kind === "string" && fm.target_kind ? fm.target_kind : undefined;
|
|
93
|
+
const listFields = declaredListFields(ctx.targetKind);
|
|
94
|
+
return {
|
|
95
|
+
feed: doc.id,
|
|
96
|
+
provider: resource,
|
|
97
|
+
...(targetKind ? { target_kind: targetKind } : {}),
|
|
98
|
+
owned_fields: ownedFields,
|
|
99
|
+
auto_apply: list(fm.auto_apply) ?? [...DEFAULT_AUTO_APPLY],
|
|
100
|
+
needs_review: list(fm.needs_review) ?? [...DEFAULT_NEEDS_REVIEW],
|
|
101
|
+
exclude: excludeOf(doc.id, fm.exclude_pattern),
|
|
102
|
+
...(threshold !== undefined ? { missing_threshold: threshold } : {}),
|
|
103
|
+
...(fm.completeness === "complete" || fm.completeness === "partial" ? { completeness: fm.completeness } : {}),
|
|
104
|
+
...(zone ? { time_zone: zone } : {}),
|
|
105
|
+
...(listFields.length ? { list_fields: listFields } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Optional editorial exclusion: a case-insensitive pattern on the record title. */
|
|
109
|
+
function excludeOf(feed, pattern) {
|
|
110
|
+
if (pattern === undefined || pattern === null || pattern === "")
|
|
111
|
+
return null;
|
|
112
|
+
try {
|
|
113
|
+
return new RegExp(String(pattern), "i");
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new OverlayRefusal(REFUSAL_CODES.POLICY_INVALID, `${feed}: exclude_pattern is not a valid pattern`, { feed, key: "exclude_pattern" });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Whether a record is editorially excluded: its title matches `exclude`, or its source id (or, for
|
|
121
|
+
* a recurrence occurrence `<series id>#<date>`, its series id) is in `exclude_ids`. Excluded records
|
|
122
|
+
* are never projected and never raise Signals.
|
|
123
|
+
*/
|
|
124
|
+
export function isExcludedRecord(policy, externalId, title) {
|
|
125
|
+
if (policy.exclude && policy.exclude.test(String(title ?? "")))
|
|
126
|
+
return true;
|
|
127
|
+
if (!policy.exclude_ids || externalId === undefined || externalId === null)
|
|
128
|
+
return false;
|
|
129
|
+
const id = String(externalId);
|
|
130
|
+
if (policy.exclude_ids.has(id))
|
|
131
|
+
return true;
|
|
132
|
+
const hash = id.indexOf("#");
|
|
133
|
+
return hash > 0 && policy.exclude_ids.has(id.slice(0, hash));
|
|
134
|
+
}
|
|
135
|
+
const SEVERITY = { new: 1, changed: 2, "page-changed": 2, disappeared: 3, canceled: 4 };
|
|
136
|
+
export const severity = (kind) => SEVERITY[kind] ?? 0;
|
|
137
|
+
const PRIORITY_RANK = { low: 1, normal: 2, urgent: 3 };
|
|
138
|
+
export const maxPriority = (a, b) => ((PRIORITY_RANK[a] ?? 0) >= (PRIORITY_RANK[b] ?? 0) ? a : b);
|
|
139
|
+
/**
|
|
140
|
+
* Decide one change. Per owned field, with B the last accepted feed value (`change.before`), N the
|
|
141
|
+
* new feed value and C the overlay document's value: C equal to N is converged (nothing to write);
|
|
142
|
+
* C equal to B writes N; anything else is `OVERLAY_DOC_CONFLICT`. Changes to fields the feed does
|
|
143
|
+
* not own are never written; on an overlay document they need judgment.
|
|
144
|
+
*
|
|
145
|
+
* A value is written as the text gate words it, and C is compared with B and N as gated too, so a
|
|
146
|
+
* document that already says the normalized value converges. A value the gate still refuses is
|
|
147
|
+
* not written: it is listed in `wording` and raises a low-priority Signal.
|
|
148
|
+
*
|
|
149
|
+
* A field in `policy.list_fields` compares as a set ({@link sameSet}), so a document holding the
|
|
150
|
+
* same members in another order converges; every other field compares whole values.
|
|
151
|
+
*/
|
|
152
|
+
export function decideChange(policy, change, { overlay = null, featured = false, textGate } = {}) {
|
|
153
|
+
const owned = new Set(policy.owned_fields);
|
|
154
|
+
const apply = {};
|
|
155
|
+
const conflicts = [];
|
|
156
|
+
const wording = [];
|
|
157
|
+
let editorFields = [];
|
|
158
|
+
const reasons = [];
|
|
159
|
+
const autoApply = policy.auto_apply.includes(change.change_kind);
|
|
160
|
+
const kind = policy.target_kind;
|
|
161
|
+
const lists = new Set(policy.list_fields ?? []);
|
|
162
|
+
const equal = (f) => (lists.has(f) ? sameSet : same);
|
|
163
|
+
if (overlay && change.after && change.before && autoApply) {
|
|
164
|
+
for (const f of change.changed_fields) {
|
|
165
|
+
if (!owned.has(f))
|
|
166
|
+
continue;
|
|
167
|
+
const C = overlay.frontmatter[f], B = change.before[f], N = change.after[f];
|
|
168
|
+
const n = gateSafeValue(N, f, kind, textGate), b = gateSafeValue(B, f, kind, textGate);
|
|
169
|
+
const eq = equal(f);
|
|
170
|
+
if (eq(C, N) || eq(C, n.value))
|
|
171
|
+
continue;
|
|
172
|
+
if (eq(C, B) || eq(C, b.value)) {
|
|
173
|
+
if (n.ok)
|
|
174
|
+
apply[f] = { from: C, to: n.value };
|
|
175
|
+
else
|
|
176
|
+
wording.push({ field: f, text: typeof N === "string" ? N : JSON.stringify(N), tells: n.tells });
|
|
177
|
+
}
|
|
178
|
+
else
|
|
179
|
+
conflicts.push({ field: f, doc_value: C, feed_before: B, feed_after: N });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// An editor-owned change needs judgment only when the document does not already say the new value.
|
|
183
|
+
if (overlay && change.before && change.after) {
|
|
184
|
+
const after = change.after;
|
|
185
|
+
editorFields = change.changed_fields.filter((f) => !owned.has(f) && !equal(f)(overlay.frontmatter[f], after[f]));
|
|
186
|
+
}
|
|
187
|
+
if (policy.needs_review.includes(change.change_kind))
|
|
188
|
+
reasons.push(`needs_review:${change.change_kind}`);
|
|
189
|
+
if (conflicts.length)
|
|
190
|
+
reasons.push(REFUSAL_CODES.OVERLAY_DOC_CONFLICT);
|
|
191
|
+
if (editorFields.length)
|
|
192
|
+
reasons.push("editor-owned-field-changed");
|
|
193
|
+
if (overlay && !autoApply && !policy.needs_review.includes(change.change_kind) && change.changed_fields.some((f) => owned.has(f))) {
|
|
194
|
+
reasons.push("owned-field-changed-without-auto-apply");
|
|
195
|
+
}
|
|
196
|
+
if (wording.length)
|
|
197
|
+
reasons.push("needs-human-safe-wording");
|
|
198
|
+
let signal = null;
|
|
199
|
+
if (reasons.length) {
|
|
200
|
+
// Text held back for a wording is not news: alone, it is a low-priority Signal.
|
|
201
|
+
let priority = wording.length && reasons.length === 1 ? "low" : "normal";
|
|
202
|
+
if (change.change_kind === "new" && !overlay)
|
|
203
|
+
priority = "low";
|
|
204
|
+
if (change.change_kind === "canceled" && (overlay || featured))
|
|
205
|
+
priority = "urgent";
|
|
206
|
+
signal = { priority, reasons };
|
|
207
|
+
}
|
|
208
|
+
return { apply, conflicts, editorFields, wording, signal };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* A feed value as an overlay document may carry it. A string goes through the text gate for its
|
|
212
|
+
* field and the overlay's Kind; any other value passes when every string inside it passes as it is.
|
|
213
|
+
*/
|
|
214
|
+
export function gateSafeValue(value, field, kind, textGate = identityGate) {
|
|
215
|
+
if (typeof value === "string") {
|
|
216
|
+
const r = textGate(value, { field, kind });
|
|
217
|
+
return { value: r.text, ok: r.ok, tells: r.tells };
|
|
218
|
+
}
|
|
219
|
+
const strings = [];
|
|
220
|
+
const walk = (v) => {
|
|
221
|
+
if (typeof v === "string")
|
|
222
|
+
strings.push(v);
|
|
223
|
+
else if (Array.isArray(v))
|
|
224
|
+
v.forEach(walk);
|
|
225
|
+
else if (v && typeof v === "object")
|
|
226
|
+
Object.values(v).forEach(walk);
|
|
227
|
+
};
|
|
228
|
+
walk(value);
|
|
229
|
+
const tells = strings.flatMap((s) => {
|
|
230
|
+
const r = textGate(s, { field, kind });
|
|
231
|
+
return r.changed || !r.ok ? (r.tells.length ? r.tells : [{ code: "NEEDS_NORMALIZING", match: s.slice(0, 80) }]) : [];
|
|
232
|
+
});
|
|
233
|
+
return { value, ok: tells.length === 0, tells };
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=policy.js.map
|