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,404 @@
|
|
|
1
|
+
import { stat } from "fs/promises";
|
|
2
|
+
import { resolveWikiGraphCacheDatabasePath } from "../common/wiki-graph-dir.js";
|
|
3
|
+
import { getNumber } from "../document/database.js";
|
|
4
|
+
import { openSharedStateDatabase } from "../document/index.js";
|
|
5
|
+
import { isNodeError } from "../utils/node-error.js";
|
|
6
|
+
const CREATE_QID_CACHE_SQL = `
|
|
7
|
+
CREATE TABLE IF NOT EXISTS qid_cache (
|
|
8
|
+
qid TEXT NOT NULL,
|
|
9
|
+
language TEXT NOT NULL,
|
|
10
|
+
label TEXT,
|
|
11
|
+
description TEXT,
|
|
12
|
+
pages_json TEXT NOT NULL,
|
|
13
|
+
checked_at TEXT NOT NULL,
|
|
14
|
+
updated_at TEXT NOT NULL,
|
|
15
|
+
PRIMARY KEY (qid, language)
|
|
16
|
+
);
|
|
17
|
+
`;
|
|
18
|
+
const CREATE_DISAMBIGUATION_CACHE_SQL = `
|
|
19
|
+
CREATE TABLE IF NOT EXISTS disambiguation_cache (
|
|
20
|
+
qid TEXT NOT NULL,
|
|
21
|
+
wiki TEXT NOT NULL,
|
|
22
|
+
pages_json TEXT NOT NULL,
|
|
23
|
+
profile_json TEXT,
|
|
24
|
+
checked_at TEXT NOT NULL,
|
|
25
|
+
PRIMARY KEY (qid, wiki)
|
|
26
|
+
);
|
|
27
|
+
`;
|
|
28
|
+
const WIKIPAGE_CACHE_SCHEMA_SQL = `
|
|
29
|
+
${CREATE_QID_CACHE_SQL}
|
|
30
|
+
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_qid_cache_checked_at
|
|
32
|
+
ON qid_cache(checked_at);
|
|
33
|
+
|
|
34
|
+
${CREATE_DISAMBIGUATION_CACHE_SQL}
|
|
35
|
+
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_disambiguation_cache_checked_at
|
|
37
|
+
ON disambiguation_cache(checked_at);
|
|
38
|
+
`;
|
|
39
|
+
const WIKIPAGE_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
40
|
+
class WikipageCache {
|
|
41
|
+
#database;
|
|
42
|
+
constructor(database) {
|
|
43
|
+
this.#database = database;
|
|
44
|
+
}
|
|
45
|
+
static async open(path) {
|
|
46
|
+
const databasePath = path ?? resolveWikiGraphCacheDatabasePath();
|
|
47
|
+
const database = await openSharedStateDatabase(
|
|
48
|
+
databasePath,
|
|
49
|
+
WIKIPAGE_CACHE_SCHEMA_SQL
|
|
50
|
+
);
|
|
51
|
+
try {
|
|
52
|
+
await migrateWikipageCacheSchema(database);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
await database.close().catch(() => void 0);
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
return new WikipageCache(database);
|
|
58
|
+
}
|
|
59
|
+
async close() {
|
|
60
|
+
await this.#database.close();
|
|
61
|
+
}
|
|
62
|
+
async getQids(qids, language) {
|
|
63
|
+
if (qids.length === 0) {
|
|
64
|
+
return /* @__PURE__ */ new Map();
|
|
65
|
+
}
|
|
66
|
+
const results = /* @__PURE__ */ new Map();
|
|
67
|
+
for (const qid of qids) {
|
|
68
|
+
const record = await this.#database.queryOne(
|
|
69
|
+
`
|
|
70
|
+
SELECT *
|
|
71
|
+
FROM qid_cache
|
|
72
|
+
WHERE qid = ? AND language = ?
|
|
73
|
+
`,
|
|
74
|
+
[qid, language],
|
|
75
|
+
mapQidRecord
|
|
76
|
+
);
|
|
77
|
+
if (record !== void 0) {
|
|
78
|
+
results.set(qid, record);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
async putQids(records, language) {
|
|
84
|
+
if (records.length === 0) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
await this.#database.transaction(async () => {
|
|
88
|
+
for (const record of records) {
|
|
89
|
+
await this.#database.run(
|
|
90
|
+
`
|
|
91
|
+
INSERT INTO qid_cache (
|
|
92
|
+
qid, language, label, description, pages_json, checked_at, updated_at
|
|
93
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
94
|
+
ON CONFLICT(qid, language) DO UPDATE SET
|
|
95
|
+
label = excluded.label,
|
|
96
|
+
description = excluded.description,
|
|
97
|
+
pages_json = excluded.pages_json,
|
|
98
|
+
checked_at = excluded.checked_at,
|
|
99
|
+
updated_at = excluded.updated_at
|
|
100
|
+
`,
|
|
101
|
+
[
|
|
102
|
+
record.qid,
|
|
103
|
+
language,
|
|
104
|
+
record.label ?? null,
|
|
105
|
+
record.description ?? null,
|
|
106
|
+
JSON.stringify(record.sitelinks),
|
|
107
|
+
record.checkedAt,
|
|
108
|
+
record.updatedAt
|
|
109
|
+
]
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async getDisambiguations(qids, wiki) {
|
|
115
|
+
if (qids.length === 0) {
|
|
116
|
+
return /* @__PURE__ */ new Map();
|
|
117
|
+
}
|
|
118
|
+
const results = /* @__PURE__ */ new Map();
|
|
119
|
+
for (const qid of qids) {
|
|
120
|
+
const record = await this.#database.queryOne(
|
|
121
|
+
`
|
|
122
|
+
SELECT *
|
|
123
|
+
FROM disambiguation_cache
|
|
124
|
+
WHERE qid = ? AND wiki = ?
|
|
125
|
+
`,
|
|
126
|
+
[qid, wiki],
|
|
127
|
+
mapDisambiguationRecord
|
|
128
|
+
);
|
|
129
|
+
if (record !== void 0) {
|
|
130
|
+
results.set(qid, record);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return results;
|
|
134
|
+
}
|
|
135
|
+
async putDisambiguations(records, wiki) {
|
|
136
|
+
if (records.length === 0) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
await this.#database.transaction(async () => {
|
|
140
|
+
for (const record of records) {
|
|
141
|
+
await this.#database.run(
|
|
142
|
+
`
|
|
143
|
+
INSERT INTO disambiguation_cache (
|
|
144
|
+
qid, wiki, pages_json, profile_json, checked_at
|
|
145
|
+
) VALUES (?, ?, ?, ?, ?)
|
|
146
|
+
ON CONFLICT(qid, wiki) DO UPDATE SET
|
|
147
|
+
pages_json = excluded.pages_json,
|
|
148
|
+
profile_json = excluded.profile_json,
|
|
149
|
+
checked_at = excluded.checked_at
|
|
150
|
+
`,
|
|
151
|
+
[
|
|
152
|
+
record.disambiguationQid,
|
|
153
|
+
wiki,
|
|
154
|
+
JSON.stringify(record.pages),
|
|
155
|
+
record.profile === void 0 ? null : JSON.stringify(record.profile),
|
|
156
|
+
record.checkedAt
|
|
157
|
+
]
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async function runWikipageCacheGc(context) {
|
|
164
|
+
const databasePath = resolveWikiGraphCacheDatabasePath();
|
|
165
|
+
const beforeBytes = await readFileSize(databasePath);
|
|
166
|
+
if (beforeBytes === void 0) {
|
|
167
|
+
return {
|
|
168
|
+
freedBytes: 0,
|
|
169
|
+
removed: 0,
|
|
170
|
+
scanned: 0
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const database = await openSharedStateDatabase(
|
|
174
|
+
databasePath,
|
|
175
|
+
WIKIPAGE_CACHE_SCHEMA_SQL
|
|
176
|
+
);
|
|
177
|
+
try {
|
|
178
|
+
await migrateWikipageCacheSchema(database);
|
|
179
|
+
const scanned = await countWikipageCacheRows(database);
|
|
180
|
+
const cutoff = new Date(context.now - WIKIPAGE_CACHE_TTL_MS).toISOString();
|
|
181
|
+
const expired = await countExpiredWikipageCacheRows(database, cutoff);
|
|
182
|
+
if (!context.dryRun && expired > 0) {
|
|
183
|
+
await database.transaction(async () => {
|
|
184
|
+
await database.run("DELETE FROM qid_cache WHERE checked_at < ?", [
|
|
185
|
+
cutoff
|
|
186
|
+
]);
|
|
187
|
+
await database.run(
|
|
188
|
+
"DELETE FROM disambiguation_cache WHERE checked_at < ?",
|
|
189
|
+
[cutoff]
|
|
190
|
+
);
|
|
191
|
+
});
|
|
192
|
+
await database.run("VACUUM");
|
|
193
|
+
}
|
|
194
|
+
const afterBytes = await readFileSize(databasePath);
|
|
195
|
+
return {
|
|
196
|
+
freedBytes: context.dryRun ? estimateDryRunFreedBytes(beforeBytes, scanned, expired) : Math.max(0, beforeBytes - (afterBytes ?? 0)),
|
|
197
|
+
removed: expired,
|
|
198
|
+
scanned
|
|
199
|
+
};
|
|
200
|
+
} finally {
|
|
201
|
+
await database.close();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function estimateDryRunFreedBytes(beforeBytes, scanned, expired) {
|
|
205
|
+
if (scanned === 0 || expired === 0) {
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
|
208
|
+
return Math.round(beforeBytes * (expired / scanned));
|
|
209
|
+
}
|
|
210
|
+
async function migrateWikipageCacheSchema(database) {
|
|
211
|
+
await migrateQidCacheSchema(database);
|
|
212
|
+
await migrateDisambiguationCacheSchema(database);
|
|
213
|
+
}
|
|
214
|
+
async function migrateQidCacheSchema(database) {
|
|
215
|
+
const columns = await listTableColumns(database, "qid_cache");
|
|
216
|
+
if (columns.has("language")) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
await database.transaction(async () => {
|
|
220
|
+
const transactionColumns = await listTableColumns(database, "qid_cache");
|
|
221
|
+
if (transactionColumns.has("language")) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
await database.run("ALTER TABLE qid_cache RENAME TO qid_cache_legacy");
|
|
225
|
+
await database.run(CREATE_QID_CACHE_SQL);
|
|
226
|
+
await database.run(`
|
|
227
|
+
INSERT OR IGNORE INTO qid_cache (
|
|
228
|
+
qid, language, label, description, pages_json, checked_at, updated_at
|
|
229
|
+
)
|
|
230
|
+
SELECT qid, 'en', label, description, pages_json, checked_at, updated_at
|
|
231
|
+
FROM qid_cache_legacy
|
|
232
|
+
`);
|
|
233
|
+
await database.run("DROP TABLE qid_cache_legacy");
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
async function migrateDisambiguationCacheSchema(database) {
|
|
237
|
+
const columns = await listTableColumns(database, "disambiguation_cache");
|
|
238
|
+
if (columns.has("wiki")) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
await database.transaction(async () => {
|
|
242
|
+
const transactionColumns = await listTableColumns(
|
|
243
|
+
database,
|
|
244
|
+
"disambiguation_cache"
|
|
245
|
+
);
|
|
246
|
+
if (transactionColumns.has("wiki")) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
await database.run(
|
|
250
|
+
"ALTER TABLE disambiguation_cache RENAME TO disambiguation_cache_legacy"
|
|
251
|
+
);
|
|
252
|
+
await database.run(CREATE_DISAMBIGUATION_CACHE_SQL);
|
|
253
|
+
await database.run(`
|
|
254
|
+
INSERT OR IGNORE INTO disambiguation_cache (
|
|
255
|
+
qid, wiki, pages_json, profile_json, checked_at
|
|
256
|
+
)
|
|
257
|
+
SELECT qid, 'enwiki', pages_json, profile_json, checked_at
|
|
258
|
+
FROM disambiguation_cache_legacy
|
|
259
|
+
`);
|
|
260
|
+
await database.run("DROP TABLE disambiguation_cache_legacy");
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
async function listTableColumns(database, table) {
|
|
264
|
+
const columns = await database.queryAll(
|
|
265
|
+
`PRAGMA table_info(${table})`,
|
|
266
|
+
void 0,
|
|
267
|
+
(row) => getString(row.name, "name")
|
|
268
|
+
);
|
|
269
|
+
return new Set(columns);
|
|
270
|
+
}
|
|
271
|
+
async function countWikipageCacheRows(database) {
|
|
272
|
+
const qids = await countRows(database, "qid_cache");
|
|
273
|
+
const disambiguations = await countRows(database, "disambiguation_cache");
|
|
274
|
+
return qids + disambiguations;
|
|
275
|
+
}
|
|
276
|
+
async function countExpiredWikipageCacheRows(database, cutoff) {
|
|
277
|
+
const qids = await countRows(database, "qid_cache", cutoff);
|
|
278
|
+
const disambiguations = await countRows(
|
|
279
|
+
database,
|
|
280
|
+
"disambiguation_cache",
|
|
281
|
+
cutoff
|
|
282
|
+
);
|
|
283
|
+
return qids + disambiguations;
|
|
284
|
+
}
|
|
285
|
+
async function countRows(database, table, checkedBefore) {
|
|
286
|
+
return await database.queryOne(
|
|
287
|
+
`
|
|
288
|
+
SELECT COUNT(*) AS count
|
|
289
|
+
FROM ${table}
|
|
290
|
+
${checkedBefore === void 0 ? "" : "WHERE checked_at < ?"}
|
|
291
|
+
`,
|
|
292
|
+
checkedBefore === void 0 ? void 0 : [checkedBefore],
|
|
293
|
+
(row) => getNumber(row, "count")
|
|
294
|
+
) ?? 0;
|
|
295
|
+
}
|
|
296
|
+
async function readFileSize(path) {
|
|
297
|
+
try {
|
|
298
|
+
return (await stat(path)).size;
|
|
299
|
+
} catch (error) {
|
|
300
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
301
|
+
return void 0;
|
|
302
|
+
}
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function mapQidRecord(row) {
|
|
307
|
+
const description = getOptionalString(row.description);
|
|
308
|
+
const label = getOptionalString(row.label);
|
|
309
|
+
return {
|
|
310
|
+
checkedAt: getString(row.checked_at, "checked_at"),
|
|
311
|
+
...description === void 0 ? {} : { description },
|
|
312
|
+
...label === void 0 ? {} : { label },
|
|
313
|
+
qid: getString(row.qid, "qid"),
|
|
314
|
+
sitelinks: parsePageRecords(getString(row.pages_json, "pages_json")),
|
|
315
|
+
updatedAt: getString(row.updated_at, "updated_at")
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function mapDisambiguationRecord(row) {
|
|
319
|
+
return {
|
|
320
|
+
checkedAt: getString(row.checked_at, "checked_at"),
|
|
321
|
+
disambiguationQid: getString(row.qid, "qid"),
|
|
322
|
+
pages: parseDisambiguationPages(getString(row.pages_json, "pages_json")),
|
|
323
|
+
...getOptionalString(row.profile_json) === void 0 ? {} : {
|
|
324
|
+
profile: parseDisambiguationProfile(
|
|
325
|
+
getOptionalString(row.profile_json)
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
function parsePageRecords(value) {
|
|
331
|
+
const parsed = JSON.parse(value);
|
|
332
|
+
if (!Array.isArray(parsed)) {
|
|
333
|
+
return [];
|
|
334
|
+
}
|
|
335
|
+
return parsed.filter(isCachedPageRecord);
|
|
336
|
+
}
|
|
337
|
+
function parseDisambiguationPages(value) {
|
|
338
|
+
const parsed = JSON.parse(value);
|
|
339
|
+
if (!Array.isArray(parsed)) {
|
|
340
|
+
return [];
|
|
341
|
+
}
|
|
342
|
+
return parsed.filter(isDisambiguationPageText);
|
|
343
|
+
}
|
|
344
|
+
function isCachedPageRecord(value) {
|
|
345
|
+
if (typeof value !== "object" || value === null) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
const record = value;
|
|
349
|
+
return typeof record.isDisambiguation === "boolean" && typeof record.title === "string" && record.title !== "" && isSupportedWiki(record.wiki);
|
|
350
|
+
}
|
|
351
|
+
function isDisambiguationPageText(value) {
|
|
352
|
+
if (typeof value !== "object" || value === null) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
const record = value;
|
|
356
|
+
return Array.isArray(record.linkedQids) && record.linkedQids.every(isLinkedQid) && typeof record.text === "string" && record.text !== "" && typeof record.title === "string" && record.title !== "" && isSupportedWiki(record.wiki);
|
|
357
|
+
}
|
|
358
|
+
function parseDisambiguationProfile(value) {
|
|
359
|
+
const parsed = JSON.parse(value);
|
|
360
|
+
if (!isDisambiguationProfile(parsed)) {
|
|
361
|
+
throw new Error(
|
|
362
|
+
"Expected profile_json to contain a disambiguation profile."
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
return parsed;
|
|
366
|
+
}
|
|
367
|
+
function isDisambiguationProfile(value) {
|
|
368
|
+
if (typeof value !== "object" || value === null) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
const record = value;
|
|
372
|
+
return Array.isArray(record.meanings) && record.meanings.every(isDisambiguationProfileMeaning) && typeof record.sourceQid === "string" && /^Q[1-9]\d*$/u.test(record.sourceQid) && (!("surface" in record) || typeof record.surface === "string");
|
|
373
|
+
}
|
|
374
|
+
function isDisambiguationProfileMeaning(value) {
|
|
375
|
+
if (typeof value !== "object" || value === null) {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
const record = value;
|
|
379
|
+
return (!("category" in record) || typeof record.category === "string") && typeof record.information === "string" && typeof record.name === "string" && record.name !== "" && (record.priority === "primary" || record.priority === "secondary" || record.priority === "other") && typeof record.qid === "string" && /^Q[1-9]\d*$/u.test(record.qid);
|
|
380
|
+
}
|
|
381
|
+
function isLinkedQid(value) {
|
|
382
|
+
if (typeof value !== "object" || value === null) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
const record = value;
|
|
386
|
+
return typeof record.qid === "string" && /^Q[1-9]\d*$/u.test(record.qid) && typeof record.title === "string" && record.title !== "";
|
|
387
|
+
}
|
|
388
|
+
function isSupportedWiki(value) {
|
|
389
|
+
return value === "enwiki" || value === "zhwiki";
|
|
390
|
+
}
|
|
391
|
+
function getString(value, field) {
|
|
392
|
+
if (typeof value !== "string") {
|
|
393
|
+
throw new Error(`Expected ${field} to be a string.`);
|
|
394
|
+
}
|
|
395
|
+
return value;
|
|
396
|
+
}
|
|
397
|
+
function getOptionalString(value) {
|
|
398
|
+
return typeof value === "string" && value !== "" ? value : void 0;
|
|
399
|
+
}
|
|
400
|
+
export {
|
|
401
|
+
WikipageCache,
|
|
402
|
+
runWikipageCacheGc
|
|
403
|
+
};
|
|
404
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/wikipage/cache.ts"],"sourcesContent":["import { stat } from \"fs/promises\";\n\nimport { resolveWikiGraphCacheDatabasePath } from \"../common/wiki-graph-dir.js\";\nimport { getNumber } from \"../document/database.js\";\nimport { openSharedStateDatabase } from \"../document/index.js\";\nimport type { Database } from \"../document/index.js\";\nimport type { GcContext, GcJobResult } from \"../gc/index.js\";\nimport { isNodeError } from \"../utils/node-error.js\";\n\nimport type {\n CachedDisambiguationRecord,\n CachedPageRecord,\n CachedQidRecord,\n DisambiguationLinkedQid,\n DisambiguationPageText,\n DisambiguationProfile,\n DisambiguationProfileMeaning,\n} from \"./types.js\";\n\ntype SqlRow = Record<string, unknown>;\n\nconst CREATE_QID_CACHE_SQL = `\nCREATE TABLE IF NOT EXISTS qid_cache (\n qid TEXT NOT NULL,\n language TEXT NOT NULL,\n label TEXT,\n description TEXT,\n pages_json TEXT NOT NULL,\n checked_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (qid, language)\n);\n`;\n\nconst CREATE_DISAMBIGUATION_CACHE_SQL = `\nCREATE TABLE IF NOT EXISTS disambiguation_cache (\n qid TEXT NOT NULL,\n wiki TEXT NOT NULL,\n pages_json TEXT NOT NULL,\n profile_json TEXT,\n checked_at TEXT NOT NULL,\n PRIMARY KEY (qid, wiki)\n);\n`;\n\nconst WIKIPAGE_CACHE_SCHEMA_SQL = `\n${CREATE_QID_CACHE_SQL}\n\nCREATE INDEX IF NOT EXISTS idx_qid_cache_checked_at\nON qid_cache(checked_at);\n\n${CREATE_DISAMBIGUATION_CACHE_SQL}\n\nCREATE INDEX IF NOT EXISTS idx_disambiguation_cache_checked_at\nON disambiguation_cache(checked_at);\n`;\nconst WIKIPAGE_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000;\n\nexport class WikipageCache {\n readonly #database: Database;\n\n public constructor(database: Database) {\n this.#database = database;\n }\n\n public static async open(path?: string): Promise<WikipageCache> {\n const databasePath = path ?? resolveWikiGraphCacheDatabasePath();\n const database = await openSharedStateDatabase(\n databasePath,\n WIKIPAGE_CACHE_SCHEMA_SQL,\n );\n\n try {\n await migrateWikipageCacheSchema(database);\n } catch (error) {\n await database.close().catch(() => undefined);\n throw error;\n }\n\n return new WikipageCache(database);\n }\n\n public async close(): Promise<void> {\n await this.#database.close();\n }\n\n public async getQids(\n qids: readonly string[],\n language: string,\n ): Promise<ReadonlyMap<string, CachedQidRecord>> {\n if (qids.length === 0) {\n return new Map();\n }\n\n const results = new Map<string, CachedQidRecord>();\n\n for (const qid of qids) {\n const record = await this.#database.queryOne(\n `\nSELECT *\nFROM qid_cache\nWHERE qid = ? AND language = ?\n`,\n [qid, language],\n mapQidRecord,\n );\n\n if (record !== undefined) {\n results.set(qid, record);\n }\n }\n\n return results;\n }\n\n public async putQids(\n records: readonly CachedQidRecord[],\n language: string,\n ): Promise<void> {\n if (records.length === 0) {\n return;\n }\n\n await this.#database.transaction(async () => {\n for (const record of records) {\n await this.#database.run(\n `\nINSERT INTO qid_cache (\n qid, language, label, description, pages_json, checked_at, updated_at\n) VALUES (?, ?, ?, ?, ?, ?, ?)\nON CONFLICT(qid, language) DO UPDATE SET\n label = excluded.label,\n description = excluded.description,\n pages_json = excluded.pages_json,\n checked_at = excluded.checked_at,\n updated_at = excluded.updated_at\n`,\n [\n record.qid,\n language,\n record.label ?? null,\n record.description ?? null,\n JSON.stringify(record.sitelinks),\n record.checkedAt,\n record.updatedAt,\n ],\n );\n }\n });\n }\n\n public async getDisambiguations(\n qids: readonly string[],\n wiki: string,\n ): Promise<ReadonlyMap<string, CachedDisambiguationRecord>> {\n if (qids.length === 0) {\n return new Map();\n }\n\n const results = new Map<string, CachedDisambiguationRecord>();\n\n for (const qid of qids) {\n const record = await this.#database.queryOne(\n `\nSELECT *\nFROM disambiguation_cache\nWHERE qid = ? AND wiki = ?\n`,\n [qid, wiki],\n mapDisambiguationRecord,\n );\n\n if (record !== undefined) {\n results.set(qid, record);\n }\n }\n\n return results;\n }\n\n public async putDisambiguations(\n records: readonly CachedDisambiguationRecord[],\n wiki: string,\n ): Promise<void> {\n if (records.length === 0) {\n return;\n }\n\n await this.#database.transaction(async () => {\n for (const record of records) {\n await this.#database.run(\n `\nINSERT INTO disambiguation_cache (\n qid, wiki, pages_json, profile_json, checked_at\n) VALUES (?, ?, ?, ?, ?)\nON CONFLICT(qid, wiki) DO UPDATE SET\n pages_json = excluded.pages_json,\n profile_json = excluded.profile_json,\n checked_at = excluded.checked_at\n`,\n [\n record.disambiguationQid,\n wiki,\n JSON.stringify(record.pages),\n record.profile === undefined\n ? null\n : JSON.stringify(record.profile),\n record.checkedAt,\n ],\n );\n }\n });\n }\n}\n\nexport async function runWikipageCacheGc(\n context: GcContext,\n): Promise<GcJobResult> {\n const databasePath = resolveWikiGraphCacheDatabasePath();\n const beforeBytes = await readFileSize(databasePath);\n\n if (beforeBytes === undefined) {\n return {\n freedBytes: 0,\n removed: 0,\n scanned: 0,\n };\n }\n\n const database = await openSharedStateDatabase(\n databasePath,\n WIKIPAGE_CACHE_SCHEMA_SQL,\n );\n\n try {\n await migrateWikipageCacheSchema(database);\n\n const scanned = await countWikipageCacheRows(database);\n const cutoff = new Date(context.now - WIKIPAGE_CACHE_TTL_MS).toISOString();\n const expired = await countExpiredWikipageCacheRows(database, cutoff);\n\n if (!context.dryRun && expired > 0) {\n await database.transaction(async () => {\n await database.run(\"DELETE FROM qid_cache WHERE checked_at < ?\", [\n cutoff,\n ]);\n await database.run(\n \"DELETE FROM disambiguation_cache WHERE checked_at < ?\",\n [cutoff],\n );\n });\n await database.run(\"VACUUM\");\n }\n\n const afterBytes = await readFileSize(databasePath);\n\n return {\n freedBytes: context.dryRun\n ? estimateDryRunFreedBytes(beforeBytes, scanned, expired)\n : Math.max(0, beforeBytes - (afterBytes ?? 0)),\n removed: expired,\n scanned,\n };\n } finally {\n await database.close();\n }\n}\n\nfunction estimateDryRunFreedBytes(\n beforeBytes: number,\n scanned: number,\n expired: number,\n): number {\n if (scanned === 0 || expired === 0) {\n return 0;\n }\n\n return Math.round(beforeBytes * (expired / scanned));\n}\n\nasync function migrateWikipageCacheSchema(database: Database): Promise<void> {\n await migrateQidCacheSchema(database);\n await migrateDisambiguationCacheSchema(database);\n}\n\nasync function migrateQidCacheSchema(database: Database): Promise<void> {\n const columns = await listTableColumns(database, \"qid_cache\");\n\n if (columns.has(\"language\")) {\n return;\n }\n\n await database.transaction(async () => {\n const transactionColumns = await listTableColumns(database, \"qid_cache\");\n\n if (transactionColumns.has(\"language\")) {\n return;\n }\n\n await database.run(\"ALTER TABLE qid_cache RENAME TO qid_cache_legacy\");\n await database.run(CREATE_QID_CACHE_SQL);\n await database.run(`\nINSERT OR IGNORE INTO qid_cache (\n qid, language, label, description, pages_json, checked_at, updated_at\n)\nSELECT qid, 'en', label, description, pages_json, checked_at, updated_at\nFROM qid_cache_legacy\n`);\n await database.run(\"DROP TABLE qid_cache_legacy\");\n });\n}\n\nasync function migrateDisambiguationCacheSchema(\n database: Database,\n): Promise<void> {\n const columns = await listTableColumns(database, \"disambiguation_cache\");\n\n if (columns.has(\"wiki\")) {\n return;\n }\n\n await database.transaction(async () => {\n const transactionColumns = await listTableColumns(\n database,\n \"disambiguation_cache\",\n );\n\n if (transactionColumns.has(\"wiki\")) {\n return;\n }\n\n await database.run(\n \"ALTER TABLE disambiguation_cache RENAME TO disambiguation_cache_legacy\",\n );\n await database.run(CREATE_DISAMBIGUATION_CACHE_SQL);\n await database.run(`\nINSERT OR IGNORE INTO disambiguation_cache (\n qid, wiki, pages_json, profile_json, checked_at\n)\nSELECT qid, 'enwiki', pages_json, profile_json, checked_at\nFROM disambiguation_cache_legacy\n`);\n await database.run(\"DROP TABLE disambiguation_cache_legacy\");\n });\n}\n\nasync function listTableColumns(\n database: Database,\n table: string,\n): Promise<ReadonlySet<string>> {\n const columns = await database.queryAll(\n `PRAGMA table_info(${table})`,\n undefined,\n (row) => getString(row.name, \"name\"),\n );\n\n return new Set(columns);\n}\n\nasync function countWikipageCacheRows(database: Database): Promise<number> {\n const qids = await countRows(database, \"qid_cache\");\n const disambiguations = await countRows(database, \"disambiguation_cache\");\n\n return qids + disambiguations;\n}\n\nasync function countExpiredWikipageCacheRows(\n database: Database,\n cutoff: string,\n): Promise<number> {\n const qids = await countRows(database, \"qid_cache\", cutoff);\n const disambiguations = await countRows(\n database,\n \"disambiguation_cache\",\n cutoff,\n );\n\n return qids + disambiguations;\n}\n\nasync function countRows(\n database: Database,\n table: \"disambiguation_cache\" | \"qid_cache\",\n checkedBefore?: string,\n): Promise<number> {\n return (\n (await database.queryOne(\n `\nSELECT COUNT(*) AS count\nFROM ${table}\n${checkedBefore === undefined ? \"\" : \"WHERE checked_at < ?\"}\n`,\n checkedBefore === undefined ? undefined : [checkedBefore],\n (row) => getNumber(row, \"count\"),\n )) ?? 0\n );\n}\n\nasync function readFileSize(path: string): Promise<number | undefined> {\n try {\n return (await stat(path)).size;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n}\n\nfunction mapQidRecord(row: SqlRow): CachedQidRecord {\n const description = getOptionalString(row.description);\n const label = getOptionalString(row.label);\n\n return {\n checkedAt: getString(row.checked_at, \"checked_at\"),\n ...(description === undefined ? {} : { description }),\n ...(label === undefined ? {} : { label }),\n qid: getString(row.qid, \"qid\"),\n sitelinks: parsePageRecords(getString(row.pages_json, \"pages_json\")),\n updatedAt: getString(row.updated_at, \"updated_at\"),\n };\n}\n\nfunction mapDisambiguationRecord(row: SqlRow): CachedDisambiguationRecord {\n return {\n checkedAt: getString(row.checked_at, \"checked_at\"),\n disambiguationQid: getString(row.qid, \"qid\"),\n pages: parseDisambiguationPages(getString(row.pages_json, \"pages_json\")),\n ...(getOptionalString(row.profile_json) === undefined\n ? {}\n : {\n profile: parseDisambiguationProfile(\n getOptionalString(row.profile_json)!,\n ),\n }),\n };\n}\n\nfunction parsePageRecords(value: string): readonly CachedPageRecord[] {\n const parsed: unknown = JSON.parse(value);\n\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n return parsed.filter(isCachedPageRecord);\n}\n\nfunction parseDisambiguationPages(\n value: string,\n): readonly DisambiguationPageText[] {\n const parsed: unknown = JSON.parse(value);\n\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n return parsed.filter(isDisambiguationPageText);\n}\n\nfunction isCachedPageRecord(value: unknown): value is CachedPageRecord {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n typeof record.isDisambiguation === \"boolean\" &&\n typeof record.title === \"string\" &&\n record.title !== \"\" &&\n isSupportedWiki(record.wiki)\n );\n}\n\nfunction isDisambiguationPageText(\n value: unknown,\n): value is DisambiguationPageText {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n Array.isArray(record.linkedQids) &&\n record.linkedQids.every(isLinkedQid) &&\n typeof record.text === \"string\" &&\n record.text !== \"\" &&\n typeof record.title === \"string\" &&\n record.title !== \"\" &&\n isSupportedWiki(record.wiki)\n );\n}\n\nfunction parseDisambiguationProfile(value: string): DisambiguationProfile {\n const parsed: unknown = JSON.parse(value);\n\n if (!isDisambiguationProfile(parsed)) {\n throw new Error(\n \"Expected profile_json to contain a disambiguation profile.\",\n );\n }\n\n return parsed;\n}\n\nfunction isDisambiguationProfile(\n value: unknown,\n): value is DisambiguationProfile {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n Array.isArray(record.meanings) &&\n record.meanings.every(isDisambiguationProfileMeaning) &&\n typeof record.sourceQid === \"string\" &&\n /^Q[1-9]\\d*$/u.test(record.sourceQid) &&\n (!(\"surface\" in record) || typeof record.surface === \"string\")\n );\n}\n\nfunction isDisambiguationProfileMeaning(\n value: unknown,\n): value is DisambiguationProfileMeaning {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n (!(\"category\" in record) || typeof record.category === \"string\") &&\n typeof record.information === \"string\" &&\n typeof record.name === \"string\" &&\n record.name !== \"\" &&\n (record.priority === \"primary\" ||\n record.priority === \"secondary\" ||\n record.priority === \"other\") &&\n typeof record.qid === \"string\" &&\n /^Q[1-9]\\d*$/u.test(record.qid)\n );\n}\n\nfunction isLinkedQid(value: unknown): value is DisambiguationLinkedQid {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n typeof record.qid === \"string\" &&\n /^Q[1-9]\\d*$/u.test(record.qid) &&\n typeof record.title === \"string\" &&\n record.title !== \"\"\n );\n}\n\nfunction isSupportedWiki(value: unknown): value is \"enwiki\" | \"zhwiki\" {\n return value === \"enwiki\" || value === \"zhwiki\";\n}\n\nfunction getString(value: unknown, field: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`Expected ${field} to be a string.`);\n }\n\n return value;\n}\n\nfunction getOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value !== \"\" ? value : undefined;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface WikipageFetchLog {
|
|
2
|
+
readonly filePath: string | undefined;
|
|
3
|
+
append(entry: WikipageFetchLogEntry): Promise<void>;
|
|
4
|
+
warnFailed(): void;
|
|
5
|
+
}
|
|
6
|
+
interface WikipageFetchLogEntry {
|
|
7
|
+
readonly attempt: number;
|
|
8
|
+
readonly durationMs: number;
|
|
9
|
+
readonly error?: unknown;
|
|
10
|
+
readonly response?: Response;
|
|
11
|
+
readonly responseText?: string;
|
|
12
|
+
readonly startedAt: number;
|
|
13
|
+
readonly url: URL;
|
|
14
|
+
}
|
|
15
|
+
declare function createWikipageFetchLog(logDirPath?: string): WikipageFetchLog;
|
|
16
|
+
|
|
17
|
+
export { type WikipageFetchLog, createWikipageFetchLog };
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { createHash } from "crypto";
|
|
2
|
+
import { appendFile } from "fs/promises";
|
|
3
|
+
import { getLogger, resolveArtifactPath } from "../common/logging.js";
|
|
4
|
+
import { formatError } from "../utils/node-error.js";
|
|
5
|
+
const MAX_RESPONSE_TEXT_LENGTH = 16384;
|
|
6
|
+
class SilentWikipageFetchLog {
|
|
7
|
+
filePath = void 0;
|
|
8
|
+
append() {
|
|
9
|
+
return Promise.resolve();
|
|
10
|
+
}
|
|
11
|
+
warnFailed() {
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
class FileWikipageFetchLog {
|
|
16
|
+
#filePath;
|
|
17
|
+
#failedWarned = false;
|
|
18
|
+
constructor(filePath) {
|
|
19
|
+
this.#filePath = filePath;
|
|
20
|
+
}
|
|
21
|
+
get filePath() {
|
|
22
|
+
return this.#filePath;
|
|
23
|
+
}
|
|
24
|
+
async append(entry) {
|
|
25
|
+
await appendFile(
|
|
26
|
+
this.#filePath,
|
|
27
|
+
`${JSON.stringify(formatEntry(entry))}
|
|
28
|
+
`,
|
|
29
|
+
"utf8"
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
warnFailed() {
|
|
33
|
+
if (this.#failedWarned) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.#failedWarned = true;
|
|
37
|
+
getLogger({ component: "wikipage" }).warn(
|
|
38
|
+
`
|
|
39
|
+
[Wikipage] Failed with fetch log: ${this.#filePath}`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function createWikipageFetchLog(logDirPath) {
|
|
44
|
+
if (logDirPath === void 0) {
|
|
45
|
+
return new SilentWikipageFetchLog();
|
|
46
|
+
}
|
|
47
|
+
const filePath = resolveArtifactPath({
|
|
48
|
+
category: "wikipage",
|
|
49
|
+
fileName: "wikipage-fetch.jsonl",
|
|
50
|
+
logDirPath
|
|
51
|
+
});
|
|
52
|
+
return filePath === void 0 ? new SilentWikipageFetchLog() : new FileWikipageFetchLog(filePath);
|
|
53
|
+
}
|
|
54
|
+
function formatEntry(entry) {
|
|
55
|
+
return {
|
|
56
|
+
action: entry.url.searchParams.get("action") ?? null,
|
|
57
|
+
attempt: entry.attempt,
|
|
58
|
+
batch: summarizeBatch(entry.url),
|
|
59
|
+
durationMs: entry.durationMs,
|
|
60
|
+
endpoint: `${entry.url.origin}${entry.url.pathname}`,
|
|
61
|
+
host: entry.url.host,
|
|
62
|
+
ok: entry.response?.ok ?? false,
|
|
63
|
+
startedAt: new Date(entry.startedAt).toISOString(),
|
|
64
|
+
...entry.response === void 0 ? {} : {
|
|
65
|
+
retryAfter: entry.response.headers.get("retry-after"),
|
|
66
|
+
status: entry.response.status
|
|
67
|
+
},
|
|
68
|
+
...entry.error === void 0 ? {} : { error: formatLogError(entry.error) },
|
|
69
|
+
...entry.responseText === void 0 ? {} : { responseText: truncateResponseText(entry.responseText) }
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function summarizeBatch(url) {
|
|
73
|
+
const ids = url.searchParams.get("ids");
|
|
74
|
+
if (ids !== null) {
|
|
75
|
+
return summarizeList("qid", ids.split("|"));
|
|
76
|
+
}
|
|
77
|
+
const titles = url.searchParams.get("titles");
|
|
78
|
+
if (titles !== null) {
|
|
79
|
+
return summarizeList("title", titles.split("|"));
|
|
80
|
+
}
|
|
81
|
+
const page = url.searchParams.get("page");
|
|
82
|
+
if (page !== null) {
|
|
83
|
+
return summarizeList("page", [page]);
|
|
84
|
+
}
|
|
85
|
+
return void 0;
|
|
86
|
+
}
|
|
87
|
+
function summarizeList(kind, values) {
|
|
88
|
+
const joined = values.join("|");
|
|
89
|
+
return {
|
|
90
|
+
count: values.length,
|
|
91
|
+
hash: createHash("sha256").update(joined).digest("hex").slice(0, 16),
|
|
92
|
+
kind,
|
|
93
|
+
sample: values.slice(0, 5)
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function formatLogError(error) {
|
|
97
|
+
return {
|
|
98
|
+
message: formatError(error),
|
|
99
|
+
name: error instanceof Error ? error.name : typeof error,
|
|
100
|
+
...formatErrorCause(error)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function formatErrorCause(error) {
|
|
104
|
+
if (!(error instanceof Error) || error.cause === void 0) {
|
|
105
|
+
return {};
|
|
106
|
+
}
|
|
107
|
+
const cause = error.cause;
|
|
108
|
+
return {
|
|
109
|
+
cause: cause instanceof Error ? {
|
|
110
|
+
message: formatError(cause),
|
|
111
|
+
name: cause.name,
|
|
112
|
+
...formatNodeErrorCode(cause)
|
|
113
|
+
} : stringifyUnknown(cause)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function stringifyUnknown(value) {
|
|
117
|
+
if (typeof value === "string") {
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint" || typeof value === "symbol") {
|
|
121
|
+
return value.toString();
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
return JSON.stringify(value);
|
|
125
|
+
} catch {
|
|
126
|
+
return "unserializable error cause";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function formatNodeErrorCode(error) {
|
|
130
|
+
const code = error.code;
|
|
131
|
+
return typeof code === "string" ? { code } : {};
|
|
132
|
+
}
|
|
133
|
+
function truncateResponseText(text) {
|
|
134
|
+
if (text.length <= MAX_RESPONSE_TEXT_LENGTH) {
|
|
135
|
+
return text;
|
|
136
|
+
}
|
|
137
|
+
return `${text.slice(0, MAX_RESPONSE_TEXT_LENGTH)}
|
|
138
|
+
[truncated ${text.length - MAX_RESPONSE_TEXT_LENGTH} chars]`;
|
|
139
|
+
}
|
|
140
|
+
export {
|
|
141
|
+
createWikipageFetchLog
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=fetch-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/wikipage/fetch-log.ts"],"sourcesContent":["import { createHash } from \"crypto\";\nimport { appendFile } from \"fs/promises\";\n\nimport { getLogger, resolveArtifactPath } from \"../common/logging.js\";\nimport { formatError } from \"../utils/node-error.js\";\n\nconst MAX_RESPONSE_TEXT_LENGTH = 16_384;\n\nexport interface WikipageFetchLog {\n readonly filePath: string | undefined;\n append(entry: WikipageFetchLogEntry): Promise<void>;\n warnFailed(): void;\n}\n\ninterface WikipageFetchLogEntry {\n readonly attempt: number;\n readonly durationMs: number;\n readonly error?: unknown;\n readonly response?: Response;\n readonly responseText?: string;\n readonly startedAt: number;\n readonly url: URL;\n}\n\nclass SilentWikipageFetchLog implements WikipageFetchLog {\n public readonly filePath = undefined;\n\n public append(): Promise<void> {\n return Promise.resolve();\n }\n\n public warnFailed(): void {\n return undefined;\n }\n}\n\nclass FileWikipageFetchLog implements WikipageFetchLog {\n readonly #filePath: string;\n #failedWarned = false;\n\n public constructor(filePath: string) {\n this.#filePath = filePath;\n }\n\n public get filePath(): string {\n return this.#filePath;\n }\n\n public async append(entry: WikipageFetchLogEntry): Promise<void> {\n await appendFile(\n this.#filePath,\n `${JSON.stringify(formatEntry(entry))}\\n`,\n \"utf8\",\n );\n }\n\n public warnFailed(): void {\n if (this.#failedWarned) {\n return;\n }\n this.#failedWarned = true;\n\n getLogger({ component: \"wikipage\" }).warn(\n `\\n[Wikipage] Failed with fetch log: ${this.#filePath}`,\n );\n }\n}\n\nexport function createWikipageFetchLog(logDirPath?: string): WikipageFetchLog {\n if (logDirPath === undefined) {\n return new SilentWikipageFetchLog();\n }\n\n const filePath = resolveArtifactPath({\n category: \"wikipage\",\n fileName: \"wikipage-fetch.jsonl\",\n logDirPath,\n });\n\n return filePath === undefined\n ? new SilentWikipageFetchLog()\n : new FileWikipageFetchLog(filePath);\n}\n\nfunction formatEntry(entry: WikipageFetchLogEntry): Record<string, unknown> {\n return {\n action: entry.url.searchParams.get(\"action\") ?? null,\n attempt: entry.attempt,\n batch: summarizeBatch(entry.url),\n durationMs: entry.durationMs,\n endpoint: `${entry.url.origin}${entry.url.pathname}`,\n host: entry.url.host,\n ok: entry.response?.ok ?? false,\n startedAt: new Date(entry.startedAt).toISOString(),\n ...(entry.response === undefined\n ? {}\n : {\n retryAfter: entry.response.headers.get(\"retry-after\"),\n status: entry.response.status,\n }),\n ...(entry.error === undefined\n ? {}\n : { error: formatLogError(entry.error) }),\n ...(entry.responseText === undefined\n ? {}\n : { responseText: truncateResponseText(entry.responseText) }),\n };\n}\n\nfunction summarizeBatch(url: URL): Record<string, unknown> | undefined {\n const ids = url.searchParams.get(\"ids\");\n if (ids !== null) {\n return summarizeList(\"qid\", ids.split(\"|\"));\n }\n\n const titles = url.searchParams.get(\"titles\");\n if (titles !== null) {\n return summarizeList(\"title\", titles.split(\"|\"));\n }\n\n const page = url.searchParams.get(\"page\");\n if (page !== null) {\n return summarizeList(\"page\", [page]);\n }\n\n return undefined;\n}\n\nfunction summarizeList(\n kind: \"page\" | \"qid\" | \"title\",\n values: readonly string[],\n): Record<string, unknown> {\n const joined = values.join(\"|\");\n\n return {\n count: values.length,\n hash: createHash(\"sha256\").update(joined).digest(\"hex\").slice(0, 16),\n kind,\n sample: values.slice(0, 5),\n };\n}\n\nfunction formatLogError(error: unknown): Record<string, unknown> {\n return {\n message: formatError(error),\n name: error instanceof Error ? error.name : typeof error,\n ...formatErrorCause(error),\n };\n}\n\nfunction formatErrorCause(error: unknown): Record<string, unknown> {\n if (!(error instanceof Error) || error.cause === undefined) {\n return {};\n }\n\n const cause = error.cause;\n\n return {\n cause:\n cause instanceof Error\n ? {\n message: formatError(cause),\n name: cause.name,\n ...formatNodeErrorCode(cause),\n }\n : stringifyUnknown(cause),\n };\n}\n\nfunction stringifyUnknown(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\" ||\n typeof value === \"symbol\"\n ) {\n return value.toString();\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return \"unserializable error cause\";\n }\n}\n\nfunction formatNodeErrorCode(error: Error): Record<string, unknown> {\n const code = (error as { readonly code?: unknown }).code;\n\n return typeof code === \"string\" ? { code } : {};\n}\n\nfunction truncateResponseText(text: string): string {\n if (text.length <= MAX_RESPONSE_TEXT_LENGTH) {\n return text;\n }\n\n return `${text.slice(0, MAX_RESPONSE_TEXT_LENGTH)}\\n[truncated ${text.length - MAX_RESPONSE_TEXT_LENGTH} chars]`;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { WikipageCache, runWikipageCacheGc } from './cache.js';
|
|
2
|
+
export { CreateDisambiguationProfileNormalizerOptions, createDisambiguationProfileNormalizer } from './normalizer.js';
|
|
3
|
+
export { RateLimiter, parseRetryAfterMs } from './rate-limiter.js';
|
|
4
|
+
export { WikipageResolver } from './resolver.js';
|
|
5
|
+
export { WikimediaClient } from './wikimedia-client.js';
|
|
6
|
+
export { CachedDisambiguationRecord, CachedPageRecord, CachedQidRecord, DisambiguationExpansion, DisambiguationLinkedQid, DisambiguationMeaningPriority, DisambiguationPageText, DisambiguationProfile, DisambiguationProfileMeaning, DisambiguationProfileNormalizer, DisambiguationProfileNormalizerInput, QidResolution, WikipageResolveProgress, WikipageResolveProgressDetail, WikipageResolveProgressReporter, WikipageResolverOptions, WikipageSitelink } from './types.js';
|
|
7
|
+
import '../document/database.js';
|
|
8
|
+
import 'sqlite3';
|
|
9
|
+
import '../gc/types.js';
|
|
10
|
+
import '../guaranteed/types.js';
|
|
11
|
+
import '../llm/types.js';
|
|
12
|
+
import 'ai';
|
|
13
|
+
import 'zod';
|
|
14
|
+
import './fetch-log.js';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { runWikipageCacheGc, WikipageCache } from "./cache.js";
|
|
2
|
+
import {
|
|
3
|
+
createDisambiguationProfileNormalizer
|
|
4
|
+
} from "./normalizer.js";
|
|
5
|
+
import { RateLimiter, parseRetryAfterMs } from "./rate-limiter.js";
|
|
6
|
+
import { WikipageResolver } from "./resolver.js";
|
|
7
|
+
import { WikimediaClient } from "./wikimedia-client.js";
|
|
8
|
+
export {
|
|
9
|
+
RateLimiter,
|
|
10
|
+
WikimediaClient,
|
|
11
|
+
WikipageCache,
|
|
12
|
+
WikipageResolver,
|
|
13
|
+
createDisambiguationProfileNormalizer,
|
|
14
|
+
parseRetryAfterMs,
|
|
15
|
+
runWikipageCacheGc
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/wikipage/index.ts"],"sourcesContent":["export { runWikipageCacheGc, WikipageCache } from \"./cache.js\";\nexport {\n createDisambiguationProfileNormalizer,\n type CreateDisambiguationProfileNormalizerOptions,\n} from \"./normalizer.js\";\nexport { RateLimiter, parseRetryAfterMs } from \"./rate-limiter.js\";\nexport { WikipageResolver } from \"./resolver.js\";\nexport { WikimediaClient } from \"./wikimedia-client.js\";\nexport type {\n CachedDisambiguationRecord,\n CachedPageRecord,\n CachedQidRecord,\n DisambiguationExpansion,\n DisambiguationLinkedQid,\n DisambiguationPageText,\n DisambiguationMeaningPriority,\n DisambiguationProfile,\n DisambiguationProfileMeaning,\n DisambiguationProfileNormalizer,\n DisambiguationProfileNormalizerInput,\n QidResolution,\n WikipageResolveProgress,\n WikipageResolveProgressDetail,\n WikipageResolveProgressReporter,\n WikipageResolverOptions,\n WikipageSitelink,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,oBAAoB,qBAAqB;AAClD;AAAA,EACE;AAAA,OAEK;AACP,SAAS,aAAa,yBAAyB;AAC/C,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;","names":[]}
|