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,76 @@
|
|
|
1
|
+
import { getReadingEdgeKey } from "./weights.js";
|
|
2
|
+
function buildSnakeGraph(input) {
|
|
3
|
+
const chunkIdToSnakeIndex = createOptionalNumberRecord();
|
|
4
|
+
const interSnakeWeightByKey = createNumberRecord();
|
|
5
|
+
for (const [snakeIndex, snakeChunkIds] of input.snakes.entries()) {
|
|
6
|
+
for (const chunkId of snakeChunkIds) {
|
|
7
|
+
chunkIdToSnakeIndex[String(chunkId)] = snakeIndex;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
for (const edge of input.edges) {
|
|
11
|
+
const fromSnakeIndex = chunkIdToSnakeIndex[String(edge.fromId)];
|
|
12
|
+
const toSnakeIndex = chunkIdToSnakeIndex[String(edge.toId)];
|
|
13
|
+
if (fromSnakeIndex === void 0 || toSnakeIndex === void 0 || fromSnakeIndex === toSnakeIndex) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const edgeKey = getReadingEdgeKey(fromSnakeIndex, toSnakeIndex);
|
|
17
|
+
interSnakeWeightByKey[edgeKey] = (interSnakeWeightByKey[edgeKey] ?? 0) + edge.weight;
|
|
18
|
+
}
|
|
19
|
+
const normalizedSnakeWeightByKey = createNumberRecord();
|
|
20
|
+
for (const [edgeKey, weight] of Object.entries(interSnakeWeightByKey)) {
|
|
21
|
+
const [fromSnakeIndexText = "", toSnakeIndexText = ""] = edgeKey.split(":");
|
|
22
|
+
const fromSnakeIndex = Number(fromSnakeIndexText);
|
|
23
|
+
const toSnakeIndex = Number(toSnakeIndexText);
|
|
24
|
+
const fromSnakeStartChunkId = input.snakes[fromSnakeIndex]?.[0];
|
|
25
|
+
const toSnakeStartChunkId = input.snakes[toSnakeIndex]?.[0];
|
|
26
|
+
if (fromSnakeStartChunkId === void 0 || toSnakeStartChunkId === void 0) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const fromChunk = input.chunksById[String(fromSnakeStartChunkId)];
|
|
30
|
+
const toChunk = input.chunksById[String(toSnakeStartChunkId)];
|
|
31
|
+
if (fromChunk === void 0 || toChunk === void 0) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const normalizedEdgeKey = compareChunkBySentence(fromChunk, toChunk) < 0 ? getReadingEdgeKey(fromSnakeIndex, toSnakeIndex) : getReadingEdgeKey(toSnakeIndex, fromSnakeIndex);
|
|
35
|
+
normalizedSnakeWeightByKey[normalizedEdgeKey] = (normalizedSnakeWeightByKey[normalizedEdgeKey] ?? 0) + weight;
|
|
36
|
+
}
|
|
37
|
+
return Object.keys(normalizedSnakeWeightByKey).sort(compareEdgeKey).map((edgeKey) => {
|
|
38
|
+
const [fromSnakeIndexText = "", toSnakeIndexText = ""] = edgeKey.split(":");
|
|
39
|
+
return {
|
|
40
|
+
fromSnakeIndex: Number(fromSnakeIndexText),
|
|
41
|
+
toSnakeIndex: Number(toSnakeIndexText),
|
|
42
|
+
weight: normalizedSnakeWeightByKey[edgeKey] ?? 0
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function compareChunkBySentence(left, right) {
|
|
47
|
+
const [leftSerialId, leftSentenceIndex] = left.sentenceId;
|
|
48
|
+
const [rightSerialId, rightSentenceIndex] = right.sentenceId;
|
|
49
|
+
if (leftSerialId !== rightSerialId) {
|
|
50
|
+
return leftSerialId - rightSerialId;
|
|
51
|
+
}
|
|
52
|
+
if (leftSentenceIndex !== rightSentenceIndex) {
|
|
53
|
+
return leftSentenceIndex - rightSentenceIndex;
|
|
54
|
+
}
|
|
55
|
+
return left.id - right.id;
|
|
56
|
+
}
|
|
57
|
+
function compareEdgeKey(left, right) {
|
|
58
|
+
const [leftFromIdText = "", leftToIdText = ""] = left.split(":");
|
|
59
|
+
const [rightFromIdText = "", rightToIdText = ""] = right.split(":");
|
|
60
|
+
const leftFromId = Number(leftFromIdText);
|
|
61
|
+
const rightFromId = Number(rightFromIdText);
|
|
62
|
+
if (leftFromId !== rightFromId) {
|
|
63
|
+
return leftFromId - rightFromId;
|
|
64
|
+
}
|
|
65
|
+
return Number(leftToIdText) - Number(rightToIdText);
|
|
66
|
+
}
|
|
67
|
+
function createNumberRecord() {
|
|
68
|
+
return /* @__PURE__ */ Object.create(null);
|
|
69
|
+
}
|
|
70
|
+
function createOptionalNumberRecord() {
|
|
71
|
+
return /* @__PURE__ */ Object.create(null);
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
buildSnakeGraph
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=snake-graph-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/topology/snake-graph-builder.ts"],"sourcesContent":["import type { ChunkRecord, ReadingEdgeRecord } from \"../document/index.js\";\nimport { getReadingEdgeKey } from \"./weights.js\";\n\nexport interface SnakeGraphEdge {\n readonly fromSnakeIndex: number;\n readonly toSnakeIndex: number;\n readonly weight: number;\n}\n\nexport function buildSnakeGraph(input: {\n chunksById: Readonly<Record<string, ChunkRecord | undefined>>;\n edges: readonly ReadingEdgeRecord[];\n snakes: readonly (readonly number[])[];\n}): SnakeGraphEdge[] {\n const chunkIdToSnakeIndex = createOptionalNumberRecord();\n const interSnakeWeightByKey = createNumberRecord();\n\n for (const [snakeIndex, snakeChunkIds] of input.snakes.entries()) {\n for (const chunkId of snakeChunkIds) {\n chunkIdToSnakeIndex[String(chunkId)] = snakeIndex;\n }\n }\n\n for (const edge of input.edges) {\n const fromSnakeIndex = chunkIdToSnakeIndex[String(edge.fromId)];\n const toSnakeIndex = chunkIdToSnakeIndex[String(edge.toId)];\n\n if (\n fromSnakeIndex === undefined ||\n toSnakeIndex === undefined ||\n fromSnakeIndex === toSnakeIndex\n ) {\n continue;\n }\n\n const edgeKey = getReadingEdgeKey(fromSnakeIndex, toSnakeIndex);\n\n interSnakeWeightByKey[edgeKey] =\n (interSnakeWeightByKey[edgeKey] ?? 0) + edge.weight;\n }\n\n const normalizedSnakeWeightByKey = createNumberRecord();\n\n for (const [edgeKey, weight] of Object.entries(interSnakeWeightByKey)) {\n const [fromSnakeIndexText = \"\", toSnakeIndexText = \"\"] = edgeKey.split(\":\");\n const fromSnakeIndex = Number(fromSnakeIndexText);\n const toSnakeIndex = Number(toSnakeIndexText);\n const fromSnakeStartChunkId = input.snakes[fromSnakeIndex]?.[0];\n const toSnakeStartChunkId = input.snakes[toSnakeIndex]?.[0];\n\n if (\n fromSnakeStartChunkId === undefined ||\n toSnakeStartChunkId === undefined\n ) {\n continue;\n }\n\n const fromChunk = input.chunksById[String(fromSnakeStartChunkId)];\n const toChunk = input.chunksById[String(toSnakeStartChunkId)];\n\n if (fromChunk === undefined || toChunk === undefined) {\n continue;\n }\n\n const normalizedEdgeKey =\n compareChunkBySentence(fromChunk, toChunk) < 0\n ? getReadingEdgeKey(fromSnakeIndex, toSnakeIndex)\n : getReadingEdgeKey(toSnakeIndex, fromSnakeIndex);\n\n normalizedSnakeWeightByKey[normalizedEdgeKey] =\n (normalizedSnakeWeightByKey[normalizedEdgeKey] ?? 0) + weight;\n }\n\n return Object.keys(normalizedSnakeWeightByKey)\n .sort(compareEdgeKey)\n .map((edgeKey) => {\n const [fromSnakeIndexText = \"\", toSnakeIndexText = \"\"] =\n edgeKey.split(\":\");\n\n return {\n fromSnakeIndex: Number(fromSnakeIndexText),\n toSnakeIndex: Number(toSnakeIndexText),\n weight: normalizedSnakeWeightByKey[edgeKey] ?? 0,\n };\n });\n}\n\nfunction compareChunkBySentence(left: ChunkRecord, right: ChunkRecord): number {\n const [leftSerialId, leftSentenceIndex] = left.sentenceId;\n const [rightSerialId, rightSentenceIndex] = right.sentenceId;\n\n if (leftSerialId !== rightSerialId) {\n return leftSerialId - rightSerialId;\n }\n\n if (leftSentenceIndex !== rightSentenceIndex) {\n return leftSentenceIndex - rightSentenceIndex;\n }\n\n return left.id - right.id;\n}\n\nfunction compareEdgeKey(left: string, right: string): number {\n const [leftFromIdText = \"\", leftToIdText = \"\"] = left.split(\":\");\n const [rightFromIdText = \"\", rightToIdText = \"\"] = right.split(\":\");\n const leftFromId = Number(leftFromIdText);\n const rightFromId = Number(rightFromIdText);\n\n if (leftFromId !== rightFromId) {\n return leftFromId - rightFromId;\n }\n\n return Number(leftToIdText) - Number(rightToIdText);\n}\n\nfunction createNumberRecord(): Record<string, number> {\n return Object.create(null) as Record<string, number>;\n}\n\nfunction createOptionalNumberRecord(): Record<string, number | undefined> {\n return Object.create(null) as Record<string, number | undefined>;\n}\n"],"mappings":"AACA,SAAS,yBAAyB;AAQ3B,SAAS,gBAAgB,OAIX;AACnB,QAAM,sBAAsB,2BAA2B;AACvD,QAAM,wBAAwB,mBAAmB;AAEjD,aAAW,CAAC,YAAY,aAAa,KAAK,MAAM,OAAO,QAAQ,GAAG;AAChE,eAAW,WAAW,eAAe;AACnC,0BAAoB,OAAO,OAAO,CAAC,IAAI;AAAA,IACzC;AAAA,EACF;AAEA,aAAW,QAAQ,MAAM,OAAO;AAC9B,UAAM,iBAAiB,oBAAoB,OAAO,KAAK,MAAM,CAAC;AAC9D,UAAM,eAAe,oBAAoB,OAAO,KAAK,IAAI,CAAC;AAE1D,QACE,mBAAmB,UACnB,iBAAiB,UACjB,mBAAmB,cACnB;AACA;AAAA,IACF;AAEA,UAAM,UAAU,kBAAkB,gBAAgB,YAAY;AAE9D,0BAAsB,OAAO,KAC1B,sBAAsB,OAAO,KAAK,KAAK,KAAK;AAAA,EACjD;AAEA,QAAM,6BAA6B,mBAAmB;AAEtD,aAAW,CAAC,SAAS,MAAM,KAAK,OAAO,QAAQ,qBAAqB,GAAG;AACrE,UAAM,CAAC,qBAAqB,IAAI,mBAAmB,EAAE,IAAI,QAAQ,MAAM,GAAG;AAC1E,UAAM,iBAAiB,OAAO,kBAAkB;AAChD,UAAM,eAAe,OAAO,gBAAgB;AAC5C,UAAM,wBAAwB,MAAM,OAAO,cAAc,IAAI,CAAC;AAC9D,UAAM,sBAAsB,MAAM,OAAO,YAAY,IAAI,CAAC;AAE1D,QACE,0BAA0B,UAC1B,wBAAwB,QACxB;AACA;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,WAAW,OAAO,qBAAqB,CAAC;AAChE,UAAM,UAAU,MAAM,WAAW,OAAO,mBAAmB,CAAC;AAE5D,QAAI,cAAc,UAAa,YAAY,QAAW;AACpD;AAAA,IACF;AAEA,UAAM,oBACJ,uBAAuB,WAAW,OAAO,IAAI,IACzC,kBAAkB,gBAAgB,YAAY,IAC9C,kBAAkB,cAAc,cAAc;AAEpD,+BAA2B,iBAAiB,KACzC,2BAA2B,iBAAiB,KAAK,KAAK;AAAA,EAC3D;AAEA,SAAO,OAAO,KAAK,0BAA0B,EAC1C,KAAK,cAAc,EACnB,IAAI,CAAC,YAAY;AAChB,UAAM,CAAC,qBAAqB,IAAI,mBAAmB,EAAE,IACnD,QAAQ,MAAM,GAAG;AAEnB,WAAO;AAAA,MACL,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,cAAc,OAAO,gBAAgB;AAAA,MACrC,QAAQ,2BAA2B,OAAO,KAAK;AAAA,IACjD;AAAA,EACF,CAAC;AACL;AAEA,SAAS,uBAAuB,MAAmB,OAA4B;AAC7E,QAAM,CAAC,cAAc,iBAAiB,IAAI,KAAK;AAC/C,QAAM,CAAC,eAAe,kBAAkB,IAAI,MAAM;AAElD,MAAI,iBAAiB,eAAe;AAClC,WAAO,eAAe;AAAA,EACxB;AAEA,MAAI,sBAAsB,oBAAoB;AAC5C,WAAO,oBAAoB;AAAA,EAC7B;AAEA,SAAO,KAAK,KAAK,MAAM;AACzB;AAEA,SAAS,eAAe,MAAc,OAAuB;AAC3D,QAAM,CAAC,iBAAiB,IAAI,eAAe,EAAE,IAAI,KAAK,MAAM,GAAG;AAC/D,QAAM,CAAC,kBAAkB,IAAI,gBAAgB,EAAE,IAAI,MAAM,MAAM,GAAG;AAClE,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,cAAc,OAAO,eAAe;AAE1C,MAAI,eAAe,aAAa;AAC9B,WAAO,aAAa;AAAA,EACtB;AAEA,SAAO,OAAO,YAAY,IAAI,OAAO,aAAa;AACpD;AAEA,SAAS,qBAA6C;AACpD,SAAO,uBAAO,OAAO,IAAI;AAC3B;AAEA,SAAS,6BAAiE;AACxE,SAAO,uBAAO,OAAO,IAAI;AAC3B;","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Document } from '../document/document.js';
|
|
2
|
+
import { ReaderGraphDelta } from '../reader/types.js';
|
|
3
|
+
import '../source/meta.js';
|
|
4
|
+
import 'zod';
|
|
5
|
+
import '../source/toc.js';
|
|
6
|
+
import '../source/types.js';
|
|
7
|
+
import '../document/database.js';
|
|
8
|
+
import 'sqlite3';
|
|
9
|
+
import '../document/text-streams.js';
|
|
10
|
+
import '../document/types.js';
|
|
11
|
+
import '../document/stores.js';
|
|
12
|
+
import '../reader/attention/attention.js';
|
|
13
|
+
import '../reader/chunk-batch/types.js';
|
|
14
|
+
import '../common/language.js';
|
|
15
|
+
import '../llm/client.js';
|
|
16
|
+
import '../llm/context.js';
|
|
17
|
+
import '../llm/cache.js';
|
|
18
|
+
import '../llm/types.js';
|
|
19
|
+
import 'ai';
|
|
20
|
+
import '../reader/segment/types.js';
|
|
21
|
+
|
|
22
|
+
declare class Topology {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(document: Document, serialId: number, groupWordsCount: number);
|
|
25
|
+
accept(delta: ReaderGraphDelta): void;
|
|
26
|
+
finalize(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { Topology };
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { groupSegments } from "./grouping.js";
|
|
2
|
+
import { buildSnakeGraph } from "./snake-graph-builder.js";
|
|
3
|
+
import {
|
|
4
|
+
detectSnakesInComponent,
|
|
5
|
+
splitConnectedComponents
|
|
6
|
+
} from "./snake-detector.js";
|
|
7
|
+
import {
|
|
8
|
+
computeChunkWeights,
|
|
9
|
+
computeReadingEdgeWeights,
|
|
10
|
+
getReadingEdgeKey
|
|
11
|
+
} from "./weights.js";
|
|
12
|
+
const DEFAULT_SNAKE_WORDS_COUNT = 280;
|
|
13
|
+
class Topology {
|
|
14
|
+
#chunkIds = [];
|
|
15
|
+
#chunksById = createChunkRecord();
|
|
16
|
+
#document;
|
|
17
|
+
#edgeKeys = [];
|
|
18
|
+
#edgesByKey = createEdgeRecord();
|
|
19
|
+
#groupWordsCount;
|
|
20
|
+
#serialId;
|
|
21
|
+
constructor(document, serialId, groupWordsCount) {
|
|
22
|
+
this.#document = document;
|
|
23
|
+
this.#groupWordsCount = groupWordsCount;
|
|
24
|
+
this.#serialId = serialId;
|
|
25
|
+
}
|
|
26
|
+
accept(delta) {
|
|
27
|
+
for (const chunk of delta.chunks) {
|
|
28
|
+
this.#saveChunk(chunk);
|
|
29
|
+
}
|
|
30
|
+
if (delta.importanceAnnotations !== void 0) {
|
|
31
|
+
for (const annotation of delta.importanceAnnotations) {
|
|
32
|
+
const chunk = this.#chunksById[String(annotation.chunkId)];
|
|
33
|
+
if (chunk === void 0) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
this.#chunksById[String(annotation.chunkId)] = {
|
|
37
|
+
...chunk,
|
|
38
|
+
importance: annotation.importance
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const edge of delta.edges) {
|
|
43
|
+
this.#saveEdge(edge);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async finalize() {
|
|
47
|
+
const chunks = this.#listChunks();
|
|
48
|
+
const edges = this.#listEdges();
|
|
49
|
+
const chunkWeights = computeChunkWeights(chunks);
|
|
50
|
+
const edgeWeights = computeReadingEdgeWeights({
|
|
51
|
+
chunkWeights,
|
|
52
|
+
edges
|
|
53
|
+
});
|
|
54
|
+
const weightedChunks = chunks.map((chunk) => ({
|
|
55
|
+
...chunk,
|
|
56
|
+
weight: chunkWeights[String(chunk.id)] ?? 0
|
|
57
|
+
}));
|
|
58
|
+
const weightedEdges = edges.map((edge) => ({
|
|
59
|
+
...edge,
|
|
60
|
+
weight: edgeWeights[getReadingEdgeKey(edge.fromId, edge.toId)] ?? 0
|
|
61
|
+
}));
|
|
62
|
+
const sentenceGroups = await groupSegments({
|
|
63
|
+
chunks: weightedChunks,
|
|
64
|
+
edges: weightedEdges,
|
|
65
|
+
fragments: this.#document.getSerialFragments(this.#serialId),
|
|
66
|
+
groupWordsCount: this.#groupWordsCount,
|
|
67
|
+
serialId: this.#serialId
|
|
68
|
+
});
|
|
69
|
+
const snakeTopology = buildSnakeTopology({
|
|
70
|
+
chunks: weightedChunks,
|
|
71
|
+
edges: weightedEdges,
|
|
72
|
+
sentenceGroups,
|
|
73
|
+
serialId: this.#serialId
|
|
74
|
+
});
|
|
75
|
+
await this.#document.serials.ensure(this.#serialId);
|
|
76
|
+
const chunkIdMap = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const chunk of weightedChunks) {
|
|
78
|
+
const createdChunk = await this.#document.chunks.create({
|
|
79
|
+
content: chunk.content,
|
|
80
|
+
generation: chunk.generation,
|
|
81
|
+
label: chunk.label,
|
|
82
|
+
sentenceId: chunk.sentenceId,
|
|
83
|
+
sentenceIds: chunk.sentenceIds,
|
|
84
|
+
weight: chunk.weight,
|
|
85
|
+
wordsCount: chunk.wordsCount,
|
|
86
|
+
...chunk.importance === void 0 ? {} : { importance: chunk.importance },
|
|
87
|
+
...chunk.retention === void 0 ? {} : { retention: chunk.retention }
|
|
88
|
+
});
|
|
89
|
+
chunkIdMap.set(chunk.id, createdChunk.id);
|
|
90
|
+
}
|
|
91
|
+
for (const edge of weightedEdges) {
|
|
92
|
+
const fromId = chunkIdMap.get(edge.fromId);
|
|
93
|
+
const toId = chunkIdMap.get(edge.toId);
|
|
94
|
+
if (fromId === void 0 || toId === void 0) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
await this.#document.readingEdges.save({
|
|
98
|
+
...edge,
|
|
99
|
+
fromId,
|
|
100
|
+
toId
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
await this.#document.fragmentGroups.saveMany(sentenceGroups);
|
|
104
|
+
const snakeIds = [];
|
|
105
|
+
for (const snake of snakeTopology.snakes) {
|
|
106
|
+
snakeIds.push(
|
|
107
|
+
await this.#document.snakes.create({
|
|
108
|
+
firstLabel: snake.firstLabel,
|
|
109
|
+
groupId: snake.groupId,
|
|
110
|
+
lastLabel: snake.lastLabel,
|
|
111
|
+
localSnakeId: snake.localSnakeId,
|
|
112
|
+
serialId: this.#serialId,
|
|
113
|
+
size: snake.size,
|
|
114
|
+
weight: snake.weight,
|
|
115
|
+
wordsCount: snake.wordsCount
|
|
116
|
+
})
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
for (const snakeChunk of snakeTopology.snakeChunks) {
|
|
120
|
+
const snakeId = snakeIds[snakeChunk.snakeIndex];
|
|
121
|
+
if (snakeId === void 0) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
await this.#document.snakeChunks.save({
|
|
125
|
+
chunkId: chunkIdMap.get(snakeChunk.chunkId) ?? snakeChunk.chunkId,
|
|
126
|
+
position: snakeChunk.position,
|
|
127
|
+
snakeId
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
for (const snakeEdge of snakeTopology.snakeEdges) {
|
|
131
|
+
const fromSnakeId = snakeIds[snakeEdge.fromSnakeIndex];
|
|
132
|
+
const toSnakeId = snakeIds[snakeEdge.toSnakeIndex];
|
|
133
|
+
if (fromSnakeId === void 0 || toSnakeId === void 0) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
await this.#document.snakeEdges.save({
|
|
137
|
+
fromSnakeId,
|
|
138
|
+
toSnakeId,
|
|
139
|
+
weight: snakeEdge.weight
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
#listChunks() {
|
|
144
|
+
return [...this.#chunkIds].sort(compareNumber).map((chunkId) => this.#chunksById[String(chunkId)]).filter((chunk) => chunk !== void 0);
|
|
145
|
+
}
|
|
146
|
+
#listEdges() {
|
|
147
|
+
return [...this.#edgeKeys].sort(compareEdgeKey).map((edgeKey) => this.#edgesByKey[edgeKey]).filter((edge) => edge !== void 0);
|
|
148
|
+
}
|
|
149
|
+
#saveChunk(chunk) {
|
|
150
|
+
const chunkId = String(chunk.id);
|
|
151
|
+
if (this.#chunksById[chunkId] === void 0) {
|
|
152
|
+
this.#chunkIds.push(chunk.id);
|
|
153
|
+
}
|
|
154
|
+
const importance = chunk.importance;
|
|
155
|
+
const retention = chunk.retention;
|
|
156
|
+
this.#chunksById[chunkId] = {
|
|
157
|
+
content: chunk.content,
|
|
158
|
+
generation: chunk.generation,
|
|
159
|
+
id: chunk.id,
|
|
160
|
+
label: chunk.label,
|
|
161
|
+
sentenceId: chunk.sentenceId,
|
|
162
|
+
sentenceIds: [...chunk.sentenceIds],
|
|
163
|
+
wordsCount: chunk.wordsCount,
|
|
164
|
+
weight: 0,
|
|
165
|
+
...importance === void 0 ? {} : { importance },
|
|
166
|
+
...retention === void 0 ? {} : { retention }
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
#saveEdge(edge) {
|
|
170
|
+
const edgeKey = getReadingEdgeKey(edge.fromId, edge.toId);
|
|
171
|
+
if (this.#edgesByKey[edgeKey] === void 0) {
|
|
172
|
+
this.#edgeKeys.push(edgeKey);
|
|
173
|
+
}
|
|
174
|
+
const strength = edge.strength;
|
|
175
|
+
this.#edgesByKey[edgeKey] = {
|
|
176
|
+
fromId: edge.fromId,
|
|
177
|
+
toId: edge.toId,
|
|
178
|
+
weight: 0,
|
|
179
|
+
...strength === void 0 ? {} : { strength }
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function compareEdgeKey(left, right) {
|
|
184
|
+
const [leftFromIdText = "", leftToIdText = ""] = left.split(":");
|
|
185
|
+
const [rightFromIdText = "", rightToIdText = ""] = right.split(":");
|
|
186
|
+
const leftFromId = Number(leftFromIdText);
|
|
187
|
+
const rightFromId = Number(rightFromIdText);
|
|
188
|
+
if (leftFromId !== rightFromId) {
|
|
189
|
+
return leftFromId - rightFromId;
|
|
190
|
+
}
|
|
191
|
+
return Number(leftToIdText) - Number(rightToIdText);
|
|
192
|
+
}
|
|
193
|
+
function compareNumber(left, right) {
|
|
194
|
+
return left - right;
|
|
195
|
+
}
|
|
196
|
+
function createChunkRecord() {
|
|
197
|
+
return /* @__PURE__ */ Object.create(null);
|
|
198
|
+
}
|
|
199
|
+
function createEdgeRecord() {
|
|
200
|
+
return /* @__PURE__ */ Object.create(null);
|
|
201
|
+
}
|
|
202
|
+
function buildSnakeTopology(input) {
|
|
203
|
+
const chunksById = createChunkRecord();
|
|
204
|
+
const chunkIdsByGroupId = createNumberListRecord();
|
|
205
|
+
const edgesByGroupId = createReadingEdgeListRecord();
|
|
206
|
+
const sentenceRangesByGroupId = [];
|
|
207
|
+
for (const sentenceGroup of input.sentenceGroups) {
|
|
208
|
+
if (sentenceGroup.serialId !== input.serialId) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
sentenceRangesByGroupId.push(sentenceGroup);
|
|
212
|
+
}
|
|
213
|
+
for (const chunk of input.chunks) {
|
|
214
|
+
const groupId = findSentenceGroupId(
|
|
215
|
+
sentenceRangesByGroupId,
|
|
216
|
+
chunk.sentenceId[1]
|
|
217
|
+
);
|
|
218
|
+
chunksById[String(chunk.id)] = chunk;
|
|
219
|
+
if (groupId === void 0) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (chunkIdsByGroupId[String(groupId)] === void 0) {
|
|
223
|
+
chunkIdsByGroupId[String(groupId)] = [];
|
|
224
|
+
}
|
|
225
|
+
chunkIdsByGroupId[String(groupId)]?.push(chunk.id);
|
|
226
|
+
}
|
|
227
|
+
for (const edge of input.edges) {
|
|
228
|
+
const fromChunk = chunksById[String(edge.fromId)];
|
|
229
|
+
const toChunk = chunksById[String(edge.toId)];
|
|
230
|
+
if (fromChunk === void 0 || toChunk === void 0) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const fromGroupId = findSentenceGroupId(
|
|
234
|
+
sentenceRangesByGroupId,
|
|
235
|
+
fromChunk.sentenceId[1]
|
|
236
|
+
);
|
|
237
|
+
const toGroupId = findSentenceGroupId(
|
|
238
|
+
sentenceRangesByGroupId,
|
|
239
|
+
toChunk.sentenceId[1]
|
|
240
|
+
);
|
|
241
|
+
if (fromGroupId === void 0 || toGroupId === void 0) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (fromGroupId !== toGroupId) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (edgesByGroupId[String(fromGroupId)] === void 0) {
|
|
248
|
+
edgesByGroupId[String(fromGroupId)] = [];
|
|
249
|
+
}
|
|
250
|
+
edgesByGroupId[String(fromGroupId)]?.push(edge);
|
|
251
|
+
}
|
|
252
|
+
const snakes = [];
|
|
253
|
+
const snakeChunks = [];
|
|
254
|
+
const snakeEdges = [];
|
|
255
|
+
for (const groupId of listSortedRecordNumbers(chunkIdsByGroupId)) {
|
|
256
|
+
const groupChunkIds = [...chunkIdsByGroupId[String(groupId)] ?? []].sort(
|
|
257
|
+
compareNumber
|
|
258
|
+
);
|
|
259
|
+
const groupEdges = edgesByGroupId[String(groupId)] ?? [];
|
|
260
|
+
const groupSnakeChunkIds = [];
|
|
261
|
+
for (const componentChunkIds of splitConnectedComponents({
|
|
262
|
+
chunkIds: groupChunkIds,
|
|
263
|
+
edges: groupEdges
|
|
264
|
+
})) {
|
|
265
|
+
const componentChunkIdRecord = createBooleanRecord();
|
|
266
|
+
for (const chunkId of componentChunkIds) {
|
|
267
|
+
componentChunkIdRecord[String(chunkId)] = true;
|
|
268
|
+
}
|
|
269
|
+
groupSnakeChunkIds.push(
|
|
270
|
+
...detectSnakesInComponent({
|
|
271
|
+
chunks: componentChunkIds.map((chunkId) => chunksById[String(chunkId)]).filter((chunk) => chunk !== void 0),
|
|
272
|
+
edges: groupEdges.filter(
|
|
273
|
+
(edge) => componentChunkIdRecord[String(edge.fromId)] === true && componentChunkIdRecord[String(edge.toId)] === true
|
|
274
|
+
),
|
|
275
|
+
snakeWordsCount: DEFAULT_SNAKE_WORDS_COUNT
|
|
276
|
+
})
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
const snakeStartIndex = snakes.length;
|
|
280
|
+
for (const [localSnakeId, snakeChunkIds] of groupSnakeChunkIds.entries()) {
|
|
281
|
+
const firstChunkId = snakeChunkIds[0];
|
|
282
|
+
const lastChunkId = snakeChunkIds[snakeChunkIds.length - 1];
|
|
283
|
+
const firstChunk = firstChunkId === void 0 ? void 0 : chunksById[String(firstChunkId)];
|
|
284
|
+
const lastChunk = lastChunkId === void 0 ? void 0 : chunksById[String(lastChunkId)];
|
|
285
|
+
if (firstChunk === void 0 || lastChunk === void 0) {
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
const snakeIndex = snakeStartIndex + localSnakeId;
|
|
289
|
+
snakes.push({
|
|
290
|
+
firstLabel: firstChunk.label,
|
|
291
|
+
groupId,
|
|
292
|
+
lastLabel: lastChunk.label,
|
|
293
|
+
localSnakeId,
|
|
294
|
+
size: snakeChunkIds.length,
|
|
295
|
+
weight: snakeChunkIds.reduce((sum, chunkId) => {
|
|
296
|
+
return sum + (chunksById[String(chunkId)]?.weight ?? 0);
|
|
297
|
+
}, 0),
|
|
298
|
+
wordsCount: snakeChunkIds.reduce((sum, chunkId) => {
|
|
299
|
+
return sum + (chunksById[String(chunkId)]?.wordsCount ?? 0);
|
|
300
|
+
}, 0)
|
|
301
|
+
});
|
|
302
|
+
for (const [position, chunkId] of snakeChunkIds.entries()) {
|
|
303
|
+
snakeChunks.push({
|
|
304
|
+
chunkId,
|
|
305
|
+
position,
|
|
306
|
+
snakeIndex
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
snakeEdges.push(
|
|
311
|
+
...buildSnakeGraph({
|
|
312
|
+
chunksById,
|
|
313
|
+
edges: groupEdges,
|
|
314
|
+
snakes: groupSnakeChunkIds
|
|
315
|
+
}).map((edge) => ({
|
|
316
|
+
fromSnakeIndex: snakeStartIndex + edge.fromSnakeIndex,
|
|
317
|
+
toSnakeIndex: snakeStartIndex + edge.toSnakeIndex,
|
|
318
|
+
weight: edge.weight
|
|
319
|
+
}))
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
return {
|
|
323
|
+
snakeChunks,
|
|
324
|
+
snakeEdges,
|
|
325
|
+
snakes
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
function findSentenceGroupId(groups, sentenceIndex) {
|
|
329
|
+
return groups.find(
|
|
330
|
+
(group) => sentenceIndex >= group.startSentenceIndex && sentenceIndex <= group.endSentenceIndex
|
|
331
|
+
)?.groupId;
|
|
332
|
+
}
|
|
333
|
+
function createBooleanRecord() {
|
|
334
|
+
return /* @__PURE__ */ Object.create(null);
|
|
335
|
+
}
|
|
336
|
+
function createNumberListRecord() {
|
|
337
|
+
return /* @__PURE__ */ Object.create(null);
|
|
338
|
+
}
|
|
339
|
+
function createReadingEdgeListRecord() {
|
|
340
|
+
return /* @__PURE__ */ Object.create(null);
|
|
341
|
+
}
|
|
342
|
+
function listSortedRecordNumbers(record) {
|
|
343
|
+
return Object.keys(record).map(Number).sort(compareNumber);
|
|
344
|
+
}
|
|
345
|
+
export {
|
|
346
|
+
Topology
|
|
347
|
+
};
|
|
348
|
+
//# sourceMappingURL=topology.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/topology/topology.ts"],"sourcesContent":["import type {\n ChunkRecord,\n Document,\n ReadingEdgeRecord,\n SentenceGroupRecord,\n} from \"../document/index.js\";\nimport type { ReaderChunk, ReaderGraphDelta } from \"../reader/index.js\";\nimport { groupSegments } from \"./grouping.js\";\nimport { buildSnakeGraph } from \"./snake-graph-builder.js\";\nimport {\n detectSnakesInComponent,\n splitConnectedComponents,\n} from \"./snake-detector.js\";\nimport {\n computeChunkWeights,\n computeReadingEdgeWeights,\n getReadingEdgeKey,\n} from \"./weights.js\";\n\nconst DEFAULT_SNAKE_WORDS_COUNT = 280;\n\nexport class Topology {\n readonly #chunkIds: number[] = [];\n readonly #chunksById = createChunkRecord();\n readonly #document: Document;\n readonly #edgeKeys: string[] = [];\n readonly #edgesByKey = createEdgeRecord();\n readonly #groupWordsCount: number;\n readonly #serialId: number;\n\n public constructor(\n document: Document,\n serialId: number,\n groupWordsCount: number,\n ) {\n this.#document = document;\n this.#groupWordsCount = groupWordsCount;\n this.#serialId = serialId;\n }\n\n public accept(delta: ReaderGraphDelta): void {\n for (const chunk of delta.chunks) {\n this.#saveChunk(chunk);\n }\n\n if (delta.importanceAnnotations !== undefined) {\n for (const annotation of delta.importanceAnnotations) {\n const chunk = this.#chunksById[String(annotation.chunkId)];\n\n if (chunk === undefined) {\n continue;\n }\n\n this.#chunksById[String(annotation.chunkId)] = {\n ...chunk,\n importance: annotation.importance,\n };\n }\n }\n\n for (const edge of delta.edges) {\n this.#saveEdge(edge);\n }\n }\n\n public async finalize(): Promise<void> {\n const chunks = this.#listChunks();\n const edges = this.#listEdges();\n const chunkWeights = computeChunkWeights(chunks);\n const edgeWeights = computeReadingEdgeWeights({\n chunkWeights,\n edges,\n });\n const weightedChunks = chunks.map((chunk) => ({\n ...chunk,\n weight: chunkWeights[String(chunk.id)] ?? 0,\n }));\n const weightedEdges = edges.map((edge) => ({\n ...edge,\n weight: edgeWeights[getReadingEdgeKey(edge.fromId, edge.toId)] ?? 0,\n }));\n const sentenceGroups = await groupSegments({\n chunks: weightedChunks,\n edges: weightedEdges,\n fragments: this.#document.getSerialFragments(this.#serialId),\n groupWordsCount: this.#groupWordsCount,\n serialId: this.#serialId,\n });\n const snakeTopology = buildSnakeTopology({\n chunks: weightedChunks,\n edges: weightedEdges,\n sentenceGroups,\n serialId: this.#serialId,\n });\n\n await this.#document.serials.ensure(this.#serialId);\n\n const chunkIdMap = new Map<number, number>();\n\n for (const chunk of weightedChunks) {\n const createdChunk = await this.#document.chunks.create({\n content: chunk.content,\n generation: chunk.generation,\n label: chunk.label,\n sentenceId: chunk.sentenceId,\n sentenceIds: chunk.sentenceIds,\n weight: chunk.weight,\n wordsCount: chunk.wordsCount,\n ...(chunk.importance === undefined\n ? {}\n : { importance: chunk.importance }),\n ...(chunk.retention === undefined\n ? {}\n : { retention: chunk.retention }),\n });\n\n chunkIdMap.set(chunk.id, createdChunk.id);\n }\n\n for (const edge of weightedEdges) {\n const fromId = chunkIdMap.get(edge.fromId);\n const toId = chunkIdMap.get(edge.toId);\n\n if (fromId === undefined || toId === undefined) {\n continue;\n }\n\n await this.#document.readingEdges.save({\n ...edge,\n fromId,\n toId,\n });\n }\n\n await this.#document.fragmentGroups.saveMany(sentenceGroups);\n\n const snakeIds: number[] = [];\n\n for (const snake of snakeTopology.snakes) {\n snakeIds.push(\n await this.#document.snakes.create({\n firstLabel: snake.firstLabel,\n groupId: snake.groupId,\n lastLabel: snake.lastLabel,\n localSnakeId: snake.localSnakeId,\n serialId: this.#serialId,\n size: snake.size,\n weight: snake.weight,\n wordsCount: snake.wordsCount,\n }),\n );\n }\n\n for (const snakeChunk of snakeTopology.snakeChunks) {\n const snakeId = snakeIds[snakeChunk.snakeIndex];\n\n if (snakeId === undefined) {\n continue;\n }\n\n await this.#document.snakeChunks.save({\n chunkId: chunkIdMap.get(snakeChunk.chunkId) ?? snakeChunk.chunkId,\n position: snakeChunk.position,\n snakeId,\n });\n }\n\n for (const snakeEdge of snakeTopology.snakeEdges) {\n const fromSnakeId = snakeIds[snakeEdge.fromSnakeIndex];\n const toSnakeId = snakeIds[snakeEdge.toSnakeIndex];\n\n if (fromSnakeId === undefined || toSnakeId === undefined) {\n continue;\n }\n\n await this.#document.snakeEdges.save({\n fromSnakeId,\n toSnakeId,\n weight: snakeEdge.weight,\n });\n }\n }\n\n #listChunks(): ChunkRecord[] {\n return [...this.#chunkIds]\n .sort(compareNumber)\n .map((chunkId) => this.#chunksById[String(chunkId)])\n .filter((chunk): chunk is ChunkRecord => chunk !== undefined);\n }\n\n #listEdges(): ReadingEdgeRecord[] {\n return [...this.#edgeKeys]\n .sort(compareEdgeKey)\n .map((edgeKey) => this.#edgesByKey[edgeKey])\n .filter((edge): edge is ReadingEdgeRecord => edge !== undefined);\n }\n\n #saveChunk(chunk: ReaderChunk): void {\n const chunkId = String(chunk.id);\n\n if (this.#chunksById[chunkId] === undefined) {\n this.#chunkIds.push(chunk.id);\n }\n\n const importance = chunk.importance;\n const retention = chunk.retention;\n\n this.#chunksById[chunkId] = {\n content: chunk.content,\n generation: chunk.generation,\n id: chunk.id,\n label: chunk.label,\n sentenceId: chunk.sentenceId,\n sentenceIds: [...chunk.sentenceIds],\n wordsCount: chunk.wordsCount,\n weight: 0,\n ...(importance === undefined ? {} : { importance }),\n ...(retention === undefined ? {} : { retention }),\n };\n }\n\n #saveEdge(edge: ReaderGraphDelta[\"edges\"][number]): void {\n const edgeKey = getReadingEdgeKey(edge.fromId, edge.toId);\n\n if (this.#edgesByKey[edgeKey] === undefined) {\n this.#edgeKeys.push(edgeKey);\n }\n\n const strength = edge.strength;\n\n this.#edgesByKey[edgeKey] = {\n fromId: edge.fromId,\n toId: edge.toId,\n weight: 0,\n ...(strength === undefined ? {} : { strength }),\n };\n }\n}\n\nfunction compareEdgeKey(left: string, right: string): number {\n const [leftFromIdText = \"\", leftToIdText = \"\"] = left.split(\":\");\n const [rightFromIdText = \"\", rightToIdText = \"\"] = right.split(\":\");\n const leftFromId = Number(leftFromIdText);\n const rightFromId = Number(rightFromIdText);\n\n if (leftFromId !== rightFromId) {\n return leftFromId - rightFromId;\n }\n\n return Number(leftToIdText) - Number(rightToIdText);\n}\n\nfunction compareNumber(left: number, right: number): number {\n return left - right;\n}\n\nfunction createChunkRecord(): Record<string, ChunkRecord | undefined> {\n return Object.create(null) as Record<string, ChunkRecord | undefined>;\n}\n\nfunction createEdgeRecord(): Record<string, ReadingEdgeRecord | undefined> {\n return Object.create(null) as Record<string, ReadingEdgeRecord | undefined>;\n}\n\ninterface SnakeDraft {\n readonly firstLabel: string;\n readonly groupId: number;\n readonly lastLabel: string;\n readonly localSnakeId: number;\n readonly size: number;\n readonly weight: number;\n readonly wordsCount: number;\n}\n\ninterface SnakeChunkDraft {\n readonly chunkId: number;\n readonly position: number;\n readonly snakeIndex: number;\n}\n\ninterface SnakeEdgeDraft {\n readonly fromSnakeIndex: number;\n readonly toSnakeIndex: number;\n readonly weight: number;\n}\n\nfunction buildSnakeTopology(input: {\n chunks: readonly ChunkRecord[];\n edges: readonly ReadingEdgeRecord[];\n sentenceGroups: readonly SentenceGroupRecord[];\n serialId: number;\n}): {\n readonly snakeChunks: readonly SnakeChunkDraft[];\n readonly snakeEdges: readonly SnakeEdgeDraft[];\n readonly snakes: readonly SnakeDraft[];\n} {\n const chunksById = createChunkRecord();\n const chunkIdsByGroupId = createNumberListRecord();\n const edgesByGroupId = createReadingEdgeListRecord();\n const sentenceRangesByGroupId: Array<{\n readonly endSentenceIndex: number;\n readonly groupId: number;\n readonly startSentenceIndex: number;\n }> = [];\n\n for (const sentenceGroup of input.sentenceGroups) {\n if (sentenceGroup.serialId !== input.serialId) {\n continue;\n }\n\n sentenceRangesByGroupId.push(sentenceGroup);\n }\n\n for (const chunk of input.chunks) {\n const groupId = findSentenceGroupId(\n sentenceRangesByGroupId,\n chunk.sentenceId[1],\n );\n\n chunksById[String(chunk.id)] = chunk;\n if (groupId === undefined) {\n continue;\n }\n if (chunkIdsByGroupId[String(groupId)] === undefined) {\n chunkIdsByGroupId[String(groupId)] = [];\n }\n chunkIdsByGroupId[String(groupId)]?.push(chunk.id);\n }\n\n for (const edge of input.edges) {\n const fromChunk = chunksById[String(edge.fromId)];\n const toChunk = chunksById[String(edge.toId)];\n\n if (fromChunk === undefined || toChunk === undefined) {\n continue;\n }\n\n const fromGroupId = findSentenceGroupId(\n sentenceRangesByGroupId,\n fromChunk.sentenceId[1],\n );\n const toGroupId = findSentenceGroupId(\n sentenceRangesByGroupId,\n toChunk.sentenceId[1],\n );\n\n if (fromGroupId === undefined || toGroupId === undefined) {\n continue;\n }\n if (fromGroupId !== toGroupId) {\n continue;\n }\n if (edgesByGroupId[String(fromGroupId)] === undefined) {\n edgesByGroupId[String(fromGroupId)] = [];\n }\n\n edgesByGroupId[String(fromGroupId)]?.push(edge);\n }\n\n const snakes: SnakeDraft[] = [];\n const snakeChunks: SnakeChunkDraft[] = [];\n const snakeEdges: SnakeEdgeDraft[] = [];\n\n for (const groupId of listSortedRecordNumbers(chunkIdsByGroupId)) {\n const groupChunkIds = [...(chunkIdsByGroupId[String(groupId)] ?? [])].sort(\n compareNumber,\n );\n const groupEdges = edgesByGroupId[String(groupId)] ?? [];\n const groupSnakeChunkIds: number[][] = [];\n\n for (const componentChunkIds of splitConnectedComponents({\n chunkIds: groupChunkIds,\n edges: groupEdges,\n })) {\n const componentChunkIdRecord = createBooleanRecord();\n\n for (const chunkId of componentChunkIds) {\n componentChunkIdRecord[String(chunkId)] = true;\n }\n\n groupSnakeChunkIds.push(\n ...detectSnakesInComponent({\n chunks: componentChunkIds\n .map((chunkId) => chunksById[String(chunkId)])\n .filter((chunk): chunk is ChunkRecord => chunk !== undefined),\n edges: groupEdges.filter(\n (edge) =>\n componentChunkIdRecord[String(edge.fromId)] === true &&\n componentChunkIdRecord[String(edge.toId)] === true,\n ),\n snakeWordsCount: DEFAULT_SNAKE_WORDS_COUNT,\n }),\n );\n }\n\n const snakeStartIndex = snakes.length;\n\n for (const [localSnakeId, snakeChunkIds] of groupSnakeChunkIds.entries()) {\n const firstChunkId = snakeChunkIds[0];\n const lastChunkId = snakeChunkIds[snakeChunkIds.length - 1];\n const firstChunk =\n firstChunkId === undefined\n ? undefined\n : chunksById[String(firstChunkId)];\n const lastChunk =\n lastChunkId === undefined ? undefined : chunksById[String(lastChunkId)];\n\n if (firstChunk === undefined || lastChunk === undefined) {\n continue;\n }\n\n const snakeIndex = snakeStartIndex + localSnakeId;\n\n snakes.push({\n firstLabel: firstChunk.label,\n groupId,\n lastLabel: lastChunk.label,\n localSnakeId,\n size: snakeChunkIds.length,\n weight: snakeChunkIds.reduce((sum, chunkId) => {\n return sum + (chunksById[String(chunkId)]?.weight ?? 0);\n }, 0),\n wordsCount: snakeChunkIds.reduce((sum, chunkId) => {\n return sum + (chunksById[String(chunkId)]?.wordsCount ?? 0);\n }, 0),\n });\n\n for (const [position, chunkId] of snakeChunkIds.entries()) {\n snakeChunks.push({\n chunkId,\n position,\n snakeIndex,\n });\n }\n }\n\n snakeEdges.push(\n ...buildSnakeGraph({\n chunksById,\n edges: groupEdges,\n snakes: groupSnakeChunkIds,\n }).map((edge) => ({\n fromSnakeIndex: snakeStartIndex + edge.fromSnakeIndex,\n toSnakeIndex: snakeStartIndex + edge.toSnakeIndex,\n weight: edge.weight,\n })),\n );\n }\n\n return {\n snakeChunks,\n snakeEdges,\n snakes,\n };\n}\n\nfunction findSentenceGroupId(\n groups: readonly {\n readonly endSentenceIndex: number;\n readonly groupId: number;\n readonly startSentenceIndex: number;\n }[],\n sentenceIndex: number,\n): number | undefined {\n return groups.find(\n (group) =>\n sentenceIndex >= group.startSentenceIndex &&\n sentenceIndex <= group.endSentenceIndex,\n )?.groupId;\n}\n\nfunction createBooleanRecord(): Record<string, boolean | undefined> {\n return Object.create(null) as Record<string, boolean | undefined>;\n}\n\nfunction createNumberListRecord(): Record<string, number[] | undefined> {\n return Object.create(null) as Record<string, number[] | undefined>;\n}\n\nfunction createReadingEdgeListRecord(): Record<\n string,\n ReadingEdgeRecord[] | undefined\n> {\n return Object.create(null) as Record<string, ReadingEdgeRecord[] | undefined>;\n}\n\nfunction listSortedRecordNumbers(\n record: Readonly<Record<string, number[] | undefined>>,\n): number[] {\n return Object.keys(record).map(Number).sort(compareNumber);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ChunkRecord, ReadingEdgeRecord } from '../document/types.js';
|
|
2
|
+
|
|
3
|
+
declare function computeChunkWeights(chunks: readonly ChunkRecord[]): Readonly<Record<string, number>>;
|
|
4
|
+
declare function computeReadingEdgeWeights(input: {
|
|
5
|
+
chunkWeights: Readonly<Record<string, number>>;
|
|
6
|
+
edges: readonly ReadingEdgeRecord[];
|
|
7
|
+
}): Readonly<Record<string, number>>;
|
|
8
|
+
declare function getReadingEdgeKey(fromId: number, toId: number): string;
|
|
9
|
+
|
|
10
|
+
export { computeChunkWeights, computeReadingEdgeWeights, getReadingEdgeKey };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChunkImportance,
|
|
3
|
+
ChunkRetention
|
|
4
|
+
} from "../document/index.js";
|
|
5
|
+
const MIN_EDGE_WEIGHT = 0.1;
|
|
6
|
+
const IMPORTANCE_WEIGHTS = {
|
|
7
|
+
[ChunkImportance.Critical]: 9,
|
|
8
|
+
[ChunkImportance.Helpful]: 1,
|
|
9
|
+
[ChunkImportance.Important]: 3
|
|
10
|
+
};
|
|
11
|
+
const LINK_STRENGTH_WEIGHTS = {
|
|
12
|
+
critical: 9,
|
|
13
|
+
helpful: 1,
|
|
14
|
+
important: 3
|
|
15
|
+
};
|
|
16
|
+
const RETENTION_WEIGHTS = {
|
|
17
|
+
[ChunkRetention.Detailed]: 9,
|
|
18
|
+
[ChunkRetention.Focused]: 3,
|
|
19
|
+
[ChunkRetention.Relevant]: 1,
|
|
20
|
+
[ChunkRetention.Verbatim]: 27
|
|
21
|
+
};
|
|
22
|
+
function computeChunkWeights(chunks) {
|
|
23
|
+
const weights = createNumberRecord();
|
|
24
|
+
for (const chunk of chunks) {
|
|
25
|
+
weights[String(chunk.id)] = computeChunkWeight(chunk);
|
|
26
|
+
}
|
|
27
|
+
return weights;
|
|
28
|
+
}
|
|
29
|
+
function computeReadingEdgeWeights(input) {
|
|
30
|
+
const strengthsByChunkId = createNumberRecord();
|
|
31
|
+
for (const edge of input.edges) {
|
|
32
|
+
const strengthWeight = getLinkStrengthWeight(edge.strength);
|
|
33
|
+
strengthsByChunkId[String(edge.fromId)] = (strengthsByChunkId[String(edge.fromId)] ?? 0) + strengthWeight;
|
|
34
|
+
strengthsByChunkId[String(edge.toId)] = (strengthsByChunkId[String(edge.toId)] ?? 0) + strengthWeight;
|
|
35
|
+
}
|
|
36
|
+
const edgeWeights = createNumberRecord();
|
|
37
|
+
for (const edge of input.edges) {
|
|
38
|
+
const strengthWeight = getLinkStrengthWeight(edge.strength);
|
|
39
|
+
const fromChunkWeight = input.chunkWeights[String(edge.fromId)] ?? 0;
|
|
40
|
+
const toChunkWeight = input.chunkWeights[String(edge.toId)] ?? 0;
|
|
41
|
+
const fromTotalStrength = strengthsByChunkId[String(edge.fromId)] ?? 0;
|
|
42
|
+
const toTotalStrength = strengthsByChunkId[String(edge.toId)] ?? 0;
|
|
43
|
+
const fromHalfWeight = fromTotalStrength === 0 ? 0 : fromChunkWeight * (strengthWeight / fromTotalStrength);
|
|
44
|
+
const toHalfWeight = toTotalStrength === 0 ? 0 : toChunkWeight * (strengthWeight / toTotalStrength);
|
|
45
|
+
edgeWeights[getReadingEdgeKey(edge.fromId, edge.toId)] = Math.max(
|
|
46
|
+
fromHalfWeight + toHalfWeight,
|
|
47
|
+
MIN_EDGE_WEIGHT
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return edgeWeights;
|
|
51
|
+
}
|
|
52
|
+
function getReadingEdgeKey(fromId, toId) {
|
|
53
|
+
return `${fromId}:${toId}`;
|
|
54
|
+
}
|
|
55
|
+
function computeChunkWeight(chunk) {
|
|
56
|
+
return getRetentionWeight(chunk.retention) + getImportanceWeight(chunk.importance);
|
|
57
|
+
}
|
|
58
|
+
function getImportanceWeight(importance) {
|
|
59
|
+
if (importance === void 0) {
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
return IMPORTANCE_WEIGHTS[importance] ?? 0;
|
|
63
|
+
}
|
|
64
|
+
function getLinkStrengthWeight(strength) {
|
|
65
|
+
if (strength === void 0) {
|
|
66
|
+
return 1;
|
|
67
|
+
}
|
|
68
|
+
return LINK_STRENGTH_WEIGHTS[strength] ?? 1;
|
|
69
|
+
}
|
|
70
|
+
function getRetentionWeight(retention) {
|
|
71
|
+
if (retention === void 0) {
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
return RETENTION_WEIGHTS[retention] ?? 0;
|
|
75
|
+
}
|
|
76
|
+
function createNumberRecord() {
|
|
77
|
+
return /* @__PURE__ */ Object.create(null);
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
computeChunkWeights,
|
|
81
|
+
computeReadingEdgeWeights,
|
|
82
|
+
getReadingEdgeKey
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=weights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/topology/weights.ts"],"sourcesContent":["import {\n ChunkImportance,\n ChunkRetention,\n type ChunkRecord,\n type ReadingEdgeRecord,\n} from \"../document/index.js\";\n\nconst MIN_EDGE_WEIGHT = 0.1;\n\nconst IMPORTANCE_WEIGHTS: Readonly<Record<ChunkImportance, number>> = {\n [ChunkImportance.Critical]: 9,\n [ChunkImportance.Helpful]: 1,\n [ChunkImportance.Important]: 3,\n};\n\nconst LINK_STRENGTH_WEIGHTS: Readonly<Record<string, number>> = {\n critical: 9,\n helpful: 1,\n important: 3,\n};\n\nconst RETENTION_WEIGHTS: Readonly<Record<ChunkRetention, number>> = {\n [ChunkRetention.Detailed]: 9,\n [ChunkRetention.Focused]: 3,\n [ChunkRetention.Relevant]: 1,\n [ChunkRetention.Verbatim]: 27,\n};\n\nexport function computeChunkWeights(\n chunks: readonly ChunkRecord[],\n): Readonly<Record<string, number>> {\n const weights = createNumberRecord();\n\n for (const chunk of chunks) {\n weights[String(chunk.id)] = computeChunkWeight(chunk);\n }\n\n return weights;\n}\n\nexport function computeReadingEdgeWeights(input: {\n chunkWeights: Readonly<Record<string, number>>;\n edges: readonly ReadingEdgeRecord[];\n}): Readonly<Record<string, number>> {\n const strengthsByChunkId = createNumberRecord();\n\n for (const edge of input.edges) {\n const strengthWeight = getLinkStrengthWeight(edge.strength);\n\n strengthsByChunkId[String(edge.fromId)] =\n (strengthsByChunkId[String(edge.fromId)] ?? 0) + strengthWeight;\n strengthsByChunkId[String(edge.toId)] =\n (strengthsByChunkId[String(edge.toId)] ?? 0) + strengthWeight;\n }\n\n const edgeWeights = createNumberRecord();\n\n for (const edge of input.edges) {\n const strengthWeight = getLinkStrengthWeight(edge.strength);\n const fromChunkWeight = input.chunkWeights[String(edge.fromId)] ?? 0;\n const toChunkWeight = input.chunkWeights[String(edge.toId)] ?? 0;\n const fromTotalStrength = strengthsByChunkId[String(edge.fromId)] ?? 0;\n const toTotalStrength = strengthsByChunkId[String(edge.toId)] ?? 0;\n const fromHalfWeight =\n fromTotalStrength === 0\n ? 0\n : fromChunkWeight * (strengthWeight / fromTotalStrength);\n const toHalfWeight =\n toTotalStrength === 0\n ? 0\n : toChunkWeight * (strengthWeight / toTotalStrength);\n\n edgeWeights[getReadingEdgeKey(edge.fromId, edge.toId)] = Math.max(\n fromHalfWeight + toHalfWeight,\n MIN_EDGE_WEIGHT,\n );\n }\n\n return edgeWeights;\n}\n\nexport function getReadingEdgeKey(fromId: number, toId: number): string {\n return `${fromId}:${toId}`;\n}\n\nfunction computeChunkWeight(chunk: ChunkRecord): number {\n return (\n getRetentionWeight(chunk.retention) + getImportanceWeight(chunk.importance)\n );\n}\n\nfunction getImportanceWeight(importance: ChunkImportance | undefined): number {\n if (importance === undefined) {\n return 0;\n }\n\n return IMPORTANCE_WEIGHTS[importance] ?? 0;\n}\n\nfunction getLinkStrengthWeight(strength: string | undefined): number {\n if (strength === undefined) {\n return 1;\n }\n\n return LINK_STRENGTH_WEIGHTS[strength] ?? 1;\n}\n\nfunction getRetentionWeight(retention: ChunkRetention | undefined): number {\n if (retention === undefined) {\n return 0;\n }\n\n return RETENTION_WEIGHTS[retention] ?? 0;\n}\n\nfunction createNumberRecord(): Record<string, number> {\n return Object.create(null) as Record<string, number>;\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAEP,MAAM,kBAAkB;AAExB,MAAM,qBAAgE;AAAA,EACpE,CAAC,gBAAgB,QAAQ,GAAG;AAAA,EAC5B,CAAC,gBAAgB,OAAO,GAAG;AAAA,EAC3B,CAAC,gBAAgB,SAAS,GAAG;AAC/B;AAEA,MAAM,wBAA0D;AAAA,EAC9D,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AACb;AAEA,MAAM,oBAA8D;AAAA,EAClE,CAAC,eAAe,QAAQ,GAAG;AAAA,EAC3B,CAAC,eAAe,OAAO,GAAG;AAAA,EAC1B,CAAC,eAAe,QAAQ,GAAG;AAAA,EAC3B,CAAC,eAAe,QAAQ,GAAG;AAC7B;AAEO,SAAS,oBACd,QACkC;AAClC,QAAM,UAAU,mBAAmB;AAEnC,aAAW,SAAS,QAAQ;AAC1B,YAAQ,OAAO,MAAM,EAAE,CAAC,IAAI,mBAAmB,KAAK;AAAA,EACtD;AAEA,SAAO;AACT;AAEO,SAAS,0BAA0B,OAGL;AACnC,QAAM,qBAAqB,mBAAmB;AAE9C,aAAW,QAAQ,MAAM,OAAO;AAC9B,UAAM,iBAAiB,sBAAsB,KAAK,QAAQ;AAE1D,uBAAmB,OAAO,KAAK,MAAM,CAAC,KACnC,mBAAmB,OAAO,KAAK,MAAM,CAAC,KAAK,KAAK;AACnD,uBAAmB,OAAO,KAAK,IAAI,CAAC,KACjC,mBAAmB,OAAO,KAAK,IAAI,CAAC,KAAK,KAAK;AAAA,EACnD;AAEA,QAAM,cAAc,mBAAmB;AAEvC,aAAW,QAAQ,MAAM,OAAO;AAC9B,UAAM,iBAAiB,sBAAsB,KAAK,QAAQ;AAC1D,UAAM,kBAAkB,MAAM,aAAa,OAAO,KAAK,MAAM,CAAC,KAAK;AACnE,UAAM,gBAAgB,MAAM,aAAa,OAAO,KAAK,IAAI,CAAC,KAAK;AAC/D,UAAM,oBAAoB,mBAAmB,OAAO,KAAK,MAAM,CAAC,KAAK;AACrE,UAAM,kBAAkB,mBAAmB,OAAO,KAAK,IAAI,CAAC,KAAK;AACjE,UAAM,iBACJ,sBAAsB,IAClB,IACA,mBAAmB,iBAAiB;AAC1C,UAAM,eACJ,oBAAoB,IAChB,IACA,iBAAiB,iBAAiB;AAExC,gBAAY,kBAAkB,KAAK,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,MAC5D,iBAAiB;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,QAAgB,MAAsB;AACtE,SAAO,GAAG,MAAM,IAAI,IAAI;AAC1B;AAEA,SAAS,mBAAmB,OAA4B;AACtD,SACE,mBAAmB,MAAM,SAAS,IAAI,oBAAoB,MAAM,UAAU;AAE9E;AAEA,SAAS,oBAAoB,YAAiD;AAC5E,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,mBAAmB,UAAU,KAAK;AAC3C;AAEA,SAAS,sBAAsB,UAAsC;AACnE,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,QAAQ,KAAK;AAC5C;AAEA,SAAS,mBAAmB,WAA+C;AACzE,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,SAAS,KAAK;AACzC;AAEA,SAAS,qBAA6C;AACpD,SAAO,uBAAO,OAAO,IAAI;AAC3B;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface GcContext {
|
|
2
|
+
readonly force: boolean;
|
|
3
|
+
readonly now: number;
|
|
4
|
+
readonly stateDirectoryPath: string;
|
|
5
|
+
readonly dryRun: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface GcJobResult {
|
|
8
|
+
readonly scanned: number;
|
|
9
|
+
readonly removed: number;
|
|
10
|
+
readonly freedBytes: number;
|
|
11
|
+
}
|
|
12
|
+
interface GcJobReport extends GcJobResult {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly error?: string;
|
|
15
|
+
}
|
|
16
|
+
interface GcRunReport extends GcJobResult {
|
|
17
|
+
readonly jobs: readonly GcJobReport[];
|
|
18
|
+
readonly skipped: boolean;
|
|
19
|
+
readonly startedAt: number;
|
|
20
|
+
readonly finishedAt: number;
|
|
21
|
+
}
|
|
22
|
+
type GcJob = (context: GcContext) => Promise<GcJobResult>;
|
|
23
|
+
|
|
24
|
+
export type { GcRunReport as G, GcContext as a, GcJob as b, GcJobReport as c, GcJobResult as d };
|