@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 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type SearchDocumentV1 } from "./contract.js";
|
|
2
|
+
/** UTF-8 bytes of the text one document contributes to an index: id, title, description, type, tags, body. */
|
|
3
|
+
export declare function documentSourceBytes(document: SearchDocumentV1): number;
|
|
4
|
+
/** The normalized tokens of every field except the body, in document order. */
|
|
5
|
+
export declare function fieldTokens(document: SearchDocumentV1): {
|
|
6
|
+
readonly id: readonly string[];
|
|
7
|
+
readonly title: readonly string[];
|
|
8
|
+
readonly type: readonly string[];
|
|
9
|
+
readonly tag: readonly string[];
|
|
10
|
+
readonly description: readonly string[];
|
|
11
|
+
};
|
|
12
|
+
export interface SearchRowTextV1 {
|
|
13
|
+
/** Each field's normalized tokens joined by one ASCII space, in document order. */
|
|
14
|
+
readonly idTerms: string;
|
|
15
|
+
readonly titleTerms: string;
|
|
16
|
+
readonly typeTerms: string;
|
|
17
|
+
readonly tagTerms: string;
|
|
18
|
+
readonly descriptionTerms: string;
|
|
19
|
+
/** The body's tokens in document order, keeping the first BODY_OCCURRENCE_CAP occurrences of each term. */
|
|
20
|
+
readonly bodyTerms: string;
|
|
21
|
+
readonly titlePhrase: string;
|
|
22
|
+
readonly idPhrase: string;
|
|
23
|
+
/** term -> its occurrences across the six column texts above (the body capped), in first-seen order. */
|
|
24
|
+
readonly instances: ReadonlyMap<string, number>;
|
|
25
|
+
/** Body tokens before the cap; over SEARCH_LIMITS.maxTermsPerDocument the index cannot hold the document. */
|
|
26
|
+
readonly bodyTermCount: number;
|
|
27
|
+
}
|
|
28
|
+
/** What one document contributes to any index: per-field token text, the two phrases, and the
|
|
29
|
+
* instance count per term. */
|
|
30
|
+
export declare function searchRowText(document: SearchDocumentV1): SearchRowTextV1;
|
|
31
|
+
export declare const FINGERPRINT_SAMPLE: readonly string[];
|
|
32
|
+
/** The normalizer fingerprint of the running runtime: a short hash of normalize() and tokenize()
|
|
33
|
+
* over a fixed sample. */
|
|
34
|
+
export declare function normalizerFingerprint(): string;
|
|
35
|
+
/** `${SEARCH_ALGORITHM}/${SEARCH_TEXT_REVISION}/${normalizerFingerprint()}`: what a stored index row
|
|
36
|
+
* was derived with. */
|
|
37
|
+
export declare function textVersion(): string;
|
|
38
|
+
//# sourceMappingURL=row-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-text.d.ts","sourceRoot":"","sources":["../../src/search/row-text.ts"],"names":[],"mappings":"AAMA,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAGvB,8GAA8G;AAC9G,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAStE;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG;IACvD,QAAQ,CAAC,EAAE,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC,CASA;AAED,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,2GAA2G;IAC3G,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,wGAAwG;IACxG,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,6GAA6G;IAC7G,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED;8BAC8B;AAC9B,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,eAAe,CA+BzE;AAMD,eAAO,MAAM,kBAAkB,mBAM7B,CAAC;AAIH;0BAC0B;AAC1B,wBAAgB,qBAAqB,IAAI,MAAM,CAK9C;AAED;uBACuB;AACvB,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What one document contributes to any search index, one owner. The in-memory source builds its
|
|
3
|
+
* term sets and volume from `fieldTokens` and the body scanner; a native index stores
|
|
4
|
+
* `searchRowText`'s column texts. Both read the same tokens, so their instance counts agree.
|
|
5
|
+
*/
|
|
6
|
+
import { sha256HexOfUtf8 } from "../sha256.js";
|
|
7
|
+
import { BODY_OCCURRENCE_CAP, SEARCH_ALGORITHM, SEARCH_TEXT_REVISION, documentDescription, documentTags, documentTitle, documentType, } from "./contract.js";
|
|
8
|
+
import { normalize, scanBody, tokenize, utf8 } from "./text.js";
|
|
9
|
+
/** UTF-8 bytes of the text one document contributes to an index: id, title, description, type, tags, body. */
|
|
10
|
+
export function documentSourceBytes(document) {
|
|
11
|
+
return (utf8(document.id).byteLength +
|
|
12
|
+
utf8(documentTitle(document) ?? "").byteLength +
|
|
13
|
+
utf8(documentDescription(document) ?? "").byteLength +
|
|
14
|
+
utf8(documentType(document) ?? "").byteLength +
|
|
15
|
+
documentTags(document).reduce((total, tag) => total + utf8(tag).byteLength, 0) +
|
|
16
|
+
utf8(document.body).byteLength);
|
|
17
|
+
}
|
|
18
|
+
/** The normalized tokens of every field except the body, in document order. */
|
|
19
|
+
export function fieldTokens(document) {
|
|
20
|
+
const type = documentType(document);
|
|
21
|
+
return {
|
|
22
|
+
id: tokenize(document.id),
|
|
23
|
+
title: tokenize(documentTitle(document) ?? ""),
|
|
24
|
+
type: type === undefined ? [] : tokenize(type),
|
|
25
|
+
tag: documentTags(document).flatMap((tag) => tokenize(tag)),
|
|
26
|
+
description: tokenize(documentDescription(document) ?? ""),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** What one document contributes to any index: per-field token text, the two phrases, and the
|
|
30
|
+
* instance count per term. */
|
|
31
|
+
export function searchRowText(document) {
|
|
32
|
+
const fields = fieldTokens(document);
|
|
33
|
+
const instances = new Map();
|
|
34
|
+
const count = (term) => void instances.set(term, (instances.get(term) ?? 0) + 1);
|
|
35
|
+
for (const tokens of [fields.id, fields.title, fields.type, fields.tag, fields.description])
|
|
36
|
+
for (const term of tokens)
|
|
37
|
+
count(term);
|
|
38
|
+
const body = [];
|
|
39
|
+
const seen = new Map();
|
|
40
|
+
let bodyTermCount = 0;
|
|
41
|
+
scanBody(document.body, (term) => {
|
|
42
|
+
bodyTermCount += 1;
|
|
43
|
+
const occurrence = (seen.get(term) ?? 0) + 1;
|
|
44
|
+
seen.set(term, occurrence);
|
|
45
|
+
if (occurrence > BODY_OCCURRENCE_CAP)
|
|
46
|
+
return;
|
|
47
|
+
body.push(term);
|
|
48
|
+
count(term);
|
|
49
|
+
});
|
|
50
|
+
const idTerms = fields.id.join(" ");
|
|
51
|
+
const titleTerms = fields.title.join(" ");
|
|
52
|
+
return Object.freeze({
|
|
53
|
+
idTerms,
|
|
54
|
+
titleTerms,
|
|
55
|
+
typeTerms: fields.type.join(" "),
|
|
56
|
+
tagTerms: fields.tag.join(" "),
|
|
57
|
+
descriptionTerms: fields.description.join(" "),
|
|
58
|
+
bodyTerms: body.join(" "),
|
|
59
|
+
titlePhrase: titleTerms,
|
|
60
|
+
idPhrase: idTerms,
|
|
61
|
+
instances,
|
|
62
|
+
bodyTermCount,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Compatibility characters, combining sequences, case pairs across scripts, scripts whose marks
|
|
66
|
+
// split tokens, and characters from recent Unicode versions (Glagolitic U+2C2F and U+2C5F from 14.0,
|
|
67
|
+
// U+1E030 from 15.0, Cyrillic TJE U+1C89 and U+1C8A from 16.0), so a runtime whose Unicode tables
|
|
68
|
+
// differ prints another fingerprint.
|
|
69
|
+
export const FINGERPRINT_SAMPLE = Object.freeze([
|
|
70
|
+
"fi fl AB ½ ℀ ㎃ ① Ⅸ ⁵ µ ㍿ カ ゙",
|
|
71
|
+
"café Å Å ñ 가 क़",
|
|
72
|
+
"ΟΔΟΣ Σίσυφος Dž DŽ İ ẞ Ꭰ ꭰ Ა Ⴀ Ꙁ",
|
|
73
|
+
"खोज ค้นหา البحث 中文 검색 եւ և",
|
|
74
|
+
"Ⱟⱟ \u{1e030} ",
|
|
75
|
+
]);
|
|
76
|
+
let fingerprint;
|
|
77
|
+
/** The normalizer fingerprint of the running runtime: a short hash of normalize() and tokenize()
|
|
78
|
+
* over a fixed sample. */
|
|
79
|
+
export function normalizerFingerprint() {
|
|
80
|
+
fingerprint ??= sha256HexOfUtf8(FINGERPRINT_SAMPLE.map((sample) => `${normalize(sample)}\u0001${tokenize(sample).join(" ")}`).join("\u0000")).slice(0, 16);
|
|
81
|
+
return fingerprint;
|
|
82
|
+
}
|
|
83
|
+
/** `${SEARCH_ALGORITHM}/${SEARCH_TEXT_REVISION}/${normalizerFingerprint()}`: what a stored index row
|
|
84
|
+
* was derived with. */
|
|
85
|
+
export function textVersion() {
|
|
86
|
+
return `${SEARCH_ALGORITHM}/${SEARCH_TEXT_REVISION}/${normalizerFingerprint()}`;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=row-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-text.js","sourceRoot":"","sources":["../../src/search/row-text.ts"],"names":[],"mappings":"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"}
|