wiki-graph-core 0.3.1
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/LICENSE +201 -0
- package/data/editor/clue_reviewer.jinja +410 -0
- package/data/editor/clue_reviewer_generator.jinja +428 -0
- package/data/editor/revision_feedback.jinja +5 -0
- package/data/editor/text_compressor.jinja +127 -0
- package/data/guaranteed/response_intent_classifier.jinja +8 -0
- package/data/help/commands/archive/next.jinja +29 -0
- package/data/help/commands/gc.jinja +38 -0
- package/data/help/commands/legacy/migrate.jinja +20 -0
- package/data/help/commands/legacy.jinja +19 -0
- package/data/help/commands/maintenance/chapter/add.jinja +41 -0
- package/data/help/commands/maintenance/chapter/list.jinja +33 -0
- package/data/help/commands/maintenance/chapter/move.jinja +36 -0
- package/data/help/commands/maintenance/chapter/remove.jinja +26 -0
- package/data/help/commands/maintenance/chapter/reset.jinja +29 -0
- package/data/help/commands/maintenance/chapter/set-source.jinja +34 -0
- package/data/help/commands/maintenance/chapter/set-summary.jinja +31 -0
- package/data/help/commands/maintenance/chapter/set-title.jinja +29 -0
- package/data/help/commands/maintenance/chapter/tree.jinja +58 -0
- package/data/help/commands/maintenance/chapter.jinja +59 -0
- package/data/help/commands/maintenance/cover.jinja +28 -0
- package/data/help/commands/maintenance/meta.jinja +55 -0
- package/data/help/commands/predicate.jinja +460 -0
- package/data/help/commands/root.jinja +83 -0
- package/data/help/commands/transform.jinja +34 -0
- package/data/help/commands/uri.jinja +274 -0
- package/data/help/topics/config.jinja +88 -0
- package/data/help/topics/format.jinja +72 -0
- package/data/help/topics/readiness.jinja +99 -0
- package/data/help/topics/recipe.jinja +151 -0
- package/data/help/topics/runtime.jinja +62 -0
- package/data/help/topics/uri.jinja +178 -0
- package/data/output/epub/cover.xhtml.jinja +13 -0
- package/data/output/epub/nav.xhtml.jinja +12 -0
- package/data/output/epub/package.opf.xml.jinja +39 -0
- package/data/output/epub/section.xhtml.jinja +12 -0
- package/data/topologization/book_coherence_extraction.jinja +223 -0
- package/data/topologization/chunk_extraction.jinja +233 -0
- package/data/topologization/evidence_choice.jinja +38 -0
- package/data/topologization/translate_chunks.jinja +138 -0
- package/data/topologization/user_focused_extraction.jinja +378 -0
- package/dist/archive/query/archive-view.d.ts +26 -0
- package/dist/archive/query/archive-view.js +4540 -0
- package/dist/archive/query/archive-view.js.map +1 -0
- package/dist/archive/query/continuation-cursor.d.ts +61 -0
- package/dist/archive/query/continuation-cursor.js +363 -0
- package/dist/archive/query/continuation-cursor.js.map +1 -0
- package/dist/archive/query/index.d.ts +29 -0
- package/dist/archive/query/index.js +63 -0
- package/dist/archive/query/index.js.map +1 -0
- package/dist/archive/query/lexical-search.d.ts +22 -0
- package/dist/archive/query/lexical-search.js +137 -0
- package/dist/archive/query/lexical-search.js.map +1 -0
- package/dist/archive/query/search-cache.d.ts +192 -0
- package/dist/archive/query/search-cache.js +1248 -0
- package/dist/archive/query/search-cache.js.map +1 -0
- package/dist/archive/search-index/index.d.ts +26 -0
- package/dist/archive/search-index/index.js +29 -0
- package/dist/archive/search-index/index.js.map +1 -0
- package/dist/archive/search-index/search-index.d.ts +26 -0
- package/dist/archive/search-index/search-index.js +555 -0
- package/dist/archive/search-index/search-index.js.map +1 -0
- package/dist/archive/search-index/search-tokenizer.d.ts +16 -0
- package/dist/archive/search-index/search-tokenizer.js +225 -0
- package/dist/archive/search-index/search-tokenizer.js.map +1 -0
- package/dist/common/cli-command.d.ts +4 -0
- package/dist/common/cli-command.js +7 -0
- package/dist/common/cli-command.js.map +1 -0
- package/dist/common/data-dir.d.ts +3 -0
- package/dist/common/data-dir.js +48 -0
- package/dist/common/data-dir.js.map +1 -0
- package/dist/common/language.d.ts +55 -0
- package/dist/common/language.js +208 -0
- package/dist/common/language.js.map +1 -0
- package/dist/common/llm-scope.d.ts +19 -0
- package/dist/common/llm-scope.js +31 -0
- package/dist/common/llm-scope.js.map +1 -0
- package/dist/common/logging.d.ts +22 -0
- package/dist/common/logging.js +141 -0
- package/dist/common/logging.js.map +1 -0
- package/dist/common/template.d.ts +8 -0
- package/dist/common/template.js +54 -0
- package/dist/common/template.js.map +1 -0
- package/dist/common/tinyld-language.d.ts +6 -0
- package/dist/common/tinyld-language.js +34 -0
- package/dist/common/tinyld-language.js.map +1 -0
- package/dist/common/wiki-graph-dir.d.ts +10 -0
- package/dist/common/wiki-graph-dir.js +41 -0
- package/dist/common/wiki-graph-dir.js.map +1 -0
- package/dist/common/wiki-graph-temp.d.ts +6 -0
- package/dist/common/wiki-graph-temp.js +21 -0
- package/dist/common/wiki-graph-temp.js.map +1 -0
- package/dist/common/wiki-graph-uri.d.ts +28 -0
- package/dist/common/wiki-graph-uri.js +171 -0
- package/dist/common/wiki-graph-uri.js.map +1 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.js +13 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/task-context.d.ts +41 -0
- package/dist/context/task-context.js +111 -0
- package/dist/context/task-context.js.map +1 -0
- package/dist/document/database.d.ts +30 -0
- package/dist/document/database.js +273 -0
- package/dist/document/database.js.map +1 -0
- package/dist/document/document.d.ts +153 -0
- package/dist/document/document.js +615 -0
- package/dist/document/document.js.map +1 -0
- package/dist/document/fragments.d.ts +63 -0
- package/dist/document/fragments.js +371 -0
- package/dist/document/fragments.js.map +1 -0
- package/dist/document/index.d.ts +13 -0
- package/dist/document/index.js +62 -0
- package/dist/document/index.js.map +1 -0
- package/dist/document/schema.d.ts +8 -0
- package/dist/document/schema.js +472 -0
- package/dist/document/schema.js.map +1 -0
- package/dist/document/shared-state-database.d.ts +9 -0
- package/dist/document/shared-state-database.js +193 -0
- package/dist/document/shared-state-database.js.map +1 -0
- package/dist/document/stores.d.ts +203 -0
- package/dist/document/stores.js +1678 -0
- package/dist/document/stores.js.map +1 -0
- package/dist/document/text-streams.d.ts +86 -0
- package/dist/document/text-streams.js +515 -0
- package/dist/document/text-streams.js.map +1 -0
- package/dist/document/types.d.ts +148 -0
- package/dist/document/types.js +69 -0
- package/dist/document/types.js.map +1 -0
- package/dist/editor/clue.d.ts +27 -0
- package/dist/editor/clue.js +158 -0
- package/dist/editor/clue.js.map +1 -0
- package/dist/editor/compressor.d.ts +18 -0
- package/dist/editor/compressor.js +68 -0
- package/dist/editor/compressor.js.map +1 -0
- package/dist/editor/editor.d.ts +39 -0
- package/dist/editor/editor.js +253 -0
- package/dist/editor/editor.js.map +1 -0
- package/dist/editor/feedback.d.ts +16 -0
- package/dist/editor/feedback.js +104 -0
- package/dist/editor/feedback.js.map +1 -0
- package/dist/editor/index.d.ts +17 -0
- package/dist/editor/index.js +5 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/editor/language-review.d.ts +14 -0
- package/dist/editor/language-review.js +35 -0
- package/dist/editor/language-review.js.map +1 -0
- package/dist/editor/log.d.ts +37 -0
- package/dist/editor/log.js +202 -0
- package/dist/editor/log.js.map +1 -0
- package/dist/editor/markup.d.ts +20 -0
- package/dist/editor/markup.js +294 -0
- package/dist/editor/markup.js.map +1 -0
- package/dist/editor/prompt-templates.d.ts +6 -0
- package/dist/editor/prompt-templates.js +11 -0
- package/dist/editor/prompt-templates.js.map +1 -0
- package/dist/editor/response.d.ts +5 -0
- package/dist/editor/response.js +31 -0
- package/dist/editor/response.js.map +1 -0
- package/dist/editor/review.d.ts +34 -0
- package/dist/editor/review.js +189 -0
- package/dist/editor/review.js.map +1 -0
- package/dist/editor/types.d.ts +31 -0
- package/dist/editor/types.js +21 -0
- package/dist/editor/types.js.map +1 -0
- package/dist/evidence-selection/anchor-resolver.d.ts +43 -0
- package/dist/evidence-selection/anchor-resolver.js +783 -0
- package/dist/evidence-selection/anchor-resolver.js.map +1 -0
- package/dist/evidence-selection/anchor-types.d.ts +27 -0
- package/dist/evidence-selection/anchor-types.js +1 -0
- package/dist/evidence-selection/anchor-types.js.map +1 -0
- package/dist/evidence-selection/index.d.ts +8 -0
- package/dist/evidence-selection/index.js +32 -0
- package/dist/evidence-selection/index.js.map +1 -0
- package/dist/evidence-selection/prompt.d.ts +18 -0
- package/dist/evidence-selection/prompt.js +54 -0
- package/dist/evidence-selection/prompt.js.map +1 -0
- package/dist/evidence-selection/quote-score.d.ts +29 -0
- package/dist/evidence-selection/quote-score.js +331 -0
- package/dist/evidence-selection/quote-score.js.map +1 -0
- package/dist/evidence-selection/selection-resolver.d.ts +19 -0
- package/dist/evidence-selection/selection-resolver.js +303 -0
- package/dist/evidence-selection/selection-resolver.js.map +1 -0
- package/dist/evidence-selection/text.d.ts +4 -0
- package/dist/evidence-selection/text.js +66 -0
- package/dist/evidence-selection/text.js.map +1 -0
- package/dist/evidence-selection/types.d.ts +36 -0
- package/dist/evidence-selection/types.js +1 -0
- package/dist/evidence-selection/types.js.map +1 -0
- package/dist/facade/app.d.ts +75 -0
- package/dist/facade/app.js +141 -0
- package/dist/facade/app.js.map +1 -0
- package/dist/facade/build-queue.d.ts +181 -0
- package/dist/facade/build-queue.js +1442 -0
- package/dist/facade/build-queue.js.map +1 -0
- package/dist/facade/chapter-build.d.ts +60 -0
- package/dist/facade/chapter-build.js +1020 -0
- package/dist/facade/chapter-build.js.map +1 -0
- package/dist/facade/chapter.d.ts +168 -0
- package/dist/facade/chapter.js +944 -0
- package/dist/facade/chapter.js.map +1 -0
- package/dist/facade/digest.d.ts +55 -0
- package/dist/facade/digest.js +168 -0
- package/dist/facade/digest.js.map +1 -0
- package/dist/facade/graph.d.ts +60 -0
- package/dist/facade/graph.js +203 -0
- package/dist/facade/graph.js.map +1 -0
- package/dist/facade/import.d.ts +49 -0
- package/dist/facade/import.js +262 -0
- package/dist/facade/import.js.map +1 -0
- package/dist/facade/index.d.ts +39 -0
- package/dist/facade/index.js +171 -0
- package/dist/facade/index.js.map +1 -0
- package/dist/facade/knowledge-graph-build.d.ts +75 -0
- package/dist/facade/knowledge-graph-build.js +897 -0
- package/dist/facade/knowledge-graph-build.js.map +1 -0
- package/dist/facade/llm-sampling.d.ts +11 -0
- package/dist/facade/llm-sampling.js +58 -0
- package/dist/facade/llm-sampling.js.map +1 -0
- package/dist/facade/types.d.ts +8 -0
- package/dist/facade/types.js +1 -0
- package/dist/facade/types.js.map +1 -0
- package/dist/facade/wiki-graph-archive.d.ts +41 -0
- package/dist/facade/wiki-graph-archive.js +130 -0
- package/dist/facade/wiki-graph-archive.js.map +1 -0
- package/dist/gc/files.d.ts +15 -0
- package/dist/gc/files.js +141 -0
- package/dist/gc/files.js.map +1 -0
- package/dist/gc/index.d.ts +2 -0
- package/dist/gc/index.js +5 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/gc/lock.d.ts +3 -0
- package/dist/gc/lock.js +137 -0
- package/dist/gc/lock.js.map +1 -0
- package/dist/gc/runner.d.ts +9 -0
- package/dist/gc/runner.js +129 -0
- package/dist/gc/runner.js.map +1 -0
- package/dist/gc/tmp-gc.d.ts +5 -0
- package/dist/gc/tmp-gc.js +57 -0
- package/dist/gc/tmp-gc.js.map +1 -0
- package/dist/gc/types.d.ts +24 -0
- package/dist/gc/types.js +1 -0
- package/dist/gc/types.js.map +1 -0
- package/dist/gc.cjs +10041 -0
- package/dist/gc.cjs.map +1 -0
- package/dist/gc.d.cts +10 -0
- package/dist/gc.d.ts +2 -0
- package/dist/gc.js +5 -0
- package/dist/gc.js.map +1 -0
- package/dist/guaranteed/classifier.d.ts +10 -0
- package/dist/guaranteed/classifier.js +88 -0
- package/dist/guaranteed/classifier.js.map +1 -0
- package/dist/guaranteed/errors.d.ts +38 -0
- package/dist/guaranteed/errors.js +73 -0
- package/dist/guaranteed/errors.js.map +1 -0
- package/dist/guaranteed/index.d.ts +7 -0
- package/dist/guaranteed/index.js +21 -0
- package/dist/guaranteed/index.js.map +1 -0
- package/dist/guaranteed/request.d.ts +8 -0
- package/dist/guaranteed/request.js +206 -0
- package/dist/guaranteed/request.js.map +1 -0
- package/dist/guaranteed/response.d.ts +12 -0
- package/dist/guaranteed/response.js +98 -0
- package/dist/guaranteed/response.js.map +1 -0
- package/dist/guaranteed/types.d.ts +20 -0
- package/dist/guaranteed/types.js +1 -0
- package/dist/guaranteed/types.js.map +1 -0
- package/dist/index-B8NNnQ8P.d.ts +424 -0
- package/dist/index.cjs +34774 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2462 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +168 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy-sdpub/upgrade.d.ts +7 -0
- package/dist/legacy-sdpub/upgrade.js +795 -0
- package/dist/legacy-sdpub/upgrade.js.map +1 -0
- package/dist/llm/cache.d.ts +13 -0
- package/dist/llm/cache.js +35 -0
- package/dist/llm/cache.js.map +1 -0
- package/dist/llm/client.d.ts +26 -0
- package/dist/llm/client.js +572 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/context.d.ts +22 -0
- package/dist/llm/context.js +78 -0
- package/dist/llm/context.js.map +1 -0
- package/dist/llm/errors.d.ts +7 -0
- package/dist/llm/errors.js +12 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.js +17 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/request-log.d.ts +9 -0
- package/dist/llm/request-log.js +35 -0
- package/dist/llm/request-log.js.map +1 -0
- package/dist/llm/sampling.d.ts +11 -0
- package/dist/llm/sampling.js +67 -0
- package/dist/llm/sampling.js.map +1 -0
- package/dist/llm/types.d.ts +50 -0
- package/dist/llm/types.js +1 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/output/epub/archive.d.ts +9 -0
- package/dist/output/epub/archive.js +81 -0
- package/dist/output/epub/archive.js.map +1 -0
- package/dist/output/epub/book.d.ts +15 -0
- package/dist/output/epub/book.js +76 -0
- package/dist/output/epub/book.js.map +1 -0
- package/dist/output/epub/content.d.ts +9 -0
- package/dist/output/epub/content.js +35 -0
- package/dist/output/epub/content.js.map +1 -0
- package/dist/output/epub/index.d.ts +20 -0
- package/dist/output/epub/index.js +14 -0
- package/dist/output/epub/index.js.map +1 -0
- package/dist/output/epub/model.d.ts +24 -0
- package/dist/output/epub/model.js +1 -0
- package/dist/output/epub/model.js.map +1 -0
- package/dist/output/epub/navigation.d.ts +10 -0
- package/dist/output/epub/navigation.js +39 -0
- package/dist/output/epub/navigation.js.map +1 -0
- package/dist/output/epub/package.d.ts +17 -0
- package/dist/output/epub/package.js +29 -0
- package/dist/output/epub/package.js.map +1 -0
- package/dist/output/epub/shared.d.ts +4 -0
- package/dist/output/epub/shared.js +12 -0
- package/dist/output/epub/shared.js.map +1 -0
- package/dist/output/epub/templates.d.ts +35 -0
- package/dist/output/epub/templates.js +26 -0
- package/dist/output/epub/templates.js.map +1 -0
- package/dist/output/index.d.ts +14 -0
- package/dist/output/index.js +11 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/plain-text.d.ts +18 -0
- package/dist/output/plain-text.js +56 -0
- package/dist/output/plain-text.js.map +1 -0
- package/dist/progress/index.d.ts +3 -0
- package/dist/progress/index.js +14 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/progress/reporter.d.ts +10 -0
- package/dist/progress/reporter.js +79 -0
- package/dist/progress/reporter.js.map +1 -0
- package/dist/progress/tracker.d.ts +37 -0
- package/dist/progress/tracker.js +119 -0
- package/dist/progress/tracker.js.map +1 -0
- package/dist/progress/types.d.ts +28 -0
- package/dist/progress/types.js +1 -0
- package/dist/progress/types.js.map +1 -0
- package/dist/reader/attention/attention.d.ts +39 -0
- package/dist/reader/attention/attention.js +123 -0
- package/dist/reader/attention/attention.js.map +1 -0
- package/dist/reader/attention/index.d.ts +9 -0
- package/dist/reader/attention/index.js +5 -0
- package/dist/reader/attention/index.js.map +1 -0
- package/dist/reader/attention/wave-reflection.d.ts +21 -0
- package/dist/reader/attention/wave-reflection.js +153 -0
- package/dist/reader/attention/wave-reflection.js.map +1 -0
- package/dist/reader/attention/working-memory.d.ts +28 -0
- package/dist/reader/attention/working-memory.js +62 -0
- package/dist/reader/attention/working-memory.js.map +1 -0
- package/dist/reader/chunk-batch/extract.d.ts +13 -0
- package/dist/reader/chunk-batch/extract.js +14 -0
- package/dist/reader/chunk-batch/extract.js.map +1 -0
- package/dist/reader/chunk-batch/extractor.d.ts +17 -0
- package/dist/reader/chunk-batch/extractor.js +337 -0
- package/dist/reader/chunk-batch/extractor.js.map +1 -0
- package/dist/reader/chunk-batch/fragment-projection.d.ts +34 -0
- package/dist/reader/chunk-batch/fragment-projection.js +94 -0
- package/dist/reader/chunk-batch/fragment-projection.js.map +1 -0
- package/dist/reader/chunk-batch/index.d.ts +12 -0
- package/dist/reader/chunk-batch/index.js +13 -0
- package/dist/reader/chunk-batch/index.js.map +1 -0
- package/dist/reader/chunk-batch/language.d.ts +9 -0
- package/dist/reader/chunk-batch/language.js +23 -0
- package/dist/reader/chunk-batch/language.js.map +1 -0
- package/dist/reader/chunk-batch/parser.d.ts +94 -0
- package/dist/reader/chunk-batch/parser.js +640 -0
- package/dist/reader/chunk-batch/parser.js.map +1 -0
- package/dist/reader/chunk-batch/prompt-templates.d.ts +6 -0
- package/dist/reader/chunk-batch/prompt-templates.js +11 -0
- package/dist/reader/chunk-batch/prompt-templates.js.map +1 -0
- package/dist/reader/chunk-batch/types.d.ts +85 -0
- package/dist/reader/chunk-batch/types.js +1 -0
- package/dist/reader/chunk-batch/types.js.map +1 -0
- package/dist/reader/index.d.ts +13 -0
- package/dist/reader/index.js +7 -0
- package/dist/reader/index.js.map +1 -0
- package/dist/reader/reader.d.ts +37 -0
- package/dist/reader/reader.js +82 -0
- package/dist/reader/reader.js.map +1 -0
- package/dist/reader/segment/index.d.ts +2 -0
- package/dist/reader/segment/index.js +5 -0
- package/dist/reader/segment/index.js.map +1 -0
- package/dist/reader/segment/intl-segmenter.d.ts +5 -0
- package/dist/reader/segment/intl-segmenter.js +102 -0
- package/dist/reader/segment/intl-segmenter.js.map +1 -0
- package/dist/reader/segment/segment.d.ts +5 -0
- package/dist/reader/segment/segment.js +9 -0
- package/dist/reader/segment/segment.js.map +1 -0
- package/dist/reader/segment/types.d.ts +14 -0
- package/dist/reader/segment/types.js +1 -0
- package/dist/reader/segment/types.js.map +1 -0
- package/dist/reader/types.d.ts +29 -0
- package/dist/reader/types.js +1 -0
- package/dist/reader/types.js.map +1 -0
- package/dist/serial.d.ts +89 -0
- package/dist/serial.js +476 -0
- package/dist/serial.js.map +1 -0
- package/dist/source/adapter.d.ts +15 -0
- package/dist/source/adapter.js +1 -0
- package/dist/source/adapter.js.map +1 -0
- package/dist/source/epub/archive.d.ts +27 -0
- package/dist/source/epub/archive.js +189 -0
- package/dist/source/epub/archive.js.map +1 -0
- package/dist/source/epub/content.d.ts +22 -0
- package/dist/source/epub/content.js +183 -0
- package/dist/source/epub/content.js.map +1 -0
- package/dist/source/epub/document.d.ts +55 -0
- package/dist/source/epub/document.js +179 -0
- package/dist/source/epub/document.js.map +1 -0
- package/dist/source/epub/index.d.ts +10 -0
- package/dist/source/epub/index.js +6 -0
- package/dist/source/epub/index.js.map +1 -0
- package/dist/source/epub/navigation.d.ts +16 -0
- package/dist/source/epub/navigation.js +215 -0
- package/dist/source/epub/navigation.js.map +1 -0
- package/dist/source/epub/package.d.ts +33 -0
- package/dist/source/epub/package.js +237 -0
- package/dist/source/epub/package.js.map +1 -0
- package/dist/source/epub/xml.d.ts +16 -0
- package/dist/source/epub/xml.js +111 -0
- package/dist/source/epub/xml.js.map +1 -0
- package/dist/source/index.d.ts +12 -0
- package/dist/source/index.js +32 -0
- package/dist/source/index.js.map +1 -0
- package/dist/source/meta.d.ts +30 -0
- package/dist/source/meta.js +22 -0
- package/dist/source/meta.js.map +1 -0
- package/dist/source/plain-text.d.ts +16 -0
- package/dist/source/plain-text.js +86 -0
- package/dist/source/plain-text.js.map +1 -0
- package/dist/source/toc.d.ts +16 -0
- package/dist/source/toc.js +17 -0
- package/dist/source/toc.js.map +1 -0
- package/dist/source/types.d.ts +16 -0
- package/dist/source/types.js +1 -0
- package/dist/source/types.js.map +1 -0
- package/dist/topology/grouping.d.ts +15 -0
- package/dist/topology/grouping.js +18 -0
- package/dist/topology/grouping.js.map +1 -0
- package/dist/topology/index.d.ts +21 -0
- package/dist/topology/index.js +5 -0
- package/dist/topology/index.js.map +1 -0
- package/dist/topology/resource-segmentation.d.ts +13 -0
- package/dist/topology/resource-segmentation.js +111 -0
- package/dist/topology/resource-segmentation.js.map +1 -0
- package/dist/topology/segment-incision.d.ts +18 -0
- package/dist/topology/segment-incision.js +197 -0
- package/dist/topology/segment-incision.js.map +1 -0
- package/dist/topology/snake-detector.d.ts +13 -0
- package/dist/topology/snake-detector.js +520 -0
- package/dist/topology/snake-detector.js.map +1 -0
- package/dist/topology/snake-graph-builder.d.ts +14 -0
- package/dist/topology/snake-graph-builder.js +76 -0
- package/dist/topology/snake-graph-builder.js.map +1 -0
- package/dist/topology/topology.d.ts +29 -0
- package/dist/topology/topology.js +348 -0
- package/dist/topology/topology.js.map +1 -0
- package/dist/topology/weights.d.ts +10 -0
- package/dist/topology/weights.js +84 -0
- package/dist/topology/weights.js.map +1 -0
- package/dist/types-FVIqiLC9.d.cts +24 -0
- package/dist/utils/async-semaphore.d.ts +7 -0
- package/dist/utils/async-semaphore.js +40 -0
- package/dist/utils/async-semaphore.js.map +1 -0
- package/dist/utils/enum.d.ts +5 -0
- package/dist/utils/enum.js +18 -0
- package/dist/utils/enum.js.map +1 -0
- package/dist/utils/hash.d.ts +3 -0
- package/dist/utils/hash.js +132 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/node-error.d.ts +4 -0
- package/dist/utils/node-error.js +59 -0
- package/dist/utils/node-error.js.map +1 -0
- package/dist/wikg/archive-uri.d.ts +1 -0
- package/dist/wikg/archive-uri.js +37 -0
- package/dist/wikg/archive-uri.js.map +1 -0
- package/dist/wikg/archive.d.ts +28 -0
- package/dist/wikg/archive.js +496 -0
- package/dist/wikg/archive.js.map +1 -0
- package/dist/wikg/index.d.ts +31 -0
- package/dist/wikg/index.js +60 -0
- package/dist/wikg/index.js.map +1 -0
- package/dist/wikg/wikg-coordinator.d.ts +45 -0
- package/dist/wikg/wikg-coordinator.js +1687 -0
- package/dist/wikg/wikg-coordinator.js.map +1 -0
- package/dist/wikg/wiki-graph-archive-file.d.ts +42 -0
- package/dist/wikg/wiki-graph-archive-file.js +78 -0
- package/dist/wikg/wiki-graph-archive-file.js.map +1 -0
- package/dist/wikilink/index.d.ts +10 -0
- package/dist/wikilink/index.js +7 -0
- package/dist/wikilink/index.js.map +1 -0
- package/dist/wikilink/relation-discovery.d.ts +31 -0
- package/dist/wikilink/relation-discovery.js +477 -0
- package/dist/wikilink/relation-discovery.js.map +1 -0
- package/dist/wikilink/types.d.ts +23 -0
- package/dist/wikilink/types.js +1 -0
- package/dist/wikilink/types.js.map +1 -0
- package/dist/wikilink/window.d.ts +7 -0
- package/dist/wikilink/window.js +53 -0
- package/dist/wikilink/window.js.map +1 -0
- package/dist/wikimatch/enrichment.d.ts +10 -0
- package/dist/wikimatch/enrichment.js +55 -0
- package/dist/wikimatch/enrichment.js.map +1 -0
- package/dist/wikimatch/index.d.ts +16 -0
- package/dist/wikimatch/index.js +66 -0
- package/dist/wikimatch/index.js.map +1 -0
- package/dist/wikimatch/option-narrowing.d.ts +17 -0
- package/dist/wikimatch/option-narrowing.js +208 -0
- package/dist/wikimatch/option-narrowing.js.map +1 -0
- package/dist/wikimatch/options.d.ts +14 -0
- package/dist/wikimatch/options.js +155 -0
- package/dist/wikimatch/options.js.map +1 -0
- package/dist/wikimatch/policy-judge.d.ts +17 -0
- package/dist/wikimatch/policy-judge.js +430 -0
- package/dist/wikimatch/policy-judge.js.map +1 -0
- package/dist/wikimatch/range-suppression.d.ts +9 -0
- package/dist/wikimatch/range-suppression.js +27 -0
- package/dist/wikimatch/range-suppression.js.map +1 -0
- package/dist/wikimatch/surface-screening.d.ts +16 -0
- package/dist/wikimatch/surface-screening.js +168 -0
- package/dist/wikimatch/surface-screening.js.map +1 -0
- package/dist/wikimatch/surface-window.d.ts +6 -0
- package/dist/wikimatch/surface-window.js +44 -0
- package/dist/wikimatch/surface-window.js.map +1 -0
- package/dist/wikimatch/types.d.ts +151 -0
- package/dist/wikimatch/types.js +1 -0
- package/dist/wikimatch/types.js.map +1 -0
- package/dist/wikimatch/wikispine.d.ts +43 -0
- package/dist/wikimatch/wikispine.js +399 -0
- package/dist/wikimatch/wikispine.js.map +1 -0
- package/dist/wikimatch/window.d.ts +6 -0
- package/dist/wikimatch/window.js +83 -0
- package/dist/wikimatch/window.js.map +1 -0
- package/dist/wikimatch/words.d.ts +16 -0
- package/dist/wikimatch/words.js +66 -0
- package/dist/wikimatch/words.js.map +1 -0
- package/dist/wikipage/cache.d.ts +18 -0
- package/dist/wikipage/cache.js +404 -0
- package/dist/wikipage/cache.js.map +1 -0
- package/dist/wikipage/fetch-log.d.ts +17 -0
- package/dist/wikipage/fetch-log.js +143 -0
- package/dist/wikipage/fetch-log.js.map +1 -0
- package/dist/wikipage/index.d.ts +14 -0
- package/dist/wikipage/index.js +17 -0
- package/dist/wikipage/index.js.map +1 -0
- package/dist/wikipage/normalizer.d.ts +14 -0
- package/dist/wikipage/normalizer.js +147 -0
- package/dist/wikipage/normalizer.js.map +1 -0
- package/dist/wikipage/rate-limiter.d.ts +13 -0
- package/dist/wikipage/rate-limiter.js +84 -0
- package/dist/wikipage/rate-limiter.js.map +1 -0
- package/dist/wikipage/resolver.d.ts +26 -0
- package/dist/wikipage/resolver.js +325 -0
- package/dist/wikipage/resolver.js.map +1 -0
- package/dist/wikipage/types.d.ts +96 -0
- package/dist/wikipage/types.js +1 -0
- package/dist/wikipage/types.js.map +1 -0
- package/dist/wikipage/wikimedia-client.d.ts +48 -0
- package/dist/wikipage/wikimedia-client.js +397 -0
- package/dist/wikipage/wikimedia-client.js.map +1 -0
- package/dist/worker-BgQ0Xl8T.d.cts +181 -0
- package/dist/worker.cjs +5259 -0
- package/dist/worker.cjs.map +1 -0
- package/dist/worker.d.cts +2 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.js +5 -0
- package/dist/worker.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/archive/query/archive-view.ts"],"sourcesContent":["import type {\n ChunkRecord,\n MentionLinkRecord,\n MentionRecord,\n ReadonlySerialTextStream,\n ReadonlyDocument,\n ReadingEdgeRecord,\n SentenceId,\n} from \"../../document/index.js\";\nimport type { BookMeta } from \"../../source/index.js\";\nimport type { Document } from \"../../document/index.js\";\nimport {\n WikipageResolver,\n type WikipageResolverOptions,\n} from \"../../wikipage/index.js\";\nimport type { QidResolution, WikipageSitelink } from \"../../wikipage/index.js\";\n\nimport {\n getGraphNode,\n listGraphNeighbors,\n type GraphNeighbor,\n type GraphNode,\n} from \"../../facade/graph.js\";\nimport {\n getChapterTree,\n listChapters,\n type ChapterEntry,\n type ChapterTree,\n} from \"../../facade/chapter.js\";\nimport {\n createLexicalQuery,\n listLexicalQueryCandidateTerms,\n createMentionLexicalHits,\n scoreLexicalText,\n type LexicalQuery,\n} from \"./lexical-search.js\";\nimport {\n createEntitySearchSession,\n createSearchSession,\n decodeBucketSearchSessionCursor,\n decodeSearchSessionCursor,\n encodeBucketSearchSessionCursor,\n populateSearchSessionObjectCaches,\n readCachedEntitySearchSessionPage,\n readCachedSearchSessionPage,\n readEntitySearchEvidenceMentions,\n readEntitySearchSessionPage,\n readSearchSessionChunkBucketPage,\n readSearchSessionDescriptor,\n readSearchSessionMetadataForCursor,\n readSearchSessionObjectBucketPage,\n readSearchSessionPage,\n SEARCH_EVIDENCE_KIND,\n type BucketSearchCursor,\n type SearchChunkHitInput,\n type SearchChunkCursorKey,\n type SearchChapterTitleCursorKey,\n type SearchEntityHitInput,\n type SearchEvidenceHitEventInput,\n type SearchObjectCursorKey,\n type SearchSessionDescriptor,\n type SearchTextCursorKey,\n type SearchTripleHitInput,\n} from \"./search-cache.js\";\nimport {\n createSearchIndexFingerprint,\n ensureSearchIndex,\n querySearchIndex,\n readSearchIndexStatus,\n SEARCH_INDEX_FTS_HIT_LIMIT,\n SEARCH_OBJECT_PROPERTY_KIND,\n SEARCH_OBJECT_PROPERTY_OWNER_KIND,\n TEXT_SENTENCE_KIND,\n type SearchIndexInput,\n type SearchIndexObjectHit,\n type SearchIndexProgressReporter,\n type SearchIndexQueryResult,\n type SearchIndexTextHit,\n} from \"../search-index/search-index.js\";\nimport { WIKI_GRAPH_URI_PREFIX } from \"../../common/wiki-graph-uri.js\";\n\nexport type ArchiveObjectType =\n | \"chapter\"\n | \"chapter-title\"\n | \"chapter-tree\"\n | \"edge\"\n | \"entity\"\n | \"fragment\"\n | \"meta\"\n | \"node\"\n | \"source\"\n | \"state\"\n | \"summary\"\n | \"triple\";\ntype ChapterStateTarget =\n | \"knowledge-graph\"\n | \"reading-graph\"\n | \"reading-summary\"\n | \"source\";\ntype ChapterStateValue = \"missing\" | \"ready\";\ntype ChapterState = Record<ChapterStateTarget, ChapterStateValue>;\n\nexport type ArchiveCollectionType =\n | \"chapter\"\n | \"chapter-title\"\n | \"entity\"\n | \"fragment\"\n | \"meta\"\n | \"node\"\n | \"source\"\n | \"summary\"\n | \"triple\";\n\nexport type ArchiveFindObjectType =\n | \"chapter\"\n | \"chapter-title\"\n | \"chapter-tree\"\n | \"entity\"\n | \"fragment\"\n | \"meta\"\n | \"node\"\n | \"source\"\n | \"summary\"\n | \"triple\";\n\nexport type ArchiveFindFilterType =\n | \"chapter\"\n | \"chapter-title\"\n | \"entity\"\n | \"fragment\"\n | \"meta\"\n | \"node\"\n | \"source\"\n | \"summary\"\n | \"triple\";\n\nexport interface ArchiveIndex {\n readonly chapters: readonly ChapterEntry[];\n readonly edgeCount: number;\n readonly meta: BookMeta | undefined;\n readonly nodeCount: number;\n readonly summaryCount: number;\n}\n\nexport interface ArchiveFindHit {\n readonly backlinks?: ArchiveBacklinks;\n readonly chapter?: number;\n readonly evidence?: ArchiveFindEvidencePreview;\n readonly evidenceLinks?: readonly MentionLinkRecord[];\n readonly evidenceMentions?: readonly EntityEvidenceMention[];\n readonly field: ArchiveFindField;\n readonly id: string;\n readonly matchCount?: number;\n readonly matchedTerms?: readonly string[];\n readonly missingTerms?: readonly string[];\n readonly position?: ArchiveFindPosition;\n readonly score?: number;\n readonly snippet: string;\n readonly state?: ChapterState;\n readonly title: string;\n readonly triple?: {\n readonly objectLabel: string;\n readonly predicate: string;\n readonly subjectLabel: string;\n };\n readonly type: ArchiveFindObjectType;\n}\n\ninterface EntityEvidenceMention {\n readonly match: Pick<\n ArchiveFindHit,\n \"matchCount\" | \"matchedTerms\" | \"missingTerms\" | \"score\"\n >;\n readonly mention: MentionRecord;\n}\n\ninterface EvidenceReadContext {\n readonly chapters: Map<number, Promise<ChapterEntry>>;\n readonly streamIndexes: Map<string, Promise<ArchiveTextStreamIndex>>;\n}\n\nexport interface ArchiveFindEvidencePreview {\n readonly nextCursor: string | null;\n readonly shown: number;\n readonly sources: readonly ArchiveEvidenceItem[];\n readonly total: number;\n}\n\nexport type ArchiveFindField =\n | \"content\"\n | \"metadata\"\n | \"source\"\n | \"summary\"\n | \"title\";\n\nexport interface ArchiveFindOptions {\n readonly archiveKey?: string;\n readonly backlinks?: boolean;\n readonly chapters?: readonly number[];\n readonly cursor?: string;\n readonly evidenceLimit?: number;\n readonly ids?: readonly string[];\n readonly limit?: number;\n readonly match?: ArchiveFindMatch;\n readonly order?: ArchiveFindOrder;\n readonly sourceContext?: number;\n readonly triplePattern?: ArchiveTriplePattern;\n readonly types?: readonly ArchiveFindFilterType[];\n}\n\nexport type ArchiveFindOrder = \"doc-asc\" | \"doc-desc\";\nexport type ArchiveFindMatch = \"all\" | \"any\";\n\nexport interface ArchiveFindPosition {\n readonly chapter: number;\n readonly documentOrder?: number;\n readonly fragment?: number;\n readonly sentence?: number;\n}\n\nexport interface ArchiveFindResult {\n readonly chapters: readonly number[] | null;\n readonly items: readonly ArchiveFindHit[];\n readonly lens: ArchiveFindLens;\n readonly lensHint: ArchiveFindLensHint | null;\n readonly limit: number;\n readonly match: ArchiveFindMatch;\n readonly nextCursor: string | null;\n readonly order: ArchiveFindOrder;\n readonly query: string;\n readonly terms: readonly string[];\n readonly types: readonly ArchiveFindFilterType[] | null;\n}\n\nexport type ArchiveFindLens = \"broad\" | \"exact\" | \"typed\";\n\nexport interface ArchiveFindLensHint {\n readonly lenses: {\n readonly chapter: string;\n readonly chunk: string;\n readonly entity: string;\n readonly node: string;\n readonly triple: string;\n };\n readonly message: string;\n}\n\nexport interface ArchiveCollectionOptions {\n readonly backlinks?: boolean;\n readonly chapters?: readonly number[];\n readonly cursor?: string;\n readonly evidenceLimit?: number;\n readonly ids?: readonly string[];\n readonly limit?: number;\n readonly order?: ArchiveFindOrder;\n readonly sourceContext?: number;\n readonly triplePattern?: ArchiveTriplePattern;\n readonly types?: readonly ArchiveCollectionType[];\n}\n\nexport interface ArchiveTriplePattern {\n readonly objectQid?: string;\n readonly predicate?: string;\n readonly subjectQid?: string;\n}\n\nexport interface ArchiveCollectionResult {\n readonly chapters: readonly number[] | null;\n readonly ids: readonly string[] | null;\n readonly items: readonly ArchiveFindHit[];\n readonly limit: number;\n readonly nextCursor: string | null;\n readonly order: ArchiveFindOrder;\n readonly types: readonly ArchiveCollectionType[] | null;\n}\n\nexport interface ArchiveBacklinks {\n readonly chunks: ArchiveBacklinkBucket;\n readonly entities: ArchiveBacklinkBucket;\n readonly triples: ArchiveBacklinkBucket;\n}\n\nexport interface ArchiveBacklinkBucket {\n readonly items: readonly ArchiveFindHit[];\n readonly limit: number;\n readonly nextCursor: string | null;\n}\n\nexport type ArchiveListKind =\n | \"chapters\"\n | \"edges\"\n | \"fragments\"\n | \"meta\"\n | \"nodes\"\n | \"summaries\";\n\nexport type ArchiveListItem =\n | {\n readonly evidence?: ArchiveFindEvidencePreview;\n readonly id: string;\n readonly label: string;\n readonly score?: number;\n readonly state?: ChapterState;\n readonly summary: string;\n readonly type: Exclude<ArchiveObjectType, \"triple\">;\n }\n | {\n readonly evidence?: ArchiveFindEvidencePreview;\n readonly id: string;\n readonly label: string;\n readonly evidenceLinks?: readonly MentionLinkRecord[];\n readonly objectLabel: string;\n readonly objectQid: string;\n readonly predicate: string;\n readonly score?: number;\n readonly subjectLabel: string;\n readonly subjectQid: string;\n readonly summary: string;\n readonly type: \"triple\";\n };\n\nexport type ArchivePage =\n | {\n readonly id: string;\n readonly state: ChapterState;\n readonly title: string;\n readonly type: \"chapter\";\n }\n | {\n readonly id: string;\n readonly title: string;\n readonly type: \"chapter-title\";\n }\n | {\n readonly id: string;\n readonly title: string;\n readonly tree: ChapterTree;\n readonly type: \"chapter-tree\";\n }\n | {\n readonly generatedNodeSummary: string;\n readonly id: string;\n readonly incoming: readonly GraphNeighbor[];\n readonly neighbors: readonly GraphNeighbor[];\n readonly outgoing: readonly GraphNeighbor[];\n readonly position: ArchiveFindPosition | undefined;\n readonly sourceFragments: readonly ArchiveNodeSourceFragment[];\n readonly title: string;\n readonly type: \"node\";\n }\n | {\n readonly backlinks?: ArchiveBacklinks;\n readonly fragment: ArchiveSourceFragment;\n readonly id: string;\n readonly nextFragmentId: string | undefined;\n readonly nodes: readonly ArchiveNodeLabel[];\n readonly previousFragmentId: string | undefined;\n readonly title: string;\n readonly type: \"fragment\";\n }\n | {\n readonly content: string;\n readonly id: string;\n readonly title: string;\n readonly type: \"summary\";\n }\n | {\n readonly evidence: ArchiveFindEvidencePreview;\n readonly id: string;\n readonly label: string;\n readonly labels: readonly string[];\n readonly mentionCount: number;\n readonly qid: string;\n readonly type: \"entity\";\n }\n | {\n readonly en: ArchiveEntityWikipageLocale | null;\n readonly id: string;\n readonly type: \"entity-wikipage\";\n readonly zh: ArchiveEntityWikipageLocale | null;\n }\n | {\n readonly evidence: ArchiveFindEvidencePreview;\n readonly id: string;\n readonly label: string;\n readonly objectQid: string;\n readonly predicate: string;\n readonly subjectQid: string;\n readonly type: \"triple\";\n }\n | {\n readonly authors?: readonly string[];\n readonly description?: string;\n readonly id: string;\n readonly publisher?: string;\n readonly title: string;\n readonly type: \"meta\";\n }\n | {\n readonly id: string;\n readonly state: ChapterState;\n readonly type: \"state\";\n }\n | {\n readonly id: string;\n readonly target: ChapterStateTarget;\n readonly type: \"state\";\n readonly value: ChapterStateValue;\n };\n\nexport interface ArchiveEntityWikipageLocale {\n readonly description?: string;\n readonly title: string;\n readonly url: string;\n}\n\nexport interface ArchivePack {\n readonly anchor: ArchivePage;\n readonly budget: number;\n readonly related: readonly ArchiveListItem[];\n}\n\nexport type ArchiveRelatedRole = \"any\" | \"object\" | \"self\" | \"subject\";\n\nexport interface ArchiveRelatedOptions {\n readonly cursor?: string;\n readonly evidenceLimit?: number;\n readonly limit?: number;\n readonly order?: ArchiveFindOrder;\n readonly query?: string;\n readonly role?: ArchiveRelatedRole;\n readonly sourceContext?: number;\n}\n\nexport interface ArchiveRelatedResult {\n readonly items: readonly ArchiveListItem[];\n readonly limit: number;\n readonly nextCursor: string | null;\n}\n\nexport interface ArchiveEvidence {\n readonly items: readonly ArchiveEvidenceItem[];\n readonly limit: number;\n readonly nextCursor: string | null;\n}\n\nexport interface ArchiveEvidenceItem {\n readonly chapterId: number;\n readonly endSentenceIndex: number;\n readonly fragmentId?: number;\n readonly id: string;\n readonly score?: number;\n readonly source: string;\n readonly startSentenceIndex: number;\n readonly title: string;\n readonly type: \"source\";\n}\n\nexport interface ArchiveNodeLabel {\n readonly id: string;\n readonly title: string;\n}\n\ninterface PositionedNodeLabel {\n readonly label: ArchiveNodeLabel;\n readonly position: ArchiveFindPosition | undefined;\n}\n\nexport interface ArchiveSourceFragment {\n readonly fragmentId?: number;\n readonly id: string;\n readonly preview: string;\n readonly sentenceCount: number;\n readonly text: string;\n readonly wordsCount: number;\n}\n\ntype ArchiveTextStreamKind = \"source\" | \"summary\";\ntype SourceEvidenceRange = {\n readonly chapterId: number;\n readonly endSentenceIndex: number;\n readonly score?: number;\n readonly startSentenceIndex: number;\n};\n\ntype TextStreamHitRange = {\n readonly chapterId: number;\n readonly endSentenceIndex: number;\n readonly hit: ArchiveFindHit;\n readonly startSentenceIndex: number;\n readonly stream: ArchiveTextStreamKind;\n};\n\ninterface ArchiveTextStreamSentence {\n readonly fragmentId: number;\n readonly globalIndex: number;\n readonly localIndex: number;\n readonly text: string;\n readonly wordsCount: number;\n}\n\ninterface ArchiveTextStreamIndex {\n readonly sentences: readonly ArchiveTextStreamSentence[];\n}\n\nexport interface ArchiveNodeSourceFragment {\n readonly id: string;\n readonly text: string;\n readonly truncated: boolean;\n}\n\nexport interface ArchiveEvidenceOptions {\n readonly cursor?: string;\n readonly limit?: number;\n readonly order?: ArchiveFindOrder;\n readonly query?: string;\n readonly sourceContext?: number;\n}\n\nconst DEFAULT_SOURCE_CONTEXT = 2;\n\nexport interface ArchivePageOptions {\n readonly backlinks?: boolean;\n readonly evidenceLimit?: number;\n readonly order?: ArchiveFindOrder;\n readonly sourceContext?: number;\n readonly wikipageResolverOptions?: WikipageResolverOptions;\n}\n\nexport async function getArchiveIndex(\n document: ReadonlyDocument,\n): Promise<ArchiveIndex> {\n const [chapters, meta, nodes, edges] = await Promise.all([\n listChapters(document),\n document.readBookMeta(),\n document.chunks.countAll(),\n document.readingEdges.countAll(),\n ]);\n\n return {\n chapters,\n edgeCount: edges,\n meta,\n nodeCount: nodes,\n summaryCount: chapters.filter((chapter) => chapter.stage === \"summarized\")\n .length,\n };\n}\n\nexport async function listArchiveObjects(\n document: ReadonlyDocument,\n kind: ArchiveListKind,\n): Promise<readonly ArchiveListItem[]> {\n switch (kind) {\n case \"chapters\":\n return await Promise.all(\n (await listChapters(document)).map(async (chapter) => {\n const state = await createChapterState(document, chapter);\n\n return {\n id: formatChapterId(chapter.chapterId),\n label: chapter.title ?? \"[untitled]\",\n state,\n summary: formatChapterStateSummary(state),\n type: \"chapter\" as const,\n };\n }),\n );\n case \"edges\":\n return (await document.readingEdges.listAll()).map((edge) => ({\n id: formatEdgeId(edge),\n label: `${formatNodeId(edge.fromId)} -> ${formatNodeId(edge.toId)}`,\n summary: `weight ${formatWeight(edge.weight)}`,\n type: \"edge\",\n }));\n case \"meta\": {\n const meta = await document.readBookMeta();\n\n return [\n {\n id: ARCHIVE_ROOT_ID,\n label: formatMetaTitle(meta),\n summary: formatMetaSummary(meta),\n type: \"meta\",\n },\n ];\n }\n case \"nodes\":\n return (await document.chunks.listAll()).map((node) => ({\n id: formatNodeId(node.id),\n label: node.label,\n summary: node.content,\n type: \"node\",\n }));\n case \"summaries\":\n return (\n await Promise.all(\n (await listChapters(document)).map(async (chapter) => {\n const summary = await document.readSummary(chapter.chapterId);\n\n if (summary === undefined) {\n return undefined;\n }\n\n return {\n id: formatSummaryId(chapter.chapterId),\n label: chapter.title ?? `[chapter ${chapter.chapterId}]`,\n summary: createSnippet(summary),\n type: \"summary\" as const,\n };\n }),\n )\n ).filter(isDefined);\n case \"fragments\":\n return (\n await Promise.all(\n (await listChapters(document)).map(async (chapter) => {\n const title = chapter.title ?? formatChapterId(chapter.chapterId);\n\n return listTextStreamSentenceCollection(\n await createTextStreamIndex(\n document,\n chapter.chapterId,\n \"source\",\n ),\n chapter.chapterId,\n \"source\",\n title,\n chapter.documentOrder,\n ).map((hit) => ({\n id: hit.id,\n label: title,\n summary: hit.snippet,\n type: \"source\" as const,\n }));\n }),\n )\n ).flat();\n }\n}\n\nexport async function listArchiveCollection(\n document: ReadonlyDocument,\n options: ArchiveCollectionOptions = {},\n): Promise<ArchiveCollectionResult> {\n const items: ArchiveFindHit[] = [];\n const documentOrders = await document.serials.listDocumentOrders();\n const chapterFilter =\n options.chapters === undefined ? undefined : new Set(options.chapters);\n const types = options.types ?? [\n \"meta\",\n \"chapter-title\",\n \"entity\",\n \"node\",\n \"triple\",\n ];\n\n if (types.includes(\"meta\")) {\n const meta = await document.readBookMeta();\n\n if (meta !== undefined) {\n items.push({\n field: \"metadata\",\n id: ARCHIVE_ROOT_ID,\n snippet: formatMetaSummary(meta),\n title: meta.title ?? \"Archive metadata\",\n type: \"meta\",\n });\n }\n }\n\n if (types.includes(\"chapter\") || types.includes(\"chapter-title\")) {\n for (const chapter of filterChapters(\n await listChapters(document),\n chapterFilter,\n )) {\n const title = chapter.title ?? `[chapter ${chapter.chapterId}]`;\n\n if (types.includes(\"chapter\") || types.includes(\"chapter-title\")) {\n items.push({\n chapter: chapter.chapterId,\n field: \"title\",\n id: formatChapterTitleId(chapter.chapterId),\n position: {\n chapter: chapter.chapterId,\n documentOrder: chapter.documentOrder,\n },\n snippet: title,\n title,\n type: \"chapter-title\",\n });\n }\n }\n }\n\n if (types.includes(\"node\")) {\n for (const node of await document.chunks.listAll()) {\n if (!isChapterAllowed(chapterFilter, node.sentenceId[0])) {\n continue;\n }\n\n const position = createNodePosition(node.sentenceIds, documentOrders);\n\n items.push({\n chapter: node.sentenceId[0],\n field: \"content\",\n id: formatNodeId(node.id),\n ...(position === undefined ? {} : { position }),\n snippet: createSnippet(node.content),\n title: node.label,\n type: \"node\",\n });\n }\n }\n\n if (types.includes(\"entity\")) {\n items.push(\n ...listEntityCollection(\n filterMentionsByChapterSet(\n await listAllMentions(document),\n chapterFilter,\n ),\n documentOrders,\n ),\n );\n }\n\n if (types.includes(\"triple\")) {\n items.push(\n ...(await listTripleCollection(document, chapterFilter, documentOrders)),\n );\n }\n\n const result = createCollectionResult(items, options);\n const evidenceItems = await hydrateFindHitEvidence(document, result.items, {\n ...(options.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: options.evidenceLimit }),\n order: options.order ?? \"doc-asc\",\n ...(options.sourceContext === undefined\n ? {}\n : { sourceContext: options.sourceContext }),\n });\n\n return {\n ...result,\n items: await hydrateFindHitBacklinks(document, evidenceItems, options),\n };\n}\n\nfunction filterChapters<T extends { readonly chapterId: number }>(\n chapters: readonly T[],\n chapterFilter: ReadonlySet<number> | undefined,\n): readonly T[] {\n return chapterFilter === undefined\n ? chapters\n : chapters.filter((chapter) => chapterFilter.has(chapter.chapterId));\n}\n\nfunction isChapterAllowed(\n chapterFilter: ReadonlySet<number> | undefined,\n chapterId: number,\n): boolean {\n return chapterFilter === undefined || chapterFilter.has(chapterId);\n}\n\nexport async function findArchiveObjects(\n document: ReadonlyDocument,\n query: string,\n options: ArchiveFindOptions = {},\n): Promise<ArchiveFindResult> {\n const limit = options.limit ?? DEFAULT_FIND_LIMIT;\n const textOnlySearch = isTextOnlySearch(options);\n\n if (\n options.cursor !== undefined &&\n (!textOnlySearch || !isFindCursor(options.cursor))\n ) {\n const bucketCursor = tryDecodeBucketSearchSessionCursor(options.cursor);\n\n if (bucketCursor !== undefined) {\n return await readBucketedSearchResultPage(document, bucketCursor, {\n ...options,\n limit,\n });\n }\n\n const cursor = decodeSearchSessionCursor(options.cursor);\n const descriptor = await readSearchSessionDescriptor(\n cursor.sessionId,\n options.archiveKey ?? \"archive\",\n );\n\n assertSearchCursorTypesMatch(options.types, descriptor.types);\n\n const page = isEntitySearchTypes(descriptor.types)\n ? await readEntitySearchSessionPage(\n cursor.sessionId,\n cursor.offset,\n limit,\n options.archiveKey ?? \"archive\",\n cursor.createdAt,\n )\n : await readSearchSessionPage(\n cursor.sessionId,\n cursor.offset,\n limit,\n options.archiveKey ?? \"archive\",\n cursor.createdAt,\n );\n\n return await hydrateFindResultBacklinks(\n document,\n {\n chapters: page.chapters,\n items: await hydrateFindHitEvidence(\n document,\n page.items,\n createFindEvidenceHydrationOptions(options, cursor.sessionId),\n ),\n lens: parseFindLens(page.lens),\n lensHint: page.lens === \"broad\" ? BROAD_FIND_LENS_HINT : null,\n limit,\n match: parseFindMatch(page.match),\n nextCursor: page.nextCursor,\n order: options.order ?? \"doc-asc\",\n query: page.query,\n terms: page.terms,\n types: parseFindTypes(descriptor.types),\n },\n options,\n );\n }\n\n const requestedTypes = options.types ?? null;\n const wantsStructuredSearch =\n requestedTypes === null ||\n requestedTypes.includes(\"entity\") ||\n requestedTypes.includes(\"triple\");\n const search = createLexicalQuery(query);\n\n if (search === undefined) {\n return createFindResult(query, [], options);\n }\n\n if (textOnlySearch) {\n return await findTextOnlyArchiveObjectsIndexed(\n document,\n query,\n options,\n search,\n );\n }\n\n const revisionScope = await createSearchRevisionScope(\n document,\n options.chapters,\n );\n const cacheInput = {\n archiveKey: options.archiveKey ?? \"archive\",\n chapters: options.chapters ?? null,\n lens: options.types === undefined ? \"broad\" : \"typed\",\n match: options.match ?? \"any\",\n order: options.order ?? \"doc-asc\",\n query,\n revisionScope,\n terms: search.terms,\n types: options.types ?? null,\n };\n const canReadSearchCache = options.triplePattern === undefined;\n const usesBucketedSearch =\n options.types === undefined && options.triplePattern === undefined;\n\n if (canReadSearchCache && isEntityOnlySearch(options)) {\n const cachedPage = await readCachedEntitySearchSessionPage(\n cacheInput,\n 0,\n limit,\n );\n\n if (cachedPage !== undefined) {\n return await hydrateFindResultBacklinks(\n document,\n {\n chapters: cachedPage.chapters,\n items: await hydrateFindHitEvidence(\n document,\n cachedPage.items,\n createFindEvidenceHydrationOptions(options, cachedPage.sessionId),\n ),\n lens: parseFindLens(cachedPage.lens),\n lensHint: cachedPage.lens === \"broad\" ? BROAD_FIND_LENS_HINT : null,\n limit,\n match: parseFindMatch(cachedPage.match),\n nextCursor: cachedPage.nextCursor,\n order: options.order ?? \"doc-asc\",\n query: cachedPage.query,\n terms: cachedPage.terms,\n types: parseFindTypes(cachedPage.types),\n },\n options,\n );\n }\n } else if (canReadSearchCache && !usesBucketedSearch) {\n const cachedPage = await readCachedSearchSessionPage(cacheInput, 0, limit);\n\n if (cachedPage !== undefined) {\n return await hydrateFindResultBacklinks(\n document,\n {\n chapters: cachedPage.chapters,\n items: await hydrateFindHitEvidence(\n document,\n cachedPage.items,\n createFindEvidenceHydrationOptions(options),\n ),\n lens: parseFindLens(cachedPage.lens),\n lensHint: cachedPage.lens === \"broad\" ? BROAD_FIND_LENS_HINT : null,\n limit,\n match: parseFindMatch(cachedPage.match),\n nextCursor: cachedPage.nextCursor,\n order: options.order ?? \"doc-asc\",\n query: cachedPage.query,\n terms: cachedPage.terms,\n types: parseFindTypes(cachedPage.types),\n },\n options,\n );\n }\n }\n\n if (usesBucketedSearch) {\n if (!(await isArchiveSearchIndexCurrent(document))) {\n throw new Error(\n \"Wiki Graph search index is missing or outdated. Run `<archive-uri>/index enable` before searching.\",\n );\n }\n const sessionId = await createSearchSession({\n archiveKey: options.archiveKey ?? \"archive\",\n chapters: options.chapters ?? null,\n lens: \"broad\",\n match: options.match ?? \"any\",\n order: options.order ?? \"doc-asc\",\n query,\n revisionScope,\n terms: search.terms,\n types: null,\n });\n const descriptor = await readSearchSessionDescriptor(\n sessionId,\n options.archiveKey ?? \"archive\",\n );\n\n return await readBucketedSearchResultPage(\n document,\n {\n createdAt: descriptor.createdAt,\n cursor: { bucket: 0 },\n sessionId,\n },\n { ...options, limit },\n );\n }\n\n const allMentions = wantsStructuredSearch\n ? await document.mentions.listBySurfaceTerms(\n listLexicalQueryCandidateTerms(query),\n )\n : [];\n const indexed = await findArchiveObjectsIndexed(document, query, options);\n const structuredHits = wantsStructuredSearch\n ? [\n ...findEntities(search, { mentions: allMentions }),\n ...(await findTriples(document, search, { mentions: allMentions })),\n ]\n : [];\n const hits = [...structuredHits, ...(indexed?.hits ?? [])];\n if (isEntityOnlySearch(options)) {\n const ranked = createRankedFindResult(\n query,\n filterLexicalHitsByMatch(hits, search, options.match ?? \"any\"),\n options,\n search.terms,\n );\n const entityCacheInput = createEntitySearchCacheInput(\n ranked.items,\n indexed?.result,\n );\n const sentenceCacheInput = await createSentenceEvidenceSearchCacheInput(\n document,\n indexed?.result,\n options,\n );\n const sessionId = await createEntitySearchSession({\n archiveKey: options.archiveKey ?? \"archive\",\n chapters: ranked.chapters,\n chunkHits: sentenceCacheInput.chunkHits,\n entityHits: [\n ...entityCacheInput.entityHits,\n ...sentenceCacheInput.entityHits,\n ],\n evidenceEvents: [\n ...entityCacheInput.evidenceEvents,\n ...sentenceCacheInput.evidenceEvents,\n ],\n lens: ranked.lens,\n match: ranked.match,\n order: ranked.order,\n query,\n revisionScope,\n terms: ranked.terms,\n tripleHits: sentenceCacheInput.tripleHits,\n types: ranked.types,\n });\n const firstPage = await readEntitySearchSessionPage(sessionId, 0, limit);\n\n return await hydrateFindResultBacklinks(\n document,\n {\n ...ranked,\n items: await hydrateFindHitEvidence(\n document,\n firstPage.items,\n createFindEvidenceHydrationOptions(options, sessionId),\n ),\n nextCursor: firstPage.nextCursor,\n },\n options,\n );\n }\n\n const ranked = createRankedFindResult(\n query,\n filterLexicalHitsByMatch(hits, search, options.match ?? \"any\"),\n options,\n search.terms,\n );\n const entityCacheInput = createEntitySearchCacheInput(\n ranked.items,\n indexed?.result,\n );\n const sentenceCacheInput = await createSentenceEvidenceSearchCacheInput(\n document,\n indexed?.result,\n options,\n );\n const sessionId = await createSearchSession({\n archiveKey: options.archiveKey ?? \"archive\",\n chapters: ranked.chapters,\n chunkHits: sentenceCacheInput.chunkHits,\n entityHits: [\n ...entityCacheInput.entityHits,\n ...sentenceCacheInput.entityHits,\n ],\n evidenceEvents: [\n ...entityCacheInput.evidenceEvents,\n ...sentenceCacheInput.evidenceEvents,\n ],\n items: ranked.items,\n lens: ranked.lens,\n match: ranked.match,\n order: ranked.order,\n query,\n revisionScope,\n terms: ranked.terms,\n tripleHits: sentenceCacheInput.tripleHits,\n types: ranked.types,\n });\n const firstPage = await readSearchSessionPage(sessionId, 0, limit);\n\n return await hydrateFindResultBacklinks(\n document,\n {\n ...ranked,\n items: await hydrateFindHitEvidence(\n document,\n firstPage.items,\n createFindEvidenceHydrationOptions(options),\n ),\n nextCursor: firstPage.nextCursor,\n },\n options,\n );\n}\n\nasync function findTextOnlyArchiveObjectsIndexed(\n document: ReadonlyDocument,\n query: string,\n options: ArchiveFindOptions,\n search: LexicalQuery,\n): Promise<ArchiveFindResult> {\n const indexed = await findArchiveObjectsIndexed(document, query, options);\n const hits = indexed?.hits ?? [];\n\n return createFindResult(\n query,\n filterLexicalHitsByMatch(hits, search, options.match ?? \"any\"),\n options,\n indexed?.result.terms ?? search.terms,\n );\n}\n\nasync function createSearchRevisionScope(\n document: ReadonlyDocument,\n chapters: readonly number[] | undefined,\n): Promise<string> {\n if (chapters === undefined || chapters.length === 0) {\n return JSON.stringify({\n chaptersRevision: await document.serials.getChaptersRevision(),\n scope: \"all\",\n });\n }\n\n const uniqueChapters = [...new Set(chapters)].sort(compareNumbers);\n const revisions = await document.serials.getRevisions(uniqueChapters);\n\n return JSON.stringify({\n chapters: uniqueChapters.map(\n (chapterId) => [chapterId, revisions.get(chapterId) ?? 0] as const,\n ),\n scope: \"chapters\",\n });\n}\n\nasync function readBucketedSearchResultPage(\n document: ReadonlyDocument,\n cursor: {\n readonly createdAt: number;\n readonly cursor: BucketSearchCursor;\n readonly sessionId: string;\n },\n options: ArchiveFindOptions & { readonly limit: number },\n): Promise<ArchiveFindResult> {\n const session = await readSearchSessionMetadataForCursor(\n cursor.sessionId,\n options.archiveKey ?? \"archive\",\n cursor.createdAt,\n );\n\n assertSearchCursorTypesMatch(options.types, session.types);\n\n const items: ArchiveFindHit[] = [];\n let bucketCursor: BucketSearchCursor | undefined = cursor.cursor;\n\n while (bucketCursor !== undefined && items.length < options.limit) {\n const remaining = options.limit - items.length;\n const page = await readBucketPage(\n document,\n session,\n bucketCursor,\n remaining,\n );\n\n items.push(...page.items);\n bucketCursor = page.nextCursor;\n }\n\n return await hydrateFindResultBacklinks(\n document,\n {\n chapters: session.chapters,\n items: await hydrateFindHitEvidence(\n document,\n items,\n createFindEvidenceHydrationOptions(options, cursor.sessionId),\n ),\n lens: parseFindLens(session.lens),\n lensHint: session.lens === \"broad\" ? BROAD_FIND_LENS_HINT : null,\n limit: options.limit,\n match: parseFindMatch(session.match),\n nextCursor:\n bucketCursor === undefined\n ? null\n : encodeBucketSearchSessionCursor(\n cursor.sessionId,\n bucketCursor,\n session.createdAt,\n ),\n order: options.order ?? \"doc-asc\",\n query: session.query,\n terms: session.terms,\n types: parseFindTypes(session.types),\n },\n options,\n );\n}\n\nasync function readBucketPage(\n document: ReadonlyDocument,\n session: SearchSessionDescriptor,\n cursor: BucketSearchCursor,\n limit: number,\n): Promise<{\n readonly items: readonly ArchiveFindHit[];\n readonly nextCursor: BucketSearchCursor | undefined;\n}> {\n switch (cursor.bucket) {\n case 0:\n return await readChapterTitleBucketPage(\n document,\n session,\n cursor.key,\n limit,\n );\n case 1:\n return await readObjectBucketPage(document, session, cursor.key, limit);\n case 2:\n return await readChunkBucketPage(document, session, cursor.key, limit);\n case 3:\n return await readTextBucketPage(document, session, cursor.key, limit);\n }\n}\n\nasync function readChapterTitleBucketPage(\n document: ReadonlyDocument,\n session: SearchSessionDescriptor,\n after: SearchChapterTitleCursorKey | undefined,\n limit: number,\n): Promise<{\n readonly items: readonly ArchiveFindHit[];\n readonly nextCursor: BucketSearchCursor | undefined;\n}> {\n const result = await querySearchIndex(document, session.query, {\n ...(session.chapters === null ? {} : { chapters: session.chapters }),\n match: parseFindMatch(session.match),\n objectHitLimit: SEARCH_INDEX_FTS_HIT_LIMIT,\n textHitLimit: 0,\n types: [\"chapter-title\"],\n });\n const chapters = new Map(\n (await listChapters(document)).map((chapter) => [\n chapter.chapterId,\n chapter,\n ]),\n );\n const hits = (result?.objectHits ?? [])\n .filter(\n (hit) => hit.ownerKind === SEARCH_OBJECT_PROPERTY_OWNER_KIND.chapter,\n )\n .sort(compareChapterTitleIndexHits)\n .filter((hit) => isAfterChapterTitleKey(hit, after));\n const page = hits.slice(0, limit + 1);\n const hydrated = (\n await Promise.all(\n page.slice(0, limit).map(async (hit) => {\n const item = await hydrateSearchObjectHit(document, chapters, hit);\n\n return item === undefined\n ? undefined\n : withSearchTerms(item, session.terms);\n }),\n )\n ).filter(isDefined);\n const last = page.at(limit - 1);\n\n return {\n items: hydrated,\n nextCursor:\n page.length > limit && last !== undefined\n ? {\n bucket: 0,\n key: {\n chapterId: parseSearchPropertyIntegerOwnerId(last.ownerId),\n score: last.score,\n },\n }\n : { bucket: 1 },\n };\n}\n\nasync function readObjectBucketPage(\n document: ReadonlyDocument,\n session: SearchSessionDescriptor,\n after: SearchObjectCursorKey | undefined,\n limit: number,\n): Promise<{\n readonly items: readonly ArchiveFindHit[];\n readonly nextCursor: BucketSearchCursor | undefined;\n}> {\n if (!session.objectCachesPopulated) {\n await populateObjectBucketCaches(document, session);\n }\n const page = await readSearchSessionObjectBucketPage(\n session.sessionId,\n 1,\n after,\n limit,\n );\n const items = page.slice(0, limit);\n const hydrated = await Promise.all(\n items.map(async (hit) => await hydrateCachedObjectBucketHit(document, hit)),\n );\n const last = items.at(-1);\n\n return {\n items: hydrated,\n nextCursor:\n page.length > limit && last !== undefined\n ? {\n bucket: 1,\n key: {\n id: getObjectBucketCursorId(last),\n kind: last.type === \"triple\" ? \"triple\" : \"entity\",\n score: last.score ?? 0,\n },\n }\n : { bucket: 2 },\n };\n}\n\nasync function populateObjectBucketCaches(\n document: ReadonlyDocument,\n session: SearchSessionDescriptor,\n): Promise<void> {\n const search = createLexicalQuery(session.query);\n\n if (search === undefined) {\n return;\n }\n\n const [allMentions, indexed] = await Promise.all([\n document.mentions.listBySurfaceTerms(\n listLexicalQueryCandidateTerms(session.query),\n ),\n querySearchIndex(document, session.query, {\n ...(session.chapters === null ? {} : { chapters: session.chapters }),\n match: parseFindMatch(session.match),\n objectHitLimit: SEARCH_INDEX_FTS_HIT_LIMIT,\n textHitLimit: 0,\n types: null,\n }),\n ]);\n const structuredHits = [\n ...findEntities(search, { mentions: allMentions }),\n ...(await findTriples(document, search, { mentions: allMentions })),\n ];\n const entityCacheInput = createEntitySearchCacheInput(\n structuredHits,\n indexed,\n );\n\n await populateSearchSessionObjectCaches({\n entityHits: entityCacheInput.entityHits,\n evidenceEvents: entityCacheInput.evidenceEvents,\n sessionId: session.sessionId,\n });\n}\n\nasync function readChunkBucketPage(\n document: ReadonlyDocument,\n session: SearchSessionDescriptor,\n after: SearchChunkCursorKey | undefined,\n limit: number,\n): Promise<{\n readonly items: readonly ArchiveFindHit[];\n readonly nextCursor: BucketSearchCursor | undefined;\n}> {\n const page = await readSearchSessionChunkBucketPage(\n session.sessionId,\n after,\n limit,\n );\n const items = page.slice(0, limit);\n const hydrated = (\n await Promise.all(\n items.map(\n async (hit) => await hydrateCachedChunkBucketHit(document, hit),\n ),\n )\n ).filter(isDefined);\n const last = items.at(-1);\n\n return {\n items: hydrated,\n nextCursor:\n page.length > limit && last !== undefined\n ? {\n bucket: 2,\n key: {\n chunkId: parseSearchPropertyIntegerOwnerId(\n last.id.slice(\"wikg://chunk/\".length),\n ),\n score: last.score ?? 0,\n },\n }\n : { bucket: 3 },\n };\n}\n\nasync function readTextBucketPage(\n document: ReadonlyDocument,\n session: SearchSessionDescriptor,\n after: SearchTextCursorKey | undefined,\n limit: number,\n): Promise<{\n readonly items: readonly ArchiveFindHit[];\n readonly nextCursor: BucketSearchCursor | undefined;\n}> {\n const result = await querySearchIndex(document, session.query, {\n ...(session.chapters === null ? {} : { chapters: session.chapters }),\n match: parseFindMatch(session.match),\n objectHitLimit: 0,\n ...(after === undefined\n ? {}\n : {\n textAfter: {\n chapterId: after.chapterId,\n kind: after.kind as SearchIndexTextHit[\"kind\"],\n rank: after.rank,\n sentenceIndex: after.sentenceIndex,\n },\n }),\n textHitLimit: createBucketQueryWindow(limit),\n types: [\"source\", \"summary\"],\n });\n const chapters = new Map(\n (await listChapters(document)).map((chapter) => [\n chapter.chapterId,\n chapter,\n ]),\n );\n const hits = [...(result?.textHits ?? [])]\n .sort(compareTextIndexHits)\n .filter((hit) => isAfterTextKey(hit, after));\n const page = hits.slice(0, limit + 1);\n const hydrated = (\n await Promise.all(\n page.slice(0, limit).map(async (hit) => {\n const item = await hydrateSearchTextHit(document, chapters, hit);\n\n return item === undefined\n ? undefined\n : withSearchTerms(item, session.terms);\n }),\n )\n ).filter(isDefined);\n const last = page.at(limit - 1);\n\n return {\n items: hydrated,\n nextCursor:\n page.length > limit && last !== undefined\n ? {\n bucket: 3,\n key: {\n chapterId: last.chapterId,\n kind: last.kind,\n rank: last.rank,\n sentenceIndex: last.sentenceIndex,\n },\n }\n : undefined,\n };\n}\n\nfunction createBucketQueryWindow(limit: number): number {\n return Math.max(limit + 1, limit * 3 + 1, 100);\n}\n\nasync function hydrateCachedObjectBucketHit(\n document: ReadonlyDocument,\n hit: ArchiveFindHit,\n): Promise<ArchiveFindHit> {\n if (hit.type === \"entity\") {\n const qid = parseEntityQid(hit.id);\n\n if (qid === undefined) {\n return hit;\n }\n const mentions = await document.mentions.listByQid(qid);\n const [first] = [...mentions].sort(compareMentions);\n\n if (first === undefined) {\n return hit;\n }\n\n return {\n ...hit,\n chapter: first.chapterId,\n position: {\n chapter: first.chapterId,\n sentence: first.sentenceIndex ?? 0,\n },\n snippet: first.note ?? first.surface,\n title: selectEntityLabel(mentions),\n };\n }\n if (hit.type === \"triple\") {\n return hit;\n }\n\n return hit;\n}\n\nasync function hydrateCachedChunkBucketHit(\n document: ReadonlyDocument,\n hit: ArchiveFindHit,\n): Promise<ArchiveFindHit | undefined> {\n const chunkId = parseSearchPropertyIntegerOwnerId(\n hit.id.slice(\"wikg://chunk/\".length),\n );\n const node = await document.chunks.getById(chunkId);\n\n if (node === undefined) {\n return undefined;\n }\n const { position: _position, ...baseHit } = hit;\n const position = createNodePosition(node.sentenceIds);\n\n return {\n ...baseHit,\n chapter: node.sentenceId[0],\n field: \"title\",\n ...(position === undefined ? {} : { position }),\n snippet: createSnippet(node.content),\n title: node.label,\n };\n}\n\nfunction compareChapterTitleIndexHits(\n left: SearchIndexObjectHit,\n right: SearchIndexObjectHit,\n): number {\n return (\n compareNumbers(right.score, left.score) ||\n compareNumbers(\n parseSearchPropertyIntegerOwnerId(left.ownerId),\n parseSearchPropertyIntegerOwnerId(right.ownerId),\n )\n );\n}\n\nfunction compareTextIndexHits(\n left: SearchIndexTextHit,\n right: SearchIndexTextHit,\n): number {\n return (\n compareNumbers(left.rank, right.rank) ||\n compareNumbers(left.chapterId, right.chapterId) ||\n compareNumbers(left.sentenceIndex, right.sentenceIndex) ||\n compareNumbers(left.kind, right.kind)\n );\n}\n\nfunction isAfterChapterTitleKey(\n hit: SearchIndexObjectHit,\n key: SearchChapterTitleCursorKey | undefined,\n): boolean {\n if (key === undefined) {\n return true;\n }\n\n return (\n compareChapterTitleIndexHits(\n {\n ...hit,\n ownerId: String(key.chapterId),\n score: key.score,\n },\n hit,\n ) < 0\n );\n}\n\nfunction isAfterTextKey(\n hit: SearchIndexTextHit,\n key: SearchTextCursorKey | undefined,\n): boolean {\n if (key === undefined) {\n return true;\n }\n\n return (\n compareTextIndexHits(\n {\n chapterId: key.chapterId,\n kind: key.kind as SearchIndexTextHit[\"kind\"],\n rank: key.rank,\n score: 0,\n sentenceIndex: key.sentenceIndex,\n wordsCount: 0,\n },\n hit,\n ) < 0\n );\n}\n\nfunction getObjectBucketCursorId(hit: ArchiveFindHit): string {\n if (hit.type !== \"triple\") {\n return hit.id.replace(/^wikg:\\/\\/entity\\//u, \"\");\n }\n\n const triple = parseTripleCursorId(hit.id);\n\n return triple ?? hit.id;\n}\n\nfunction parseTripleCursorId(id: string): string | undefined {\n const match = /^wikg:\\/\\/triple\\/([^/]+)\\/([^/]+)\\/([^/]+)$/u.exec(id);\n\n if (\n match?.[1] === undefined ||\n match[2] === undefined ||\n match[3] === undefined\n ) {\n return undefined;\n }\n\n return `${match[1]}\\u001f${decodeURIComponent(match[2])}\\u001f${match[3]}`;\n}\n\nfunction tryDecodeBucketSearchSessionCursor(cursor: string):\n | {\n readonly createdAt: number;\n readonly cursor: BucketSearchCursor;\n readonly sessionId: string;\n }\n | undefined {\n try {\n return decodeBucketSearchSessionCursor(cursor);\n } catch {\n return undefined;\n }\n}\n\nexport async function rebuildArchiveSearchIndex(\n document: Document,\n progress?: SearchIndexProgressReporter,\n): Promise<void> {\n const input = await createSearchIndexRecords(document, progress);\n\n if ((await readSearchIndexStatus(document, input)) === \"dirty\") {\n await document.deleteSearchIndexDatabase();\n }\n\n await ensureSearchIndex(document, input, progress);\n}\n\nexport async function isArchiveSearchIndexCurrent(\n document: ReadonlyDocument,\n): Promise<boolean> {\n return (await readArchiveSearchIndexStatus(document)) === \"current\";\n}\n\nexport async function readArchiveSearchIndexStatus(\n document: ReadonlyDocument,\n): Promise<\"current\" | \"dirty\" | \"missing\"> {\n return await readSearchIndexStatus(\n document,\n await createSearchIndexRecords(document),\n );\n}\n\nexport async function clearDirtyArchiveSearchIndex(\n document: Document,\n): Promise<void> {\n if ((await readArchiveSearchIndexStatus(document)) === \"dirty\") {\n await document.deleteSearchIndexDatabase();\n }\n}\n\nexport async function createArchiveSearchIndexFingerprint(\n document: ReadonlyDocument,\n): Promise<string> {\n return createSearchIndexFingerprint(await createSearchIndexRecords(document));\n}\n\nexport async function grepArchiveObjects(\n document: ReadonlyDocument,\n query: string,\n options: ArchiveFindOptions = {},\n): Promise<ArchiveFindResult> {\n const search = createPhraseSearch(query);\n\n if (search === undefined) {\n return createFindResult(\n query,\n [],\n { ...options, match: \"all\" },\n [],\n \"exact\",\n );\n }\n\n const hits: ArchiveFindHit[] = [];\n\n hits.push(...findMeta(await document.readBookMeta(), search));\n hits.push(...(await findChapters(document, search)));\n hits.push(...(await findNodes(document, search)));\n\n return createFindResult(\n query,\n hits,\n { ...options, match: \"all\" },\n [query.trim().toLowerCase()],\n \"exact\",\n );\n}\n\nasync function findArchiveObjectsIndexed(\n document: ReadonlyDocument,\n query: string,\n options: ArchiveFindOptions,\n): Promise<\n | {\n readonly hits: readonly ArchiveFindHit[];\n readonly result: SearchIndexQueryResult;\n }\n | undefined\n> {\n if (!(await isArchiveSearchIndexCurrent(document))) {\n throw new Error(\n \"Wiki Graph search index is missing or outdated. Run `<archive-uri>/index enable` before searching.\",\n );\n }\n const result = await querySearchIndex(document, query, {\n ...(options.chapters === undefined ? {} : { chapters: options.chapters }),\n ...(options.match === undefined ? {} : { match: options.match }),\n ...createSearchIndexQueryLimitOptions(options),\n types: options.types ?? null,\n });\n\n return result === undefined\n ? undefined\n : {\n hits: await hydrateSearchIndexHits(\n document,\n result,\n createSearchIndexHydrationOptions(options),\n ),\n result,\n };\n}\n\nasync function queryRequiredSearchIndex(\n document: ReadonlyDocument,\n query: string,\n options: Parameters<typeof querySearchIndex>[2],\n): Promise<SearchIndexQueryResult | undefined> {\n if (!(await isArchiveSearchIndexCurrent(document))) {\n throw new Error(\n \"Wiki Graph search index is missing or outdated. Run `<archive-uri>/index enable` before searching.\",\n );\n }\n\n return await querySearchIndex(document, query, options);\n}\n\nasync function hydrateSearchIndexHits(\n document: ReadonlyDocument,\n result: SearchIndexQueryResult,\n options: {\n readonly textHitLimit?: number;\n } = {},\n): Promise<readonly ArchiveFindHit[]> {\n const chapters = new Map(\n (await listChapters(document)).map((chapter) => [\n chapter.chapterId,\n chapter,\n ]),\n );\n const hits: ArchiveFindHit[] = [];\n\n for (const hit of result.objectHits) {\n const hydrated = await hydrateSearchObjectHit(document, chapters, hit);\n\n if (hydrated !== undefined) {\n hits.push(withSearchTerms(hydrated, result.terms));\n }\n }\n\n const textHits =\n options.textHitLimit === undefined\n ? result.textHits\n : result.textHits.slice(0, options.textHitLimit);\n\n for (const hit of textHits) {\n const hydrated = await hydrateSearchTextHit(document, chapters, hit);\n\n if (hydrated !== undefined) {\n hits.push(withSearchTerms(hydrated, result.terms));\n }\n }\n\n return hits;\n}\n\nfunction createSearchIndexHydrationOptions(options: ArchiveFindOptions): {\n readonly textHitLimit?: number;\n} {\n if (!isTextOnlySearch(options) || options.limit === undefined) {\n return {};\n }\n\n return { textHitLimit: createTextOnlySearchCacheWindow(options.limit) };\n}\n\nfunction createSearchIndexQueryLimitOptions(options: ArchiveFindOptions): {\n readonly textHitLimit?: number;\n} {\n if (!isTextOnlySearch(options) || options.limit === undefined) {\n return {};\n }\n\n return { textHitLimit: createTextOnlySearchCacheWindow(options.limit) };\n}\n\nfunction createTextOnlySearchCacheWindow(limit: number): number {\n return Math.max(limit + 1, TEXT_ONLY_SEARCH_CACHE_WINDOW);\n}\n\nfunction isTextOnlySearch(options: ArchiveFindOptions): boolean {\n return (\n options.types !== undefined &&\n options.types.length > 0 &&\n options.types.every((type) => type === \"source\" || type === \"summary\")\n );\n}\n\nfunction withSearchTerms(\n hit: ArchiveFindHit,\n terms: readonly string[],\n): ArchiveFindHit {\n return {\n ...hit,\n matchCount: terms.length,\n matchedTerms: terms,\n missingTerms: [],\n };\n}\n\nasync function hydrateSearchObjectHit(\n document: ReadonlyDocument,\n chapters: ReadonlyMap<number, ChapterEntry>,\n hit: SearchIndexObjectHit,\n): Promise<ArchiveFindHit | undefined> {\n switch (hit.ownerKind) {\n case SEARCH_OBJECT_PROPERTY_OWNER_KIND.chapter: {\n const chapterId = parseSearchPropertyIntegerOwnerId(hit.ownerId);\n const chapter = chapters.get(chapterId);\n\n if (chapter === undefined) {\n return undefined;\n }\n\n const title = chapter.title ?? `[chapter ${chapter.chapterId}]`;\n\n return {\n chapter: chapter.chapterId,\n field: \"title\",\n id: formatChapterTitleId(chapter.chapterId),\n matchCount: 1,\n position: { chapter: chapter.chapterId },\n score: hit.score,\n snippet: title,\n title,\n type: \"chapter-title\",\n };\n }\n case SEARCH_OBJECT_PROPERTY_OWNER_KIND.chunk: {\n const chunkId = parseSearchPropertyIntegerOwnerId(hit.ownerId);\n const node = await document.chunks.getById(chunkId);\n\n if (node === undefined) {\n return undefined;\n }\n\n const position = createNodePosition(node.sentenceIds);\n const isLabel = hit.propertyKind === SEARCH_OBJECT_PROPERTY_KIND.label;\n\n return {\n chapter: node.sentenceId[0],\n field: isLabel ? \"title\" : \"content\",\n id: formatNodeId(node.id),\n matchCount: 1,\n ...(position === undefined ? {} : { position }),\n score: hit.score,\n snippet: isLabel ? node.label : createSnippet(node.content),\n title: node.label,\n type: \"node\",\n };\n }\n case SEARCH_OBJECT_PROPERTY_OWNER_KIND.entity:\n return undefined;\n }\n}\n\nfunction parseSearchPropertyIntegerOwnerId(ownerId: string): number {\n const value = Number(ownerId);\n\n if (!Number.isSafeInteger(value)) {\n throw new Error(`Invalid search property owner id: ${ownerId}`);\n }\n\n return value;\n}\n\nasync function hydrateSearchTextHit(\n document: ReadonlyDocument,\n chapters: ReadonlyMap<number, ChapterEntry>,\n hit: SearchIndexTextHit,\n): Promise<ArchiveFindHit | undefined> {\n const stream =\n hit.kind === TEXT_SENTENCE_KIND.source\n ? (\"source\" as const)\n : (\"summary\" as const);\n const chapter = chapters.get(hit.chapterId);\n\n if (chapter === undefined) {\n return undefined;\n }\n\n const range = await readTextStreamRange(\n document,\n hit.chapterId,\n stream,\n hit.sentenceIndex,\n hit.sentenceIndex,\n );\n\n return {\n chapter: hit.chapterId,\n field: stream,\n id: range.id,\n matchCount: 1,\n position: {\n chapter: hit.chapterId,\n sentence: hit.sentenceIndex,\n },\n score: hit.score,\n snippet: createSnippet(range.text),\n title: chapter.title ?? `[chapter ${hit.chapterId}]`,\n type: stream,\n };\n}\n\nasync function createSearchIndexRecords(\n document: ReadonlyDocument,\n progress?: SearchIndexProgressReporter,\n): Promise<SearchIndexInput> {\n const objectProperties: SearchIndexInput[\"objectProperties\"][number][] = [];\n const textSentences: SearchIndexInput[\"textSentences\"][number][] = [];\n const chapters = await listChapters(document);\n let chapterDone = 0;\n\n for (const chapter of chapters) {\n const title = chapter.title ?? `[chapter ${chapter.chapterId}]`;\n\n objectProperties.push({\n chapterId: chapter.chapterId,\n ownerId: String(chapter.chapterId),\n ownerKind: SEARCH_OBJECT_PROPERTY_OWNER_KIND.chapter,\n propertyKind: SEARCH_OBJECT_PROPERTY_KIND.title,\n text: title,\n });\n\n textSentences.push(\n ...(await createTextStreamSearchIndexRecords(\n document,\n chapter.chapterId,\n \"summary\",\n title,\n )),\n );\n textSentences.push(\n ...(await createTextStreamSearchIndexRecords(\n document,\n chapter.chapterId,\n \"source\",\n title,\n )),\n );\n chapterDone += 1;\n await progress?.({\n done: chapterDone,\n phase: \"collecting\",\n total: chapters.length,\n unit: \"chapter\",\n });\n }\n\n for (const node of await document.chunks.listAll()) {\n objectProperties.push({\n chapterId: node.sentenceId[0],\n ownerId: String(node.id),\n ownerKind: SEARCH_OBJECT_PROPERTY_OWNER_KIND.chunk,\n propertyKind: SEARCH_OBJECT_PROPERTY_KIND.label,\n text: node.label,\n });\n objectProperties.push({\n chapterId: node.sentenceId[0],\n ownerId: String(node.id),\n ownerKind: SEARCH_OBJECT_PROPERTY_OWNER_KIND.chunk,\n propertyKind: SEARCH_OBJECT_PROPERTY_KIND.content,\n text: node.content,\n });\n }\n\n for (const mention of await document.mentions.listAll()) {\n objectProperties.push({\n chapterId: mention.chapterId,\n ownerId: mention.qid,\n ownerKind: SEARCH_OBJECT_PROPERTY_OWNER_KIND.entity,\n propertyKind: SEARCH_OBJECT_PROPERTY_KIND.surface,\n text: mention.surface,\n });\n }\n\n return { objectProperties, textSentences };\n}\n\nasync function createTextStreamSearchIndexRecords(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n _title: string,\n): Promise<SearchIndexInput[\"textSentences\"]> {\n const index = await createTextStreamIndex(document, chapterId, stream);\n\n return index.sentences.map((sentence) => ({\n chapterId,\n kind:\n stream === \"source\"\n ? TEXT_SENTENCE_KIND.source\n : TEXT_SENTENCE_KIND.summary,\n sentenceIndex: sentence.globalIndex,\n text: sentence.text,\n wordsCount: sentence.wordsCount,\n }));\n}\n\nexport async function readArchiveText(\n document: ReadonlyDocument,\n id: string,\n): Promise<string> {\n const reference = parseArchiveReference(id);\n\n switch (reference.type) {\n case \"chapter\":\n throw new Error(\n `Chapter ${formatChapterId(reference.id)} is a scope URI, not a readable object.`,\n );\n case \"chapter-title\": {\n const chapter = await requireChapter(document, reference.id);\n\n return chapter.title ?? `[chapter ${reference.id}]`;\n }\n case \"fragment\":\n return (\n await readSourceFragment(\n document,\n reference.serialId,\n reference.fragmentId,\n )\n ).text;\n case \"summary\": {\n const summary = await readTextStreamText(\n document,\n reference.id,\n \"summary\",\n );\n\n if (summary.trim() === \"\") {\n throw new Error(`Summary ${formatSummaryId(reference.id)} is missing.`);\n }\n\n return summary;\n }\n case \"node\": {\n const { node } = await requireNode(document, reference.id);\n\n return node.content;\n }\n case \"meta\": {\n return formatMetaText(await document.readBookMeta());\n }\n }\n}\n\nexport async function readArchivePage(\n document: ReadonlyDocument,\n id: string,\n options: ArchivePageOptions = {},\n): Promise<ArchivePage> {\n if (isWikiGraphObjectUri(id)) {\n return await readWikiGraphPage(\n document,\n normalizeWikiGraphObjectUri(id),\n options,\n );\n }\n\n const reference = parseArchiveReference(id);\n\n switch (reference.type) {\n case \"chapter\": {\n throw new Error(\n `Chapter ${formatChapterId(reference.id)} is a scope URI, not a readable object. Use wikg://chapter/${reference.id}/title or wikg://chapter/${reference.id}/state.`,\n );\n }\n case \"chapter-title\": {\n const chapter = await requireChapter(document, reference.id);\n\n return {\n id: formatChapterTitleId(reference.id),\n title: chapter.title ?? `[chapter ${reference.id}]`,\n type: \"chapter-title\",\n };\n }\n case \"fragment\": {\n const [fragment, relatedNodes, fragmentIds] = await Promise.all([\n readSourceFragment(document, reference.serialId, reference.fragmentId),\n listFragmentNodes(document, reference.serialId, reference.fragmentId),\n document.getSerialFragments(reference.serialId).listFragmentIds(),\n ]);\n const fragmentIndex = fragmentIds.indexOf(reference.fragmentId);\n const previousFragmentId =\n fragmentIndex > 0 ? fragmentIds[fragmentIndex - 1] : undefined;\n const nextFragmentId =\n fragmentIndex >= 0 && fragmentIndex < fragmentIds.length - 1\n ? fragmentIds[fragmentIndex + 1]\n : undefined;\n\n return {\n fragment,\n id: fragment.id,\n nextFragmentId:\n nextFragmentId === undefined\n ? undefined\n : formatFragmentId(reference.serialId, nextFragmentId),\n nodes: relatedNodes,\n previousFragmentId:\n previousFragmentId === undefined\n ? undefined\n : formatFragmentId(reference.serialId, previousFragmentId),\n title: fragment.id,\n type: \"fragment\",\n };\n }\n case \"meta\":\n return {\n ...createMetaPage(await document.readBookMeta()),\n id: ARCHIVE_ROOT_ID,\n type: \"meta\",\n };\n case \"node\": {\n const { chapterId, node } = await requireNode(document, reference.id);\n const [neighbors, sourceFragments] = await Promise.all([\n listGraphNeighbors(document, chapterId, reference.id),\n readNodeSourceFragments(document, node),\n ]);\n const outgoing = neighbors.filter(\n (neighbor) => neighbor.direction === \"outgoing\",\n );\n const incoming = neighbors.filter(\n (neighbor) => neighbor.direction === \"incoming\",\n );\n\n return {\n generatedNodeSummary: node.content,\n id: formatNodeId(node.id),\n incoming,\n neighbors,\n outgoing,\n position: createNodePosition(node.sentenceIds),\n sourceFragments,\n title: node.label,\n type: \"node\",\n };\n }\n case \"summary\": {\n const chapter = await requireChapter(document, reference.id);\n const content = await readTextStreamText(\n document,\n reference.id,\n \"summary\",\n );\n\n if (content.trim() === \"\") {\n throw new Error(`Summary ${formatSummaryId(reference.id)} is missing.`);\n }\n\n return {\n content,\n id: formatSummaryId(reference.id),\n title: chapter.title ?? `[chapter ${reference.id}]`,\n type: \"summary\",\n };\n }\n }\n}\n\nasync function readWikiGraphPage(\n document: ReadonlyDocument,\n uri: string,\n options: ArchivePageOptions = {},\n): Promise<ArchivePage> {\n uri = normalizeWikiGraphObjectUri(uri);\n const reference = parseWikiGraphReference(uri);\n\n switch (reference.type) {\n case \"meta\":\n return await readArchivePage(document, ARCHIVE_ROOT_ID, options);\n case \"chapter\":\n throw new Error(\n `wikg://chapter/${reference.chapterId} is a scope URI, not a readable object. Use wikg://chapter/${reference.chapterId}/title or wikg://chapter/${reference.chapterId}/state.`,\n );\n case \"chapter-title\":\n return await readArchivePage(\n document,\n formatChapterTitleId(reference.chapterId),\n options,\n );\n case \"chapter-state\": {\n const details = await requireChapter(document, reference.chapterId);\n const targets = await createChapterState(document, details);\n\n return {\n id:\n reference.target === undefined\n ? `wikg://chapter/${reference.chapterId}/state`\n : `wikg://chapter/${reference.chapterId}/state/${reference.target}`,\n ...(reference.target === undefined\n ? { state: targets }\n : { target: reference.target, value: targets[reference.target] }),\n type: \"state\",\n };\n }\n case \"chapter-tree\":\n return {\n id: \"chapter-tree\",\n title: \"Chapter tree\",\n tree: await getChapterTree(document),\n type: \"chapter-tree\",\n };\n case \"entity\": {\n const mentions = filterMentionsByChapter(\n await document.mentions.listByQid(reference.qid),\n reference.chapterId,\n );\n\n if (mentions.length === 0) {\n throw new Error(`Entity ${uri} was not found in this archive.`);\n }\n\n return {\n evidence: await createMentionEvidencePreview(\n document,\n mentions,\n options.evidenceLimit,\n createEvidenceReadContext(),\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n options.order ?? \"doc-asc\",\n ),\n id: uri,\n label: selectEntityLabel(mentions),\n labels: selectEntityLabels(mentions),\n mentionCount: mentions.length,\n qid: reference.qid,\n type: \"entity\",\n };\n }\n case \"entity-wikipage\":\n return {\n ...(await resolveEntityWikipage(reference.qid, options)),\n id: uri,\n type: \"entity-wikipage\",\n };\n case \"triple\": {\n const links = await filterMentionLinksByChapter(\n document,\n await document.mentionLinks.listByTriple({\n objectQid: reference.objectQid,\n predicate: reference.predicate,\n subjectQid: reference.subjectQid,\n }),\n reference.chapterId,\n );\n\n if (links.length === 0) {\n throw new Error(`Triple ${uri} was not found in this archive.`);\n }\n\n return {\n evidence: await createMentionLinkEvidencePreview(\n document,\n links,\n options.evidenceLimit,\n createEvidenceReadContext(),\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n options.order ?? \"doc-asc\",\n ),\n id: uri,\n label: await createTriplePageLabel(document, reference),\n objectQid: reference.objectQid,\n predicate: reference.predicate,\n subjectQid: reference.subjectQid,\n type: \"triple\",\n };\n }\n case \"chunk\": {\n if (reference.chapterId !== undefined) {\n const { chapterId } = await requireNode(document, reference.id);\n\n if (chapterId !== reference.chapterId) {\n throw new Error(`Chunk ${uri} was not found in this archive.`);\n }\n }\n return await readArchivePage(\n document,\n formatNodeId(reference.id),\n options,\n );\n }\n case \"text-stream\":\n return {\n ...(options.backlinks === true\n ? { backlinks: await createTextStreamBacklinks(document, reference) }\n : {}),\n fragment: await createTextStreamRangeFragment(document, reference),\n id: uri,\n nextFragmentId: undefined,\n nodes: [],\n previousFragmentId: undefined,\n title: uri,\n type: \"fragment\",\n };\n }\n}\n\nexport async function listArchiveLinks(\n document: ReadonlyDocument,\n id: string,\n direction: \"backlinks\" | \"links\",\n): Promise<readonly GraphNeighbor[]> {\n return (await listAllArchiveLinks(document, id)).filter((neighbor) =>\n direction === \"links\"\n ? neighbor.direction === \"outgoing\"\n : neighbor.direction === \"incoming\",\n );\n}\n\nexport async function listAllArchiveLinks(\n document: ReadonlyDocument,\n id: string,\n): Promise<readonly GraphNeighbor[]> {\n if (isWikiGraphObjectUri(id)) {\n id = normalizeWikiGraphObjectUri(id);\n const reference = parseWikiGraphReference(id);\n\n if (reference.type !== \"chunk\") {\n return [];\n }\n\n const { chapterId } = await requireNode(document, reference.id);\n\n if (\n reference.chapterId !== undefined &&\n reference.chapterId !== chapterId\n ) {\n throw new Error(`Chunk ${id} was not found in this archive.`);\n }\n\n return await listGraphNeighbors(document, chapterId, reference.id);\n }\n\n const reference = parseArchiveReference(id);\n\n if (reference.type !== \"node\") {\n return [];\n }\n\n const { chapterId } = await requireNode(document, reference.id);\n return await listGraphNeighbors(document, chapterId, reference.id);\n}\n\nexport async function listRelatedArchiveObjects(\n document: ReadonlyDocument,\n id: string,\n options: ArchiveRelatedOptions = {},\n): Promise<ArchiveRelatedResult> {\n if (isWikiGraphObjectUri(id)) {\n return await listRelatedWikiGraphObjects(\n document,\n normalizeWikiGraphObjectUri(id),\n options,\n );\n }\n\n const reference = parseArchiveReference(id);\n if (reference.type !== \"node\") {\n rejectRelatedRole(options.role, id);\n return paginateRelatedItems([], options);\n }\n rejectRelatedRole(options.role, id);\n\n const documentOrders = await document.serials.listDocumentOrders();\n const { chapterId } = await requireNode(document, reference.id);\n const items = sortGraphNeighborsByListMode(\n await listGraphNeighbors(document, chapterId, reference.id),\n documentOrders,\n options.order ?? \"doc-asc\",\n ).map((neighbor) => ({\n id: formatNodeId(neighbor.node.id),\n label: neighbor.node.label,\n summary: neighbor.node.content,\n type: \"node\" as const,\n }));\n\n return await hydrateRelatedItemsEvidence(\n document,\n await filterAndSortChunkRelatedItemsByQuery(document, items, options.query),\n options,\n );\n}\n\nasync function listRelatedWikiGraphObjects(\n document: ReadonlyDocument,\n uri: string,\n options: ArchiveRelatedOptions,\n): Promise<ArchiveRelatedResult> {\n const reference = parseWikiGraphReference(uri);\n\n switch (reference.type) {\n case \"chapter\": {\n throw new Error(`Related is not available for scope URI: ${uri}`);\n }\n case \"chapter-title\":\n rejectRelatedRole(options.role, uri);\n return paginateRelatedItems([], options);\n case \"chunk\": {\n rejectRelatedRole(options.role, uri);\n const { chapterId } = await requireNode(document, reference.id);\n\n if (\n reference.chapterId !== undefined &&\n reference.chapterId !== chapterId\n ) {\n throw new Error(`Chunk ${uri} was not found in this archive.`);\n }\n\n const items = sortGraphNeighborsByListMode(\n await listGraphNeighbors(document, chapterId, reference.id),\n await document.serials.listDocumentOrders(),\n options.order ?? \"doc-asc\",\n ).map((neighbor) => ({\n id: formatNodeId(neighbor.node.id),\n label: neighbor.node.label,\n summary: neighbor.node.content,\n type: \"node\" as const,\n }));\n\n return await hydrateRelatedItemsEvidence(\n document,\n await filterAndSortChunkRelatedItemsByQuery(\n document,\n items,\n options.query,\n ),\n options,\n );\n }\n case \"text-stream\": {\n rejectRelatedQuery(options.query, uri);\n rejectRelatedRole(options.role, uri);\n const chapter = await requireChapter(document, reference.chapterId);\n\n return await hydrateRelatedItemsEvidence(\n document,\n [\n {\n id: formatChapterId(reference.chapterId),\n label: chapter.title ?? `[chapter ${reference.chapterId}]`,\n summary: `${chapter.stage}; ${chapter.fragmentCount} fragments`,\n type: \"chapter\",\n },\n ],\n options,\n );\n }\n case \"entity\":\n return await listRelatedEntityObjects(document, reference, options);\n case \"triple\":\n throw new Error(\n `Related is only available for chunk and entity objects: ${uri}`,\n );\n case \"chapter-tree\":\n case \"entity-wikipage\":\n case \"meta\":\n case \"chapter-state\":\n rejectRelatedQuery(options.query, uri);\n rejectRelatedRole(options.role, uri);\n return paginateRelatedItems([], options);\n }\n}\n\nasync function resolveEntityWikipage(\n qid: string,\n options: ArchivePageOptions,\n): Promise<{\n readonly en: ArchiveEntityWikipageLocale | null;\n readonly zh: ArchiveEntityWikipageLocale | null;\n}> {\n const [en, zh] = await Promise.all([\n resolveEntityWikipageLocale(qid, \"en\", \"enwiki\", options),\n resolveEntityWikipageLocale(qid, \"zh\", \"zhwiki\", options),\n ]);\n\n return { en, zh };\n}\n\nasync function resolveEntityWikipageLocale(\n qid: string,\n language: \"en\" | \"zh\",\n wiki: \"enwiki\" | \"zhwiki\",\n options: ArchivePageOptions,\n): Promise<ArchiveEntityWikipageLocale | null> {\n const resolver = await WikipageResolver.open({\n ...options.wikipageResolverOptions,\n language,\n wiki,\n });\n\n try {\n const [resolution] = await resolver.resolveQids([qid]);\n\n if (resolution === undefined) {\n return null;\n }\n\n return createEntityWikipageLocale(resolution, wiki);\n } finally {\n await resolver.close();\n }\n}\n\nfunction createEntityWikipageLocale(\n resolution: QidResolution,\n wiki: \"enwiki\" | \"zhwiki\",\n): ArchiveEntityWikipageLocale | null {\n const sitelink =\n resolution.sitelinks?.find((item) => item.wiki === wiki) ??\n (resolution.sitelink?.wiki === wiki ? resolution.sitelink : undefined);\n\n if (sitelink === undefined) {\n return null;\n }\n\n return {\n ...(resolution.description === undefined\n ? {}\n : { description: resolution.description }),\n title: sitelink.title,\n url: formatWikipediaPageUrl(sitelink),\n };\n}\n\nfunction formatWikipediaPageUrl(sitelink: WikipageSitelink): string {\n const language = sitelink.wiki === \"zhwiki\" ? \"zh\" : \"en\";\n\n return `https://${language}.wikipedia.org/wiki/${encodeURIComponent(\n sitelink.title.replace(/ /gu, \"_\"),\n )}`;\n}\n\nasync function listRelatedEntityObjects(\n document: ReadonlyDocument,\n reference: Extract<WikiGraphReference, { readonly type: \"entity\" }>,\n options: ArchiveRelatedOptions,\n): Promise<ArchiveRelatedResult> {\n const mentions = filterMentionsByChapter(\n await document.mentions.listByQid(reference.qid),\n reference.chapterId,\n );\n\n if (mentions.length === 0) {\n throw new Error(\n `Entity ${formatEntityUri(reference.qid)} was not found in this archive.`,\n );\n }\n\n const chapters = [\n ...new Set(mentions.map((mention) => mention.chapterId)),\n ].sort(compareNumbers);\n const role = options.role ?? \"any\";\n const triplesById = new Map<\n string,\n Extract<ArchiveListItem, { readonly type: \"triple\" }>\n >();\n\n for (const chapterId of chapters) {\n for (const link of await document.mentionLinks.listByChapter(chapterId)) {\n const [source, target] = await Promise.all([\n document.mentions.getById(link.sourceMentionId),\n document.mentions.getById(link.targetMentionId),\n ]);\n\n if (source === undefined || target === undefined) {\n continue;\n }\n if (\n !matchesRelatedEntityRole(source.qid, target.qid, reference.qid, role)\n ) {\n continue;\n }\n\n const id = formatTripleUri(source.qid, link.predicate, target.qid);\n\n const existing = triplesById.get(id);\n\n if (existing !== undefined) {\n triplesById.set(id, {\n ...existing,\n evidenceLinks: [...(existing.evidenceLinks ?? []), link],\n });\n continue;\n }\n\n triplesById.set(id, {\n evidenceLinks: [link],\n id,\n label: `${source.surface} ${link.predicate} ${target.surface}`,\n objectLabel: target.surface,\n objectQid: target.qid,\n predicate: link.predicate,\n subjectLabel: source.surface,\n subjectQid: source.qid,\n summary: `${source.qid} ${link.predicate} ${target.qid}`,\n type: \"triple\",\n });\n }\n }\n\n return await hydrateRelatedItemsEvidence(\n document,\n await filterAndSortEntityRelatedTriplesByQuery(\n document,\n sortRelatedItemsByListMode(\n [...triplesById.values()],\n options.order ?? \"doc-asc\",\n await document.serials.listDocumentOrders(),\n ),\n reference.qid,\n options.query,\n ),\n options,\n );\n}\n\nasync function filterAndSortChunkRelatedItemsByQuery(\n document: ReadonlyDocument,\n items: readonly ArchiveListItem[],\n query: string | undefined,\n): Promise<readonly ArchiveListItem[]> {\n if (query === undefined) {\n return items;\n }\n\n const indexResult = await queryRequiredSearchIndex(document, query, {\n types: [\"node\"],\n });\n\n if (indexResult === undefined) {\n return [];\n }\n\n const scoresByChunkId = new Map<number, number[]>();\n const allowedChunkIds = new Set(\n items.flatMap((item) => {\n if (item.type !== \"node\") {\n return [];\n }\n const reference = parseArchiveReference(item.id);\n\n return reference.type === \"node\" ? [reference.id] : [];\n }),\n );\n\n for (const hit of indexResult.objectHits) {\n if (\n hit.ownerKind !== SEARCH_OBJECT_PROPERTY_OWNER_KIND.chunk ||\n !allowedChunkIds.has(Number(hit.ownerId))\n ) {\n continue;\n }\n\n const chunkId = Number(hit.ownerId);\n const scores = scoresByChunkId.get(chunkId) ?? [];\n\n scores.push(hit.score);\n scoresByChunkId.set(chunkId, scores);\n }\n\n return items\n .flatMap((item) => {\n if (item.type !== \"node\") {\n return [];\n }\n const reference = parseArchiveReference(item.id);\n\n if (reference.type !== \"node\") {\n return [];\n }\n const scores = scoresByChunkId.get(reference.id);\n\n return scores === undefined\n ? []\n : [{ ...item, score: aggregateEvidenceScores(scores) }];\n })\n .sort(compareRelatedQueryItems);\n}\n\nasync function filterAndSortEntityRelatedTriplesByQuery(\n document: ReadonlyDocument,\n items: readonly ArchiveListItem[],\n anchorQid: string,\n query: string | undefined,\n): Promise<readonly ArchiveListItem[]> {\n if (query === undefined) {\n return items;\n }\n const scope = await createEntityRelatedQueryScope(document, items, anchorQid);\n\n const indexResult = await queryRequiredSearchIndex(document, query, {\n chapters: [...scope.chapterIds],\n types: [\"entity\", \"source\"],\n });\n\n if (indexResult === undefined) {\n return [];\n }\n\n const sentenceScores = new Map(\n indexResult.textHits\n .filter((hit) => hit.kind === TEXT_SENTENCE_KIND.source)\n .map(\n (hit) =>\n [\n createSentenceHitKey(hit.chapterId, hit.sentenceIndex),\n hit.score,\n ] as const,\n ),\n );\n const endpointScoresByKey = new Map<string, number[]>();\n\n for (const hit of indexResult.objectHits) {\n if (\n hit.ownerKind !== SEARCH_OBJECT_PROPERTY_OWNER_KIND.entity ||\n hit.ownerId === anchorQid ||\n hit.chapterId === undefined\n ) {\n continue;\n }\n\n const key = createEntityRelatedEndpointKey(hit.ownerId, hit.chapterId);\n const scores = endpointScoresByKey.get(key) ?? [];\n\n scores.push(hit.score);\n endpointScoresByKey.set(key, scores);\n }\n\n return items\n .flatMap((item) => {\n if (item.type !== \"triple\") {\n return [];\n }\n\n const scores = [\n ...[...(scope.endpointKeysByTripleId.get(item.id) ?? [])].flatMap(\n (key) => endpointScoresByKey.get(key) ?? [],\n ),\n ...(item.evidenceLinks ?? []).flatMap((link) =>\n link.evidenceSentenceIds.flatMap(([chapterId, sentenceIndex]) => {\n const score = sentenceScores.get(\n createSentenceHitKey(chapterId, sentenceIndex),\n );\n\n return score === undefined ? [] : [score];\n }),\n ),\n ];\n\n return scores.length === 0\n ? []\n : [{ ...item, score: aggregateEvidenceScores(scores) }];\n })\n .sort(compareRelatedQueryItems);\n}\n\nasync function createEntityRelatedQueryScope(\n document: ReadonlyDocument,\n items: readonly ArchiveListItem[],\n anchorQid: string,\n): Promise<{\n readonly chapterIds: ReadonlySet<number>;\n readonly endpointKeysByTripleId: ReadonlyMap<string, ReadonlySet<string>>;\n}> {\n const chapterIds = new Set<number>();\n const endpointKeysByTripleId = new Map<string, Set<string>>();\n const mentionCache = new Map<string, MentionRecord | undefined>();\n\n for (const item of items) {\n if (item.type !== \"triple\") {\n continue;\n }\n\n const endpointKeys = new Set<string>();\n\n for (const link of item.evidenceLinks ?? []) {\n for (const [chapterId] of link.evidenceSentenceIds) {\n chapterIds.add(chapterId);\n }\n\n const [source, target] = await Promise.all([\n getCachedMention(document, mentionCache, link.sourceMentionId),\n getCachedMention(document, mentionCache, link.targetMentionId),\n ]);\n\n for (const mention of [source, target]) {\n if (mention === undefined || mention.qid === anchorQid) {\n continue;\n }\n\n chapterIds.add(mention.chapterId);\n endpointKeys.add(\n createEntityRelatedEndpointKey(mention.qid, mention.chapterId),\n );\n }\n }\n\n endpointKeysByTripleId.set(item.id, endpointKeys);\n }\n\n return { chapterIds, endpointKeysByTripleId };\n}\n\nasync function getCachedMention(\n document: ReadonlyDocument,\n cache: Map<string, MentionRecord | undefined>,\n mentionId: string,\n): Promise<MentionRecord | undefined> {\n if (!cache.has(mentionId)) {\n cache.set(mentionId, await document.mentions.getById(mentionId));\n }\n\n return cache.get(mentionId);\n}\n\nfunction createEntityRelatedEndpointKey(\n qid: string,\n chapterId: number,\n): string {\n return `${qid}:${chapterId}`;\n}\n\nfunction compareRelatedQueryItems(\n left: ArchiveListItem,\n right: ArchiveListItem,\n): number {\n const scoreComparison = (right.score ?? 0) - (left.score ?? 0);\n\n if (scoreComparison !== 0) {\n return scoreComparison;\n }\n\n return compareListHits(\n createFindHitFromListItem(left),\n createFindHitFromListItem(right),\n \"doc-asc\",\n );\n}\n\nfunction sortRelatedItemsByListMode(\n items: readonly ArchiveListItem[],\n order: ArchiveFindOrder = \"doc-asc\",\n documentOrders?: ReadonlyMap<number, number>,\n): readonly ArchiveListItem[] {\n return [...items].sort((left, right) =>\n compareListHits(\n createFindHitFromListItem(left, documentOrders),\n createFindHitFromListItem(right, documentOrders),\n order,\n ),\n );\n}\n\nfunction sortGraphNeighborsByListMode(\n neighbors: readonly GraphNeighbor[],\n documentOrders: ReadonlyMap<number, number>,\n order: ArchiveFindOrder,\n): readonly GraphNeighbor[] {\n const direction = order === \"doc-asc\" ? 1 : -1;\n\n return [...neighbors].sort(\n (left, right) =>\n compareSentenceIds(\n getFirstGraphNodeSentenceId(left.node),\n getFirstGraphNodeSentenceId(right.node),\n documentOrders,\n ) * direction,\n );\n}\n\nfunction createFindHitFromListItem(\n item: ArchiveListItem,\n documentOrders?: ReadonlyMap<number, number>,\n): ArchiveFindHit {\n const position = createListItemPosition(item, documentOrders);\n const score =\n item.type === \"triple\" ? (item.evidenceLinks?.length ?? 0) : undefined;\n\n return {\n field: \"title\",\n id: item.id,\n ...(position === undefined ? {} : { position }),\n ...(score === undefined ? {} : { score }),\n snippet: item.summary,\n title: item.label,\n type: toFindObjectType(item.type),\n };\n}\n\nfunction toFindObjectType(\n type: ArchiveListItem[\"type\"],\n): ArchiveFindObjectType {\n switch (type) {\n case \"edge\":\n case \"state\":\n return \"meta\";\n default:\n return type;\n }\n}\n\nfunction createListItemPosition(\n item: ArchiveListItem,\n documentOrders?: ReadonlyMap<number, number>,\n): ArchiveFindPosition | undefined {\n if (item.type === \"triple\") {\n return createFirstMentionLinkPosition(\n item.evidenceLinks ?? [],\n documentOrders,\n );\n }\n\n return undefined;\n}\n\nfunction createFirstMentionLinkPosition(\n links: readonly MentionLinkRecord[],\n documentOrders?: ReadonlyMap<number, number>,\n): ArchiveFindPosition | undefined {\n const sentenceIds = links.flatMap((link) => link.evidenceSentenceIds);\n const [first] = sentenceIds.sort((left, right) =>\n compareSentenceIds(left, right, documentOrders),\n );\n\n return first === undefined\n ? undefined\n : createSentencePosition(first, documentOrders);\n}\n\nfunction getFirstGraphNodeSentenceId(node: GraphNode): SentenceId {\n return (\n [...node.sentenceIds].sort(compareSentenceIds)[0] ?? [\n Number.MAX_SAFE_INTEGER,\n Number.MAX_SAFE_INTEGER,\n ]\n );\n}\n\nfunction matchesRelatedEntityRole(\n subjectQid: string,\n objectQid: string,\n qid: string,\n role: ArchiveRelatedRole,\n): boolean {\n const isSubject = subjectQid === qid;\n const isObject = objectQid === qid;\n const isSelf = isSubject && isObject;\n\n switch (role) {\n case \"any\":\n return isSubject || isObject;\n case \"subject\":\n return isSubject && !isSelf;\n case \"object\":\n return isObject && !isSelf;\n case \"self\":\n return isSelf;\n }\n}\n\nfunction rejectRelatedRole(\n role: ArchiveRelatedRole | undefined,\n id: string,\n): void {\n if (role !== undefined && role !== \"any\") {\n throw new Error(`--role is only available for entity related: ${id}`);\n }\n}\n\nfunction rejectRelatedQuery(query: string | undefined, id: string): void {\n if (query !== undefined) {\n throw new Error(\n `Related query is only available for chunk and entity: ${id}`,\n );\n }\n}\n\nasync function hydrateRelatedItemsEvidence(\n document: ReadonlyDocument,\n items: readonly ArchiveListItem[],\n options: ArchiveRelatedOptions,\n): Promise<ArchiveRelatedResult> {\n const page = paginateRelatedItems(items, options);\n\n if (options.evidenceLimit === undefined) {\n return {\n ...page,\n items: page.items.map((item) => {\n if (item.type !== \"triple\") {\n return item;\n }\n const { evidenceLinks: _evidenceLinks, ...publicItem } = item;\n return publicItem;\n }),\n };\n }\n\n const context = createEvidenceReadContext();\n const evidenceLimit = options.evidenceLimit;\n\n return {\n ...page,\n items: await Promise.all(\n page.items.map(async (item) => {\n if (item.evidence !== undefined) {\n return item;\n }\n if (item.type === \"triple\") {\n const evidence = await createMentionLinkEvidencePreview(\n document,\n item.evidenceLinks ?? [],\n evidenceLimit,\n context,\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n options.order ?? \"doc-asc\",\n );\n const { evidenceLinks: _evidenceLinks, ...publicItem } = item;\n\n return { ...publicItem, evidence };\n }\n if (item.type === \"node\") {\n const reference = parseArchiveReference(item.id);\n\n if (reference.type !== \"node\") {\n return item;\n }\n\n const { node } = await requireNode(document, reference.id);\n return {\n ...item,\n evidence: await createSourceEvidencePreview(\n document,\n createNodeEvidenceRanges(node),\n evidenceLimit,\n context,\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n options.order ?? \"doc-asc\",\n ),\n };\n }\n return item;\n }),\n ),\n };\n}\n\nfunction paginateRelatedItems(\n items: readonly ArchiveListItem[],\n options: ArchiveRelatedOptions,\n): ArchiveRelatedResult {\n const limit = options.limit ?? 20;\n const offset = parseRelatedCursor(options.cursor);\n const pageItems = items.slice(offset, offset + limit);\n const nextOffset = offset + pageItems.length;\n\n return {\n items: pageItems,\n limit,\n nextCursor: nextOffset >= items.length ? null : String(nextOffset),\n };\n}\n\nfunction parseRelatedCursor(cursor: string | undefined): number {\n if (cursor === undefined) {\n return 0;\n }\n\n if (!/^(0|[1-9][0-9]*)$/u.test(cursor)) {\n throw new Error(`Invalid related cursor: ${cursor}`);\n }\n\n return Number(cursor);\n}\n\nexport async function listArchiveEvidence(\n document: ReadonlyDocument,\n uri: string,\n options: ArchiveEvidenceOptions = {},\n): Promise<ArchiveEvidence> {\n const reference = parseWikiGraphReference(uri);\n\n switch (reference.type) {\n case \"chapter\":\n case \"chapter-title\":\n case \"chapter-state\":\n case \"chapter-tree\":\n case \"entity-wikipage\":\n case \"meta\":\n case \"text-stream\":\n throw new Error(`Evidence is not available for ${uri}.`);\n case \"chunk\": {\n const { chapterId, node } = await requireNode(document, reference.id);\n\n if (\n reference.chapterId !== undefined &&\n reference.chapterId !== chapterId\n ) {\n throw new Error(`Chunk ${uri} was not found in this archive.`);\n }\n\n return await createSourceEvidencePage(\n document,\n createNodeEvidenceRanges(node),\n options,\n );\n }\n case \"entity\":\n return await createSourceEvidencePage(\n document,\n await createMentionEvidenceRanges(\n document,\n filterMentionsByChapter(\n await document.mentions.listByQid(reference.qid),\n reference.chapterId,\n ),\n ),\n options,\n );\n case \"triple\":\n return await createSourceEvidencePage(\n document,\n createMentionLinkEvidenceRanges(\n document,\n await filterMentionLinksByChapter(\n document,\n await document.mentionLinks.listByTriple({\n objectQid: reference.objectQid,\n predicate: reference.predicate,\n subjectQid: reference.subjectQid,\n }),\n reference.chapterId,\n ),\n ),\n options,\n );\n }\n}\n\nexport async function packArchiveContext(\n document: ReadonlyDocument,\n id: string,\n budget: number,\n): Promise<ArchivePack> {\n validatePackReference(id);\n\n const [anchor, related] = await Promise.all([\n readArchivePage(document, id, { evidenceLimit: 3 }),\n listRelatedArchiveObjects(document, id, { evidenceLimit: 3 }),\n ]);\n\n return {\n anchor,\n budget,\n related: related.items,\n };\n}\n\nfunction validatePackReference(id: string): void {\n const reference = parseWikiGraphReference(id);\n\n switch (reference.type) {\n case \"chunk\":\n case \"entity\":\n return;\n case \"chapter\":\n case \"chapter-title\":\n case \"chapter-state\":\n case \"chapter-tree\":\n case \"entity-wikipage\":\n case \"meta\":\n case \"text-stream\":\n throw new Error(\n `Pack is only available for chunk and entity objects: ${id}`,\n );\n }\n}\n\nexport function formatChapterId(chapterId: number): string {\n return `chapter:${chapterId}`;\n}\n\nexport function formatChapterTitleId(chapterId: number): string {\n return `chapter-title:${chapterId}`;\n}\n\nexport function formatEdgeId(edge: ReadingEdgeRecord): string {\n return `edge:${edge.fromId}->${edge.toId}`;\n}\n\nexport function formatNodeId(nodeId: number): string {\n return `node:${nodeId}`;\n}\n\nexport function formatSummaryId(chapterId: number): string {\n return `summary:${chapterId}`;\n}\n\nexport function formatFragmentId(serialId: number, fragmentId: number): string {\n return `fragment:${serialId}:${fragmentId}`;\n}\n\nfunction findEntities(\n search: LexicalQuery,\n context: {\n readonly mentions: readonly MentionRecord[];\n },\n): readonly ArchiveFindHit[] {\n const candidatesByQid = new Map<\n string,\n Array<{\n readonly hit: ArchiveFindHit;\n readonly mention: MentionRecord;\n }>\n >();\n\n for (const { match, mention } of createMentionLexicalHits(\n context.mentions,\n search,\n )) {\n const candidates = candidatesByQid.get(mention.qid) ?? [];\n\n candidates.push({\n hit: {\n chapter: mention.chapterId,\n field: \"title\" as const,\n id: `wikg://entity/${mention.qid}`,\n ...createFindMatchFields(match),\n position: {\n chapter: mention.chapterId,\n sentence: mention.sentenceIndex ?? 0,\n },\n snippet: mention.note ?? mention.surface,\n title: mention.surface,\n type: \"entity\" as const,\n },\n mention,\n });\n candidatesByQid.set(mention.qid, candidates);\n }\n\n return [...candidatesByQid.values()].map((candidates) => {\n const rankedCandidates = [...candidates].sort((left, right) => {\n const scoreComparison = (right.hit.score ?? 0) - (left.hit.score ?? 0);\n\n if (scoreComparison !== 0) {\n return scoreComparison;\n }\n if (left.hit.position === undefined) {\n return right.hit.position === undefined ? 0 : 1;\n }\n if (right.hit.position === undefined) {\n return -1;\n }\n return compareArchivePositions(left.hit.position, right.hit.position);\n });\n const [best] = rankedCandidates;\n\n if (best === undefined) {\n throw new Error(\"Internal error: entity search candidate is empty.\");\n }\n\n return {\n ...best.hit,\n score: aggregateEvidenceScores(\n rankedCandidates.map((candidate) => candidate.hit.score ?? 0),\n ),\n evidenceMentions: rankedCandidates.map((candidate) => ({\n match: {\n matchCount: candidate.hit.matchCount ?? 0,\n matchedTerms: candidate.hit.matchedTerms ?? [],\n missingTerms: candidate.hit.missingTerms ?? [],\n score: candidate.hit.score ?? 0,\n },\n mention: candidate.mention,\n })),\n };\n });\n}\n\nasync function findTriples(\n document: ReadonlyDocument,\n search: LexicalQuery,\n context: {\n readonly mentions: readonly MentionRecord[];\n },\n): Promise<readonly ArchiveFindHit[]> {\n const mentionsById = new Map(\n context.mentions.map((mention) => [mention.id, mention]),\n );\n const hitsByTriple = new Map<string, ArchiveFindHit[]>();\n\n for (const chapter of await listChapters(document)) {\n for (const link of await document.mentionLinks.listByChapter(\n chapter.chapterId,\n )) {\n const [source, target] = await Promise.all([\n getMentionForTripleSearch(document, mentionsById, link.sourceMentionId),\n getMentionForTripleSearch(document, mentionsById, link.targetMentionId),\n ]);\n\n if (source === undefined || target === undefined) {\n continue;\n }\n\n const text = `${source.surface} ${link.predicate} ${target.surface}`;\n const match = scoreLexicalText(text, search);\n\n if (match === undefined) {\n continue;\n }\n\n const id = formatTripleUri(source.qid, link.predicate, target.qid);\n const next = {\n chapter: source.chapterId,\n evidenceLinks: [link],\n field: \"content\" as const,\n id,\n ...createFindMatchFields(match),\n position: {\n chapter: source.chapterId,\n sentence: source.sentenceIndex ?? 0,\n },\n snippet: link.note ?? text,\n title: text,\n triple: {\n objectLabel: target.surface,\n predicate: link.predicate,\n subjectLabel: source.surface,\n },\n type: \"triple\" as const,\n };\n const values = hitsByTriple.get(id) ?? [];\n\n values.push(next);\n hitsByTriple.set(id, values);\n }\n }\n\n return [...hitsByTriple.values()].map(groupTripleEvidenceHits);\n}\n\nasync function listAllMentions(\n document: ReadonlyDocument,\n): Promise<readonly MentionRecord[]> {\n return await document.mentions.listAll();\n}\n\nfunction groupTripleEvidenceHits(\n evidenceHits: readonly ArchiveFindHit[],\n): ArchiveFindHit {\n const rankedHits = [...evidenceHits].sort(compareFindEvidenceHits);\n const [best] = rankedHits;\n\n if (best === undefined) {\n throw new Error(\"Internal error: triple search candidate is empty.\");\n }\n\n return {\n ...best,\n evidenceLinks: rankedHits.flatMap((hit) => hit.evidenceLinks ?? []),\n score: aggregateEvidenceScores(rankedHits.map((hit) => hit.score ?? 0)),\n };\n}\n\nfunction listEntityCollection(\n mentions: readonly MentionRecord[],\n documentOrders?: ReadonlyMap<number, number>,\n): readonly ArchiveFindHit[] {\n const mentionsByQid = new Map<string, MentionRecord[]>();\n\n for (const mention of mentions) {\n const values = mentionsByQid.get(mention.qid) ?? [];\n\n values.push(mention);\n mentionsByQid.set(mention.qid, values);\n }\n\n return [...mentionsByQid.entries()].map(([qid, qidMentions]) => {\n const [first] = qidMentions.sort(compareMentions);\n\n if (first === undefined) {\n throw new Error(\"Internal error: entity collection candidate is empty.\");\n }\n\n return {\n chapter: first.chapterId,\n evidenceMentions: qidMentions.map((mention) =>\n createUnscoredEntityEvidenceMention(mention),\n ),\n field: \"title\",\n id: `wikg://entity/${qid}`,\n position: {\n chapter: first.chapterId,\n documentOrder: documentOrders?.get(first.chapterId) ?? first.chapterId,\n sentence: first.sentenceIndex ?? 0,\n },\n score: qidMentions.length,\n snippet: `${qidMentions.length} mentions`,\n title: selectEntityLabel(qidMentions),\n type: \"entity\",\n };\n });\n}\n\nfunction listTextStreamSentenceCollection(\n index: ArchiveTextStreamIndex,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n title: string,\n documentOrder?: number,\n): readonly ArchiveFindHit[] {\n return index.sentences.map((sentence) => ({\n chapter: chapterId,\n field: stream,\n id: formatTextStreamRangeUri(\n chapterId,\n stream,\n sentence.globalIndex,\n sentence.globalIndex,\n ),\n position: {\n chapter: chapterId,\n documentOrder: documentOrder ?? chapterId,\n fragment: sentence.fragmentId,\n sentence: sentence.localIndex,\n },\n snippet: createSnippet(sentence.text),\n title,\n type: stream === \"source\" ? \"source\" : \"summary\",\n }));\n}\n\nasync function listTripleCollection(\n document: ReadonlyDocument,\n chapterFilter?: ReadonlySet<number>,\n documentOrders?: ReadonlyMap<number, number>,\n): Promise<readonly ArchiveFindHit[]> {\n const hitsById = new Map<string, ArchiveFindHit>();\n\n for (const chapter of filterChapters(\n await listChapters(document),\n chapterFilter,\n )) {\n for (const link of await document.mentionLinks.listByChapter(\n chapter.chapterId,\n )) {\n const [source, target] = await Promise.all([\n document.mentions.getById(link.sourceMentionId),\n document.mentions.getById(link.targetMentionId),\n ]);\n\n if (source === undefined || target === undefined) {\n continue;\n }\n\n const id = formatTripleUri(source.qid, link.predicate, target.qid);\n const existing = hitsById.get(id);\n\n if (existing !== undefined) {\n hitsById.set(id, {\n ...existing,\n evidenceLinks: [...(existing.evidenceLinks ?? []), link],\n score: (existing.evidenceLinks?.length ?? 0) + 1,\n });\n continue;\n }\n\n hitsById.set(id, {\n chapter: source.chapterId,\n evidenceLinks: [link],\n field: \"title\",\n id,\n position: {\n chapter: source.chapterId,\n documentOrder:\n documentOrders?.get(source.chapterId) ?? source.chapterId,\n sentence: source.sentenceIndex ?? 0,\n },\n score: 1,\n snippet: `${source.surface} ${link.predicate} ${target.surface}`,\n title: `${source.qid} ${link.predicate} ${target.qid}`,\n triple: {\n objectLabel: target.surface,\n predicate: link.predicate,\n subjectLabel: source.surface,\n },\n type: \"triple\",\n });\n }\n }\n\n return [...hitsById.values()];\n}\n\nfunction compareMentions(left: MentionRecord, right: MentionRecord): number {\n return (\n compareNumbers(left.chapterId, right.chapterId) ||\n compareNumbers(left.sentenceIndex ?? 0, right.sentenceIndex ?? 0) ||\n left.id.localeCompare(right.id)\n );\n}\n\nasync function getMentionForTripleSearch(\n document: ReadonlyDocument,\n cache: Map<string, MentionRecord>,\n mentionId: string,\n): Promise<MentionRecord | undefined> {\n const cached = cache.get(mentionId);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const mention = await document.mentions.getById(mentionId);\n\n if (mention !== undefined) {\n cache.set(mentionId, mention);\n }\n\n return mention;\n}\n\nasync function hydrateFindHitEvidence(\n document: ReadonlyDocument,\n hits: readonly ArchiveFindHit[],\n options: {\n readonly evidenceLimit?: number;\n readonly order?: ArchiveFindOrder;\n readonly sessionId?: string;\n readonly sourceContext?: number;\n } = {},\n): Promise<readonly ArchiveFindHit[]> {\n const evidenceContext = createEvidenceReadContext();\n\n const hydrated = await Promise.all(\n hits.map(async (rawHit) => {\n const displayHit = await hydrateEntityDisplayHit(document, rawHit);\n const hit = await hydrateTextStreamHitContext(\n document,\n displayHit,\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n evidenceContext,\n );\n\n if (hit.evidence !== undefined && hit.evidence.sources.length > 0) {\n return hit;\n }\n if (\n hit.evidence !== undefined &&\n hit.type === \"entity\" &&\n options.sessionId !== undefined\n ) {\n return await hydrateEntitySessionHitEvidence(\n document,\n hit,\n options.sessionId,\n options.evidenceLimit,\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n evidenceContext,\n );\n }\n if (hit.evidenceLinks !== undefined) {\n if (options.evidenceLimit === undefined) {\n const { evidenceLinks: _evidenceLinks, ...publicHit } = hit;\n\n return publicHit;\n }\n\n const evidence = await createMentionLinkEvidencePreview(\n document,\n hit.evidenceLinks,\n options.evidenceLimit,\n evidenceContext,\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n options.order ?? \"doc-asc\",\n );\n const { evidenceLinks: _evidenceLinks, ...publicHit } = hit;\n\n return {\n ...publicHit,\n evidence,\n };\n }\n if (hit.evidenceMentions === undefined) {\n return hit;\n }\n if (options.evidenceLimit === undefined) {\n const { evidenceMentions: _evidenceMentions, ...publicHit } = hit;\n\n return publicHit;\n }\n\n const evidence = await createMentionEvidencePreview(\n document,\n hit.evidenceMentions.map((item) => item.mention),\n options.evidenceLimit,\n evidenceContext,\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n options.order ?? \"doc-asc\",\n );\n const { evidenceMentions: _evidenceMentions, ...publicHit } = hit;\n\n return {\n ...publicHit,\n evidence,\n };\n }),\n );\n\n return await coalesceTextStreamFindHits(document, hydrated, evidenceContext);\n}\n\nasync function hydrateEntityDisplayHit(\n document: ReadonlyDocument,\n hit: ArchiveFindHit,\n): Promise<ArchiveFindHit> {\n if (hit.type !== \"entity\") {\n return hit;\n }\n\n const qid = parseEntityQid(hit.id);\n\n if (qid === undefined) {\n return hit;\n }\n if (hit.title !== qid && hit.snippet !== qid) {\n return hit;\n }\n\n const mentions = await document.mentions.listByQid(qid);\n const [first] = mentions.sort(compareMentions);\n\n if (first === undefined) {\n return hit;\n }\n\n return {\n ...hit,\n chapter: first.chapterId,\n position: {\n chapter: first.chapterId,\n sentence: first.sentenceIndex ?? 0,\n },\n snippet: hit.snippet === qid ? (first.note ?? first.surface) : hit.snippet,\n title: hit.title === qid ? selectEntityLabel(mentions) : hit.title,\n };\n}\n\nasync function hydrateTextStreamHitContext(\n document: ReadonlyDocument,\n hit: ArchiveFindHit,\n sourceContext: number,\n context: EvidenceReadContext,\n): Promise<ArchiveFindHit> {\n if (sourceContext <= 0 || (hit.type !== \"source\" && hit.type !== \"summary\")) {\n return hit;\n }\n if (hit.matchCount === undefined && hit.matchedTerms === undefined) {\n return hit;\n }\n\n const reference = parseTextStreamHitReference(hit.id);\n\n if (reference === undefined) {\n return hit;\n }\n\n const range = await readTextStreamRange(\n document,\n reference.chapterId,\n reference.stream,\n reference.startSentenceIndex - sourceContext,\n reference.endSentenceIndex + sourceContext,\n context,\n );\n\n return {\n ...hit,\n id: range.id,\n snippet: range.text,\n };\n}\n\nfunction parseTextStreamHitReference(\n uri: string,\n): Extract<WikiGraphReference, { readonly type: \"text-stream\" }> | undefined {\n if (!isWikiGraphObjectUri(uri)) {\n return undefined;\n }\n\n try {\n const reference = parseWikiGraphReference(normalizeWikiGraphObjectUri(uri));\n\n return reference.type === \"text-stream\" ? reference : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function coalesceTextStreamFindHits(\n document: ReadonlyDocument,\n hits: readonly ArchiveFindHit[],\n context: EvidenceReadContext,\n): Promise<readonly ArchiveFindHit[]> {\n const entries: Array<\n | { readonly hit: ArchiveFindHit; readonly type: \"hit\" }\n | { range: TextStreamHitRange; readonly type: \"range\" }\n > = [];\n\n for (const hit of hits) {\n const range = parseSearchTextStreamHitRange(hit);\n\n if (range === undefined || hit.backlinks !== undefined) {\n entries.push({ hit, type: \"hit\" });\n continue;\n }\n\n const overlappingIndexes = entries\n .map((entry, index) =>\n entry.type === \"range\" &&\n areMergeableTextStreamHitRanges(entry.range, range)\n ? index\n : -1,\n )\n .filter((index) => index >= 0);\n\n if (overlappingIndexes.length === 0) {\n entries.push({ range, type: \"range\" });\n continue;\n }\n\n const firstIndex = overlappingIndexes[0] ?? 0;\n const ranges = overlappingIndexes.flatMap((index) => {\n const entry = entries[index];\n\n return entry?.type === \"range\" ? [entry.range] : [];\n });\n\n entries[firstIndex] = {\n range: await mergeTextStreamHitRangeGroup(\n document,\n [...ranges, range],\n context,\n ),\n type: \"range\",\n };\n\n for (const index of overlappingIndexes.slice(1).reverse()) {\n entries.splice(index, 1);\n }\n }\n\n return entries.map((entry) =>\n entry.type === \"range\" ? entry.range.hit : entry.hit,\n );\n}\n\nfunction parseSearchTextStreamHitRange(\n hit: ArchiveFindHit,\n): TextStreamHitRange | undefined {\n if (hit.type !== \"source\" && hit.type !== \"summary\") {\n return undefined;\n }\n if (hit.matchCount === undefined && hit.matchedTerms === undefined) {\n return undefined;\n }\n\n const reference = parseTextStreamHitReference(hit.id);\n\n if (reference === undefined) {\n return undefined;\n }\n\n return {\n chapterId: reference.chapterId,\n endSentenceIndex: reference.endSentenceIndex,\n hit,\n startSentenceIndex: reference.startSentenceIndex,\n stream: reference.stream,\n };\n}\n\nfunction areMergeableTextStreamHitRanges(\n left: TextStreamHitRange,\n right: TextStreamHitRange,\n): boolean {\n return (\n left.chapterId === right.chapterId &&\n left.stream === right.stream &&\n right.startSentenceIndex <= left.endSentenceIndex + 1 &&\n left.startSentenceIndex <= right.endSentenceIndex + 1\n );\n}\n\nasync function mergeTextStreamHitRangeGroup(\n document: ReadonlyDocument,\n ranges: readonly TextStreamHitRange[],\n context: EvidenceReadContext,\n): Promise<TextStreamHitRange> {\n const [representative] = ranges;\n\n if (representative === undefined) {\n throw new Error(\n \"Internal error: cannot merge empty text stream hit group.\",\n );\n }\n\n const startSentenceIndex = Math.min(\n ...ranges.map((range) => range.startSentenceIndex),\n );\n const endSentenceIndex = Math.max(\n ...ranges.map((range) => range.endSentenceIndex),\n );\n const text = await readTextStreamRange(\n document,\n representative.chapterId,\n representative.stream,\n startSentenceIndex,\n endSentenceIndex,\n context,\n );\n const hits = ranges.map((range) => range.hit);\n const scores = hits\n .map((hit) => hit.score)\n .filter((score): score is number => score !== undefined);\n\n return {\n chapterId: representative.chapterId,\n endSentenceIndex,\n hit: {\n ...representative.hit,\n id: text.id,\n matchCount: Math.max(...hits.map((hit) => hit.matchCount ?? 0)),\n matchedTerms: mergeStringLists(\n hits.flatMap((hit) => hit.matchedTerms ?? []),\n ),\n missingTerms: mergeStringLists(\n hits.flatMap((hit) => hit.missingTerms ?? []),\n ),\n ...(scores.length === 0 ? {} : { score: Math.max(...scores) }),\n snippet: text.text,\n },\n startSentenceIndex,\n stream: representative.stream,\n };\n}\n\nasync function hydrateFindResultBacklinks(\n document: ReadonlyDocument,\n result: ArchiveFindResult,\n options: Pick<ArchiveFindOptions, \"backlinks\">,\n): Promise<ArchiveFindResult> {\n return {\n ...result,\n items: await hydrateFindHitBacklinks(document, result.items, options),\n };\n}\n\nasync function hydrateFindHitBacklinks(\n document: ReadonlyDocument,\n hits: readonly ArchiveFindHit[],\n options:\n | Pick<ArchiveFindOptions, \"backlinks\">\n | Pick<ArchiveCollectionOptions, \"backlinks\">,\n): Promise<readonly ArchiveFindHit[]> {\n if (options.backlinks !== true) {\n return hits;\n }\n\n return await Promise.all(\n hits.map(async (hit) => {\n const reference = parseSourceBacklinkReference(hit.id);\n\n if (reference === undefined) {\n return hit;\n }\n\n return {\n ...hit,\n backlinks: await createTextStreamBacklinks(document, reference),\n };\n }),\n );\n}\n\nfunction parseSourceBacklinkReference(\n uri: string,\n): Extract<WikiGraphReference, { readonly type: \"text-stream\" }> | undefined {\n if (!isWikiGraphObjectUri(uri)) {\n return undefined;\n }\n\n try {\n const reference = parseWikiGraphReference(normalizeWikiGraphObjectUri(uri));\n\n return reference.type === \"text-stream\" && reference.stream === \"source\"\n ? reference\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction createFindEvidenceHydrationOptions(\n options: ArchiveFindOptions,\n sessionId?: string,\n): {\n readonly evidenceLimit?: number;\n readonly order?: ArchiveFindOrder;\n readonly sessionId?: string;\n readonly sourceContext?: number;\n} {\n return {\n ...(options.evidenceLimit === undefined\n ? {}\n : { evidenceLimit: options.evidenceLimit }),\n order: options.order ?? \"doc-asc\",\n ...(sessionId === undefined ? {} : { sessionId }),\n ...(options.sourceContext === undefined\n ? {}\n : { sourceContext: options.sourceContext }),\n };\n}\n\nasync function createTextStreamBacklinks(\n document: ReadonlyDocument,\n reference: Extract<WikiGraphReference, { readonly type: \"text-stream\" }>,\n): Promise<ArchiveBacklinks> {\n if (reference.stream !== \"source\") {\n return createEmptyBacklinks();\n }\n\n const sentenceKeys = await createTextStreamRangeSentenceKeySet(\n document,\n reference,\n );\n const [chunks, mentions, links] = await Promise.all([\n createChunkBacklinkHits(document, sentenceKeys),\n createEntityBacklinkHits(document, sentenceKeys),\n createTripleBacklinkHits(document, reference.chapterId, sentenceKeys),\n ]);\n\n return {\n chunks: createBacklinkBucket(chunks),\n entities: createBacklinkBucket(mentions),\n triples: createBacklinkBucket(links),\n };\n}\n\nfunction createEmptyBacklinks(): ArchiveBacklinks {\n return {\n chunks: createBacklinkBucket([]),\n entities: createBacklinkBucket([]),\n triples: createBacklinkBucket([]),\n };\n}\n\nfunction createBacklinkBucket(\n hits: readonly ArchiveFindHit[],\n): ArchiveBacklinkBucket {\n const sorted = [...hits].sort((left, right) =>\n compareListHits(left, right, \"doc-asc\"),\n );\n\n return {\n items: sorted,\n limit: sorted.length,\n nextCursor: null,\n };\n}\n\nasync function createTextStreamRangeSentenceKeySet(\n document: ReadonlyDocument,\n reference: Extract<WikiGraphReference, { readonly type: \"text-stream\" }>,\n): Promise<ReadonlySet<string>> {\n const index = await createTextStreamIndex(\n document,\n reference.chapterId,\n reference.stream,\n );\n const lastSentenceIndex = Math.max(0, index.sentences.length - 1);\n const start = clampInteger(\n reference.startSentenceIndex,\n 0,\n lastSentenceIndex,\n );\n const end = clampInteger(\n reference.endSentenceIndex,\n start,\n lastSentenceIndex,\n );\n const keys = new Set<string>();\n\n for (const sentence of index.sentences.slice(start, end + 1)) {\n keys.add(formatSentenceKey(reference.chapterId, sentence.globalIndex));\n }\n\n return keys;\n}\n\nasync function createChunkBacklinkHits(\n document: ReadonlyDocument,\n sentenceKeys: ReadonlySet<string>,\n): Promise<readonly ArchiveFindHit[]> {\n return (await document.chunks.listAll())\n .filter((chunk) =>\n chunk.sentenceIds.some((sentenceId) =>\n sentenceKeys.has(formatSentenceIdKey(sentenceId)),\n ),\n )\n .map((chunk) => {\n const position = createNodePosition(chunk.sentenceIds);\n\n return {\n chapter: chunk.sentenceId[0],\n field: \"content\" as const,\n id: formatNodeId(chunk.id),\n ...(position === undefined ? {} : { position }),\n snippet: createSnippet(chunk.content),\n title: chunk.label,\n type: \"node\" as const,\n };\n });\n}\n\nasync function createEntityBacklinkHits(\n document: ReadonlyDocument,\n sentenceKeys: ReadonlySet<string>,\n): Promise<readonly ArchiveFindHit[]> {\n return listEntityCollection(\n (await listAllMentions(document)).filter((mention) =>\n sentenceKeys.has(\n formatSentenceKey(mention.chapterId, mention.sentenceIndex ?? 0),\n ),\n ),\n );\n}\n\nasync function createTripleBacklinkHits(\n document: ReadonlyDocument,\n chapterId: number,\n sentenceKeys: ReadonlySet<string>,\n): Promise<readonly ArchiveFindHit[]> {\n const hitsById = new Map<string, ArchiveFindHit>();\n\n for (const link of await document.mentionLinks.listByChapter(chapterId)) {\n const evidenceSentenceIds = link.evidenceSentenceIds.filter((sentenceId) =>\n sentenceKeys.has(formatSentenceIdKey(sentenceId)),\n );\n\n if (evidenceSentenceIds.length === 0) {\n continue;\n }\n\n const [source, target] = await Promise.all([\n document.mentions.getById(link.sourceMentionId),\n document.mentions.getById(link.targetMentionId),\n ]);\n\n if (source === undefined || target === undefined) {\n continue;\n }\n\n const id = formatTripleUri(source.qid, link.predicate, target.qid);\n const existing = hitsById.get(id);\n const evidenceLink = { ...link, evidenceSentenceIds };\n\n if (existing !== undefined) {\n hitsById.set(id, {\n ...existing,\n evidenceLinks: [...(existing.evidenceLinks ?? []), evidenceLink],\n score: (existing.evidenceLinks?.length ?? 0) + 1,\n });\n continue;\n }\n\n hitsById.set(id, {\n chapter: source.chapterId,\n evidenceLinks: [evidenceLink],\n field: \"title\",\n id,\n position: createSentencePosition(\n [...evidenceSentenceIds].sort(compareSentenceIds)[0] ?? [\n source.chapterId,\n source.sentenceIndex ?? 0,\n ],\n ),\n score: 1,\n snippet: `${source.surface} ${link.predicate} ${target.surface}`,\n title: `${source.qid} ${link.predicate} ${target.qid}`,\n triple: {\n objectLabel: target.surface,\n predicate: link.predicate,\n subjectLabel: source.surface,\n },\n type: \"triple\",\n });\n }\n\n return [...hitsById.values()];\n}\n\nfunction formatSentenceIdKey(sentenceId: SentenceId): string {\n return formatSentenceKey(sentenceId[0], sentenceId[1]);\n}\n\nfunction formatSentenceKey(chapterId: number, sentenceIndex: number): string {\n return `${chapterId}:${sentenceIndex}`;\n}\n\nfunction createUnscoredEntityEvidenceMention(\n mention: MentionRecord,\n): EntityEvidenceMention {\n return {\n match: {\n matchCount: 0,\n matchedTerms: [],\n missingTerms: [],\n score: 0,\n },\n mention,\n };\n}\n\nasync function hydrateEntitySessionHitEvidence(\n document: ReadonlyDocument,\n hit: ArchiveFindHit,\n sessionId: string,\n evidenceLimit: number | undefined,\n sourceContext: number,\n context: EvidenceReadContext = createEvidenceReadContext(),\n): Promise<ArchiveFindHit> {\n if (evidenceLimit === undefined) {\n const { evidence: _evidence, ...publicHit } = hit;\n\n return publicHit;\n }\n\n const qid = parseEntityQid(hit.id);\n\n if (qid === undefined) {\n return hit;\n }\n\n const mentionsByQid = await document.mentions.listByQid(qid);\n const mentionsById = new Map(\n mentionsByQid.map((mention) => [mention.id, mention]),\n );\n const allMentions = (\n await readEntitySearchEvidenceMentions(\n sessionId,\n mentionsByQid.map((mention) => mention.id),\n 10_000,\n )\n ).flatMap((hit) => {\n const mention = mentionsById.get(hit.mentionId);\n\n return mention === undefined ? [] : [mention];\n });\n const ranges = await createMentionEvidenceRanges(document, allMentions);\n const mergedRanges = await createExpandedSourceEvidenceRanges(\n document,\n ranges,\n sourceContext,\n context,\n );\n const sources = await Promise.all(\n mergedRanges\n .slice(0, evidenceLimit)\n .map(\n async (range) =>\n await createSourceEvidenceItem(\n document,\n range.chapterId,\n range.startSentenceIndex,\n range.endSentenceIndex,\n context,\n ),\n ),\n );\n\n return {\n ...hit,\n ...(allMentions[0] === undefined\n ? {}\n : {\n chapter: allMentions[0].chapterId,\n position: {\n chapter: allMentions[0].chapterId,\n sentence: allMentions[0].sentenceIndex ?? 0,\n },\n snippet: allMentions[0].note ?? allMentions[0].surface,\n title: allMentions[0].surface,\n }),\n evidence: {\n nextCursor:\n sources.length < mergedRanges.length\n ? encodeFindCursor(sources.length)\n : null,\n shown: sources.length,\n sources,\n total: mergedRanges.length,\n },\n };\n}\n\nfunction formatTripleUri(\n subjectQid: string,\n predicate: string,\n objectQid: string,\n): string {\n return `wikg://triple/${subjectQid}/${encodeURIComponent(predicate)}/${objectQid}`;\n}\n\nfunction formatEntityUri(qid: string): string {\n return `wikg://entity/${qid}`;\n}\n\nfunction isEntityOnlySearch(options: ArchiveFindOptions): boolean {\n return isEntitySearchTypes(options.types ?? null);\n}\n\nfunction isEntitySearchTypes(types: readonly string[] | null): boolean {\n return types !== null && types.length === 1 && types[0] === \"entity\";\n}\n\nfunction assertSearchCursorTypesMatch(\n requestedTypes: readonly string[] | undefined,\n sessionTypes: readonly string[] | null,\n): void {\n if (requestedTypes === undefined) {\n return;\n }\n if (requestedTypes.length !== (sessionTypes?.length ?? 0)) {\n throw new Error(\"Search cursor does not match the requested result types.\");\n }\n const sessionTypeSet = new Set(sessionTypes ?? []);\n\n if (requestedTypes.some((type) => !sessionTypeSet.has(type))) {\n throw new Error(\"Search cursor does not match the requested result types.\");\n }\n}\n\nfunction createEntitySearchCacheInput(\n hits: readonly ArchiveFindHit[],\n indexResult?: SearchIndexQueryResult,\n): {\n readonly entityHits: readonly SearchEntityHitInput[];\n readonly evidenceEvents: readonly SearchEvidenceHitEventInput[];\n} {\n const evidenceEvents: SearchEvidenceHitEventInput[] = [];\n const evidenceScoresByQid = new Map<string, number[]>();\n const propertyScoresByQid = new Map<string, number[]>();\n\n for (const hit of indexResult?.objectHits ?? []) {\n if (hit.ownerKind !== SEARCH_OBJECT_PROPERTY_OWNER_KIND.entity) {\n continue;\n }\n\n const scores = propertyScoresByQid.get(hit.ownerId) ?? [];\n\n scores.push(hit.score);\n propertyScoresByQid.set(hit.ownerId, scores);\n }\n\n for (const hit of hits) {\n if (hit.type !== \"entity\" || hit.evidenceMentions === undefined) {\n continue;\n }\n\n const qid = parseEntityQid(hit.id);\n\n if (qid === undefined) {\n continue;\n }\n\n const scores = evidenceScoresByQid.get(qid) ?? [];\n\n for (const evidenceMention of hit.evidenceMentions) {\n const sentenceIndex = evidenceMention.mention.sentenceIndex;\n\n if (sentenceIndex === undefined) {\n continue;\n }\n\n const score = evidenceMention.match.score ?? hit.score ?? 0;\n\n evidenceEvents.push({\n chapterId: evidenceMention.mention.chapterId,\n evidenceId: evidenceMention.mention.id,\n evidenceKind: SEARCH_EVIDENCE_KIND.mention,\n score,\n sentenceIndex,\n });\n scores.push(score);\n }\n\n evidenceScoresByQid.set(qid, scores);\n }\n\n const qids = new Set([\n ...evidenceScoresByQid.keys(),\n ...propertyScoresByQid.keys(),\n ]);\n\n return {\n entityHits: [...qids].map((qid) => ({\n evidenceTopScores: evidenceScoresByQid.get(qid) ?? [],\n propertyTopScores: propertyScoresByQid.get(qid) ?? [],\n qid,\n })),\n evidenceEvents,\n };\n}\n\nasync function createSentenceEvidenceSearchCacheInput(\n document: ReadonlyDocument,\n indexResult: SearchIndexQueryResult | undefined,\n options: ArchiveFindOptions,\n): Promise<{\n readonly chunkHits: readonly SearchChunkHitInput[];\n readonly entityHits: readonly SearchEntityHitInput[];\n readonly evidenceEvents: readonly SearchEvidenceHitEventInput[];\n readonly tripleHits: readonly SearchTripleHitInput[];\n}> {\n if (indexResult === undefined || isTextOnlySearch(options)) {\n return {\n chunkHits: [],\n entityHits: [],\n evidenceEvents: [],\n tripleHits: [],\n };\n }\n\n const sourceHits = indexResult.textHits.filter(\n (hit) => hit.kind === TEXT_SENTENCE_KIND.source,\n );\n\n if (sourceHits.length === 0) {\n return {\n chunkHits: [],\n entityHits: [],\n evidenceEvents: [],\n tripleHits: [],\n };\n }\n\n const sourceHitScores = new Map<string, number>();\n const chapterIds = new Set<number>();\n\n for (const hit of sourceHits) {\n sourceHitScores.set(\n createSentenceHitKey(hit.chapterId, hit.sentenceIndex),\n hit.score,\n );\n chapterIds.add(hit.chapterId);\n }\n\n const evidenceEvents: SearchEvidenceHitEventInput[] = [];\n const entityEvidenceScoresByQid = new Map<string, number[]>();\n const chunkEvidenceScoresById = new Map<number, number[]>();\n const tripleEvidenceScoresByKey = new Map<\n string,\n {\n readonly objectQid: string;\n readonly predicate: string;\n readonly scores: number[];\n readonly subjectQid: string;\n }\n >();\n\n for (const chapterId of chapterIds) {\n for (const mention of await document.mentions.listByChapter(chapterId)) {\n if (mention.sentenceIndex === undefined) {\n continue;\n }\n\n const score = sourceHitScores.get(\n createSentenceHitKey(chapterId, mention.sentenceIndex),\n );\n\n if (score === undefined) {\n continue;\n }\n\n evidenceEvents.push({\n chapterId,\n evidenceId: mention.id,\n evidenceKind: SEARCH_EVIDENCE_KIND.mention,\n score,\n sentenceIndex: mention.sentenceIndex,\n });\n const scores = entityEvidenceScoresByQid.get(mention.qid) ?? [];\n\n scores.push(score);\n entityEvidenceScoresByQid.set(mention.qid, scores);\n }\n\n for (const chunk of await document.chunks.listBySerial(chapterId)) {\n for (const [, sentenceIndex] of chunk.sentenceIds) {\n const score = sourceHitScores.get(\n createSentenceHitKey(chapterId, sentenceIndex),\n );\n\n if (score === undefined) {\n continue;\n }\n\n evidenceEvents.push({\n chapterId,\n evidenceId: String(chunk.id),\n evidenceKind: SEARCH_EVIDENCE_KIND.chunk,\n score,\n sentenceIndex,\n });\n const scores = chunkEvidenceScoresById.get(chunk.id) ?? [];\n\n scores.push(score);\n chunkEvidenceScoresById.set(chunk.id, scores);\n }\n }\n\n const mentionCache = new Map<string, MentionRecord>();\n\n for (const link of await document.mentionLinks.listByChapter(chapterId)) {\n const [source, target] = await Promise.all([\n getMentionForTripleSearch(document, mentionCache, link.sourceMentionId),\n getMentionForTripleSearch(document, mentionCache, link.targetMentionId),\n ]);\n\n if (source === undefined || target === undefined) {\n continue;\n }\n\n for (const [\n evidenceChapterId,\n sentenceIndex,\n ] of link.evidenceSentenceIds) {\n const score = sourceHitScores.get(\n createSentenceHitKey(evidenceChapterId, sentenceIndex),\n );\n\n if (score === undefined) {\n continue;\n }\n\n evidenceEvents.push({\n chapterId: evidenceChapterId,\n evidenceId: link.id,\n evidenceKind: SEARCH_EVIDENCE_KIND.mentionLink,\n score,\n sentenceIndex,\n });\n\n const key = formatTripleUri(source.qid, link.predicate, target.qid);\n const current = tripleEvidenceScoresByKey.get(key) ?? {\n objectQid: target.qid,\n predicate: link.predicate,\n scores: [],\n subjectQid: source.qid,\n };\n\n current.scores.push(score);\n tripleEvidenceScoresByKey.set(key, current);\n }\n }\n }\n\n return {\n chunkHits: [...chunkEvidenceScoresById.entries()].map(\n ([chunkId, scores]) => ({\n chunkId,\n evidenceTopScores: scores,\n }),\n ),\n entityHits: [...entityEvidenceScoresByQid.entries()].map(\n ([qid, scores]) => ({\n evidenceTopScores: scores,\n qid,\n }),\n ),\n evidenceEvents,\n tripleHits: [...tripleEvidenceScoresByKey.values()].map((hit) => ({\n evidenceTopScores: hit.scores,\n objectQid: hit.objectQid,\n predicate: hit.predicate,\n subjectQid: hit.subjectQid,\n })),\n };\n}\n\nfunction createSentenceHitKey(\n chapterId: number,\n sentenceIndex: number,\n): string {\n return `${chapterId}:${sentenceIndex}`;\n}\n\nfunction parseEntityQid(id: string): string | undefined {\n const normalized = normalizeWikiGraphObjectUri(id);\n const prefix = `${WIKI_GRAPH_URI_PREFIX}entity/`;\n\n return normalized.startsWith(prefix)\n ? normalized.slice(prefix.length)\n : undefined;\n}\n\nfunction filterLexicalHitsByMatch(\n hits: readonly ArchiveFindHit[],\n search: LexicalQuery,\n match: ArchiveFindMatch,\n): readonly ArchiveFindHit[] {\n if (match === \"any\") {\n return hits;\n }\n\n const requiredTerms = [...search.phrases];\n\n if (requiredTerms.length === 0) {\n return hits;\n }\n\n return hits.filter((hit) =>\n requiredTerms.every((term) => hit.matchedTerms?.includes(term) === true),\n );\n}\n\nasync function findChapters(\n document: ReadonlyDocument,\n search: ArchiveTextSearch,\n): Promise<readonly ArchiveFindHit[]> {\n const hits: ArchiveFindHit[] = [];\n\n for (const chapter of await listChapters(document)) {\n const title = chapter.title ?? `[chapter ${chapter.chapterId}]`;\n const titleMatch = matchText(title, search);\n\n if (titleMatch !== undefined) {\n hits.push({\n chapter: chapter.chapterId,\n field: \"title\",\n id: formatChapterTitleId(chapter.chapterId),\n ...createFindMatchFields(titleMatch),\n position: {\n chapter: chapter.chapterId,\n },\n snippet: title,\n title,\n type: \"chapter-title\",\n });\n }\n\n hits.push(\n ...(await findTextStreamSentences(\n document,\n chapter.chapterId,\n \"summary\",\n title,\n search,\n )),\n );\n\n hits.push(\n ...(await findTextStreamSentences(\n document,\n chapter.chapterId,\n \"source\",\n title,\n search,\n )),\n );\n }\n\n return hits;\n}\n\nasync function findTextStreamSentences(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n title: string,\n search: ArchiveTextSearch,\n): Promise<readonly ArchiveFindHit[]> {\n const index = await createTextStreamIndex(document, chapterId, stream);\n\n return index.sentences.flatMap((sentence) => {\n const match = matchText(sentence.text, search);\n\n if (match === undefined) {\n return [];\n }\n\n return [\n {\n chapter: chapterId,\n field: stream,\n id: formatTextStreamRangeUri(\n chapterId,\n stream,\n sentence.globalIndex,\n sentence.globalIndex,\n ),\n ...createFindMatchFields(match),\n position: {\n chapter: chapterId,\n fragment: sentence.fragmentId,\n sentence: sentence.localIndex,\n },\n snippet: createSnippet(sentence.text, getSnippetNeedle(match)),\n title,\n type: stream === \"source\" ? (\"source\" as const) : (\"summary\" as const),\n },\n ];\n });\n}\n\nasync function readSourceFragment(\n document: ReadonlyDocument,\n serialId: number,\n fragmentId: number,\n): Promise<ArchiveSourceFragment> {\n const fragment = await document\n .getSerialFragments(serialId)\n .getFragment(fragmentId);\n const text = fragment.sentences.map((sentence) => sentence.text).join(\"\\n\");\n\n return {\n fragmentId,\n id: formatFragmentId(serialId, fragmentId),\n preview: createSnippet(text),\n sentenceCount: fragment.sentences.length,\n text,\n wordsCount: fragment.sentences.reduce(\n (total, sentence) => total + sentence.wordsCount,\n 0,\n ),\n };\n}\n\nasync function createTextStreamRangeFragment(\n document: ReadonlyDocument,\n reference: Extract<WikiGraphReference, { readonly type: \"text-stream\" }>,\n): Promise<ArchiveSourceFragment> {\n const range = await readTextStreamRange(\n document,\n reference.chapterId,\n reference.stream,\n reference.startSentenceIndex,\n reference.endSentenceIndex,\n );\n\n return {\n fragmentId: range.startSentenceIndex,\n id: range.id,\n preview: createSnippet(range.text),\n sentenceCount: range.endSentenceIndex - range.startSentenceIndex + 1,\n text: range.text,\n wordsCount: countWords(range.text),\n };\n}\n\nasync function readTextStreamRange(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n startSentenceIndex: number,\n endSentenceIndex: number,\n context: EvidenceReadContext = createEvidenceReadContext(),\n): Promise<{\n readonly endSentenceIndex: number;\n readonly id: string;\n readonly startSentenceIndex: number;\n readonly text: string;\n}> {\n const index = await getTextStreamIndex(document, chapterId, stream, context);\n if (index.sentences.length === 0) {\n throw new Error(\n `Chapter ${formatChapterId(chapterId)} has no ${stream} text.`,\n );\n }\n\n const lastSentenceIndex = index.sentences.length - 1;\n if (startSentenceIndex > lastSentenceIndex) {\n throw new Error(\n `${stream} range ${formatTextStreamRangeUri(chapterId, stream, startSentenceIndex, endSentenceIndex)} is out of bounds. Last sentence number is ${lastSentenceIndex + 1}.`,\n );\n }\n\n const start = clampInteger(startSentenceIndex, 0, lastSentenceIndex);\n const end = clampInteger(endSentenceIndex, start, lastSentenceIndex);\n const sentences = index.sentences.slice(start, end + 1);\n const text =\n normalizeRenderedTextStreamRange(\n await readTextStreamRawRange(document, chapterId, stream, start, end),\n ) ?? joinTextStreamSentences(sentences);\n\n return {\n endSentenceIndex: end,\n id: formatTextStreamRangeUri(chapterId, stream, start, end),\n startSentenceIndex: start,\n text,\n };\n}\n\nasync function readTextStreamText(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n): Promise<string> {\n const serial = getTextStreamSerial(document, chapterId, stream);\n const text = await serial.readText?.();\n\n if (text !== undefined) {\n return text;\n }\n\n const index = await createTextStreamIndex(document, chapterId, stream);\n\n return joinTextStreamSentences(index.sentences);\n}\n\nasync function readTextStreamRawRange(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n startSentenceIndex: number,\n endSentenceIndex: number,\n): Promise<string | undefined> {\n const serial = getTextStreamSerial(document, chapterId, stream);\n\n return await serial.readTextInRange?.(startSentenceIndex, endSentenceIndex);\n}\n\nfunction getTextStreamSerial(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n): ReadonlySerialTextStream {\n return stream === \"summary\"\n ? document.getSummaryFragments(chapterId)\n : document.getSerialFragments(chapterId);\n}\n\nfunction joinTextStreamSentences(\n sentences: readonly Pick<ArchiveTextStreamSentence, \"text\">[],\n): string {\n return sentences.map((sentence) => sentence.text).join(\"\");\n}\n\nfunction normalizeRenderedTextStreamRange(\n text: string | undefined,\n): string | undefined {\n return text\n ?.replace(/^(?:[^\\S\\r\\n]*(?:\\r\\n|\\n|\\r))+/u, \"\")\n .replace(/(?:(?:\\r\\n|\\n|\\r)[^\\S\\r\\n]*)+$/u, \"\");\n}\n\nasync function getTextStreamIndex(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n context: EvidenceReadContext = createEvidenceReadContext(),\n): Promise<ArchiveTextStreamIndex> {\n const key = `${chapterId}:${stream}`;\n let index = context.streamIndexes.get(key);\n\n if (index === undefined) {\n index = createTextStreamIndex(document, chapterId, stream);\n context.streamIndexes.set(key, index);\n }\n\n return await index;\n}\n\nasync function createTextStreamIndex(\n document: ReadonlyDocument,\n chapterId: number,\n stream: ArchiveTextStreamKind,\n): Promise<ArchiveTextStreamIndex> {\n if (stream === \"summary\") {\n const fragments = document.getSummaryFragments(chapterId);\n const sentences: ArchiveTextStreamSentence[] = [];\n\n for (const fragmentId of await fragments.listFragmentIds()) {\n const fragment = await fragments.getFragment(fragmentId);\n\n for (let index = 0; index < fragment.sentences.length; index += 1) {\n const sentence = fragment.sentences[index];\n\n if (sentence === undefined) {\n continue;\n }\n\n sentences.push({\n fragmentId,\n globalIndex: sentences.length,\n localIndex: index,\n text: sentence.text,\n wordsCount: sentence.wordsCount,\n });\n }\n }\n\n return { sentences };\n }\n\n const fragments = document.getSerialFragments(chapterId);\n const sentences: ArchiveTextStreamSentence[] = [];\n\n for (const fragmentId of await fragments.listFragmentIds()) {\n const fragment = await fragments.getFragment(fragmentId);\n\n for (let index = 0; index < fragment.sentences.length; index += 1) {\n const sentence = fragment.sentences[index];\n\n if (sentence === undefined) {\n continue;\n }\n\n sentences.push({\n fragmentId,\n globalIndex: sentences.length,\n localIndex: index,\n text: sentence.text,\n wordsCount: sentence.wordsCount,\n });\n }\n }\n\n return { sentences };\n}\n\nfunction selectEntityLabel(mentions: readonly MentionRecord[]): string {\n return selectEntityLabels(mentions)[0] ?? mentions[0]?.qid ?? \"[entity]\";\n}\n\nfunction selectEntityLabels(\n mentions: readonly MentionRecord[],\n): readonly string[] {\n const counts = new Map<string, number>();\n\n for (const mention of mentions) {\n counts.set(mention.surface, (counts.get(mention.surface) ?? 0) + 1);\n }\n\n return [...counts.entries()]\n .sort((left, right) => {\n const countComparison = right[1] - left[1];\n\n return countComparison === 0\n ? left[0].localeCompare(right[0])\n : countComparison;\n })\n .map(([label]) => label);\n}\n\nasync function createTriplePageLabel(\n document: ReadonlyDocument,\n reference: Extract<WikiGraphReference, { readonly type: \"triple\" }>,\n): Promise<string> {\n const [subjectMentions, objectMentions] = await Promise.all([\n document.mentions.listByQid(reference.subjectQid),\n document.mentions.listByQid(reference.objectQid),\n ]);\n const scopedSubjectMentions = filterMentionsByChapter(\n subjectMentions,\n reference.chapterId,\n );\n const scopedObjectMentions = filterMentionsByChapter(\n objectMentions,\n reference.chapterId,\n );\n const subjectLabel =\n scopedSubjectMentions.length === 0\n ? reference.subjectQid\n : selectEntityLabel(scopedSubjectMentions);\n const objectLabel =\n scopedObjectMentions.length === 0\n ? reference.objectQid\n : selectEntityLabel(scopedObjectMentions);\n\n return `${subjectLabel}(${reference.subjectQid}) ${reference.predicate} ${objectLabel}(${reference.objectQid})`;\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n\n return trimmed === \"\" ? 0 : trimmed.split(/\\s+/u).length;\n}\n\nasync function listFragmentNodes(\n document: ReadonlyDocument,\n chapterId: number,\n fragmentId: number,\n): Promise<readonly ArchiveNodeLabel[]> {\n return (\n await document.chunks.listBySentenceStartIndexes(chapterId, [fragmentId])\n )\n .map(createPositionedNodeLabel)\n .sort(comparePositionedNodeLabels)\n .map(({ label }) => label);\n}\n\nfunction createNodeLabel(node: ChunkRecord): ArchiveNodeLabel {\n return {\n id: formatNodeId(node.id),\n title: node.label,\n };\n}\n\nfunction createPositionedNodeLabel(node: ChunkRecord): PositionedNodeLabel {\n return {\n label: createNodeLabel(node),\n position: createNodePosition(node.sentenceIds),\n };\n}\n\nfunction comparePositionedNodeLabels(\n left: PositionedNodeLabel,\n right: PositionedNodeLabel,\n): number {\n if (left.position !== undefined && right.position !== undefined) {\n return compareArchivePositions(left.position, right.position);\n }\n\n if (left.position !== undefined) {\n return -1;\n }\n\n if (right.position !== undefined) {\n return 1;\n }\n\n return left.label.id.localeCompare(right.label.id);\n}\n\nfunction findMeta(\n meta: BookMeta | undefined,\n search: ArchiveTextSearch,\n): readonly ArchiveFindHit[] {\n if (meta === undefined) {\n return [];\n }\n\n const fields = [\n meta.title,\n ...meta.authors,\n meta.description,\n meta.publisher,\n ].filter(isDefined);\n const content = fields.join(\"\\n\");\n const contentMatch = matchText(content, search);\n\n if (contentMatch === undefined) {\n return [];\n }\n\n return [\n {\n field: \"metadata\",\n id: ARCHIVE_ROOT_ID,\n ...createFindMatchFields(contentMatch),\n snippet: createSnippet(content, getSnippetNeedle(contentMatch)),\n title: meta.title ?? \"Archive metadata\",\n type: \"meta\",\n },\n ];\n}\n\nasync function findNodes(\n document: ReadonlyDocument,\n search: ArchiveTextSearch,\n): Promise<readonly ArchiveFindHit[]> {\n const hits: ArchiveFindHit[] = [];\n\n for (const node of await document.chunks.listAll()) {\n const position = createNodePosition(node.sentenceIds);\n const labelMatch = matchText(node.label, search);\n\n if (labelMatch !== undefined) {\n hits.push({\n chapter: node.sentenceId[0],\n field: \"title\",\n id: formatNodeId(node.id),\n ...createFindMatchFields(labelMatch),\n ...(position === undefined ? {} : { position }),\n snippet: node.label,\n title: node.label,\n type: \"node\",\n });\n }\n const contentMatch = matchText(node.content, search);\n\n if (contentMatch !== undefined) {\n hits.push({\n chapter: node.sentenceId[0],\n field: \"content\",\n id: formatNodeId(node.id),\n ...createFindMatchFields(contentMatch),\n ...(position === undefined ? {} : { position }),\n snippet: createSnippet(node.content, getSnippetNeedle(contentMatch)),\n title: node.label,\n type: \"node\",\n });\n }\n }\n\n return hits;\n}\n\nasync function requireChapter(\n document: ReadonlyDocument,\n chapterId: number,\n): Promise<ChapterEntry> {\n const chapter = (await listChapters(document)).find(\n (entry) => entry.chapterId === chapterId,\n );\n\n if (chapter === undefined) {\n throw new Error(`Chapter ${formatChapterId(chapterId)} does not exist.`);\n }\n\n return chapter;\n}\n\nasync function createChapterState(\n document: ReadonlyDocument,\n chapter: ChapterEntry,\n): Promise<ChapterState> {\n const serial = await document.serials.getById(chapter.chapterId);\n\n return {\n source: chapter.stage === \"planned\" ? \"missing\" : \"ready\",\n \"reading-graph\":\n chapter.stage === \"graphed\" || chapter.stage === \"summarized\"\n ? \"ready\"\n : \"missing\",\n \"reading-summary\": chapter.stage === \"summarized\" ? \"ready\" : \"missing\",\n \"knowledge-graph\":\n serial?.knowledgeGraphReady === true ? \"ready\" : \"missing\",\n };\n}\n\nfunction formatChapterStateSummary(state: ChapterState): string {\n return [\n `source:${state.source}`,\n `reading-graph:${state[\"reading-graph\"]}`,\n `reading-summary:${state[\"reading-summary\"]}`,\n `knowledge-graph:${state[\"knowledge-graph\"]}`,\n ].join(\" \");\n}\n\nasync function requireNode(\n document: ReadonlyDocument,\n nodeId: number,\n): Promise<{\n readonly chapterId: number;\n readonly node: GraphNode;\n}> {\n const chunk = await document.chunks.getById(nodeId);\n\n if (chunk === undefined) {\n throw new Error(`Node ${formatNodeId(nodeId)} does not exist.`);\n }\n\n const chapterId = chunk.sentenceId[0];\n\n return {\n chapterId,\n node: await getGraphNode(document, chapterId, nodeId),\n };\n}\n\nasync function readNodeSourceFragments(\n document: ReadonlyDocument,\n node: GraphNode,\n): Promise<readonly ArchiveNodeSourceFragment[]> {\n const fragmentIds = await collectNodeSourceFragmentIds(document, node);\n\n return await Promise.all(\n fragmentIds.map(async ([chapterId, fragmentId]) => {\n const fragment = await readSourceFragment(\n document,\n chapterId,\n fragmentId,\n );\n const index = await createTextStreamIndex(document, chapterId, \"source\");\n const fragmentSentences = index.sentences.filter(\n (sentence) => sentence.fragmentId === fragmentId,\n );\n const firstSentence = fragmentSentences[0];\n const lastSentence = fragmentSentences[fragmentSentences.length - 1];\n const text = truncateSourceExcerpt(fragment.text);\n\n return {\n id:\n firstSentence === undefined || lastSentence === undefined\n ? fragment.id\n : formatTextStreamRangeUri(\n chapterId,\n \"source\",\n firstSentence.globalIndex,\n lastSentence.globalIndex,\n ),\n text,\n truncated: text.length < fragment.text.length,\n };\n }),\n );\n}\n\nasync function collectNodeSourceFragmentIds(\n document: ReadonlyDocument,\n node: Pick<GraphNode, \"sentenceIds\">,\n): Promise<readonly (readonly [number, number])[]> {\n const seen = new Set<string>();\n const fragmentIds: (readonly [number, number])[] = [];\n const indexes = new Map<number, Promise<ArchiveTextStreamIndex>>();\n\n for (const [chapterId, sentenceIndex] of node.sentenceIds) {\n let index = indexes.get(chapterId);\n\n if (index === undefined) {\n index = createTextStreamIndex(document, chapterId, \"source\");\n indexes.set(chapterId, index);\n }\n\n const sentence = (await index).sentences[sentenceIndex];\n\n if (sentence === undefined) {\n continue;\n }\n\n const fragmentId = sentence.fragmentId;\n const key = `${chapterId}:${fragmentId}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n fragmentIds.push([chapterId, fragmentId]);\n }\n }\n\n return fragmentIds;\n}\n\nfunction truncateSourceExcerpt(text: string): string {\n return text.length <= 1200 ? text : `${text.slice(0, 1200)}...`;\n}\n\nfunction createNodeEvidenceRanges(node: Pick<GraphNode, \"sentenceIds\">): Array<{\n readonly chapterId: number;\n readonly endSentenceIndex: number;\n readonly startSentenceIndex: number;\n}> {\n const ranges = new Map<string, [number, number]>();\n\n for (const [chapterId, sentenceIndex] of node.sentenceIds) {\n const key = `${chapterId}`;\n const current = ranges.get(key);\n\n if (current === undefined) {\n ranges.set(key, [sentenceIndex, sentenceIndex]);\n } else {\n ranges.set(key, [\n Math.min(current[0], sentenceIndex),\n Math.max(current[1], sentenceIndex),\n ]);\n }\n }\n\n return [...ranges.entries()].map(([key, [start, end]]) => {\n const chapterId = Number(key);\n return {\n chapterId,\n endSentenceIndex: end,\n startSentenceIndex: start,\n };\n });\n}\n\nasync function createMentionEvidencePreview(\n document: ReadonlyDocument,\n mentions: readonly MentionRecord[],\n limit = 3,\n context: EvidenceReadContext = createEvidenceReadContext(),\n sourceContext = DEFAULT_SOURCE_CONTEXT,\n order: ArchiveFindOrder = \"doc-asc\",\n): Promise<ArchiveFindEvidencePreview> {\n return await createSourceEvidencePreview(\n document,\n await createMentionEvidenceRanges(document, mentions),\n limit,\n context,\n sourceContext,\n order,\n );\n}\n\nasync function createMentionEvidenceRanges(\n document: ReadonlyDocument,\n mentions: readonly MentionRecord[],\n): Promise<\n Array<{\n readonly chapterId: number;\n readonly endSentenceIndex: number;\n readonly startSentenceIndex: number;\n }>\n> {\n return await Promise.all(\n mentions.map(async (mention) => {\n const startSentenceIndex =\n mention.sentenceIndex ??\n (await findSentenceIndexAtOffset(\n document,\n mention.chapterId,\n mention.rangeStart,\n ));\n const endSentenceIndex =\n mention.sentenceIndex ??\n (await findSentenceIndexAtOffset(\n document,\n mention.chapterId,\n Math.max(0, mention.rangeEnd - 1),\n ));\n\n return {\n chapterId: mention.chapterId,\n endSentenceIndex,\n startSentenceIndex,\n };\n }),\n );\n}\n\nasync function createMentionLinkEvidencePreview(\n document: ReadonlyDocument,\n links: readonly MentionLinkRecord[],\n limit = 3,\n context: EvidenceReadContext = createEvidenceReadContext(),\n sourceContext = DEFAULT_SOURCE_CONTEXT,\n order: ArchiveFindOrder = \"doc-asc\",\n): Promise<ArchiveFindEvidencePreview> {\n return await createSourceEvidencePreview(\n document,\n createMentionLinkEvidenceRanges(document, links),\n limit,\n context,\n sourceContext,\n order,\n );\n}\n\nfunction createMentionLinkEvidenceRanges(\n _document: ReadonlyDocument,\n links: readonly MentionLinkRecord[],\n): Array<{\n readonly chapterId: number;\n readonly endSentenceIndex: number;\n readonly startSentenceIndex: number;\n}> {\n return links.flatMap((link) =>\n link.evidenceSentenceIds.map(([chapterId, sentenceIndex]) => ({\n chapterId,\n endSentenceIndex: sentenceIndex,\n startSentenceIndex: sentenceIndex,\n })),\n );\n}\n\nfunction filterMentionsByChapter(\n mentions: readonly MentionRecord[],\n chapterId: number | undefined,\n): readonly MentionRecord[] {\n return chapterId === undefined\n ? mentions\n : mentions.filter((mention) => mention.chapterId === chapterId);\n}\n\nfunction filterMentionsByChapterSet(\n mentions: readonly MentionRecord[],\n chapterFilter: ReadonlySet<number> | undefined,\n): readonly MentionRecord[] {\n return chapterFilter === undefined\n ? mentions\n : mentions.filter((mention) => chapterFilter.has(mention.chapterId));\n}\n\nasync function filterMentionLinksByChapter(\n document: ReadonlyDocument,\n links: readonly MentionLinkRecord[],\n chapterId: number | undefined,\n): Promise<readonly MentionLinkRecord[]> {\n if (chapterId === undefined) {\n return links;\n }\n\n const filtered: MentionLinkRecord[] = [];\n\n for (const link of links) {\n const source = await document.mentions.getById(link.sourceMentionId);\n\n if (source?.chapterId === chapterId) {\n filtered.push(link);\n }\n }\n\n return filtered;\n}\n\nasync function createSourceEvidencePage(\n document: ReadonlyDocument,\n ranges: readonly SourceEvidenceRange[],\n options: ArchiveEvidenceOptions,\n): Promise<ArchiveEvidence> {\n const context = createEvidenceReadContext();\n const limit = options.limit ?? DEFAULT_FIND_LIMIT;\n const start = decodeFindCursor(options.cursor);\n const evidenceRanges = await filterAndSortSourceEvidenceRangesByFtsQuery(\n document,\n ranges,\n options.query,\n options.order ?? \"doc-asc\",\n );\n const displayRanges = await createExpandedSourceEvidenceRanges(\n document,\n evidenceRanges,\n options.sourceContext ?? DEFAULT_SOURCE_CONTEXT,\n context,\n );\n const pageRanges = displayRanges.slice(start, start + limit);\n const nextOffset = start + pageRanges.length;\n const items = await Promise.all(\n pageRanges.map(\n async (range) =>\n await createSourceEvidenceItem(\n document,\n range.chapterId,\n range.startSentenceIndex,\n range.endSentenceIndex,\n context,\n range.score,\n ),\n ),\n );\n\n return {\n items,\n limit,\n nextCursor:\n nextOffset < displayRanges.length ? encodeFindCursor(nextOffset) : null,\n };\n}\n\nasync function filterAndSortSourceEvidenceRangesByFtsQuery(\n document: ReadonlyDocument,\n ranges: readonly SourceEvidenceRange[],\n queryText: string | undefined,\n order: ArchiveFindOrder,\n): Promise<readonly SourceEvidenceRange[]> {\n const documentOrders = await document.serials.listDocumentOrders();\n\n if (queryText === undefined) {\n return mergeSourceEvidenceRanges(ranges).sort((left, right) =>\n compareSourceEvidenceRanges(left, right, documentOrders, order),\n );\n }\n\n const indexResult = await queryRequiredSearchIndex(document, queryText, {\n chapters: [...new Set(ranges.map((range) => range.chapterId))],\n types: [\"source\"],\n });\n\n if (indexResult === undefined) {\n return [];\n }\n\n const matchedRanges = new Map<string, SourceEvidenceRange>();\n const rangesByChapterId = new Map<number, SourceEvidenceRange[]>();\n\n for (const range of ranges) {\n const chapterRanges = rangesByChapterId.get(range.chapterId) ?? [];\n\n chapterRanges.push(range);\n rangesByChapterId.set(range.chapterId, chapterRanges);\n }\n\n for (const hit of indexResult.textHits) {\n if (hit.kind !== TEXT_SENTENCE_KIND.source) {\n continue;\n }\n\n for (const range of rangesByChapterId.get(hit.chapterId) ?? []) {\n if (\n hit.sentenceIndex < range.startSentenceIndex ||\n hit.sentenceIndex > range.endSentenceIndex\n ) {\n continue;\n }\n\n const key = formatSourceEvidenceRangeKey(range);\n const current = matchedRanges.get(key);\n\n matchedRanges.set(key, {\n ...range,\n score: Math.max(current?.score ?? 0, hit.score),\n });\n }\n }\n\n return [...matchedRanges.values()].sort((left, right) => {\n const scoreComparison = (right.score ?? 0) - (left.score ?? 0);\n\n if (scoreComparison !== 0) {\n return scoreComparison;\n }\n\n return compareSourceEvidenceRanges(left, right, documentOrders, \"doc-asc\");\n });\n}\n\nfunction formatSourceEvidenceRangeKey(range: SourceEvidenceRange): string {\n return `${range.chapterId}:${range.startSentenceIndex}:${range.endSentenceIndex}`;\n}\n\nfunction compareSourceEvidenceRanges(\n left: SourceEvidenceRange,\n right: SourceEvidenceRange,\n documentOrders: ReadonlyMap<number, number>,\n order: ArchiveFindOrder,\n): number {\n const direction = order === \"doc-asc\" ? 1 : -1;\n\n return (\n (compareNumbers(\n documentOrders.get(left.chapterId) ?? left.chapterId,\n documentOrders.get(right.chapterId) ?? right.chapterId,\n ) ||\n compareNumbers(left.chapterId, right.chapterId) ||\n compareNumbers(left.startSentenceIndex, right.startSentenceIndex) ||\n compareNumbers(left.endSentenceIndex, right.endSentenceIndex)) * direction\n );\n}\n\nasync function createSourceEvidencePreview(\n document: ReadonlyDocument,\n ranges: readonly SourceEvidenceRange[],\n limit: number,\n context: EvidenceReadContext = createEvidenceReadContext(),\n sourceContext = DEFAULT_SOURCE_CONTEXT,\n order: ArchiveFindOrder = \"doc-asc\",\n): Promise<ArchiveFindEvidencePreview> {\n const documentOrders = await document.serials.listDocumentOrders();\n const mergedRanges = mergeSourceEvidenceRanges(ranges).sort((left, right) =>\n compareSourceEvidenceRanges(left, right, documentOrders, order),\n );\n const displayRanges = await createExpandedSourceEvidenceRanges(\n document,\n mergedRanges.slice(0, limit),\n sourceContext,\n context,\n );\n const sources = await Promise.all(\n displayRanges.map(\n async (range) =>\n await createSourceEvidenceItem(\n document,\n range.chapterId,\n range.startSentenceIndex,\n range.endSentenceIndex,\n context,\n ),\n ),\n );\n\n return {\n nextCursor:\n Math.min(limit, mergedRanges.length) < mergedRanges.length\n ? encodeFindCursor(Math.min(limit, mergedRanges.length))\n : null,\n shown: sources.length,\n sources,\n total: mergedRanges.length,\n };\n}\n\nfunction mergeSourceEvidenceRanges(\n ranges: readonly SourceEvidenceRange[],\n): SourceEvidenceRange[] {\n const rangesBySource = new Map<\n string,\n Array<{\n readonly end: number;\n readonly score?: number;\n readonly start: number;\n }>\n >();\n\n for (const range of ranges) {\n const key = `${range.chapterId}`;\n const sourceRanges = rangesBySource.get(key) ?? [];\n\n sourceRanges.push({\n end: range.endSentenceIndex,\n ...(range.score === undefined ? {} : { score: range.score }),\n start: range.startSentenceIndex,\n });\n rangesBySource.set(key, sourceRanges);\n }\n\n return [...rangesBySource.entries()].flatMap(([key, ranges]) => {\n const chapterId = Number(key);\n\n return mergeEvidenceRanges(ranges).map(\n ({ end, score, start }) =>\n ({\n chapterId,\n endSentenceIndex: end,\n ...(score === undefined ? {} : { score }),\n startSentenceIndex: start,\n }) as const,\n );\n });\n}\n\nfunction mergeSourceEvidenceRangesInInputOrder(\n ranges: readonly SourceEvidenceRange[],\n): SourceEvidenceRange[] {\n const merged: SourceEvidenceRange[] = [];\n\n for (const range of ranges) {\n const overlappingIndexes = merged\n .map((existing, index) =>\n areMergeableSourceEvidenceRanges(existing, range) ? index : -1,\n )\n .filter((index) => index >= 0);\n\n if (overlappingIndexes.length === 0) {\n merged.push(range);\n continue;\n }\n\n const firstIndex = overlappingIndexes[0] ?? 0;\n const overlapping = overlappingIndexes.flatMap((index) => {\n const existing = merged[index];\n\n return existing === undefined ? [] : [existing];\n });\n const mergedRange = mergeSourceEvidenceRangeGroup([...overlapping, range]);\n\n merged[firstIndex] = mergedRange;\n for (const index of overlappingIndexes.slice(1).reverse()) {\n merged.splice(index, 1);\n }\n }\n\n return merged;\n}\n\nfunction areMergeableSourceEvidenceRanges(\n left: SourceEvidenceRange,\n right: SourceEvidenceRange,\n): boolean {\n return (\n left.chapterId === right.chapterId &&\n right.startSentenceIndex <= left.endSentenceIndex + 1 &&\n left.startSentenceIndex <= right.endSentenceIndex + 1\n );\n}\n\nfunction mergeSourceEvidenceRangeGroup(\n ranges: readonly SourceEvidenceRange[],\n): SourceEvidenceRange {\n const [first] = ranges;\n\n if (first === undefined) {\n throw new Error(\"Internal error: cannot merge empty evidence range group.\");\n }\n\n const scores = ranges\n .map((range) => range.score)\n .filter((score): score is number => score !== undefined);\n\n return {\n chapterId: first.chapterId,\n endSentenceIndex: Math.max(\n ...ranges.map((range) => range.endSentenceIndex),\n ),\n ...(scores.length === 0 ? {} : { score: Math.max(...scores) }),\n startSentenceIndex: Math.min(\n ...ranges.map((range) => range.startSentenceIndex),\n ),\n };\n}\n\nasync function createExpandedSourceEvidenceRanges(\n document: ReadonlyDocument,\n ranges: readonly SourceEvidenceRange[],\n sourceContext: number,\n context: EvidenceReadContext,\n): Promise<SourceEvidenceRange[]> {\n const expanded = await Promise.all(\n ranges.map(async (range) => {\n if (sourceContext <= 0) {\n return range;\n }\n\n const sourceIndex = await getTextStreamIndex(\n document,\n range.chapterId,\n \"source\",\n context,\n );\n const lastSentenceIndex = Math.max(0, sourceIndex.sentences.length - 1);\n\n return {\n ...range,\n endSentenceIndex: clampInteger(\n range.endSentenceIndex + sourceContext,\n range.startSentenceIndex,\n lastSentenceIndex,\n ),\n startSentenceIndex: clampInteger(\n range.startSentenceIndex - sourceContext,\n 0,\n lastSentenceIndex,\n ),\n };\n }),\n );\n\n return mergeSourceEvidenceRangesInInputOrder(expanded);\n}\n\nasync function createSourceEvidenceItem(\n document: ReadonlyDocument,\n chapterId: number,\n startSentenceIndex: number,\n endSentenceIndex: number,\n context: EvidenceReadContext = createEvidenceReadContext(),\n score?: number,\n): Promise<ArchiveEvidenceItem> {\n const chapter = await getEvidenceChapter(document, chapterId, context);\n const range = await readTextStreamRange(\n document,\n chapterId,\n \"source\",\n startSentenceIndex,\n endSentenceIndex,\n context,\n );\n\n return {\n chapterId,\n endSentenceIndex: range.endSentenceIndex,\n fragmentId: range.startSentenceIndex,\n id: formatTextStreamRangeUri(\n chapterId,\n \"source\",\n range.startSentenceIndex,\n range.endSentenceIndex,\n ),\n ...(score === undefined ? {} : { score }),\n source: range.text,\n startSentenceIndex: range.startSentenceIndex,\n title: chapter.title ?? `[chapter ${chapterId}]`,\n type: \"source\",\n };\n}\n\nfunction createEvidenceReadContext(): EvidenceReadContext {\n return {\n chapters: new Map(),\n streamIndexes: new Map(),\n };\n}\n\nasync function getEvidenceChapter(\n document: ReadonlyDocument,\n chapterId: number,\n context: EvidenceReadContext,\n): Promise<ChapterEntry> {\n let chapter = context.chapters.get(chapterId);\n\n if (chapter === undefined) {\n chapter = requireChapter(document, chapterId);\n context.chapters.set(chapterId, chapter);\n }\n\n return await chapter;\n}\n\nasync function findSentenceIndexAtOffset(\n document: ReadonlyDocument,\n chapterId: number,\n offset: number,\n): Promise<number> {\n const serial = document.getSerialFragments(chapterId);\n const sentences =\n serial.listSentences === undefined ? [] : await serial.listSentences();\n\n if (sentences.length === 0) {\n return 0;\n }\n let cursor = 0;\n\n for (let index = 0; index < sentences.length; index += 1) {\n const sentence = sentences[index];\n\n if (sentence === undefined) {\n continue;\n }\n\n const nextCursor = cursor + sentence.text.length;\n\n if (offset <= nextCursor) {\n return index;\n }\n\n cursor = nextCursor + 1;\n }\n\n return Math.max(0, sentences.length - 1);\n}\n\nfunction formatTextStreamRangeUri(\n chapterId: number,\n stream: ArchiveTextStreamKind,\n startSentenceIndex: number,\n endSentenceIndex: number,\n): string {\n const startSentenceNumber = startSentenceIndex + 1;\n const endSentenceNumber = endSentenceIndex + 1;\n const hash =\n startSentenceIndex === endSentenceIndex\n ? String(startSentenceNumber)\n : `${startSentenceNumber}..${endSentenceNumber}`;\n\n return `wikg://chapter/${chapterId}/${stream}#${hash}`;\n}\n\nfunction mergeEvidenceRanges(\n ranges: readonly {\n readonly end: number;\n readonly score?: number;\n readonly start: number;\n }[],\n): readonly {\n readonly end: number;\n readonly score?: number;\n readonly start: number;\n}[] {\n const sortedRanges = [...ranges]\n .map((range) => ({\n ...(range.score === undefined ? {} : { score: range.score }),\n end: Math.max(range.start, range.end),\n start: Math.min(range.start, range.end),\n }))\n .sort((left, right) =>\n left.start === right.start\n ? left.end - right.end\n : left.start - right.start,\n );\n const mergedRanges: Array<{\n end: number;\n score?: number;\n start: number;\n }> = [];\n\n for (const { end, score, start } of sortedRanges) {\n const last = mergedRanges.at(-1);\n\n if (last === undefined || start > last.end + 1) {\n mergedRanges.push({\n end,\n ...(score === undefined ? {} : { score }),\n start,\n });\n } else {\n last.end = Math.max(last.end, end);\n if (score !== undefined) {\n last.score = Math.max(last.score ?? score, score);\n }\n }\n }\n\n return mergedRanges;\n}\n\nfunction clampInteger(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, Math.floor(value)));\n}\n\ntype WikiGraphReference =\n | {\n readonly type: \"meta\";\n }\n | {\n readonly chapterId: number;\n readonly type: \"chapter\";\n }\n | {\n readonly chapterId: number;\n readonly type: \"chapter-title\";\n }\n | {\n readonly chapterId: number;\n readonly target?: ChapterStateTarget;\n readonly type: \"chapter-state\";\n }\n | {\n readonly type: \"chapter-tree\";\n }\n | {\n readonly chapterId?: number;\n readonly id: number;\n readonly type: \"chunk\";\n }\n | {\n readonly chapterId: number;\n readonly endSentenceIndex: number;\n readonly stream: ArchiveTextStreamKind;\n readonly startSentenceIndex: number;\n readonly type: \"text-stream\";\n }\n | {\n readonly chapterId?: number;\n readonly qid: string;\n readonly type: \"entity\";\n }\n | {\n readonly qid: string;\n readonly type: \"entity-wikipage\";\n }\n | {\n readonly chapterId?: number;\n readonly objectQid: string;\n readonly predicate: string;\n readonly subjectQid: string;\n readonly type: \"triple\";\n };\n\nfunction parseWikiGraphReference(uri: string): WikiGraphReference {\n uri = normalizeWikiGraphObjectUri(uri);\n\n if (!isWikiGraphObjectUri(uri)) {\n const archiveReference = parseArchiveReference(uri);\n\n switch (archiveReference.type) {\n case \"node\":\n return { id: archiveReference.id, type: \"chunk\" };\n case \"chapter\":\n return { chapterId: archiveReference.id, type: \"chapter\" };\n case \"chapter-title\":\n return { chapterId: archiveReference.id, type: \"chapter-title\" };\n case \"summary\":\n return {\n chapterId: archiveReference.id,\n endSentenceIndex: Number.POSITIVE_INFINITY,\n stream: \"summary\",\n startSentenceIndex: 0,\n type: \"text-stream\",\n };\n case \"fragment\":\n case \"meta\":\n throw new Error(`Evidence is not available for ${uri}.`);\n }\n }\n\n if (uri === WIKI_GRAPH_URI_PREFIX) {\n return { type: \"meta\" };\n }\n\n const [rawPath = \"\", hash = \"\"] = uri\n .slice(WIKI_GRAPH_URI_PREFIX.length)\n .split(\"#\", 2);\n const pathParts = rawPath.split(\"/\").filter((part) => part !== \"\");\n\n if (pathParts.length === 0) {\n return { type: \"meta\" };\n }\n\n if (pathParts[0] === \"chapter-tree\" && pathParts.length === 1) {\n return { type: \"chapter-tree\" };\n }\n\n switch (pathParts[0]) {\n case \"chapter\":\n if (pathParts.length === 2) {\n return {\n chapterId: parsePositiveInteger(pathParts[1], uri),\n type: \"chapter\",\n };\n }\n if (pathParts[1] !== undefined) {\n const chapterId = parsePositiveInteger(pathParts[1], uri);\n\n switch (pathParts[2]) {\n case \"state\":\n if (pathParts.length === 3) {\n return { chapterId, type: \"chapter-state\" };\n }\n if (pathParts.length === 4) {\n return {\n chapterId,\n target: parseChapterStateTarget(pathParts[3], uri),\n type: \"chapter-state\",\n };\n }\n break;\n case \"title\":\n if (pathParts.length === 3) {\n return { chapterId, type: \"chapter-title\" };\n }\n break;\n case \"chunk\":\n if (pathParts.length === 4) {\n return {\n chapterId,\n id: parsePositiveInteger(pathParts[3], uri),\n type: \"chunk\",\n };\n }\n break;\n case \"entity\":\n if (pathParts.length === 4) {\n return {\n chapterId,\n qid: parseQid(pathParts[3], uri),\n type: \"entity\",\n };\n }\n break;\n case \"source\":\n if (pathParts.length === 3) {\n const [start, end] = parseSentenceRange(hash);\n\n return {\n chapterId,\n endSentenceIndex: end,\n stream: \"source\",\n startSentenceIndex: start,\n type: \"text-stream\",\n };\n }\n break;\n case \"summary\":\n if (pathParts.length === 3) {\n const [start, end] = parseSentenceRange(hash);\n\n return {\n chapterId,\n endSentenceIndex: end,\n stream: \"summary\",\n startSentenceIndex: start,\n type: \"text-stream\",\n };\n }\n break;\n case \"tree\":\n if (pathParts.length === 3) {\n return { chapterId, type: \"chapter\" };\n }\n break;\n case \"triple\":\n if (pathParts.length === 6) {\n return {\n chapterId,\n objectQid: parseQid(pathParts[5], uri),\n predicate: decodeURIComponent(pathParts[4] ?? \"\"),\n subjectQid: parseQid(pathParts[3], uri),\n type: \"triple\",\n };\n }\n break;\n }\n }\n break;\n case \"chunk\":\n if (pathParts.length === 2) {\n return {\n id: parsePositiveInteger(pathParts[1], uri),\n type: \"chunk\",\n };\n }\n break;\n case \"entity\":\n if (pathParts.length === 2) {\n return {\n qid: parseQid(pathParts[1], uri),\n type: \"entity\",\n };\n }\n if (pathParts.length === 3 && pathParts[2] === \"wikipage\") {\n return {\n qid: parseQid(pathParts[1], uri),\n type: \"entity-wikipage\",\n };\n }\n break;\n case \"triple\":\n if (pathParts.length === 4) {\n return {\n objectQid: parseQid(pathParts[3], uri),\n predicate: decodeURIComponent(pathParts[2] ?? \"\"),\n subjectQid: parseQid(pathParts[1], uri),\n type: \"triple\",\n };\n }\n break;\n }\n\n throw new Error(`Invalid Wiki Graph URI: ${uri}`);\n}\n\nfunction parseQid(value: string | undefined, uri: string): string {\n if (value !== undefined && /^Q[1-9][0-9]*$/u.test(value)) {\n return value;\n }\n\n throw new Error(`Invalid Wiki Graph URI: ${uri}`);\n}\n\nfunction parseChapterStateTarget(\n value: string | undefined,\n uri: string,\n): ChapterStateTarget {\n if (\n value === \"source\" ||\n value === \"reading-graph\" ||\n value === \"reading-summary\" ||\n value === \"knowledge-graph\"\n ) {\n return value;\n }\n\n throw new Error(`Invalid Wiki Graph URI: ${uri}`);\n}\n\nfunction parseSentenceRange(hash: string): readonly [number, number] {\n if (hash === \"\") {\n return [0, Number.POSITIVE_INFINITY];\n }\n\n const match = /^([1-9][0-9]*)(?:\\.\\.([1-9][0-9]*))?$/u.exec(hash);\n\n if (match?.[1] === undefined) {\n throw new Error(`Invalid source sentence range: ${hash}`);\n }\n\n const parsedStart = Number(match[1]) - 1;\n const parsedEnd = Number(match[2] ?? match[1]) - 1;\n\n if (\n Number.isInteger(parsedStart) &&\n parsedStart >= 0 &&\n Number.isInteger(parsedEnd) &&\n parsedEnd >= parsedStart\n ) {\n return [parsedStart, parsedEnd];\n }\n\n throw new Error(`Invalid source sentence range: ${hash}`);\n}\n\nfunction parseArchiveReference(id: string):\n | {\n readonly id: number;\n readonly type: \"chapter\" | \"chapter-title\" | \"summary\";\n }\n | {\n readonly id: number;\n readonly type: \"node\";\n }\n | {\n readonly fragmentId: number;\n readonly serialId: number;\n readonly type: \"fragment\";\n }\n | {\n readonly type: \"meta\";\n } {\n const normalized = id.trim();\n const [type, value] = normalized.split(\":\", 2);\n\n if (type === \"meta\" && (value === \"book\" || value === \"root\")) {\n return { type: \"meta\" };\n }\n if (type === \"chapter\" || type === \"chapter-title\" || type === \"summary\") {\n const parsedId = parsePositiveInteger(value, normalized);\n\n return { id: parsedId, type };\n }\n if (type === \"node\") {\n const parsedId = parsePositiveInteger(value, normalized);\n\n return {\n id: parsedId,\n type: \"node\",\n };\n }\n if (type === \"fragment\") {\n const parts = normalized.slice(\"fragment:\".length).split(\":\");\n\n if (parts.length !== 2) {\n throw new Error(`Invalid archive object id: ${id}`);\n }\n\n return {\n fragmentId: parseNonNegativeInteger(parts[1], normalized),\n serialId: parsePositiveInteger(parts[0], normalized),\n type: \"fragment\",\n };\n }\n throw new Error(`Invalid archive object id: ${id}`);\n}\n\nfunction parsePositiveInteger(value: string | undefined, id: string): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid archive object id: ${id}`);\n }\n\n return parsed;\n}\n\nfunction parseNonNegativeInteger(\n value: string | undefined,\n id: string,\n): number {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`Invalid archive object id: ${id}`);\n }\n\n return parsed;\n}\n\ninterface ArchiveTextSearch {\n readonly match: ArchiveFindMatch;\n readonly terms: readonly string[];\n}\n\ninterface ArchiveTextMatch {\n readonly matchCount: number;\n readonly matchedTerms: readonly string[];\n readonly missingTerms: readonly string[];\n readonly score: number;\n}\n\nconst DEFAULT_FIND_LIMIT = 20;\nconst GROUP_SCORE_EVIDENCE_LIMIT = 10;\nconst TEXT_ONLY_SEARCH_CACHE_WINDOW = 100;\nconst GROUP_SCORE_MAX_EQUAL_EVIDENCE_BONUS = 0.3;\nconst ARCHIVE_ROOT_ID = \"meta:root\";\n\nfunction isWikiGraphObjectUri(uri: string): boolean {\n return uri.startsWith(WIKI_GRAPH_URI_PREFIX);\n}\n\nfunction normalizeWikiGraphObjectUri(uri: string): string {\n return uri;\n}\n\nconst BROAD_FIND_LENS_HINT = {\n lenses: {\n chapter: \"book outline and chapter titles\",\n chunk: \"source text ranges\",\n entity: \"indexed entities\",\n node: \"topology / LLM Wiki structure\",\n triple: \"knowledge graph statements\",\n },\n message:\n \"Choose scope URI lenses such as /chapter, /chunk, /entity, or /triple for broad search.\",\n} satisfies ArchiveFindLensHint;\n\nfunction createPhraseSearch(query: string): ArchiveTextSearch | undefined {\n const needle = query.trim().toLowerCase();\n\n if (needle === \"\") {\n return undefined;\n }\n\n return {\n match: \"all\",\n terms: [needle],\n };\n}\n\nfunction matchText(\n value: string,\n search: ArchiveTextSearch,\n): ArchiveTextMatch | undefined {\n const lower = value.toLowerCase();\n const matchedTerms = search.terms.filter((term) => lower.includes(term));\n const missingTerms = search.terms.filter((term) => !lower.includes(term));\n\n if (search.match === \"all\" && missingTerms.length > 0) {\n return undefined;\n }\n if (search.match === \"any\" && matchedTerms.length === 0) {\n return undefined;\n }\n const [snippetNeedle] = matchedTerms;\n\n if (snippetNeedle === undefined) {\n return undefined;\n }\n\n return {\n matchCount: matchedTerms.length,\n matchedTerms,\n missingTerms,\n score: matchedTerms.length / search.terms.length,\n };\n}\n\nfunction createFindMatchFields(\n match: ArchiveTextMatch,\n): Pick<\n ArchiveFindHit,\n \"matchCount\" | \"matchedTerms\" | \"missingTerms\" | \"score\"\n> {\n return {\n matchCount: match.matchCount,\n matchedTerms: match.matchedTerms,\n missingTerms: match.missingTerms,\n score: match.score,\n };\n}\n\nfunction aggregateEvidenceScores(scores: readonly number[]): number {\n const rankedScores = [...scores]\n .filter((score) => score > 0)\n .sort((left, right) => right - left)\n .slice(0, GROUP_SCORE_EVIDENCE_LIMIT);\n const [bestScore] = rankedScores;\n\n if (bestScore === undefined) {\n return 0;\n }\n\n const evidenceDecayFactor =\n GROUP_SCORE_MAX_EQUAL_EVIDENCE_BONUS / calculateEvidenceDecayBase();\n\n return rankedScores.reduce(\n (total, score, index) =>\n total +\n score * (index === 0 ? 1 : evidenceDecayFactor / Math.log2(index + 2)),\n 0,\n );\n}\n\nfunction calculateEvidenceDecayBase(): number {\n let total = 0;\n\n for (let rank = 2; rank <= GROUP_SCORE_EVIDENCE_LIMIT; rank += 1) {\n total += 1 / Math.log2(rank + 1);\n }\n\n return total;\n}\n\nfunction compareFindEvidenceHits(\n left: ArchiveFindHit,\n right: ArchiveFindHit,\n): number {\n const scoreComparison = (right.score ?? 0) - (left.score ?? 0);\n\n if (scoreComparison !== 0) {\n return scoreComparison;\n }\n if (left.position === undefined) {\n return right.position === undefined ? 0 : 1;\n }\n if (right.position === undefined) {\n return -1;\n }\n return compareArchivePositions(left.position, right.position);\n}\n\nfunction getSnippetNeedle(match: ArchiveTextMatch): string {\n const [needle] = match.matchedTerms;\n\n if (needle === undefined) {\n throw new Error(\"Internal error: missing matched search term.\");\n }\n\n return needle;\n}\n\nfunction createFindResult(\n query: string,\n hits: readonly ArchiveFindHit[],\n options: ArchiveFindOptions,\n terms = createSearchTerms(query),\n lens: ArchiveFindLens = options.types === undefined ? \"broad\" : \"typed\",\n): ArchiveFindResult {\n const ranked = createRankedFindResult(query, hits, options, terms, lens);\n const start = decodeFindCursor(options.cursor);\n const items = ranked.items.slice(start, start + ranked.limit);\n const nextOffset = start + items.length;\n\n return {\n ...ranked,\n items,\n nextCursor:\n nextOffset < ranked.items.length ? encodeFindCursor(nextOffset) : null,\n };\n}\n\nfunction createRankedFindResult(\n query: string,\n hits: readonly ArchiveFindHit[],\n options: ArchiveFindOptions,\n terms = createSearchTerms(query),\n lens: ArchiveFindLens = options.types === undefined ? \"broad\" : \"typed\",\n): ArchiveFindResult {\n const order = options.order ?? \"doc-asc\";\n const limit = options.limit ?? DEFAULT_FIND_LIMIT;\n const chapters = options.chapters ?? null;\n const match = options.match ?? \"any\";\n const types = options.types ?? null;\n const ids = options.ids ?? null;\n const filtered = groupFindHitsByObject(hits)\n .filter((hit) => matchesFindId(hit, ids))\n .filter((hit) => matchesFindChapter(hit, chapters))\n .filter((hit) => matchesFindType(hit, types))\n .filter((hit) => matchesTriplePattern(hit, options.triplePattern))\n .sort((left, right) => compareSearchHits(left, right, order));\n\n return {\n chapters,\n items: filtered,\n lens,\n lensHint: lens === \"broad\" ? BROAD_FIND_LENS_HINT : null,\n limit,\n match,\n nextCursor: null,\n order,\n query,\n terms,\n types,\n };\n}\n\nfunction groupFindHitsByObject(\n hits: readonly ArchiveFindHit[],\n): readonly ArchiveFindHit[] {\n const hitsById = new Map<string, ArchiveFindHit[]>();\n\n for (const hit of hits) {\n const values = hitsById.get(hit.id) ?? [];\n\n values.push(hit);\n hitsById.set(hit.id, values);\n }\n\n return [...hitsById.values()].map(groupObjectEvidenceHits);\n}\n\nfunction groupObjectEvidenceHits(\n evidenceHits: readonly ArchiveFindHit[],\n): ArchiveFindHit {\n const rankedHits = [...evidenceHits].sort(compareFindEvidenceHits);\n const [best] = rankedHits;\n\n if (best === undefined) {\n throw new Error(\"Internal error: search result candidate is empty.\");\n }\n if (rankedHits.length === 1) {\n return best;\n }\n\n return {\n ...best,\n matchCount: Math.max(...rankedHits.map((hit) => hit.matchCount ?? 0)),\n matchedTerms: mergeStringLists(\n rankedHits.flatMap((hit) => hit.matchedTerms ?? []),\n ),\n missingTerms: mergeStringLists(\n rankedHits.flatMap((hit) => hit.missingTerms ?? []),\n ),\n score: aggregateEvidenceScores(rankedHits.map((hit) => hit.score ?? 0)),\n };\n}\n\nfunction mergeStringLists(values: readonly string[]): readonly string[] {\n return [...new Set(values)];\n}\n\nfunction createCollectionResult(\n hits: readonly ArchiveFindHit[],\n options: ArchiveCollectionOptions,\n): ArchiveCollectionResult {\n const order = options.order ?? \"doc-asc\";\n const limit = options.limit ?? DEFAULT_FIND_LIMIT;\n const chapters = options.chapters ?? null;\n const ids = options.ids ?? null;\n const types = options.types ?? null;\n const start = decodeFindCursor(options.cursor);\n const filtered = hits\n .filter((hit) => matchesFindId(hit, ids))\n .filter((hit) => matchesFindChapter(hit, chapters))\n .filter((hit) => matchesCollectionType(hit, types))\n .filter((hit) => matchesTriplePattern(hit, options.triplePattern))\n .sort((left, right) => compareListHits(left, right, order));\n const items = filtered.slice(start, start + limit);\n const nextOffset = start + items.length;\n\n return {\n chapters,\n ids,\n items,\n limit,\n nextCursor:\n nextOffset < filtered.length ? encodeFindCursor(nextOffset) : null,\n order,\n types,\n };\n}\n\nfunction matchesFindId(\n hit: ArchiveFindHit,\n ids: readonly string[] | null,\n): boolean {\n return ids === null || ids.includes(hit.id);\n}\n\nfunction matchesFindChapter(\n hit: ArchiveFindHit,\n chapters: readonly number[] | null,\n): boolean {\n if (chapters === null) {\n return true;\n }\n\n return hit.chapter !== undefined && chapters.includes(hit.chapter);\n}\n\nfunction matchesFindType(\n hit: ArchiveFindHit,\n types: readonly ArchiveFindFilterType[] | null,\n): boolean {\n if (types === null) {\n return true;\n }\n\n if (hit.type === \"chapter-title\" && types.includes(\"chapter\")) {\n return true;\n }\n\n return isFindFilterType(hit.type) && types.includes(hit.type);\n}\n\nfunction matchesCollectionType(\n hit: ArchiveFindHit,\n types: readonly ArchiveCollectionType[] | null,\n): boolean {\n return (\n types === null || (isCollectionType(hit.type) && types.includes(hit.type))\n );\n}\n\nfunction matchesTriplePattern(\n hit: ArchiveFindHit,\n pattern: ArchiveTriplePattern | undefined,\n): boolean {\n if (pattern === undefined || hit.type !== \"triple\") {\n return true;\n }\n\n const triple = parseTripleHitUri(hit.id);\n\n if (triple === undefined) {\n return false;\n }\n\n return (\n (pattern.subjectQid === undefined ||\n pattern.subjectQid === triple.subjectQid) &&\n (pattern.predicate === undefined ||\n pattern.predicate === triple.predicate) &&\n (pattern.objectQid === undefined || pattern.objectQid === triple.objectQid)\n );\n}\n\nfunction parseTripleHitUri(uri: string):\n | {\n readonly objectQid: string;\n readonly predicate: string;\n readonly subjectQid: string;\n }\n | undefined {\n const match =\n /^wikg:\\/\\/triple\\/(Q[1-9][0-9]*)\\/([^/]+)\\/(Q[1-9][0-9]*)$/u.exec(uri);\n\n if (\n match?.[1] === undefined ||\n match[2] === undefined ||\n match[3] === undefined\n ) {\n return undefined;\n }\n\n return {\n objectQid: match[3],\n predicate: decodeURIComponent(match[2]),\n subjectQid: match[1],\n };\n}\n\nfunction compareSearchHits(\n left: ArchiveFindHit,\n right: ArchiveFindHit,\n order: ArchiveFindOrder,\n): number {\n const direction = order === \"doc-asc\" ? 1 : -1;\n const relevance =\n compareNumbers(getSearchBucket(left.type), getSearchBucket(right.type)) ||\n compareNumbers(right.score ?? 0, left.score ?? 0) ||\n compareNumbers(right.matchCount ?? 0, left.matchCount ?? 0);\n const position =\n compareNumbers(\n getPositionDocumentOrder(left),\n getPositionDocumentOrder(right),\n ) ||\n compareNumbers(getPositionChapter(left), getPositionChapter(right)) ||\n compareNumbers(getPositionFragment(left), getPositionFragment(right)) ||\n compareNumbers(getPositionSentence(left), getPositionSentence(right)) ||\n compareNumbers(getTypeOrder(left.type), getTypeOrder(right.type)) ||\n left.id.localeCompare(right.id);\n\n return relevance || position * direction;\n}\n\nfunction compareListHits(\n left: ArchiveFindHit,\n right: ArchiveFindHit,\n order: ArchiveFindOrder,\n): number {\n const direction = order === \"doc-asc\" ? 1 : -1;\n const bucketComparison =\n compareNumbers(getListBucket(left.type), getListBucket(right.type)) ||\n compareListBucketItems(left, right);\n\n if (bucketComparison !== 0) {\n return bucketComparison;\n }\n\n return compareListPosition(left, right) * direction;\n}\n\nfunction compareListBucketItems(\n left: ArchiveFindHit,\n right: ArchiveFindHit,\n): number {\n const leftBucket = getListBucket(left.type);\n\n if (leftBucket !== getListBucket(right.type)) {\n return 0;\n }\n if (leftBucket === 0) {\n return compareNumbers(right.score ?? 0, left.score ?? 0);\n }\n\n return 0;\n}\n\nfunction compareListPosition(\n left: ArchiveFindHit,\n right: ArchiveFindHit,\n): number {\n return (\n compareNumbers(\n getPositionDocumentOrder(left),\n getPositionDocumentOrder(right),\n ) ||\n compareNumbers(getPositionChapter(left), getPositionChapter(right)) ||\n compareNumbers(getPositionFragment(left), getPositionFragment(right)) ||\n compareNumbers(getPositionSentence(left), getPositionSentence(right)) ||\n compareNumbers(getTypeOrder(left.type), getTypeOrder(right.type)) ||\n left.id.localeCompare(right.id)\n );\n}\n\nfunction getListBucket(type: ArchiveFindObjectType): number {\n switch (type) {\n case \"entity\":\n case \"triple\":\n return 0;\n case \"node\":\n return 1;\n case \"summary\":\n return 2;\n case \"source\":\n case \"fragment\":\n return 3;\n case \"chapter-title\":\n case \"chapter\":\n case \"chapter-tree\":\n case \"meta\":\n return 4;\n }\n}\n\nfunction getSearchBucket(type: ArchiveFindObjectType): number {\n switch (type) {\n case \"chapter-title\":\n return 0;\n case \"entity\":\n case \"triple\":\n return 1;\n case \"node\":\n return 2;\n case \"source\":\n case \"summary\":\n return 3;\n case \"chapter\":\n case \"chapter-tree\":\n case \"meta\":\n case \"fragment\":\n throw new Error(`Unsupported search result bucket type: ${type}`);\n }\n}\n\nfunction createSearchTerms(query: string): readonly string[] {\n return query\n .trim()\n .toLowerCase()\n .split(/\\s+/u)\n .filter((term) => term !== \"\");\n}\n\nfunction getPositionChapter(hit: ArchiveFindHit): number {\n return hit.position?.chapter ?? Number.MAX_SAFE_INTEGER;\n}\n\nfunction getPositionDocumentOrder(hit: ArchiveFindHit): number {\n return (\n hit.position?.documentOrder ??\n hit.position?.chapter ??\n Number.MAX_SAFE_INTEGER\n );\n}\n\nfunction getPositionFragment(hit: ArchiveFindHit): number {\n return hit.position?.fragment ?? 0;\n}\n\nfunction getPositionSentence(hit: ArchiveFindHit): number {\n return hit.position?.sentence ?? 0;\n}\n\nfunction getTypeOrder(type: ArchiveFindObjectType): number {\n switch (type) {\n case \"chapter-title\":\n case \"chapter\":\n return 0;\n case \"chapter-tree\":\n return 1;\n case \"entity\":\n return 2;\n case \"triple\":\n return 3;\n case \"summary\":\n return 4;\n case \"node\":\n return 5;\n case \"source\":\n return 6;\n case \"fragment\":\n return 6;\n case \"meta\":\n return 7;\n }\n}\n\nfunction createNodePosition(\n sentenceIds: readonly SentenceId[],\n documentOrders?: ReadonlyMap<number, number>,\n): ArchiveFindPosition | undefined {\n const [first] = [...sentenceIds].sort(compareSentenceIds);\n\n return first === undefined\n ? undefined\n : createSentencePosition(first, documentOrders);\n}\n\nfunction createSentencePosition(\n sentenceId: SentenceId,\n documentOrders?: ReadonlyMap<number, number>,\n): ArchiveFindPosition {\n return {\n chapter: sentenceId[0],\n documentOrder: documentOrders?.get(sentenceId[0]) ?? sentenceId[0],\n fragment: sentenceId[1],\n sentence: sentenceId[1],\n };\n}\n\nfunction compareSentenceIds(\n left: SentenceId,\n right: SentenceId,\n documentOrders?: ReadonlyMap<number, number>,\n): number {\n return (\n compareNumbers(\n documentOrders?.get(left[0]) ?? left[0],\n documentOrders?.get(right[0]) ?? right[0],\n ) ||\n compareNumbers(left[0], right[0]) ||\n compareNumbers(left[1], right[1])\n );\n}\n\nfunction compareArchivePositions(\n left: ArchiveFindPosition,\n right: ArchiveFindPosition,\n): number {\n return (\n compareNumbers(\n left.documentOrder ?? left.chapter,\n right.documentOrder ?? right.chapter,\n ) ||\n compareNumbers(left.chapter, right.chapter) ||\n compareNumbers(left.fragment ?? 0, right.fragment ?? 0) ||\n compareNumbers(left.sentence ?? 0, right.sentence ?? 0)\n );\n}\n\nfunction compareNumbers(left: number, right: number): number {\n return left === right ? 0 : left < right ? -1 : 1;\n}\n\nfunction isFindFilterType(\n type: ArchiveFindObjectType,\n): type is ArchiveFindFilterType {\n return (\n type === \"chapter\" ||\n type === \"chapter-title\" ||\n type === \"entity\" ||\n type === \"fragment\" ||\n type === \"meta\" ||\n type === \"node\" ||\n type === \"source\" ||\n type === \"summary\" ||\n type === \"triple\"\n );\n}\n\nfunction isCollectionType(\n type: ArchiveFindObjectType,\n): type is ArchiveCollectionType {\n return (\n type === \"chapter\" ||\n type === \"chapter-title\" ||\n type === \"entity\" ||\n type === \"fragment\" ||\n type === \"meta\" ||\n type === \"node\" ||\n type === \"source\" ||\n type === \"summary\" ||\n type === \"triple\"\n );\n}\n\nfunction parseFindLens(value: string): ArchiveFindLens {\n if (value === \"broad\" || value === \"exact\" || value === \"typed\") {\n return value;\n }\n\n throw new Error(\"Invalid cached search session.\");\n}\n\nfunction parseFindMatch(value: string): ArchiveFindMatch {\n if (value === \"all\" || value === \"any\") {\n return value;\n }\n\n throw new Error(\"Invalid cached search session.\");\n}\n\nfunction parseFindTypes(\n values: readonly string[] | null,\n): readonly ArchiveFindFilterType[] | null {\n if (values === null) {\n return null;\n }\n\n return values.map((value) => {\n if (\n value === \"entity\" ||\n value === \"fragment\" ||\n value === \"meta\" ||\n value === \"node\" ||\n value === \"source\" ||\n value === \"summary\" ||\n value === \"chapter\" ||\n value === \"chapter-title\" ||\n value === \"triple\"\n ) {\n return value;\n }\n\n throw new Error(\"Invalid cached search session.\");\n });\n}\n\nfunction encodeFindCursor(offset: number): string {\n return Buffer.from(JSON.stringify({ offset, v: 1 })).toString(\"base64url\");\n}\n\nfunction decodeFindCursor(cursor: string | undefined): number {\n if (cursor === undefined) {\n return 0;\n }\n\n try {\n const parsed: unknown = JSON.parse(\n Buffer.from(cursor, \"base64url\").toString(\"utf8\"),\n );\n\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"v\" in parsed &&\n \"offset\" in parsed &&\n parsed.v === 1 &&\n Number.isInteger(parsed.offset) &&\n typeof parsed.offset === \"number\" &&\n parsed.offset >= 0\n ) {\n return parsed.offset;\n }\n } catch {\n throw new Error(\"Invalid search cursor.\");\n }\n\n throw new Error(\"Invalid search cursor.\");\n}\n\nfunction isFindCursor(cursor: string): boolean {\n try {\n decodeFindCursor(cursor);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction createSnippet(value: string, needle?: string): string {\n const collapsed = value.replace(/\\s+/g, \" \").trim();\n\n if (needle === undefined) {\n return collapsed.length > 180 ? `${collapsed.slice(0, 177)}...` : collapsed;\n }\n\n const index = collapsed.toLowerCase().indexOf(needle);\n\n if (index < 0) {\n return collapsed.length > 180 ? `${collapsed.slice(0, 177)}...` : collapsed;\n }\n\n const start = Math.max(0, index - 60);\n const end = Math.min(collapsed.length, index + needle.length + 120);\n const prefix = start === 0 ? \"\" : \"...\";\n const suffix = end === collapsed.length ? \"\" : \"...\";\n\n return `${prefix}${collapsed.slice(start, end)}${suffix}`;\n}\n\nfunction formatMetaSummary(meta: BookMeta | undefined): string {\n if (meta === undefined) {\n return \"[missing]\";\n }\n\n return [meta.title, meta.authors.join(\", \"), meta.publisher]\n .filter((value) => value !== null && value !== \"\")\n .join(\" / \");\n}\n\nfunction formatMetaTitle(meta: BookMeta | undefined): string {\n return meta?.title ?? \"Archive metadata\";\n}\n\nfunction createMetaPage(meta: BookMeta | undefined): {\n readonly authors?: readonly string[];\n readonly description?: string;\n readonly publisher?: string;\n readonly title: string;\n} {\n return {\n ...(meta?.authors === undefined || meta.authors.length === 0\n ? {}\n : { authors: meta.authors }),\n ...(meta?.description === undefined || meta.description === null\n ? {}\n : { description: meta.description }),\n ...(meta?.publisher === undefined || meta.publisher === null\n ? {}\n : { publisher: meta.publisher }),\n title: formatMetaTitle(meta),\n };\n}\n\nfunction formatMetaText(meta: BookMeta | undefined): string {\n const page = createMetaPage(meta);\n\n return [\n `title: ${page.title}`,\n page.authors === undefined\n ? undefined\n : `authors: ${page.authors.join(\", \")}`,\n page.publisher === undefined ? undefined : `publisher: ${page.publisher}`,\n page.description === undefined\n ? undefined\n : `description: ${page.description}`,\n ]\n .filter(isDefined)\n .join(\"\\n\");\n}\n\nfunction formatWeight(weight: number): string {\n return Number.isInteger(weight) ? String(weight) : weight.toFixed(3);\n}\n\nfunction isDefined<T>(value: T | undefined | null): value is T {\n return value !== undefined && value !== null;\n}\n"],"mappings":"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","names":["sessionId","ranked","entityCacheInput","sentenceCacheInput","firstPage","reference","chapterId","_evidenceLinks","publicHit","evidence","_evidenceMentions","hit","fragments","sentences","ranges"]}
|