@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,28 @@
|
|
|
1
|
+
import { type SearchRequestV1, type SearchResultV1, type SearchStopV1 } from "./contract.js";
|
|
2
|
+
import type { SearchSource } from "./source.js";
|
|
3
|
+
/** What a cursor is bound to besides the request and the corpus key: a host scope such as the bundle id. */
|
|
4
|
+
export interface SearchScopeV1 {
|
|
5
|
+
readonly scope?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SearchOptionsV1 {
|
|
8
|
+
/** The largest answer, as UTF-8 JSON: a page that would exceed it ends early, with `nextCursor` at
|
|
9
|
+
* the cut, keeping at least one hit. Absent: every requested hit is returned. */
|
|
10
|
+
readonly maxResultBytes?: number;
|
|
11
|
+
/** The most capped term instances a request's terms may hold across the corpus before the request
|
|
12
|
+
* is refused as too broad. Default and ceiling: SEARCH_LIMITS.maxEvidenceInstances. */
|
|
13
|
+
readonly maxEvidenceInstances?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The contract's checks without a schema library: a plain request object with only the contract's
|
|
17
|
+
* members, each within its bounds. Returns a copy holding the members present. A cursor's binding
|
|
18
|
+
* is checked when it is used, against the corpus it continues.
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateSearchRequest(input: unknown): SearchRequestV1;
|
|
21
|
+
/**
|
|
22
|
+
* Runs one request over a source. Throws `SearchInputError` for a request outside the contract
|
|
23
|
+
* (including a cursor minted for another corpus, scope, query, match or filters),
|
|
24
|
+
* `SearchBroadQueryError` when the request's terms exceed `maxEvidenceInstances`, `SearchLimitError`
|
|
25
|
+
* as the source does, and stops as `stop` asks.
|
|
26
|
+
*/
|
|
27
|
+
export declare function searchDocuments(source: SearchSource, request: SearchRequestV1, scope?: SearchScopeV1, stop?: SearchStopV1, options?: SearchOptionsV1): Promise<SearchResultV1>;
|
|
28
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/search/search.ts"],"names":[],"mappings":"AASA,OAAO,EAWL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAC;AAG9D,4GAA4G;AAC5G,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B;qFACiF;IACjF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;2FACuF;IACvF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAgFD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAgBrE;AA8CD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,eAAe,EACxB,KAAK,GAAE,aAAkB,EACzB,IAAI,CAAC,EAAE,YAAY,EACnB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAwGzB"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One `documents.search.v1` request over a source. Query normalization, the 16-term cap, `auto`
|
|
3
|
+
* matching (all terms, then the any-term fallback without conversational terms) and the guidance
|
|
4
|
+
* text are portal-webmcp 0.3.1's `superbee_search_documents`; cursors, facets, the page budget and
|
|
5
|
+
* the result shape are this contract's. Every refusal is a `SearchInputError` with a fixed reason.
|
|
6
|
+
*/
|
|
7
|
+
import { assertSafeConceptId } from "../paths.js";
|
|
8
|
+
import { InvalidInputError } from "../errors.js";
|
|
9
|
+
import { sha256HexOfUtf8 } from "../sha256.js";
|
|
10
|
+
import { SEARCH_ALGORITHM, SEARCH_FACETS, SEARCH_GUIDANCE, SEARCH_LIMITS, SEARCH_MATCHES, } from "./contract.js";
|
|
11
|
+
import { SearchBroadQueryError, SearchInputError, stopIfAsked } from "./errors.js";
|
|
12
|
+
import { base64UrlDecode, base64UrlEncode, canonicalJson } from "./identity.js";
|
|
13
|
+
import { excerptOf, facetsOf, rankEvidence } from "./rank.js";
|
|
14
|
+
import { normalizeQuery, relaxQuery, utf8, utf8ByteLength } from "./text.js";
|
|
15
|
+
const CURSOR_VERSION = 1;
|
|
16
|
+
const REQUEST_MEMBERS = new Set(["query", "match", "type", "tag", "prefix", "limit", "cursor", "facets"]);
|
|
17
|
+
/** A lone surrogate: matched by code unit in memory, but it has no UTF-8 form a native index can bind. */
|
|
18
|
+
const LONE_SURROGATE = /[\uD800-\uDFFF]/u;
|
|
19
|
+
function optionalFilter(value, maxBytes = SEARCH_LIMITS.maxFilterBytes) {
|
|
20
|
+
if (value === undefined)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (typeof value !== "string" || value === "" || utf8ByteLength(value) > maxBytes || LONE_SURROGATE.test(value))
|
|
23
|
+
throw new SearchInputError("filter");
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function evidenceInstanceBound(value) {
|
|
27
|
+
if (value === undefined)
|
|
28
|
+
return SEARCH_LIMITS.maxEvidenceInstances;
|
|
29
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
30
|
+
throw new TypeError("maxEvidenceInstances must be a positive integer");
|
|
31
|
+
return Math.min(value, SEARCH_LIMITS.maxEvidenceInstances);
|
|
32
|
+
}
|
|
33
|
+
const isCount = (value) => Number.isSafeInteger(value) && value >= 0;
|
|
34
|
+
/** The contract's checks on every member except the cursor's binding, in one order. */
|
|
35
|
+
function checkRequest(request) {
|
|
36
|
+
const raw = request?.query;
|
|
37
|
+
if (typeof raw !== "string" || utf8ByteLength(raw) > SEARCH_LIMITS.maxQueryBytes)
|
|
38
|
+
throw new SearchInputError("query");
|
|
39
|
+
const query = normalizeQuery(raw);
|
|
40
|
+
if (query.terms.length === 0)
|
|
41
|
+
throw new SearchInputError("empty-query");
|
|
42
|
+
if (query.terms.length > SEARCH_LIMITS.maxQueryTerms)
|
|
43
|
+
throw new SearchInputError("too-many-query-terms");
|
|
44
|
+
const requestedMatch = request.match ?? "auto";
|
|
45
|
+
if (!SEARCH_MATCHES.includes(requestedMatch))
|
|
46
|
+
throw new SearchInputError("match");
|
|
47
|
+
const type = optionalFilter(request.type);
|
|
48
|
+
const tag = optionalFilter(request.tag);
|
|
49
|
+
const prefix = optionalFilter(request.prefix, SEARCH_LIMITS.maxPrefixBytes);
|
|
50
|
+
if (prefix !== undefined) {
|
|
51
|
+
try {
|
|
52
|
+
assertSafeConceptId(prefix.endsWith("/") ? prefix.slice(0, -1) : prefix);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error instanceof InvalidInputError)
|
|
56
|
+
throw new SearchInputError("filter");
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const filters = {
|
|
61
|
+
...(type === undefined ? {} : { type }),
|
|
62
|
+
...(tag === undefined ? {} : { tag }),
|
|
63
|
+
...(prefix === undefined ? {} : { prefix }),
|
|
64
|
+
};
|
|
65
|
+
const limit = request.limit ?? SEARCH_LIMITS.defaultRows;
|
|
66
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > SEARCH_LIMITS.maxRows)
|
|
67
|
+
throw new SearchInputError("limit");
|
|
68
|
+
const wanted = new Set();
|
|
69
|
+
if (request.facets !== undefined) {
|
|
70
|
+
if (!Array.isArray(request.facets) || request.facets.length > SEARCH_FACETS.length)
|
|
71
|
+
throw new SearchInputError("facets");
|
|
72
|
+
for (const facet of request.facets) {
|
|
73
|
+
if (!SEARCH_FACETS.includes(facet) || wanted.has(facet))
|
|
74
|
+
throw new SearchInputError("facets");
|
|
75
|
+
wanted.add(facet);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { query, requestedMatch, type, tag, prefix, filters, limit, wanted };
|
|
79
|
+
}
|
|
80
|
+
function cursorText(cursor) {
|
|
81
|
+
if (typeof cursor !== "string" || cursor === "" || utf8ByteLength(cursor) > SEARCH_LIMITS.maxCursorBytes)
|
|
82
|
+
throw new SearchInputError("cursor");
|
|
83
|
+
return cursor;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The contract's checks without a schema library: a plain request object with only the contract's
|
|
87
|
+
* members, each within its bounds. Returns a copy holding the members present. A cursor's binding
|
|
88
|
+
* is checked when it is used, against the corpus it continues.
|
|
89
|
+
*/
|
|
90
|
+
export function validateSearchRequest(input) {
|
|
91
|
+
if (input === null || typeof input !== "object" || Array.isArray(input))
|
|
92
|
+
throw new SearchInputError("request");
|
|
93
|
+
for (const member of Object.keys(input))
|
|
94
|
+
if (!REQUEST_MEMBERS.has(member))
|
|
95
|
+
throw new SearchInputError("request");
|
|
96
|
+
const request = input;
|
|
97
|
+
checkRequest(request);
|
|
98
|
+
if (request.cursor !== undefined)
|
|
99
|
+
parseCursor(request.cursor);
|
|
100
|
+
return {
|
|
101
|
+
query: request.query,
|
|
102
|
+
...(request.match === undefined ? {} : { match: request.match }),
|
|
103
|
+
...(request.type === undefined ? {} : { type: request.type }),
|
|
104
|
+
...(request.tag === undefined ? {} : { tag: request.tag }),
|
|
105
|
+
...(request.prefix === undefined ? {} : { prefix: request.prefix }),
|
|
106
|
+
...(request.limit === undefined ? {} : { limit: request.limit }),
|
|
107
|
+
...(request.cursor === undefined ? {} : { cursor: request.cursor }),
|
|
108
|
+
...(request.facets === undefined ? {} : { facets: [...request.facets] }),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function bindingOf(corpusKey, scope, state) {
|
|
112
|
+
return sha256HexOfUtf8(canonicalJson({
|
|
113
|
+
algorithm: SEARCH_ALGORITHM,
|
|
114
|
+
corpusKey,
|
|
115
|
+
scope: scope ?? null,
|
|
116
|
+
...state,
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
function encodeCursor(binding, position) {
|
|
120
|
+
return base64UrlEncode(utf8(canonicalJson({ b: binding, p: position, v: CURSOR_VERSION })));
|
|
121
|
+
}
|
|
122
|
+
/** Structural decoding is shared by early request validation and corpus-bound continuation. */
|
|
123
|
+
function parseCursor(cursor) {
|
|
124
|
+
const bytes = base64UrlDecode(cursorText(cursor));
|
|
125
|
+
let parsed;
|
|
126
|
+
try {
|
|
127
|
+
parsed = bytes && JSON.parse(new TextDecoder("utf-8", { fatal: true, ignoreBOM: false }).decode(bytes));
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
throw new SearchInputError("cursor");
|
|
131
|
+
}
|
|
132
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
133
|
+
throw new SearchInputError("cursor");
|
|
134
|
+
const body = parsed;
|
|
135
|
+
const keys = Object.keys(body).sort();
|
|
136
|
+
if (keys.join(",") !== "b,p,v" || body.v !== CURSOR_VERSION || typeof body.b !== "string")
|
|
137
|
+
throw new SearchInputError("cursor");
|
|
138
|
+
if (!Number.isSafeInteger(body.p) || body.p < 1)
|
|
139
|
+
throw new SearchInputError("cursor");
|
|
140
|
+
return { b: body.b, p: body.p };
|
|
141
|
+
}
|
|
142
|
+
/** The position must carry this request's binding and lie inside the hits. */
|
|
143
|
+
function decodeCursor(cursor, binding, total) {
|
|
144
|
+
const body = parseCursor(cursor);
|
|
145
|
+
if (body.b !== binding || body.p >= total)
|
|
146
|
+
throw new SearchInputError("cursor");
|
|
147
|
+
return body.p;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Runs one request over a source. Throws `SearchInputError` for a request outside the contract
|
|
151
|
+
* (including a cursor minted for another corpus, scope, query, match or filters),
|
|
152
|
+
* `SearchBroadQueryError` when the request's terms exceed `maxEvidenceInstances`, `SearchLimitError`
|
|
153
|
+
* as the source does, and stops as `stop` asks.
|
|
154
|
+
*/
|
|
155
|
+
export async function searchDocuments(source, request, scope = {}, stop, options = {}) {
|
|
156
|
+
if (typeof source?.evidence !== "function" || typeof source.text !== "function")
|
|
157
|
+
throw new TypeError("searchDocuments needs a SearchSource");
|
|
158
|
+
const { query, requestedMatch, type, tag, prefix, filters, limit, wanted } = checkRequest(request);
|
|
159
|
+
const maxInstances = evidenceInstanceBound(options.maxEvidenceInstances);
|
|
160
|
+
stopIfAsked(stop);
|
|
161
|
+
const batch = await source.evidence(query.terms, filters, { maxInstances }, stop);
|
|
162
|
+
stopIfAsked(stop);
|
|
163
|
+
const size = batch?.size;
|
|
164
|
+
if (typeof batch?.key !== "string" ||
|
|
165
|
+
batch.key === "" ||
|
|
166
|
+
!Array.isArray(batch.documents) ||
|
|
167
|
+
!isCount(batch.volume) ||
|
|
168
|
+
![size?.documents, size?.indexed, size?.skipped, size?.reindexPending].every(isCount))
|
|
169
|
+
throw new TypeError("the search source answered a malformed evidence batch");
|
|
170
|
+
// The same bound on every source, whether or not the source stopped before its walk.
|
|
171
|
+
if (batch.volume > maxInstances)
|
|
172
|
+
throw new SearchBroadQueryError(maxInstances, batch.volume);
|
|
173
|
+
let effectiveMatch = requestedMatch === "any" ? "any" : "all";
|
|
174
|
+
let effectiveQuery = query;
|
|
175
|
+
let ignoredTerms = [];
|
|
176
|
+
let fallbackUsed = false;
|
|
177
|
+
let hits = rankEvidence(batch.documents, effectiveQuery, filters, effectiveMatch, stop);
|
|
178
|
+
if (requestedMatch === "auto" && hits.length === 0 && query.terms.length > 1) {
|
|
179
|
+
// The relaxed terms are a subset of the terms the evidence answered, so one read serves both.
|
|
180
|
+
const relaxed = relaxQuery(query);
|
|
181
|
+
effectiveQuery = relaxed.query;
|
|
182
|
+
ignoredTerms = relaxed.ignoredTerms;
|
|
183
|
+
effectiveMatch = "any";
|
|
184
|
+
fallbackUsed = true;
|
|
185
|
+
hits = rankEvidence(batch.documents, effectiveQuery, filters, effectiveMatch, stop);
|
|
186
|
+
}
|
|
187
|
+
const binding = bindingOf(batch.key, scope?.scope, {
|
|
188
|
+
query: query.phrase,
|
|
189
|
+
match: requestedMatch,
|
|
190
|
+
type: type ?? null,
|
|
191
|
+
tag: tag ?? null,
|
|
192
|
+
// Absent when unused, so a request without a prefix binds as it did before the filter existed.
|
|
193
|
+
prefix,
|
|
194
|
+
});
|
|
195
|
+
const start = request.cursor === undefined ? 0 : decodeCursor(request.cursor, binding, hits.length);
|
|
196
|
+
const page = hits.slice(start, start + limit);
|
|
197
|
+
const texts = page.length === 0
|
|
198
|
+
? new Map()
|
|
199
|
+
: await source.text(page.map(({ evidence }) => ({ id: evidence.id, version: evidence.version })));
|
|
200
|
+
stopIfAsked(stop);
|
|
201
|
+
const rows = page.map((hit) => {
|
|
202
|
+
const { evidence } = hit;
|
|
203
|
+
return {
|
|
204
|
+
id: evidence.id,
|
|
205
|
+
version: evidence.version,
|
|
206
|
+
...(evidence.title === undefined ? {} : { title: evidence.title }),
|
|
207
|
+
...(evidence.type === undefined ? {} : { type: evidence.type }),
|
|
208
|
+
tags: [...evidence.tags],
|
|
209
|
+
score: hit.score,
|
|
210
|
+
matchedTerms: hit.matchedTerms.map(({ term, fields }) => ({ term, fields: [...fields] })),
|
|
211
|
+
excerpt: excerptOf(hit, texts.get(evidence.id), effectiveQuery, SEARCH_LIMITS.excerptBytes),
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
const answer = (count) => ({
|
|
215
|
+
hits: rows.slice(0, count),
|
|
216
|
+
query: {
|
|
217
|
+
requestedMatch,
|
|
218
|
+
effectiveMatch,
|
|
219
|
+
fallbackUsed,
|
|
220
|
+
terms: [...effectiveQuery.terms],
|
|
221
|
+
...(ignoredTerms.length === 0 ? {} : { ignoredTerms: [...ignoredTerms] }),
|
|
222
|
+
},
|
|
223
|
+
total: hits.length,
|
|
224
|
+
...(wanted.size === 0 ? {} : { facets: facetsOf(hits, wanted) }),
|
|
225
|
+
...(start + count < hits.length ? { nextCursor: encodeCursor(binding, start + count) } : {}),
|
|
226
|
+
corpus: {
|
|
227
|
+
documents: size.documents,
|
|
228
|
+
indexed: size.indexed,
|
|
229
|
+
skipped: size.skipped,
|
|
230
|
+
reindexPending: size.reindexPending,
|
|
231
|
+
},
|
|
232
|
+
...(hits.length === 0
|
|
233
|
+
? {
|
|
234
|
+
guidance: effectiveMatch === "all" && effectiveQuery.terms.length > 1 ? SEARCH_GUIDANCE.all : SEARCH_GUIDANCE.any,
|
|
235
|
+
}
|
|
236
|
+
: {}),
|
|
237
|
+
});
|
|
238
|
+
// A page that does not fit the host's answer budget ends early, with a cursor at the cut (as
|
|
239
|
+
// portal-webmcp's pages do), so a long question at limit 50 still answers. At least one hit is kept:
|
|
240
|
+
// a single hit too large for the budget is the host's refusal to make.
|
|
241
|
+
let count = rows.length;
|
|
242
|
+
let result = answer(count);
|
|
243
|
+
const budget = options.maxResultBytes;
|
|
244
|
+
if (budget !== undefined && count > 1 && utf8ByteLength(JSON.stringify(result)) > budget) {
|
|
245
|
+
const sizes = rows.map((row) => utf8ByteLength(JSON.stringify(row)) + 1);
|
|
246
|
+
let size = utf8ByteLength(JSON.stringify(answer(0))) + utf8ByteLength(encodeCursor(binding, start)) + 16;
|
|
247
|
+
count = 0;
|
|
248
|
+
while (count < rows.length && size + sizes[count] <= budget)
|
|
249
|
+
size += sizes[count++];
|
|
250
|
+
count = Math.max(1, count);
|
|
251
|
+
result = answer(count);
|
|
252
|
+
while (count > 1 && utf8ByteLength(JSON.stringify(result)) > budget)
|
|
253
|
+
result = answer(--count);
|
|
254
|
+
}
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/search/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam a backend implements so the engine can search it. A source answers evidence for the
|
|
3
|
+
* query's terms in one consistent read and the text of the page's hits for excerpts; the engine
|
|
4
|
+
* ranks, pages and facets every source with the same code, so two sources that answer the same
|
|
5
|
+
* evidence for the same documents give byte-identical results.
|
|
6
|
+
*/
|
|
7
|
+
import type { SearchFiltersV1, SearchMatchFieldV1, SearchStopV1 } from "./contract.js";
|
|
8
|
+
/** What one indexed document holds of the query's terms, plus the fields ranking and facets read. */
|
|
9
|
+
export interface SearchEvidenceV1 {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly version: string;
|
|
12
|
+
readonly title?: string;
|
|
13
|
+
readonly type?: string;
|
|
14
|
+
/** Declared string tags, in document order. */
|
|
15
|
+
readonly tags: readonly string[];
|
|
16
|
+
readonly titlePhrase: string;
|
|
17
|
+
readonly idPhrase: string;
|
|
18
|
+
/** term -> the fields holding it and its body occurrences, capped at BODY_OCCURRENCE_CAP. Only
|
|
19
|
+
* terms the document holds appear. */
|
|
20
|
+
readonly terms: ReadonlyMap<string, {
|
|
21
|
+
readonly fields: readonly SearchMatchFieldV1[];
|
|
22
|
+
readonly bodyOccurrences: number;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
/** The sizes of what a source searched, reported as the result's `corpus`. */
|
|
26
|
+
export interface SearchCorpusSizeV1 {
|
|
27
|
+
/** Every document of the corpus. */
|
|
28
|
+
readonly documents: number;
|
|
29
|
+
/** Documents the source searches, reindexPending included. */
|
|
30
|
+
readonly indexed: number;
|
|
31
|
+
/** Documents the index cannot hold (over SEARCH_LIMITS.maxTermsPerDocument body terms, or a
|
|
32
|
+
* backend's own row bound), left out and counted. */
|
|
33
|
+
readonly skipped: number;
|
|
34
|
+
/** Indexed documents served at an older text version, awaiting re-derivation. */
|
|
35
|
+
readonly reindexPending: number;
|
|
36
|
+
}
|
|
37
|
+
/** What the engine allows one evidence read: a source that can stops before walking anything. */
|
|
38
|
+
export interface SearchEvidenceBoundsV1 {
|
|
39
|
+
/** The most capped term instances the terms may hold; over it, `documents` is empty. */
|
|
40
|
+
readonly maxInstances: number;
|
|
41
|
+
}
|
|
42
|
+
export interface SearchEvidenceBatchV1 {
|
|
43
|
+
/** Identity of what was searched: a snapshot digest, a heads digest, or a revision. Cursors bind to it. */
|
|
44
|
+
readonly key: string;
|
|
45
|
+
readonly size: SearchCorpusSizeV1;
|
|
46
|
+
/** Sum over the terms of their capped instance counts (searchRowText's `instances`) across the
|
|
47
|
+
* indexed documents, before the filters. */
|
|
48
|
+
readonly volume: number;
|
|
49
|
+
/** Every indexed document holding at least one of the terms after the exact filters, once each.
|
|
50
|
+
* Empty when `volume` exceeds the bound. */
|
|
51
|
+
readonly documents: readonly SearchEvidenceV1[];
|
|
52
|
+
}
|
|
53
|
+
export interface SearchTextV1 {
|
|
54
|
+
readonly description: string;
|
|
55
|
+
readonly body: string;
|
|
56
|
+
}
|
|
57
|
+
export interface SearchSource {
|
|
58
|
+
/** One consistent read: identity, sizes, the volume pre-check and the evidence for `terms` after
|
|
59
|
+
* the exact filters. */
|
|
60
|
+
evidence(terms: readonly string[], filters: SearchFiltersV1, bounds: SearchEvidenceBoundsV1, stop?: SearchStopV1): Promise<SearchEvidenceBatchV1>;
|
|
61
|
+
/** Description and body of the page's hits, at the evidence's version, for excerpts only. */
|
|
62
|
+
text(hits: readonly {
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly version: string;
|
|
65
|
+
}[]): Promise<ReadonlyMap<string, SearchTextV1>>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/search/source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEvF,qGAAqG;AACrG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;0CACsC;IACtC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;QAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3H;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;yDACqD;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,iGAAiG;AACjG,MAAM,WAAW,sBAAsB;IACrC,wFAAwF;IACxF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,2GAA2G;IAC3G,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC;gDAC4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;gDAC4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B;4BACwB;IACxB,QAAQ,CACN,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,sBAAsB,EAC9B,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,6FAA6F;IAC7F,IAAI,CAAC,IAAI,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CACtH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/search/source.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The search text rules, one owner: normalization, tokenization, the body scanner that keeps original
|
|
3
|
+
* byte offsets, query normalization and the automatic fallback's relaxation, plus the UTF-8 helpers
|
|
4
|
+
* excerpts need. Moved unchanged from portal-webmcp 0.3.1 (`search.ts`, `text.ts`).
|
|
5
|
+
*/
|
|
6
|
+
export declare function utf8(value: string): Uint8Array;
|
|
7
|
+
export declare function utf8ByteLength(value: string): number;
|
|
8
|
+
/**
|
|
9
|
+
* Move an index forward until it starts a UTF-8 sequence. A slice that begins on
|
|
10
|
+
* a continuation byte would decode to a replacement character, so continuations
|
|
11
|
+
* are skipped rather than replaced.
|
|
12
|
+
*/
|
|
13
|
+
export declare function forwardBoundary(bytes: Uint8Array, index: number): number;
|
|
14
|
+
/** Move an index backward until it ends a complete UTF-8 sequence. */
|
|
15
|
+
export declare function backwardBoundary(bytes: Uint8Array, index: number): number;
|
|
16
|
+
export declare function decodeUtf8(bytes: Uint8Array, start: number, end: number): string;
|
|
17
|
+
/** Collapse every maximal whitespace run to one ASCII space and trim both ends. */
|
|
18
|
+
export declare function collapseWhitespace(value: string): string;
|
|
19
|
+
/** Locale-independent normalization: Unicode NFKC then `toLowerCase()`. */
|
|
20
|
+
export declare function normalize(value: string): string;
|
|
21
|
+
/** Tokenization into maximal Unicode letter-or-number sequences of the normalized text. */
|
|
22
|
+
export declare function tokenize(value: string): string[];
|
|
23
|
+
/** A field's normalized phrase is its tokens joined by one ASCII space. */
|
|
24
|
+
export declare function phrase(value: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Visits every body token in document order with the original UTF-8 byte range of the run that
|
|
27
|
+
* produced it (every token of one run shares its range). `visit` returns `true` to stop the scan.
|
|
28
|
+
* The in-memory index and the excerpt both read the body through this one scanner, so a match's
|
|
29
|
+
* offsets are the same wherever they are computed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function scanBody(body: string, visit: (term: string, start: number, end: number) => boolean | void): void;
|
|
32
|
+
export interface NormalizedQueryV1 {
|
|
33
|
+
readonly phrase: string;
|
|
34
|
+
readonly terms: readonly string[];
|
|
35
|
+
}
|
|
36
|
+
/** Duplicate query tokens collapse after their first occurrence; the phrase is the remainder. */
|
|
37
|
+
export declare function normalizeQuery(query: string): NormalizedQueryV1;
|
|
38
|
+
export interface RelaxedQueryV1 {
|
|
39
|
+
readonly query: NormalizedQueryV1;
|
|
40
|
+
readonly ignoredTerms: readonly string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Removes fixed conversational terms for automatic any-term fallback. If that
|
|
44
|
+
* would remove the whole query, the original normalized query stays intact.
|
|
45
|
+
*/
|
|
46
|
+
export declare function relaxQuery(query: NormalizedQueryV1): RelaxedQueryV1;
|
|
47
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/search/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAE9C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIxE;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAMD,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,2FAA2F;AAC3F,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhD;AAED,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAsBD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,CA4BhH;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAS/D;AAYD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,cAAc,CAQnE"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The search text rules, one owner: normalization, tokenization, the body scanner that keeps original
|
|
3
|
+
* byte offsets, query normalization and the automatic fallback's relaxation, plus the UTF-8 helpers
|
|
4
|
+
* excerpts need. Moved unchanged from portal-webmcp 0.3.1 (`search.ts`, `text.ts`).
|
|
5
|
+
*/
|
|
6
|
+
const encoder = new TextEncoder();
|
|
7
|
+
const decoder = new TextDecoder("utf-8", { fatal: false, ignoreBOM: false });
|
|
8
|
+
export function utf8(value) {
|
|
9
|
+
return encoder.encode(value);
|
|
10
|
+
}
|
|
11
|
+
export function utf8ByteLength(value) {
|
|
12
|
+
return encoder.encode(value).byteLength;
|
|
13
|
+
}
|
|
14
|
+
function continuation(byte) {
|
|
15
|
+
return byte !== undefined && (byte & 0b1100_0000) === 0b1000_0000;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Move an index forward until it starts a UTF-8 sequence. A slice that begins on
|
|
19
|
+
* a continuation byte would decode to a replacement character, so continuations
|
|
20
|
+
* are skipped rather than replaced.
|
|
21
|
+
*/
|
|
22
|
+
export function forwardBoundary(bytes, index) {
|
|
23
|
+
let cursor = Math.max(0, Math.min(index, bytes.byteLength));
|
|
24
|
+
while (cursor < bytes.byteLength && continuation(bytes[cursor]))
|
|
25
|
+
cursor += 1;
|
|
26
|
+
return cursor;
|
|
27
|
+
}
|
|
28
|
+
/** Move an index backward until it ends a complete UTF-8 sequence. */
|
|
29
|
+
export function backwardBoundary(bytes, index) {
|
|
30
|
+
let cursor = Math.max(0, Math.min(index, bytes.byteLength));
|
|
31
|
+
while (cursor > 0 && continuation(bytes[cursor]))
|
|
32
|
+
cursor -= 1;
|
|
33
|
+
return cursor;
|
|
34
|
+
}
|
|
35
|
+
export function decodeUtf8(bytes, start, end) {
|
|
36
|
+
return decoder.decode(bytes.subarray(start, end));
|
|
37
|
+
}
|
|
38
|
+
/** Collapse every maximal whitespace run to one ASCII space and trim both ends. */
|
|
39
|
+
export function collapseWhitespace(value) {
|
|
40
|
+
return value.replace(/\s+/gu, " ").trim();
|
|
41
|
+
}
|
|
42
|
+
const TOKEN = /[\p{L}\p{N}]+/gu;
|
|
43
|
+
const LETTER_OR_NUMBER = /[\p{L}\p{N}]/u;
|
|
44
|
+
const MARK = /\p{M}/u;
|
|
45
|
+
/** Locale-independent normalization: Unicode NFKC then `toLowerCase()`. */
|
|
46
|
+
export function normalize(value) {
|
|
47
|
+
return value.normalize("NFKC").toLowerCase();
|
|
48
|
+
}
|
|
49
|
+
/** Tokenization into maximal Unicode letter-or-number sequences of the normalized text. */
|
|
50
|
+
export function tokenize(value) {
|
|
51
|
+
return [...normalize(value).matchAll(TOKEN)].map((match) => match[0]);
|
|
52
|
+
}
|
|
53
|
+
/** A field's normalized phrase is its tokens joined by one ASCII space. */
|
|
54
|
+
export function phrase(value) {
|
|
55
|
+
return tokenize(value).join(" ");
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Whether an original character can belong to a token run.
|
|
59
|
+
*
|
|
60
|
+
* Body tokens must keep original byte offsets, so the body is segmented before
|
|
61
|
+
* normalization rather than after. A character joins a run when it is a letter
|
|
62
|
+
* or number, a combining mark (so a decomposed sequence composes inside its own
|
|
63
|
+
* run), or a compatibility character whose NFKC form contains a letter or
|
|
64
|
+
* number. NFKC never composes across a character outside that set, so run-wise
|
|
65
|
+
* tokenization yields the same terms as tokenizing the whole normalized field.
|
|
66
|
+
*/
|
|
67
|
+
const runMembership = new Map();
|
|
68
|
+
function inTokenRun(character) {
|
|
69
|
+
const cached = runMembership.get(character);
|
|
70
|
+
if (cached !== undefined)
|
|
71
|
+
return cached;
|
|
72
|
+
const member = LETTER_OR_NUMBER.test(character) || MARK.test(character) || LETTER_OR_NUMBER.test(character.normalize("NFKC"));
|
|
73
|
+
runMembership.set(character, member);
|
|
74
|
+
return member;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Visits every body token in document order with the original UTF-8 byte range of the run that
|
|
78
|
+
* produced it (every token of one run shares its range). `visit` returns `true` to stop the scan.
|
|
79
|
+
* The in-memory index and the excerpt both read the body through this one scanner, so a match's
|
|
80
|
+
* offsets are the same wherever they are computed.
|
|
81
|
+
*/
|
|
82
|
+
export function scanBody(body, visit) {
|
|
83
|
+
let byteOffset = 0;
|
|
84
|
+
let runStart = 0;
|
|
85
|
+
let run = "";
|
|
86
|
+
let stopped = false;
|
|
87
|
+
const flush = () => {
|
|
88
|
+
if (run.length === 0)
|
|
89
|
+
return;
|
|
90
|
+
for (const match of normalize(run).matchAll(TOKEN)) {
|
|
91
|
+
if (visit(match[0], runStart, byteOffset) === true) {
|
|
92
|
+
stopped = true;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
run = "";
|
|
97
|
+
};
|
|
98
|
+
for (const character of body) {
|
|
99
|
+
if (inTokenRun(character)) {
|
|
100
|
+
if (run.length === 0)
|
|
101
|
+
runStart = byteOffset;
|
|
102
|
+
run += character;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
flush();
|
|
106
|
+
if (stopped)
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// for-of yields one code point; lone surrogates encode as the three-byte replacement character.
|
|
110
|
+
const point = character.codePointAt(0);
|
|
111
|
+
byteOffset += point <= 0x7f ? 1 : point <= 0x7ff ? 2 : point <= 0xffff ? 3 : 4;
|
|
112
|
+
}
|
|
113
|
+
flush();
|
|
114
|
+
}
|
|
115
|
+
/** Duplicate query tokens collapse after their first occurrence; the phrase is the remainder. */
|
|
116
|
+
export function normalizeQuery(query) {
|
|
117
|
+
const terms = [];
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
for (const token of tokenize(query)) {
|
|
120
|
+
if (seen.has(token))
|
|
121
|
+
continue;
|
|
122
|
+
seen.add(token);
|
|
123
|
+
terms.push(token);
|
|
124
|
+
}
|
|
125
|
+
return { phrase: terms.join(" "), terms: Object.freeze(terms) };
|
|
126
|
+
}
|
|
127
|
+
// Fixed package text, deliberately not locale-sensitive. These words carry
|
|
128
|
+
// little retrieval signal in ordinary English questions. They are removed only
|
|
129
|
+
// by the automatic fallback, never by explicit `all` or `any` matching.
|
|
130
|
+
// prettier-ignore
|
|
131
|
+
const CONVERSATIONAL_TERMS = new Set([
|
|
132
|
+
"a", "an", "and", "are", "as", "at", "be", "by", "can", "did", "do", "does",
|
|
133
|
+
"for", "from", "how", "in", "is", "it", "of", "on", "or", "should", "that", "the",
|
|
134
|
+
"this", "to", "was", "what", "when", "where", "which", "who", "why", "will", "with",
|
|
135
|
+
]);
|
|
136
|
+
/**
|
|
137
|
+
* Removes fixed conversational terms for automatic any-term fallback. If that
|
|
138
|
+
* would remove the whole query, the original normalized query stays intact.
|
|
139
|
+
*/
|
|
140
|
+
export function relaxQuery(query) {
|
|
141
|
+
const terms = query.terms.filter((term) => !CONVERSATIONAL_TERMS.has(term));
|
|
142
|
+
if (terms.length === 0)
|
|
143
|
+
return { query, ignoredTerms: Object.freeze([]) };
|
|
144
|
+
const kept = new Set(terms);
|
|
145
|
+
return {
|
|
146
|
+
query: { phrase: terms.join(" "), terms: Object.freeze(terms) },
|
|
147
|
+
ignoredTerms: Object.freeze(query.terms.filter((term) => !kept.has(term))),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/search/text.ts"],"names":[],"mappings":"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"}
|