@superbee/core 0.2.0-pre.3 → 0.2.0-pre.31
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 +1084 -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 +19 -1
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +83 -36
- package/dist/backend.js.map +1 -1
- package/dist/blob-contract.d.ts +80 -0
- package/dist/blob-contract.d.ts.map +1 -0
- package/dist/blob-contract.js +131 -0
- package/dist/blob-contract.js.map +1 -0
- package/dist/blob-journal.d.ts +302 -0
- package/dist/blob-journal.d.ts.map +1 -0
- package/dist/blob-journal.js +540 -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 +202 -0
- package/dist/bundle-health/report.d.ts.map +1 -0
- package/dist/bundle-health/report.js +438 -0
- package/dist/bundle-health/report.js.map +1 -0
- package/dist/bundle-ops.d.ts +1 -1
- package/dist/bundle-ops.d.ts.map +1 -1
- package/dist/bundle-ops.js +2 -2
- package/dist/bundle-ops.js.map +1 -1
- package/dist/bundle.d.ts +2 -1
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +3 -3
- 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/connector-request.d.ts +87 -0
- package/dist/connector-request.d.ts.map +1 -0
- package/dist/connector-request.js +370 -0
- package/dist/connector-request.js.map +1 -0
- package/dist/connectors.d.ts +262 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +1179 -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 +186 -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 +5 -1
- package/dist/document-codec.d.ts.map +1 -1
- package/dist/document-codec.js +7 -4
- 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 +22 -10
- package/dist/document-mutation.d.ts.map +1 -1
- package/dist/document-mutation.js +61 -27
- package/dist/document-mutation.js.map +1 -1
- 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 +16 -8
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +42 -4
- 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 +86 -4
- package/dist/filesystem-identity.d.ts.map +1 -1
- package/dist/filesystem-identity.js +338 -102
- 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/governed-body-write.d.ts +106 -0
- package/dist/governed-body-write.d.ts.map +1 -0
- package/dist/governed-body-write.js +251 -0
- package/dist/governed-body-write.js.map +1 -0
- 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 +67 -0
- package/dist/hosted-client/blob-delivery.d.ts.map +1 -0
- package/dist/hosted-client/blob-delivery.js +169 -0
- package/dist/hosted-client/blob-delivery.js.map +1 -0
- package/dist/hosted-client/blob-write.d.ts +386 -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 +454 -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/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 +18 -0
- package/dist/hosted-transport/index.d.ts.map +1 -0
- package/dist/hosted-transport/index.js +18 -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/index.d.ts +34 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -8
- package/dist/index.js.map +1 -1
- package/dist/indexeddb-backend.d.ts +28 -37
- package/dist/indexeddb-backend.d.ts.map +1 -1
- package/dist/indexeddb-backend.js +467 -113
- package/dist/indexeddb-backend.js.map +1 -1
- package/dist/journaled-backend.d.ts +232 -15
- package/dist/journaled-backend.d.ts.map +1 -1
- package/dist/journaled-backend.js +254 -55
- 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 +451 -0
- package/dist/kind-authoring.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-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 +65 -2
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +341 -21
- package/dist/kinds.js.map +1 -1
- package/dist/link-types.d.ts +26 -0
- package/dist/link-types.d.ts.map +1 -0
- package/dist/link-types.js +57 -0
- package/dist/link-types.js.map +1 -0
- package/dist/links.d.ts +21 -3
- package/dist/links.d.ts.map +1 -1
- package/dist/links.js +213 -14
- 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.map +1 -1
- package/dist/memory-backend.js +6 -2
- package/dist/memory-backend.js.map +1 -1
- package/dist/paths.d.ts +16 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +25 -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 +42 -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 +112 -0
- package/dist/recipe-lifecycle/evolution.d.ts.map +1 -0
- package/dist/recipe-lifecycle/evolution.js +941 -0
- package/dist/recipe-lifecycle/evolution.js.map +1 -0
- package/dist/recipe-lifecycle/index.d.ts +30 -0
- package/dist/recipe-lifecycle/index.d.ts.map +1 -0
- package/dist/recipe-lifecycle/index.js +26 -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 +594 -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/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 +69 -0
- package/dist/record-overlay/policy.d.ts.map +1 -0
- package/dist/record-overlay/policy.js +228 -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 +67 -67
- package/dist/remote-backend.d.ts.map +1 -1
- package/dist/remote-backend.js +168 -201
- 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 +38 -0
- package/dist/remote-error.d.ts.map +1 -0
- package/dist/remote-error.js +59 -0
- package/dist/remote-error.js.map +1 -0
- 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 +86 -0
- package/dist/remote-parsers.d.ts.map +1 -0
- package/dist/remote-parsers.js +181 -0
- package/dist/remote-parsers.js.map +1 -0
- package/dist/remote.d.ts +5 -2
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +5 -1
- package/dist/remote.js.map +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/guard.d.ts +78 -0
- package/dist/source-engine/guard.d.ts.map +1 -0
- package/dist/source-engine/guard.js +423 -0
- package/dist/source-engine/guard.js.map +1 -0
- package/dist/source-engine/index.d.ts +26 -0
- package/dist/source-engine/index.d.ts.map +1 -0
- package/dist/source-engine/index.js +21 -0
- package/dist/source-engine/index.js.map +1 -0
- package/dist/source-engine/machine-state.d.ts +74 -0
- package/dist/source-engine/machine-state.d.ts.map +1 -0
- package/dist/source-engine/machine-state.js +48 -0
- package/dist/source-engine/machine-state.js.map +1 -0
- package/dist/source-engine/observe.d.ts +18 -0
- package/dist/source-engine/observe.d.ts.map +1 -0
- package/dist/source-engine/observe.js +620 -0
- package/dist/source-engine/observe.js.map +1 -0
- package/dist/source-engine/overlay.d.ts +49 -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/types.d.ts +287 -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 +95 -0
- package/dist/source-harness/fixture.d.ts.map +1 -0
- package/dist/source-harness/fixture.js +273 -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 +6 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +4 -1
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +38 -5
- 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 +161 -19
- package/dist/uncertain-write.d.ts.map +1 -1
- package/dist/uncertain-write.js +90 -31
- 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/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 +107 -2
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Canonical JSON, code-unit order and strict base64url for the index identity and cursors. Moved from
|
|
2
|
+
// portal-webmcp 0.3.1 (`identity.ts`); private to the subpath. SHA-256 is core's (`../sha256.ts`).
|
|
3
|
+
/**
|
|
4
|
+
* Canonical JSON for identity digests, cursor bodies, and byte measurement.
|
|
5
|
+
* Keys sort by UTF-16 code unit, `undefined` members are dropped, and anything
|
|
6
|
+
* outside plain JSON is rejected so a digest can never depend on host ordering.
|
|
7
|
+
*/
|
|
8
|
+
export function canonicalJson(value) {
|
|
9
|
+
const rendered = serialize(value);
|
|
10
|
+
if (rendered === undefined)
|
|
11
|
+
throw new TypeError("canonical JSON received an undefined root");
|
|
12
|
+
return rendered;
|
|
13
|
+
}
|
|
14
|
+
function serialize(value) {
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
18
|
+
return JSON.stringify(value);
|
|
19
|
+
if (typeof value === "number") {
|
|
20
|
+
if (!Number.isFinite(value))
|
|
21
|
+
throw new TypeError("canonical JSON received a non-finite number");
|
|
22
|
+
return JSON.stringify(value);
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(value))
|
|
25
|
+
return `[${value.map((item) => serialize(item) ?? "null").join(",")}]`;
|
|
26
|
+
if (typeof value === "object") {
|
|
27
|
+
const prototype = Object.getPrototypeOf(value);
|
|
28
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
29
|
+
throw new TypeError("canonical JSON received a non-plain object");
|
|
30
|
+
const members = [];
|
|
31
|
+
for (const key of Object.keys(value).sort(codeUnitCompare)) {
|
|
32
|
+
const rendered = serialize(value[key]);
|
|
33
|
+
if (rendered !== undefined)
|
|
34
|
+
members.push(`${JSON.stringify(key)}:${rendered}`);
|
|
35
|
+
}
|
|
36
|
+
return `{${members.join(",")}}`;
|
|
37
|
+
}
|
|
38
|
+
throw new TypeError("canonical JSON received a non-JSON value");
|
|
39
|
+
}
|
|
40
|
+
/** Locale-independent UTF-16 code-unit ordering; canonical order never uses host collation. */
|
|
41
|
+
export function codeUnitCompare(a, b) {
|
|
42
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
43
|
+
}
|
|
44
|
+
const BASE64URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
45
|
+
export function base64UrlEncode(bytes) {
|
|
46
|
+
let out = "";
|
|
47
|
+
for (let index = 0; index < bytes.byteLength; index += 3) {
|
|
48
|
+
const a = bytes[index];
|
|
49
|
+
const b = bytes[index + 1];
|
|
50
|
+
const c = bytes[index + 2];
|
|
51
|
+
out += BASE64URL[a >> 2] + BASE64URL[((a & 0b11) << 4) | ((b ?? 0) >> 4)];
|
|
52
|
+
if (b === undefined)
|
|
53
|
+
break;
|
|
54
|
+
out += BASE64URL[((b & 0b1111) << 2) | ((c ?? 0) >> 6)];
|
|
55
|
+
if (c === undefined)
|
|
56
|
+
break;
|
|
57
|
+
out += BASE64URL[c & 0b111111];
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
/** Strict unpadded base64url decoding; any stray character rejects the input. */
|
|
62
|
+
export function base64UrlDecode(value) {
|
|
63
|
+
if (value.length % 4 === 1)
|
|
64
|
+
return undefined;
|
|
65
|
+
const bits = [];
|
|
66
|
+
for (const character of value) {
|
|
67
|
+
const index = BASE64URL.indexOf(character);
|
|
68
|
+
if (index < 0)
|
|
69
|
+
return undefined;
|
|
70
|
+
bits.push(index);
|
|
71
|
+
}
|
|
72
|
+
const bytes = new Uint8Array(Math.floor((bits.length * 6) / 8));
|
|
73
|
+
let accumulator = 0;
|
|
74
|
+
let width = 0;
|
|
75
|
+
let cursor = 0;
|
|
76
|
+
for (const sextet of bits) {
|
|
77
|
+
accumulator = (accumulator << 6) | sextet;
|
|
78
|
+
width += 6;
|
|
79
|
+
if (width >= 8) {
|
|
80
|
+
width -= 8;
|
|
81
|
+
bytes[cursor] = (accumulator >> width) & 0xff;
|
|
82
|
+
cursor += 1;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Reject non-canonical trailing bits so one byte string has exactly one encoding.
|
|
86
|
+
if (width > 0 && (accumulator & ((1 << width) - 1)) !== 0)
|
|
87
|
+
return undefined;
|
|
88
|
+
return bytes;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/search/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@superbee/core/search`: the one `documents.search.v1` engine. The contract, query rules,
|
|
3
|
+
* ranking, the any-term fallback, facets, cursors and page budgets live here; a backend supplies
|
|
4
|
+
* what it searches through the `SearchSource` seam, and `memorySearchSource` indexes a complete
|
|
5
|
+
* corpus in memory. Pure ECMAScript with no dependency, so a Worker, a browser page and the CLI run
|
|
6
|
+
* the same code. Ranking is portal-webmcp 0.3.1's (`portal-webmcp-search/v1`).
|
|
7
|
+
*/
|
|
8
|
+
export { BODY_OCCURRENCE_CAP, SEARCH_ALGORITHM, SEARCH_FACETS, SEARCH_GUIDANCE, SEARCH_LIMITS, SEARCH_MATCHES, SEARCH_MATCH_FIELDS, SEARCH_MAX_OUTPUT_BYTES, SEARCH_OPERATION_ID, SEARCH_TEXT_REVISION, type SearchDocumentV1, type SearchFacetV1, type SearchFacetValueV1, type SearchFiltersV1, type SearchHitV1, type SearchMatchFieldV1, type SearchMatchModeV1, type SearchMatchV1, type SearchRequestV1, type SearchResultV1, type SearchStopV1, } from "./contract.js";
|
|
9
|
+
export { SearchAbortError, SearchBroadQueryError, SearchInputError, SearchLimitError, type SearchInputReason, } from "./errors.js";
|
|
10
|
+
export { normalize, normalizeQuery, phrase, relaxQuery, tokenize, type NormalizedQueryV1, type RelaxedQueryV1, } from "./text.js";
|
|
11
|
+
export { documentSourceBytes, normalizerFingerprint, searchRowText, textVersion, type SearchRowTextV1, } from "./row-text.js";
|
|
12
|
+
export type { SearchCorpusSizeV1, SearchEvidenceBatchV1, SearchEvidenceBoundsV1, SearchEvidenceV1, SearchSource, SearchTextV1, } from "./source.js";
|
|
13
|
+
export { memorySearchSource, type MemorySearchSourceOptionsV1, type MemorySearchSourceV1 } from "./memory-source.js";
|
|
14
|
+
export { searchDocuments, validateSearchRequest, type SearchOptionsV1, type SearchScopeV1 } from "./search.js";
|
|
15
|
+
export { searchSourceFromBackend } from "./backend-source.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,SAAS,EACT,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,KAAK,2BAA2B,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@superbee/core/search`: the one `documents.search.v1` engine. The contract, query rules,
|
|
3
|
+
* ranking, the any-term fallback, facets, cursors and page budgets live here; a backend supplies
|
|
4
|
+
* what it searches through the `SearchSource` seam, and `memorySearchSource` indexes a complete
|
|
5
|
+
* corpus in memory. Pure ECMAScript with no dependency, so a Worker, a browser page and the CLI run
|
|
6
|
+
* the same code. Ranking is portal-webmcp 0.3.1's (`portal-webmcp-search/v1`).
|
|
7
|
+
*/
|
|
8
|
+
export { BODY_OCCURRENCE_CAP, SEARCH_ALGORITHM, SEARCH_FACETS, SEARCH_GUIDANCE, SEARCH_LIMITS, SEARCH_MATCHES, SEARCH_MATCH_FIELDS, SEARCH_MAX_OUTPUT_BYTES, SEARCH_OPERATION_ID, SEARCH_TEXT_REVISION, } from "./contract.js";
|
|
9
|
+
export { SearchAbortError, SearchBroadQueryError, SearchInputError, SearchLimitError, } from "./errors.js";
|
|
10
|
+
export { normalize, normalizeQuery, phrase, relaxQuery, tokenize, } from "./text.js";
|
|
11
|
+
export { documentSourceBytes, normalizerFingerprint, searchRowText, textVersion, } from "./row-text.js";
|
|
12
|
+
export { memorySearchSource } from "./memory-source.js";
|
|
13
|
+
export { searchDocuments, validateSearchRequest } from "./search.js";
|
|
14
|
+
export { searchSourceFromBackend } from "./backend-source.js";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GAYrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,SAAS,EACT,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,GAGT,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,WAAW,GAEZ,MAAM,eAAe,CAAC;AASvB,OAAO,EAAE,kBAAkB,EAA+D,MAAM,oBAAoB,CAAC;AACrH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAA4C,MAAM,aAAa,CAAC;AAE/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type SearchDocumentV1, type SearchStopV1 } from "./contract.js";
|
|
2
|
+
import type { SearchSource } from "./source.js";
|
|
3
|
+
export interface MemorySearchSourceOptionsV1 {
|
|
4
|
+
/** Identifies this exact corpus (a snapshot digest, a heads digest); cursors are bound to it. */
|
|
5
|
+
readonly key: string;
|
|
6
|
+
/** A host's own bound on the corpus's source bytes, at most SEARCH_LIMITS.maxIndexSourceBytes. */
|
|
7
|
+
readonly maxSourceBytes?: number;
|
|
8
|
+
/** A host's own bound on the corpus's documents, at most SEARCH_LIMITS.maxIndexDocuments. */
|
|
9
|
+
readonly maxDocuments?: number;
|
|
10
|
+
/** Stops the build. */
|
|
11
|
+
readonly stop?: SearchStopV1;
|
|
12
|
+
}
|
|
13
|
+
export interface MemorySearchSourceV1 extends SearchSource {
|
|
14
|
+
readonly key: string;
|
|
15
|
+
/** Identity of the built index; two identical corpora index identically. Computed on first read. */
|
|
16
|
+
readonly indexDigest: `sha256:${string}`;
|
|
17
|
+
}
|
|
18
|
+
/** Shared bounds for direct and backend-fed memory corpora. */
|
|
19
|
+
export declare function memorySearchBounds(options: Omit<MemorySearchSourceOptionsV1, "key">): {
|
|
20
|
+
maxDocuments: {
|
|
21
|
+
name: string;
|
|
22
|
+
max: number;
|
|
23
|
+
};
|
|
24
|
+
maxSourceBytes: {
|
|
25
|
+
name: string;
|
|
26
|
+
max: number;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Builds the in-memory source over a complete corpus. The corpus limits (SEARCH_LIMITS: documents,
|
|
31
|
+
* source bytes) and the host's bounds throw `SearchLimitError`; a document over the per-document
|
|
32
|
+
* term cap is skipped and counted; two documents with one id throw `TypeError`; a stop throws as
|
|
33
|
+
* its check does.
|
|
34
|
+
*/
|
|
35
|
+
export declare function memorySearchSource(documents: readonly SearchDocumentV1[], options: MemorySearchSourceOptionsV1): MemorySearchSourceV1;
|
|
36
|
+
//# sourceMappingURL=memory-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-source.d.ts","sourceRoot":"","sources":["../../src/search/memory-source.ts"],"names":[],"mappings":"AAUA,OAAO,EASL,KAAK,gBAAgB,EAGrB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAIV,YAAY,EAEb,MAAM,aAAa,CAAC;AAiCrB,MAAM,WAAW,2BAA2B;IAC1C,iGAAiG;IACjG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,6FAA6F;IAC7F,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,uBAAuB;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,QAAQ,CAAC,WAAW,EAAE,UAAU,MAAM,EAAE,CAAC;CAC1C;AAaD,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC;;;;;;;;;EASnF;AAqBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAwGtB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The in-memory source: a complete corpus indexed once, answering evidence by walking its rows.
|
|
3
|
+
*
|
|
4
|
+
* The build is portal-webmcp 0.3.1's (`buildSearchIndex`): field term sets and a positional body
|
|
5
|
+
* index holding every occurrence's original byte range, so the lazy `indexDigest` is Portal's
|
|
6
|
+
* index identity byte for byte. A document over SEARCH_LIMITS.maxTermsPerDocument body terms is
|
|
7
|
+
* left out and counted as skipped; the corpus bounds still refuse the whole corpus. A host builds
|
|
8
|
+
* one source per corpus key and keeps it; nothing here re-reads a document after the build.
|
|
9
|
+
*/
|
|
10
|
+
import { sha256HexOfUtf8 } from "../sha256.js";
|
|
11
|
+
import { BODY_OCCURRENCE_CAP, SEARCH_ALGORITHM, SEARCH_LIMITS, SIGNAL_INTERVAL, documentDescription, documentTags, documentTitle, documentType, } from "./contract.js";
|
|
12
|
+
import { SearchLimitError, stopIfAsked } from "./errors.js";
|
|
13
|
+
import { canonicalJson, codeUnitCompare } from "./identity.js";
|
|
14
|
+
import { documentSourceBytes, fieldTokens } from "./row-text.js";
|
|
15
|
+
import { scanBody } from "./text.js";
|
|
16
|
+
function limitExceeded(limit, max, actual) {
|
|
17
|
+
throw new SearchLimitError(limit, max, actual);
|
|
18
|
+
}
|
|
19
|
+
/** A host bound, held to the engine's own ceiling; the binding limit names itself in a refusal. */
|
|
20
|
+
function bound(name, value, ceilingName, ceiling) {
|
|
21
|
+
if (value === undefined)
|
|
22
|
+
return { name: ceilingName, max: ceiling };
|
|
23
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
24
|
+
throw new TypeError(`${name} must be a positive integer`);
|
|
25
|
+
return value < ceiling ? { name, max: value } : { name: ceilingName, max: ceiling };
|
|
26
|
+
}
|
|
27
|
+
/** Shared bounds for direct and backend-fed memory corpora. */
|
|
28
|
+
export function memorySearchBounds(options) {
|
|
29
|
+
const maxDocuments = bound("maxDocuments", options.maxDocuments, "maxIndexDocuments", SEARCH_LIMITS.maxIndexDocuments);
|
|
30
|
+
const maxSourceBytes = bound("maxSourceBytes", options.maxSourceBytes, "maxIndexSourceBytes", SEARCH_LIMITS.maxIndexSourceBytes);
|
|
31
|
+
return { maxDocuments, maxSourceBytes };
|
|
32
|
+
}
|
|
33
|
+
/** Every body occurrence's byte range by term, or nothing when the body is over the term cap. */
|
|
34
|
+
function indexBody(body, maxTermsPerDocument) {
|
|
35
|
+
const terms = new Map();
|
|
36
|
+
const state = { count: 0, over: false };
|
|
37
|
+
scanBody(body, (term, start, end) => {
|
|
38
|
+
state.count += 1;
|
|
39
|
+
// Stop before retaining an over-budget occurrence.
|
|
40
|
+
if (state.count > maxTermsPerDocument) {
|
|
41
|
+
state.over = true;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const existing = terms.get(term);
|
|
45
|
+
if (existing)
|
|
46
|
+
existing.push({ start, end });
|
|
47
|
+
else
|
|
48
|
+
terms.set(term, [{ start, end }]);
|
|
49
|
+
return false;
|
|
50
|
+
});
|
|
51
|
+
return state.over ? undefined : terms;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Builds the in-memory source over a complete corpus. The corpus limits (SEARCH_LIMITS: documents,
|
|
55
|
+
* source bytes) and the host's bounds throw `SearchLimitError`; a document over the per-document
|
|
56
|
+
* term cap is skipped and counted; two documents with one id throw `TypeError`; a stop throws as
|
|
57
|
+
* its check does.
|
|
58
|
+
*/
|
|
59
|
+
export function memorySearchSource(documents, options) {
|
|
60
|
+
const key = options?.key;
|
|
61
|
+
if (typeof key !== "string" || key === "")
|
|
62
|
+
throw new TypeError("memorySearchSource needs a non-empty key");
|
|
63
|
+
const { maxDocuments, maxSourceBytes } = memorySearchBounds(options);
|
|
64
|
+
const stop = options.stop;
|
|
65
|
+
stopIfAsked(stop);
|
|
66
|
+
if (documents.length > maxDocuments.max)
|
|
67
|
+
limitExceeded(maxDocuments.name, maxDocuments.max, documents.length);
|
|
68
|
+
const rows = [];
|
|
69
|
+
const ids = new Set();
|
|
70
|
+
let sourceBytes = 0;
|
|
71
|
+
for (const [position, document] of documents.entries()) {
|
|
72
|
+
if (position % SIGNAL_INTERVAL === 0)
|
|
73
|
+
stopIfAsked(stop);
|
|
74
|
+
// text() answers by id, so two documents under one id would share one excerpt.
|
|
75
|
+
if (ids.has(document.id))
|
|
76
|
+
throw new TypeError("memorySearchSource needs one document per id");
|
|
77
|
+
ids.add(document.id);
|
|
78
|
+
// Check the total source budget before allocating postings for this document.
|
|
79
|
+
const documentBytes = documentSourceBytes(document);
|
|
80
|
+
if (sourceBytes + documentBytes > maxSourceBytes.max) {
|
|
81
|
+
limitExceeded(maxSourceBytes.name, maxSourceBytes.max, sourceBytes + documentBytes);
|
|
82
|
+
}
|
|
83
|
+
sourceBytes += documentBytes;
|
|
84
|
+
const body = document.body;
|
|
85
|
+
const indexed = indexBody(body, SEARCH_LIMITS.maxTermsPerDocument);
|
|
86
|
+
if (indexed === undefined)
|
|
87
|
+
continue;
|
|
88
|
+
const bodyTerms = new Map();
|
|
89
|
+
for (const [term, tokens] of indexed)
|
|
90
|
+
bodyTerms.set(term, Object.freeze(tokens));
|
|
91
|
+
const title = documentTitle(document);
|
|
92
|
+
const type = documentType(document);
|
|
93
|
+
const tags = documentTags(document);
|
|
94
|
+
const fields = fieldTokens(document);
|
|
95
|
+
const fieldInstances = new Map();
|
|
96
|
+
for (const tokens of [fields.id, fields.title, fields.type, fields.tag, fields.description])
|
|
97
|
+
for (const term of tokens)
|
|
98
|
+
fieldInstances.set(term, (fieldInstances.get(term) ?? 0) + 1);
|
|
99
|
+
rows.push({
|
|
100
|
+
indexedId: document.id,
|
|
101
|
+
indexedVersion: document.version,
|
|
102
|
+
idPhrase: fields.id.join(" "),
|
|
103
|
+
idSegments: new Set(fields.id),
|
|
104
|
+
titlePhrase: fields.title.join(" "),
|
|
105
|
+
titleTerms: new Set(fields.title),
|
|
106
|
+
typeTerms: new Set(fields.type),
|
|
107
|
+
tagTerms: new Set(fields.tag),
|
|
108
|
+
descriptionTerms: new Set(fields.description),
|
|
109
|
+
bodyTerms,
|
|
110
|
+
fieldInstances,
|
|
111
|
+
title,
|
|
112
|
+
exactType: type,
|
|
113
|
+
exactTags: Object.freeze([...tags]),
|
|
114
|
+
description: documentDescription(document) ?? "",
|
|
115
|
+
body,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
Object.freeze(rows);
|
|
119
|
+
const byId = new Map(rows.map((row) => [row.indexedId, row]));
|
|
120
|
+
let digest;
|
|
121
|
+
const size = Object.freeze({
|
|
122
|
+
documents: documents.length,
|
|
123
|
+
indexed: rows.length,
|
|
124
|
+
skipped: documents.length - rows.length,
|
|
125
|
+
reindexPending: 0,
|
|
126
|
+
});
|
|
127
|
+
return Object.freeze({
|
|
128
|
+
key,
|
|
129
|
+
// Lazy: hashed per document only when somebody asks for the identity.
|
|
130
|
+
get indexDigest() {
|
|
131
|
+
digest ??= computeIndexDigest(rows);
|
|
132
|
+
return digest;
|
|
133
|
+
},
|
|
134
|
+
async evidence(terms, filters, bounds, evidenceStop) {
|
|
135
|
+
stopIfAsked(evidenceStop);
|
|
136
|
+
let volume = 0;
|
|
137
|
+
for (const [position, row] of rows.entries()) {
|
|
138
|
+
if (position % SIGNAL_INTERVAL === 0)
|
|
139
|
+
stopIfAsked(evidenceStop);
|
|
140
|
+
for (const term of terms)
|
|
141
|
+
volume += instancesOf(row, term);
|
|
142
|
+
}
|
|
143
|
+
const held = [];
|
|
144
|
+
// Over the bound nothing is walked, as a native index refuses before it reads a posting.
|
|
145
|
+
if (volume > bounds.maxInstances)
|
|
146
|
+
return { key, size, volume, documents: held };
|
|
147
|
+
for (const [position, row] of rows.entries()) {
|
|
148
|
+
if (position % SIGNAL_INTERVAL === 0)
|
|
149
|
+
stopIfAsked(evidenceStop);
|
|
150
|
+
if (filters.type !== undefined && row.exactType !== filters.type)
|
|
151
|
+
continue;
|
|
152
|
+
if (filters.tag !== undefined && !row.exactTags.includes(filters.tag))
|
|
153
|
+
continue;
|
|
154
|
+
if (filters.prefix !== undefined && !row.indexedId.startsWith(filters.prefix))
|
|
155
|
+
continue;
|
|
156
|
+
const evidence = evidenceOf(row, terms);
|
|
157
|
+
if (evidence !== undefined)
|
|
158
|
+
held.push(evidence);
|
|
159
|
+
}
|
|
160
|
+
return { key, size, volume, documents: held };
|
|
161
|
+
},
|
|
162
|
+
async text(hits) {
|
|
163
|
+
const texts = new Map();
|
|
164
|
+
for (const hit of hits) {
|
|
165
|
+
const row = byId.get(hit.id);
|
|
166
|
+
if (row !== undefined && row.indexedVersion === hit.version)
|
|
167
|
+
texts.set(hit.id, { description: row.description, body: row.body });
|
|
168
|
+
}
|
|
169
|
+
return texts;
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/** The term's capped instances in the row: searchRowText's `instances` for the same document. */
|
|
174
|
+
function instancesOf(row, term) {
|
|
175
|
+
return (row.fieldInstances.get(term) ?? 0) + Math.min(row.bodyTerms.get(term)?.length ?? 0, BODY_OCCURRENCE_CAP);
|
|
176
|
+
}
|
|
177
|
+
function fieldsForTerm(row, term) {
|
|
178
|
+
const fields = [];
|
|
179
|
+
if (row.titleTerms.has(term))
|
|
180
|
+
fields.push("title");
|
|
181
|
+
if (row.typeTerms.has(term))
|
|
182
|
+
fields.push("type");
|
|
183
|
+
if (row.tagTerms.has(term))
|
|
184
|
+
fields.push("tag");
|
|
185
|
+
if (row.descriptionTerms.has(term))
|
|
186
|
+
fields.push("description");
|
|
187
|
+
if (row.idSegments.has(term))
|
|
188
|
+
fields.push("id");
|
|
189
|
+
if (row.bodyTerms.has(term))
|
|
190
|
+
fields.push("body");
|
|
191
|
+
return fields;
|
|
192
|
+
}
|
|
193
|
+
/** The row's evidence for the terms it holds, or nothing when it holds none of them. */
|
|
194
|
+
function evidenceOf(row, terms) {
|
|
195
|
+
let held;
|
|
196
|
+
for (const term of terms) {
|
|
197
|
+
const fields = fieldsForTerm(row, term);
|
|
198
|
+
if (fields.length === 0)
|
|
199
|
+
continue;
|
|
200
|
+
held ??= new Map();
|
|
201
|
+
held.set(term, {
|
|
202
|
+
fields: Object.freeze(fields),
|
|
203
|
+
bodyOccurrences: Math.min(row.bodyTerms.get(term)?.length ?? 0, BODY_OCCURRENCE_CAP),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
if (held === undefined)
|
|
207
|
+
return undefined;
|
|
208
|
+
return {
|
|
209
|
+
id: row.indexedId,
|
|
210
|
+
version: row.indexedVersion,
|
|
211
|
+
...(row.title === undefined ? {} : { title: row.title }),
|
|
212
|
+
...(row.exactType === undefined ? {} : { type: row.exactType }),
|
|
213
|
+
tags: row.exactTags,
|
|
214
|
+
titlePhrase: row.titlePhrase,
|
|
215
|
+
idPhrase: row.idPhrase,
|
|
216
|
+
terms: held,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/** Portal's index identity, byte for byte: one hash per document, then one over the list. */
|
|
220
|
+
function computeIndexDigest(rows) {
|
|
221
|
+
const fingerprints = rows.map((row) => sha256HexOfUtf8(canonicalJson({
|
|
222
|
+
id: row.indexedId,
|
|
223
|
+
version: row.indexedVersion,
|
|
224
|
+
idPhrase: row.idPhrase,
|
|
225
|
+
titlePhrase: row.titlePhrase,
|
|
226
|
+
type: row.exactType ?? null,
|
|
227
|
+
tags: [...row.exactTags],
|
|
228
|
+
description: [...row.descriptionTerms].sort(codeUnitCompare),
|
|
229
|
+
body: [...row.bodyTerms.keys()]
|
|
230
|
+
.sort(codeUnitCompare)
|
|
231
|
+
.map((term) => [term, row.bodyTerms.get(term).map((token) => [token.start, token.end])]),
|
|
232
|
+
})));
|
|
233
|
+
return `sha256:${sha256HexOfUtf8(canonicalJson({ algorithm: SEARCH_ALGORITHM, documents: fingerprints }))}`;
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=memory-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-source.js","sourceRoot":"","sources":["../../src/search/memory-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoring, ordering, facets and excerpts over a source's evidence. The weights, the order and the
|
|
3
|
+
* excerpt window are portal-webmcp 0.3.1's (`search.ts`), read from evidence instead of an index
|
|
4
|
+
* row, so every source ranks with this one code.
|
|
5
|
+
*/
|
|
6
|
+
import { type SearchFacetV1, type SearchFacetValueV1, type SearchFiltersV1, type SearchMatchFieldV1, type SearchMatchModeV1, type SearchStopV1 } from "./contract.js";
|
|
7
|
+
import type { SearchEvidenceV1, SearchTextV1 } from "./source.js";
|
|
8
|
+
import { type NormalizedQueryV1 } from "./text.js";
|
|
9
|
+
export interface SearchTermEvidenceV1 {
|
|
10
|
+
readonly term: string;
|
|
11
|
+
readonly fields: readonly SearchMatchFieldV1[];
|
|
12
|
+
}
|
|
13
|
+
export interface RankedHitV1 {
|
|
14
|
+
readonly evidence: SearchEvidenceV1;
|
|
15
|
+
readonly score: number;
|
|
16
|
+
/** Exact normalized terms and indexed fields that contributed to this hit. */
|
|
17
|
+
readonly matchedTerms: readonly SearchTermEvidenceV1[];
|
|
18
|
+
}
|
|
19
|
+
/** Deterministic ranking: score descending, then canonical id in code-unit order. With `any`,
|
|
20
|
+
* term coverage first. The exact filters are applied again here, so a source cannot widen them. */
|
|
21
|
+
export declare function rankEvidence(documents: readonly SearchEvidenceV1[], query: NormalizedQueryV1, filters: SearchFiltersV1, match: SearchMatchModeV1, stop?: SearchStopV1): readonly RankedHitV1[];
|
|
22
|
+
/** Value counts over every hit; a repeated tag counts once per document. */
|
|
23
|
+
export declare function facetsOf(hits: readonly RankedHitV1[], wanted: ReadonlySet<SearchFacetV1>): {
|
|
24
|
+
tags?: SearchFacetValueV1[] | undefined;
|
|
25
|
+
type?: SearchFacetValueV1[] | undefined;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* The body around the first body match of the query's terms, else the start of the description.
|
|
29
|
+
* The first token the scanner meets is the lowest byte start; tokens sharing a start come from one
|
|
30
|
+
* run and share its range, so query-term order cannot change the window. The body is scanned only
|
|
31
|
+
* when the evidence says it holds a term, and only up to the first match.
|
|
32
|
+
*/
|
|
33
|
+
export declare function excerptOf(hit: RankedHitV1, text: SearchTextV1 | undefined, query: NormalizedQueryV1, excerptBytes: number): string;
|
|
34
|
+
//# sourceMappingURL=rank.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.d.ts","sourceRoot":"","sources":["../../src/search/rank.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACxD;AAwCD;mGACmG;AACnG,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,iBAAiB,EACxB,IAAI,CAAC,EAAE,YAAY,GAClB,SAAS,WAAW,EAAE,CAmBxB;AASD,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC;;;EAWxF;AAgBD;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,iBAAiB,EACxB,YAAY,EAAE,MAAM,GACnB,MAAM,CAcR"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoring, ordering, facets and excerpts over a source's evidence. The weights, the order and the
|
|
3
|
+
* excerpt window are portal-webmcp 0.3.1's (`search.ts`), read from evidence instead of an index
|
|
4
|
+
* row, so every source ranks with this one code.
|
|
5
|
+
*/
|
|
6
|
+
import { BODY_OCCURRENCE_CAP, EXCERPT_LEAD_BYTES, SEARCH_LIMITS, SEARCH_MATCH_FIELDS, SIGNAL_INTERVAL, } from "./contract.js";
|
|
7
|
+
import { stopIfAsked } from "./errors.js";
|
|
8
|
+
import { codeUnitCompare } from "./identity.js";
|
|
9
|
+
import { backwardBoundary, collapseWhitespace, decodeUtf8, forwardBoundary, scanBody, utf8, } from "./text.js";
|
|
10
|
+
/** The fields holding `term`, in the contract's field order whatever order the source used. */
|
|
11
|
+
function fieldsForTerm(evidence, term) {
|
|
12
|
+
const held = evidence.terms.get(term);
|
|
13
|
+
if (held === undefined)
|
|
14
|
+
return [];
|
|
15
|
+
return SEARCH_MATCH_FIELDS.filter((field) => held.fields.includes(field));
|
|
16
|
+
}
|
|
17
|
+
function score(evidence, query, match) {
|
|
18
|
+
const matchedTerms = [];
|
|
19
|
+
for (const term of query.terms) {
|
|
20
|
+
const fields = fieldsForTerm(evidence, term);
|
|
21
|
+
if (fields.length === 0) {
|
|
22
|
+
if (match === "all")
|
|
23
|
+
return undefined;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
matchedTerms.push(Object.freeze({ term, fields: Object.freeze(fields) }));
|
|
27
|
+
}
|
|
28
|
+
if (matchedTerms.length === 0)
|
|
29
|
+
return undefined;
|
|
30
|
+
let total = 0;
|
|
31
|
+
if (evidence.titlePhrase === query.phrase)
|
|
32
|
+
total += 10_000;
|
|
33
|
+
else if (evidence.titlePhrase.startsWith(`${query.phrase} `))
|
|
34
|
+
total += 5_000;
|
|
35
|
+
if (evidence.idPhrase === query.phrase)
|
|
36
|
+
total += 4_000;
|
|
37
|
+
for (const { term, fields } of matchedTerms) {
|
|
38
|
+
if (fields.includes("title"))
|
|
39
|
+
total += 500;
|
|
40
|
+
if (fields.includes("type"))
|
|
41
|
+
total += 250;
|
|
42
|
+
if (fields.includes("tag"))
|
|
43
|
+
total += 250;
|
|
44
|
+
if (fields.includes("description"))
|
|
45
|
+
total += 100;
|
|
46
|
+
if (fields.includes("id"))
|
|
47
|
+
total += 100;
|
|
48
|
+
const occurrences = evidence.terms.get(term)?.bodyOccurrences ?? 0;
|
|
49
|
+
total += Math.min(occurrences, BODY_OCCURRENCE_CAP) * 10;
|
|
50
|
+
}
|
|
51
|
+
return { score: total, matchedTerms: Object.freeze(matchedTerms) };
|
|
52
|
+
}
|
|
53
|
+
/** Deterministic ranking: score descending, then canonical id in code-unit order. With `any`,
|
|
54
|
+
* term coverage first. The exact filters are applied again here, so a source cannot widen them. */
|
|
55
|
+
export function rankEvidence(documents, query, filters, match, stop) {
|
|
56
|
+
stopIfAsked(stop);
|
|
57
|
+
const hits = [];
|
|
58
|
+
for (const [position, evidence] of documents.entries()) {
|
|
59
|
+
if (position % SIGNAL_INTERVAL === 0)
|
|
60
|
+
stopIfAsked(stop);
|
|
61
|
+
if (filters.type !== undefined && evidence.type !== filters.type)
|
|
62
|
+
continue;
|
|
63
|
+
if (filters.tag !== undefined && !evidence.tags.includes(filters.tag))
|
|
64
|
+
continue;
|
|
65
|
+
if (filters.prefix !== undefined && !evidence.id.startsWith(filters.prefix))
|
|
66
|
+
continue;
|
|
67
|
+
const value = score(evidence, query, match);
|
|
68
|
+
if (value === undefined)
|
|
69
|
+
continue;
|
|
70
|
+
hits.push(Object.freeze({ evidence, score: value.score, matchedTerms: value.matchedTerms }));
|
|
71
|
+
}
|
|
72
|
+
hits.sort((left, right) => (match === "any" ? right.matchedTerms.length - left.matchedTerms.length : 0) ||
|
|
73
|
+
right.score - left.score ||
|
|
74
|
+
codeUnitCompare(left.evidence.id, right.evidence.id));
|
|
75
|
+
return Object.freeze(hits);
|
|
76
|
+
}
|
|
77
|
+
function facetValues(counts) {
|
|
78
|
+
return [...counts.entries()]
|
|
79
|
+
.sort(([leftValue, left], [rightValue, right]) => right - left || codeUnitCompare(leftValue, rightValue))
|
|
80
|
+
.slice(0, SEARCH_LIMITS.maxFacetValues)
|
|
81
|
+
.map(([value, count]) => ({ value, count }));
|
|
82
|
+
}
|
|
83
|
+
/** Value counts over every hit; a repeated tag counts once per document. */
|
|
84
|
+
export function facetsOf(hits, wanted) {
|
|
85
|
+
const types = new Map();
|
|
86
|
+
const tags = new Map();
|
|
87
|
+
for (const { evidence } of hits) {
|
|
88
|
+
if (wanted.has("type") && evidence.type !== undefined)
|
|
89
|
+
types.set(evidence.type, (types.get(evidence.type) ?? 0) + 1);
|
|
90
|
+
if (wanted.has("tags"))
|
|
91
|
+
for (const tag of new Set(evidence.tags))
|
|
92
|
+
tags.set(tag, (tags.get(tag) ?? 0) + 1);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
...(wanted.has("type") ? { type: facetValues(types) } : {}),
|
|
96
|
+
...(wanted.has("tags") ? { tags: facetValues(tags) } : {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function excerptFrom(bytes, match, excerptBytes) {
|
|
100
|
+
const matchBytes = match.end - match.start;
|
|
101
|
+
const leadBudget = Math.max(0, excerptBytes - Math.min(excerptBytes, matchBytes));
|
|
102
|
+
const lead = Math.min(EXCERPT_LEAD_BYTES, leadBudget);
|
|
103
|
+
const start = forwardBoundary(bytes, Math.max(0, match.start - lead));
|
|
104
|
+
const end = backwardBoundary(bytes, Math.min(bytes.byteLength, start + excerptBytes));
|
|
105
|
+
return collapseWhitespace(decodeUtf8(bytes, start, Math.max(start, end)));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The body around the first body match of the query's terms, else the start of the description.
|
|
109
|
+
* The first token the scanner meets is the lowest byte start; tokens sharing a start come from one
|
|
110
|
+
* run and share its range, so query-term order cannot change the window. The body is scanned only
|
|
111
|
+
* when the evidence says it holds a term, and only up to the first match.
|
|
112
|
+
*/
|
|
113
|
+
export function excerptOf(hit, text, query, excerptBytes) {
|
|
114
|
+
const body = text?.body ?? "";
|
|
115
|
+
const found = {};
|
|
116
|
+
if (hit.matchedTerms.some(({ fields }) => fields.includes("body"))) {
|
|
117
|
+
const terms = new Set(query.terms);
|
|
118
|
+
scanBody(body, (term, start, end) => {
|
|
119
|
+
if (!terms.has(term))
|
|
120
|
+
return false;
|
|
121
|
+
found.range = { start, end };
|
|
122
|
+
return true;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return found.range !== undefined
|
|
126
|
+
? excerptFrom(utf8(body), found.range, excerptBytes)
|
|
127
|
+
: excerptFrom(utf8(text?.description ?? ""), { start: 0, end: 0 }, excerptBytes);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../src/search/rank.ts"],"names":[],"mappings":"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"}
|