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,337 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import {
|
|
3
|
+
GuaranteedParseValidationError,
|
|
4
|
+
GuaranteedRequestFailureError,
|
|
5
|
+
ParsedJsonError,
|
|
6
|
+
RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,
|
|
7
|
+
requestGuaranteedJson
|
|
8
|
+
} from "../../guaranteed/index.js";
|
|
9
|
+
import {
|
|
10
|
+
EVIDENCE_SELECTION_PROMPT_FRAGMENT,
|
|
11
|
+
normalizeEvidenceDisplayText
|
|
12
|
+
} from "../../evidence-selection/index.js";
|
|
13
|
+
import {
|
|
14
|
+
bookCoherenceResponseSchema,
|
|
15
|
+
ChunkBatchParser,
|
|
16
|
+
ChunkMetadataField,
|
|
17
|
+
userFocusedResponseSchema
|
|
18
|
+
} from "./parser.js";
|
|
19
|
+
import { FragmentProjection } from "./fragment-projection.js";
|
|
20
|
+
import { projectFragmentText } from "./fragment-projection.js";
|
|
21
|
+
import { needsTranslation } from "./language.js";
|
|
22
|
+
import {
|
|
23
|
+
BOOK_COHERENCE_PROMPT_TEMPLATE,
|
|
24
|
+
EVIDENCE_CHOICE_PROMPT_TEMPLATE,
|
|
25
|
+
TRANSLATE_CHUNKS_PROMPT_TEMPLATE,
|
|
26
|
+
USER_FOCUSED_PROMPT_TEMPLATE
|
|
27
|
+
} from "./prompt-templates.js";
|
|
28
|
+
const MAX_CHUNK_REGENERATIONS = 7;
|
|
29
|
+
const TRANSLATED_CHUNK_SCHEMA = z.object({
|
|
30
|
+
content: z.string(),
|
|
31
|
+
id: z.number(),
|
|
32
|
+
label: z.string()
|
|
33
|
+
});
|
|
34
|
+
const TRANSLATED_CHUNKS_SCHEMA = z.array(TRANSLATED_CHUNK_SCHEMA);
|
|
35
|
+
const MAX_TRANSLATION_RETRIES = 3;
|
|
36
|
+
class ChunkExtractor {
|
|
37
|
+
#extractionGuidance;
|
|
38
|
+
#llm;
|
|
39
|
+
#scopes;
|
|
40
|
+
#sentenceTextSource;
|
|
41
|
+
#userLanguage;
|
|
42
|
+
constructor(options) {
|
|
43
|
+
this.#extractionGuidance = options.extractionGuidance;
|
|
44
|
+
this.#llm = options.llm;
|
|
45
|
+
this.#scopes = options.scopes;
|
|
46
|
+
this.#sentenceTextSource = options.sentenceTextSource;
|
|
47
|
+
this.#userLanguage = options.userLanguage;
|
|
48
|
+
}
|
|
49
|
+
async extractUserFocused(input) {
|
|
50
|
+
const projection = new FragmentProjection(input.sentences);
|
|
51
|
+
const messages = this.#buildMessages({
|
|
52
|
+
promptTemplateName: USER_FOCUSED_PROMPT_TEMPLATE,
|
|
53
|
+
templateContext: {
|
|
54
|
+
extraction_guidance: this.#extractionGuidance,
|
|
55
|
+
evidence_selection_prompt: EVIDENCE_SELECTION_PROMPT_FRAGMENT,
|
|
56
|
+
user_language: this.#userLanguage,
|
|
57
|
+
working_memory: input.workingMemoryPrompt
|
|
58
|
+
},
|
|
59
|
+
text: formatEvidenceSelectionSourceText(projection)
|
|
60
|
+
});
|
|
61
|
+
const extraction = await this.#extractChunks({
|
|
62
|
+
emptyChunkBatch: {
|
|
63
|
+
chunks: [],
|
|
64
|
+
links: [],
|
|
65
|
+
orderCorrect: true,
|
|
66
|
+
tempIds: []
|
|
67
|
+
},
|
|
68
|
+
messages,
|
|
69
|
+
metadataField: ChunkMetadataField.Retention,
|
|
70
|
+
projection,
|
|
71
|
+
schema: userFocusedResponseSchema,
|
|
72
|
+
sentences: input.sentences,
|
|
73
|
+
visibleChunkIds: input.visibleChunkIds
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
chunkBatch: await this.#ensureChunkBatchLanguage(
|
|
77
|
+
extraction.result.chunkBatch,
|
|
78
|
+
extraction.parser
|
|
79
|
+
),
|
|
80
|
+
fragmentSummary: extraction.result.fragmentSummary ?? ""
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async extractBookCoherence(input) {
|
|
84
|
+
const projection = new FragmentProjection(input.sentences);
|
|
85
|
+
const messages = this.#buildMessages({
|
|
86
|
+
promptTemplateName: BOOK_COHERENCE_PROMPT_TEMPLATE,
|
|
87
|
+
templateContext: {
|
|
88
|
+
user_focused_chunks: input.userFocusedChunks.map((chunk) => ({
|
|
89
|
+
content: chunk.content,
|
|
90
|
+
id: chunk.id,
|
|
91
|
+
label: chunk.label
|
|
92
|
+
})),
|
|
93
|
+
evidence_selection_prompt: EVIDENCE_SELECTION_PROMPT_FRAGMENT,
|
|
94
|
+
user_language: this.#userLanguage,
|
|
95
|
+
working_memory: input.workingMemoryPrompt
|
|
96
|
+
},
|
|
97
|
+
text: formatEvidenceSelectionSourceText(projection)
|
|
98
|
+
});
|
|
99
|
+
const extraction = await this.#extractChunks({
|
|
100
|
+
emptyChunkBatch: {
|
|
101
|
+
chunks: [],
|
|
102
|
+
importanceAnnotations: [],
|
|
103
|
+
links: [],
|
|
104
|
+
orderCorrect: true,
|
|
105
|
+
tempIds: []
|
|
106
|
+
},
|
|
107
|
+
messages,
|
|
108
|
+
metadataField: ChunkMetadataField.Importance,
|
|
109
|
+
projection,
|
|
110
|
+
schema: bookCoherenceResponseSchema,
|
|
111
|
+
sentences: input.sentences,
|
|
112
|
+
validImportanceChunkIds: input.userFocusedChunks.map((chunk) => chunk.id),
|
|
113
|
+
visibleChunkIds: input.visibleChunkIds
|
|
114
|
+
});
|
|
115
|
+
return await this.#ensureChunkBatchLanguage(
|
|
116
|
+
extraction.result.chunkBatch,
|
|
117
|
+
extraction.parser
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
#buildMessages(input) {
|
|
121
|
+
return [
|
|
122
|
+
{
|
|
123
|
+
content: this.#llm.loadSystemPrompt(
|
|
124
|
+
input.promptTemplateName,
|
|
125
|
+
input.templateContext
|
|
126
|
+
),
|
|
127
|
+
role: "system"
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
content: input.text,
|
|
131
|
+
role: "user"
|
|
132
|
+
}
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
async #extractChunks(input) {
|
|
136
|
+
return await this.#llm.withContext(
|
|
137
|
+
async (context) => {
|
|
138
|
+
const parser = new ChunkBatchParser({
|
|
139
|
+
metadataField: input.metadataField,
|
|
140
|
+
projection: input.projection,
|
|
141
|
+
responseIntentClassifierPrompt: this.#llm.loadSystemPrompt(
|
|
142
|
+
RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE
|
|
143
|
+
),
|
|
144
|
+
sentenceTextSource: this.#sentenceTextSource,
|
|
145
|
+
sentences: input.sentences,
|
|
146
|
+
visibleChunkIds: input.visibleChunkIds,
|
|
147
|
+
choiceSystemPrompt: this.#llm.loadSystemPrompt(
|
|
148
|
+
EVIDENCE_CHOICE_PROMPT_TEMPLATE,
|
|
149
|
+
{
|
|
150
|
+
extraction_guidance: this.#extractionGuidance,
|
|
151
|
+
metadata_field: input.metadataField,
|
|
152
|
+
user_language: this.#userLanguage
|
|
153
|
+
}
|
|
154
|
+
),
|
|
155
|
+
requestChoice: async (messages, index, maxRetries) => await context.request(messages, {
|
|
156
|
+
retryIndex: index,
|
|
157
|
+
retryMax: maxRetries,
|
|
158
|
+
scope: this.#scopes.choice,
|
|
159
|
+
useCache: false
|
|
160
|
+
}),
|
|
161
|
+
...input.validImportanceChunkIds === void 0 ? {} : {
|
|
162
|
+
validImportanceChunkIds: input.validImportanceChunkIds
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
try {
|
|
166
|
+
const result = await requestGuaranteedJson({
|
|
167
|
+
messages: input.messages,
|
|
168
|
+
schema: input.schema,
|
|
169
|
+
maxRetries: MAX_CHUNK_REGENERATIONS,
|
|
170
|
+
parse: async (data, index, maxRetries) => await parser.parse(data, {
|
|
171
|
+
isLastGenerationAttempt: index >= maxRetries
|
|
172
|
+
}),
|
|
173
|
+
responseIntentClassifierPrompt: this.#llm.loadSystemPrompt(
|
|
174
|
+
RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE
|
|
175
|
+
),
|
|
176
|
+
request: async (messages, index, maxRetries) => await context.request(messages, {
|
|
177
|
+
retryIndex: index,
|
|
178
|
+
retryMax: maxRetries,
|
|
179
|
+
scope: this.#scopes.extraction
|
|
180
|
+
})
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
parser,
|
|
184
|
+
result
|
|
185
|
+
};
|
|
186
|
+
} catch (error) {
|
|
187
|
+
if (isRecoverableChunkExtractionFailure(error)) {
|
|
188
|
+
return {
|
|
189
|
+
parser,
|
|
190
|
+
result: {
|
|
191
|
+
chunkBatch: input.emptyChunkBatch
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* 对于 AI 来说,原本应该直接生成正确语言的文字和摘要,但因为
|
|
202
|
+
* 强迫 AI 在不同语言之间切换非常困难,经常会出现语言不符合要求的情况。
|
|
203
|
+
*
|
|
204
|
+
* 所以我们的处理方案是:
|
|
205
|
+
* 1. 通过程序找到那些与要求语言不一致的句子
|
|
206
|
+
* 2. 直接再用 AI 把这些句子翻译过去
|
|
207
|
+
*
|
|
208
|
+
* 这是一个保底手段。
|
|
209
|
+
*/
|
|
210
|
+
async #ensureChunkBatchLanguage(chunkBatch, parser) {
|
|
211
|
+
if (this.#userLanguage === void 0 || chunkBatch.chunks.length === 0) {
|
|
212
|
+
return chunkBatch;
|
|
213
|
+
}
|
|
214
|
+
const translationInput = [];
|
|
215
|
+
for (const [index, chunk] of chunkBatch.chunks.entries()) {
|
|
216
|
+
if (!needsTranslation({
|
|
217
|
+
content: chunk.content,
|
|
218
|
+
label: chunk.label,
|
|
219
|
+
targetLanguage: this.#userLanguage
|
|
220
|
+
})) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
translationInput.push({
|
|
224
|
+
content: chunk.content,
|
|
225
|
+
id: index,
|
|
226
|
+
label: chunk.label,
|
|
227
|
+
sourceSentences: await parser.getChunkSourceSentences(chunk)
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (translationInput.length === 0) {
|
|
231
|
+
return chunkBatch;
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
const translatedChunks = await this.#translateChunks(
|
|
235
|
+
translationInput,
|
|
236
|
+
this.#userLanguage
|
|
237
|
+
);
|
|
238
|
+
const translatedById = createTranslatedChunkRecord(translatedChunks);
|
|
239
|
+
return {
|
|
240
|
+
...chunkBatch,
|
|
241
|
+
chunks: chunkBatch.chunks.map((chunk, index) => {
|
|
242
|
+
const translated = translatedById[String(index)];
|
|
243
|
+
if (translated === void 0) {
|
|
244
|
+
return chunk;
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
...chunk,
|
|
248
|
+
content: translated.content,
|
|
249
|
+
label: translated.label
|
|
250
|
+
};
|
|
251
|
+
})
|
|
252
|
+
};
|
|
253
|
+
} catch {
|
|
254
|
+
return chunkBatch;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async #translateChunks(chunks, userLanguage) {
|
|
258
|
+
return await requestGuaranteedJson({
|
|
259
|
+
messages: [
|
|
260
|
+
{
|
|
261
|
+
content: this.#llm.loadSystemPrompt(
|
|
262
|
+
TRANSLATE_CHUNKS_PROMPT_TEMPLATE,
|
|
263
|
+
{
|
|
264
|
+
user_language: userLanguage
|
|
265
|
+
}
|
|
266
|
+
),
|
|
267
|
+
role: "system"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
content: JSON.stringify(chunks, void 0, 2),
|
|
271
|
+
role: "user"
|
|
272
|
+
}
|
|
273
|
+
],
|
|
274
|
+
schema: TRANSLATED_CHUNKS_SCHEMA,
|
|
275
|
+
maxRetries: MAX_TRANSLATION_RETRIES,
|
|
276
|
+
parse: (data) => {
|
|
277
|
+
validateTranslatedChunks(chunks, data);
|
|
278
|
+
return data;
|
|
279
|
+
},
|
|
280
|
+
responseIntentClassifierPrompt: this.#llm.loadSystemPrompt(
|
|
281
|
+
RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE
|
|
282
|
+
),
|
|
283
|
+
request: async (messages, index, maxRetries) => await this.#llm.request(messages, {
|
|
284
|
+
retryIndex: index,
|
|
285
|
+
retryMax: maxRetries,
|
|
286
|
+
scope: this.#scopes.extraction
|
|
287
|
+
})
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function formatEvidenceSelectionSourceText(projection) {
|
|
292
|
+
return projection.sentences.map(
|
|
293
|
+
(sentence, index) => `S${index + 1}: ${projectFragmentText(
|
|
294
|
+
normalizeEvidenceDisplayText(sentence.rawText)
|
|
295
|
+
)}`
|
|
296
|
+
).join("\n");
|
|
297
|
+
}
|
|
298
|
+
function isParsedJsonValidationFailure(error) {
|
|
299
|
+
return error instanceof GuaranteedParseValidationError && error.cause instanceof ParsedJsonError;
|
|
300
|
+
}
|
|
301
|
+
function isRecoverableChunkExtractionFailure(error) {
|
|
302
|
+
return isParsedJsonValidationFailure(error) || error instanceof GuaranteedRequestFailureError;
|
|
303
|
+
}
|
|
304
|
+
function createTranslatedChunkRecord(translatedChunks) {
|
|
305
|
+
const record = /* @__PURE__ */ Object.create(null);
|
|
306
|
+
for (const chunk of translatedChunks) {
|
|
307
|
+
record[String(chunk.id)] = chunk;
|
|
308
|
+
}
|
|
309
|
+
return record;
|
|
310
|
+
}
|
|
311
|
+
function validateTranslatedChunks(chunks, translatedChunks) {
|
|
312
|
+
const issues = [];
|
|
313
|
+
if (translatedChunks.length !== chunks.length) {
|
|
314
|
+
issues.push(
|
|
315
|
+
`Expected ${chunks.length} translated chunk(s), got ${translatedChunks.length}`
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
for (const [index, chunk] of chunks.entries()) {
|
|
319
|
+
const translatedChunk = translatedChunks[index];
|
|
320
|
+
if (translatedChunk === void 0) {
|
|
321
|
+
issues.push(`Missing translated chunk at position ${index}`);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (translatedChunk.id !== chunk.id) {
|
|
325
|
+
issues.push(
|
|
326
|
+
`Translated chunk at position ${index} must keep id ${chunk.id}, got ${translatedChunk.id}`
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (issues.length > 0) {
|
|
331
|
+
throw new ParsedJsonError(issues);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
export {
|
|
335
|
+
ChunkExtractor
|
|
336
|
+
};
|
|
337
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/reader/chunk-batch/extractor.ts"],"sourcesContent":["import { z, type ZodType } from \"zod\";\n\nimport {\n GuaranteedParseValidationError,\n GuaranteedRequestFailureError,\n ParsedJsonError,\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n requestGuaranteedJson,\n} from \"../../guaranteed/index.js\";\nimport type { Language } from \"../../common/language.js\";\nimport {\n EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n normalizeEvidenceDisplayText,\n} from \"../../evidence-selection/index.js\";\nimport type { LLMessage, LLM } from \"../../llm/index.js\";\nimport {\n bookCoherenceResponseSchema,\n ChunkBatchParser,\n ChunkMetadataField,\n type BookCoherenceResponseData,\n type ExtractChunksResult,\n type UserFocusedResponseData,\n userFocusedResponseSchema,\n} from \"./parser.js\";\nimport { FragmentProjection } from \"./fragment-projection.js\";\nimport { projectFragmentText } from \"./fragment-projection.js\";\nimport { needsTranslation } from \"./language.js\";\nimport {\n BOOK_COHERENCE_PROMPT_TEMPLATE,\n EVIDENCE_CHOICE_PROMPT_TEMPLATE,\n TRANSLATE_CHUNKS_PROMPT_TEMPLATE,\n USER_FOCUSED_PROMPT_TEMPLATE,\n} from \"./prompt-templates.js\";\nimport type {\n ChunkBatch,\n ChunkBatchOptions,\n ChunkExtractionSentence,\n ChunkTranslationInput,\n ChunkTranslationOutput,\n ExtractBookCoherenceInput,\n ExtractUserFocusedInput,\n ExtractUserFocusedResult,\n} from \"./types.js\";\n\nconst MAX_CHUNK_REGENERATIONS = 7;\n\ninterface ExtractChunksInput<\n TData extends UserFocusedResponseData | BookCoherenceResponseData,\n> {\n readonly emptyChunkBatch: ChunkBatch;\n readonly messages: readonly LLMessage[];\n readonly metadataField: ChunkMetadataField;\n readonly projection: FragmentProjection;\n readonly schema: ZodType<TData>;\n readonly sentences: readonly ChunkExtractionSentence[];\n readonly validImportanceChunkIds?: readonly number[];\n readonly visibleChunkIds: readonly number[];\n}\n\ninterface ExtractChunksOutput<\n TData extends UserFocusedResponseData | BookCoherenceResponseData,\n> {\n readonly parser: ChunkBatchParser<TData>;\n readonly result: ExtractChunksResult;\n}\nconst TRANSLATED_CHUNK_SCHEMA = z.object({\n content: z.string(),\n id: z.number(),\n label: z.string(),\n});\nconst TRANSLATED_CHUNKS_SCHEMA = z.array(TRANSLATED_CHUNK_SCHEMA);\nconst MAX_TRANSLATION_RETRIES = 3;\n\nexport class ChunkExtractor<S extends string> {\n readonly #extractionGuidance: string;\n readonly #llm: LLM<S>;\n readonly #scopes: ChunkBatchOptions<S>[\"scopes\"];\n readonly #sentenceTextSource: ChunkBatchOptions<S>[\"sentenceTextSource\"];\n readonly #userLanguage: Language | undefined;\n\n public constructor(options: ChunkBatchOptions<S>) {\n this.#extractionGuidance = options.extractionGuidance;\n this.#llm = options.llm;\n this.#scopes = options.scopes;\n this.#sentenceTextSource = options.sentenceTextSource;\n this.#userLanguage = options.userLanguage;\n }\n\n public async extractUserFocused(\n input: ExtractUserFocusedInput,\n ): Promise<ExtractUserFocusedResult> {\n const projection = new FragmentProjection(input.sentences);\n const messages = this.#buildMessages({\n promptTemplateName: USER_FOCUSED_PROMPT_TEMPLATE,\n templateContext: {\n extraction_guidance: this.#extractionGuidance,\n evidence_selection_prompt: EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n user_language: this.#userLanguage,\n working_memory: input.workingMemoryPrompt,\n },\n text: formatEvidenceSelectionSourceText(projection),\n });\n const extraction = await this.#extractChunks({\n emptyChunkBatch: {\n chunks: [],\n links: [],\n orderCorrect: true,\n tempIds: [],\n },\n messages,\n metadataField: ChunkMetadataField.Retention,\n projection,\n schema: userFocusedResponseSchema,\n sentences: input.sentences,\n visibleChunkIds: input.visibleChunkIds,\n });\n\n return {\n chunkBatch: await this.#ensureChunkBatchLanguage(\n extraction.result.chunkBatch,\n extraction.parser,\n ),\n fragmentSummary: extraction.result.fragmentSummary ?? \"\",\n };\n }\n\n public async extractBookCoherence(\n input: ExtractBookCoherenceInput,\n ): Promise<ChunkBatch> {\n const projection = new FragmentProjection(input.sentences);\n const messages = this.#buildMessages({\n promptTemplateName: BOOK_COHERENCE_PROMPT_TEMPLATE,\n templateContext: {\n user_focused_chunks: input.userFocusedChunks.map((chunk) => ({\n content: chunk.content,\n id: chunk.id,\n label: chunk.label,\n })),\n evidence_selection_prompt: EVIDENCE_SELECTION_PROMPT_FRAGMENT,\n user_language: this.#userLanguage,\n working_memory: input.workingMemoryPrompt,\n },\n text: formatEvidenceSelectionSourceText(projection),\n });\n const extraction = await this.#extractChunks({\n emptyChunkBatch: {\n chunks: [],\n importanceAnnotations: [],\n links: [],\n orderCorrect: true,\n tempIds: [],\n },\n messages,\n metadataField: ChunkMetadataField.Importance,\n projection,\n schema: bookCoherenceResponseSchema,\n sentences: input.sentences,\n validImportanceChunkIds: input.userFocusedChunks.map((chunk) => chunk.id),\n visibleChunkIds: input.visibleChunkIds,\n });\n\n return await this.#ensureChunkBatchLanguage(\n extraction.result.chunkBatch,\n extraction.parser,\n );\n }\n\n #buildMessages(input: {\n promptTemplateName: string;\n templateContext: Record<string, unknown>;\n text: string;\n }): LLMessage[] {\n return [\n {\n content: this.#llm.loadSystemPrompt(\n input.promptTemplateName,\n input.templateContext,\n ),\n role: \"system\",\n },\n {\n content: input.text,\n role: \"user\",\n },\n ];\n }\n\n async #extractChunks<\n TData extends UserFocusedResponseData | BookCoherenceResponseData,\n >(input: ExtractChunksInput<TData>): Promise<ExtractChunksOutput<TData>> {\n return await this.#llm.withContext(\n async (context): Promise<ExtractChunksOutput<TData>> => {\n const parser = new ChunkBatchParser<TData>({\n metadataField: input.metadataField,\n projection: input.projection,\n responseIntentClassifierPrompt: this.#llm.loadSystemPrompt(\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n ),\n sentenceTextSource: this.#sentenceTextSource,\n sentences: input.sentences,\n visibleChunkIds: input.visibleChunkIds,\n choiceSystemPrompt: this.#llm.loadSystemPrompt(\n EVIDENCE_CHOICE_PROMPT_TEMPLATE,\n {\n extraction_guidance: this.#extractionGuidance,\n metadata_field: input.metadataField,\n user_language: this.#userLanguage,\n },\n ),\n requestChoice: async (messages, index, maxRetries) =>\n await context.request(messages, {\n retryIndex: index,\n retryMax: maxRetries,\n scope: this.#scopes.choice,\n useCache: false,\n }),\n ...(input.validImportanceChunkIds === undefined\n ? {}\n : {\n validImportanceChunkIds: input.validImportanceChunkIds,\n }),\n });\n\n try {\n const result = await requestGuaranteedJson({\n messages: input.messages,\n schema: input.schema,\n maxRetries: MAX_CHUNK_REGENERATIONS,\n parse: async (data, index, maxRetries) =>\n await parser.parse(data, {\n isLastGenerationAttempt: index >= maxRetries,\n }),\n responseIntentClassifierPrompt: this.#llm.loadSystemPrompt(\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n ),\n request: async (messages, index, maxRetries) =>\n await context.request(messages, {\n retryIndex: index,\n retryMax: maxRetries,\n scope: this.#scopes.extraction,\n }),\n });\n\n return {\n parser,\n result,\n };\n } catch (error) {\n if (isRecoverableChunkExtractionFailure(error)) {\n return {\n parser,\n result: {\n chunkBatch: input.emptyChunkBatch,\n },\n };\n }\n throw error;\n }\n },\n );\n }\n\n /**\n * 对于 AI 来说,原本应该直接生成正确语言的文字和摘要,但因为\n * 强迫 AI 在不同语言之间切换非常困难,经常会出现语言不符合要求的情况。\n *\n * 所以我们的处理方案是:\n * 1. 通过程序找到那些与要求语言不一致的句子\n * 2. 直接再用 AI 把这些句子翻译过去\n *\n * 这是一个保底手段。\n */\n async #ensureChunkBatchLanguage(\n chunkBatch: ChunkBatch,\n parser: ChunkBatchParser<\n UserFocusedResponseData | BookCoherenceResponseData\n >,\n ): Promise<ChunkBatch> {\n if (this.#userLanguage === undefined || chunkBatch.chunks.length === 0) {\n return chunkBatch;\n }\n\n const translationInput: ChunkTranslationInput[] = [];\n\n for (const [index, chunk] of chunkBatch.chunks.entries()) {\n if (\n !needsTranslation({\n content: chunk.content,\n label: chunk.label,\n targetLanguage: this.#userLanguage,\n })\n ) {\n continue;\n }\n\n translationInput.push({\n content: chunk.content,\n id: index,\n label: chunk.label,\n sourceSentences: await parser.getChunkSourceSentences(chunk),\n });\n }\n\n if (translationInput.length === 0) {\n return chunkBatch;\n }\n\n try {\n const translatedChunks = await this.#translateChunks(\n translationInput,\n this.#userLanguage,\n );\n const translatedById = createTranslatedChunkRecord(translatedChunks);\n\n return {\n ...chunkBatch,\n chunks: chunkBatch.chunks.map((chunk, index) => {\n const translated = translatedById[String(index)];\n\n if (translated === undefined) {\n return chunk;\n }\n\n return {\n ...chunk,\n content: translated.content,\n label: translated.label,\n };\n }),\n };\n } catch {\n return chunkBatch;\n }\n }\n\n async #translateChunks(\n chunks: readonly ChunkTranslationInput[],\n userLanguage: Language,\n ): Promise<readonly ChunkTranslationOutput[]> {\n return await requestGuaranteedJson({\n messages: [\n {\n content: this.#llm.loadSystemPrompt(\n TRANSLATE_CHUNKS_PROMPT_TEMPLATE,\n {\n user_language: userLanguage,\n },\n ),\n role: \"system\",\n },\n {\n content: JSON.stringify(chunks, undefined, 2),\n role: \"user\",\n },\n ],\n schema: TRANSLATED_CHUNKS_SCHEMA,\n maxRetries: MAX_TRANSLATION_RETRIES,\n parse: (data) => {\n validateTranslatedChunks(chunks, data);\n return data;\n },\n responseIntentClassifierPrompt: this.#llm.loadSystemPrompt(\n RESPONSE_INTENT_CLASSIFIER_PROMPT_TEMPLATE,\n ),\n request: async (messages, index, maxRetries) =>\n await this.#llm.request(messages, {\n retryIndex: index,\n retryMax: maxRetries,\n scope: this.#scopes.extraction,\n }),\n });\n }\n}\n\nfunction formatEvidenceSelectionSourceText(\n projection: FragmentProjection,\n): string {\n return projection.sentences\n .map(\n (sentence, index) =>\n `S${index + 1}: ${projectFragmentText(\n normalizeEvidenceDisplayText(sentence.rawText),\n )}`,\n )\n .join(\"\\n\");\n}\n\nfunction isParsedJsonValidationFailure(error: unknown): boolean {\n return (\n error instanceof GuaranteedParseValidationError &&\n error.cause instanceof ParsedJsonError\n );\n}\n\nfunction isRecoverableChunkExtractionFailure(error: unknown): boolean {\n return (\n isParsedJsonValidationFailure(error) ||\n error instanceof GuaranteedRequestFailureError\n );\n}\n\nfunction createTranslatedChunkRecord(\n translatedChunks: readonly ChunkTranslationOutput[],\n): Readonly<Record<string, ChunkTranslationOutput>> {\n const record = Object.create(null) as Record<string, ChunkTranslationOutput>;\n\n for (const chunk of translatedChunks) {\n record[String(chunk.id)] = chunk;\n }\n\n return record;\n}\n\nfunction validateTranslatedChunks(\n chunks: readonly ChunkTranslationInput[],\n translatedChunks: readonly ChunkTranslationOutput[],\n): void {\n const issues: string[] = [];\n\n if (translatedChunks.length !== chunks.length) {\n issues.push(\n `Expected ${chunks.length} translated chunk(s), got ${translatedChunks.length}`,\n );\n }\n\n for (const [index, chunk] of chunks.entries()) {\n const translatedChunk = translatedChunks[index];\n\n if (translatedChunk === undefined) {\n issues.push(`Missing translated chunk at position ${index}`);\n continue;\n }\n\n if (translatedChunk.id !== chunk.id) {\n issues.push(\n `Translated chunk at position ${index} must keep id ${chunk.id}, got ${translatedChunk.id}`,\n );\n }\n }\n\n if (issues.length > 0) {\n throw new ParsedJsonError(issues);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SentenceId } from '../../document/types.js';
|
|
2
|
+
import { ChunkExtractionSentence } from './types.js';
|
|
3
|
+
import '../../common/language.js';
|
|
4
|
+
import '../../llm/client.js';
|
|
5
|
+
import '../../llm/context.js';
|
|
6
|
+
import '../../llm/cache.js';
|
|
7
|
+
import '../../llm/types.js';
|
|
8
|
+
import 'ai';
|
|
9
|
+
|
|
10
|
+
interface TextSpan {
|
|
11
|
+
readonly length: number;
|
|
12
|
+
readonly offset: number;
|
|
13
|
+
}
|
|
14
|
+
interface ProjectedFragmentSentence {
|
|
15
|
+
readonly endOffset: number;
|
|
16
|
+
readonly projectedText: string;
|
|
17
|
+
readonly rawText: string;
|
|
18
|
+
readonly sentenceId: SentenceId;
|
|
19
|
+
readonly startOffset: number;
|
|
20
|
+
readonly wordsCount: number;
|
|
21
|
+
}
|
|
22
|
+
declare class FragmentProjection {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(sentences: readonly ChunkExtractionSentence[]);
|
|
25
|
+
get projectedText(): string;
|
|
26
|
+
get rawText(): string;
|
|
27
|
+
get sentences(): readonly ProjectedFragmentSentence[];
|
|
28
|
+
findExactMatches(text: string): readonly TextSpan[];
|
|
29
|
+
projectText(text: string): string;
|
|
30
|
+
resolveSentenceIds(span: TextSpan): SentenceId[];
|
|
31
|
+
}
|
|
32
|
+
declare function projectFragmentText(text: string): string;
|
|
33
|
+
|
|
34
|
+
export { FragmentProjection, type ProjectedFragmentSentence, type TextSpan, projectFragmentText };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const SENTENCE_SEPARATOR = " ";
|
|
2
|
+
const STANDARDIZATION_MAP = {
|
|
3
|
+
'"': "\uFF02",
|
|
4
|
+
"\\": "\uFF3C"
|
|
5
|
+
};
|
|
6
|
+
class FragmentProjection {
|
|
7
|
+
#projectedText;
|
|
8
|
+
#rawText;
|
|
9
|
+
#sentences;
|
|
10
|
+
constructor(sentences) {
|
|
11
|
+
const projectedSentences = [];
|
|
12
|
+
let rawText = "";
|
|
13
|
+
let projectedText = "";
|
|
14
|
+
let offset = 0;
|
|
15
|
+
for (const [index, sentence] of sentences.entries()) {
|
|
16
|
+
if (index > 0) {
|
|
17
|
+
rawText += SENTENCE_SEPARATOR;
|
|
18
|
+
projectedText += SENTENCE_SEPARATOR;
|
|
19
|
+
offset += SENTENCE_SEPARATOR.length;
|
|
20
|
+
}
|
|
21
|
+
const projectedSentenceText = projectFragmentText(sentence.text);
|
|
22
|
+
const startOffset = offset;
|
|
23
|
+
const endOffset = startOffset + projectedSentenceText.length;
|
|
24
|
+
rawText += sentence.text;
|
|
25
|
+
projectedText += projectedSentenceText;
|
|
26
|
+
projectedSentences.push({
|
|
27
|
+
endOffset,
|
|
28
|
+
projectedText: projectedSentenceText,
|
|
29
|
+
rawText: sentence.text,
|
|
30
|
+
sentenceId: sentence.sentenceId,
|
|
31
|
+
startOffset,
|
|
32
|
+
wordsCount: sentence.wordsCount
|
|
33
|
+
});
|
|
34
|
+
offset = endOffset;
|
|
35
|
+
}
|
|
36
|
+
this.#rawText = rawText;
|
|
37
|
+
this.#projectedText = projectedText;
|
|
38
|
+
this.#sentences = projectedSentences;
|
|
39
|
+
}
|
|
40
|
+
get projectedText() {
|
|
41
|
+
return this.#projectedText;
|
|
42
|
+
}
|
|
43
|
+
get rawText() {
|
|
44
|
+
return this.#rawText;
|
|
45
|
+
}
|
|
46
|
+
get sentences() {
|
|
47
|
+
return this.#sentences;
|
|
48
|
+
}
|
|
49
|
+
findExactMatches(text) {
|
|
50
|
+
const query = projectFragmentText(text).trim();
|
|
51
|
+
if (query === "") {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const matches = [];
|
|
55
|
+
let startIndex = 0;
|
|
56
|
+
while (startIndex <= this.#projectedText.length - query.length) {
|
|
57
|
+
const offset = this.#projectedText.indexOf(query, startIndex);
|
|
58
|
+
if (offset === -1) {
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
matches.push({
|
|
62
|
+
length: query.length,
|
|
63
|
+
offset
|
|
64
|
+
});
|
|
65
|
+
startIndex = offset + 1;
|
|
66
|
+
}
|
|
67
|
+
return matches;
|
|
68
|
+
}
|
|
69
|
+
projectText(text) {
|
|
70
|
+
return projectFragmentText(text);
|
|
71
|
+
}
|
|
72
|
+
resolveSentenceIds(span) {
|
|
73
|
+
if (span.length <= 0) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
const rangeStart = span.offset;
|
|
77
|
+
const rangeEnd = span.offset + span.length;
|
|
78
|
+
return this.#sentences.filter(
|
|
79
|
+
(sentence) => sentence.endOffset > rangeStart && sentence.startOffset < rangeEnd
|
|
80
|
+
).map((sentence) => sentence.sentenceId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function projectFragmentText(text) {
|
|
84
|
+
let result = "";
|
|
85
|
+
for (const char of text) {
|
|
86
|
+
result += STANDARDIZATION_MAP[char] ?? char;
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
FragmentProjection,
|
|
92
|
+
projectFragmentText
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=fragment-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/reader/chunk-batch/fragment-projection.ts"],"sourcesContent":["import type { SentenceId } from \"../../document/index.js\";\nimport type { ChunkExtractionSentence } from \"./types.js\";\n\nconst SENTENCE_SEPARATOR = \" \";\n\nconst STANDARDIZATION_MAP = {\n '\"': \""\",\n \"\\\\\": \"\\",\n} as const;\n\nexport interface TextSpan {\n readonly length: number;\n readonly offset: number;\n}\n\nexport interface ProjectedFragmentSentence {\n readonly endOffset: number;\n readonly projectedText: string;\n readonly rawText: string;\n readonly sentenceId: SentenceId;\n readonly startOffset: number;\n readonly wordsCount: number;\n}\n\nexport class FragmentProjection {\n readonly #projectedText: string;\n readonly #rawText: string;\n readonly #sentences: readonly ProjectedFragmentSentence[];\n\n public constructor(sentences: readonly ChunkExtractionSentence[]) {\n const projectedSentences: ProjectedFragmentSentence[] = [];\n let rawText = \"\";\n let projectedText = \"\";\n let offset = 0;\n\n for (const [index, sentence] of sentences.entries()) {\n if (index > 0) {\n rawText += SENTENCE_SEPARATOR;\n projectedText += SENTENCE_SEPARATOR;\n offset += SENTENCE_SEPARATOR.length;\n }\n\n const projectedSentenceText = projectFragmentText(sentence.text);\n const startOffset = offset;\n const endOffset = startOffset + projectedSentenceText.length;\n\n rawText += sentence.text;\n projectedText += projectedSentenceText;\n projectedSentences.push({\n endOffset,\n projectedText: projectedSentenceText,\n rawText: sentence.text,\n sentenceId: sentence.sentenceId,\n startOffset,\n wordsCount: sentence.wordsCount,\n });\n offset = endOffset;\n }\n\n this.#rawText = rawText;\n this.#projectedText = projectedText;\n this.#sentences = projectedSentences;\n }\n\n public get projectedText(): string {\n return this.#projectedText;\n }\n\n public get rawText(): string {\n return this.#rawText;\n }\n\n public get sentences(): readonly ProjectedFragmentSentence[] {\n return this.#sentences;\n }\n\n public findExactMatches(text: string): readonly TextSpan[] {\n const query = projectFragmentText(text).trim();\n\n if (query === \"\") {\n return [];\n }\n\n const matches: TextSpan[] = [];\n let startIndex = 0;\n\n while (startIndex <= this.#projectedText.length - query.length) {\n const offset = this.#projectedText.indexOf(query, startIndex);\n\n if (offset === -1) {\n break;\n }\n\n matches.push({\n length: query.length,\n offset,\n });\n startIndex = offset + 1;\n }\n\n return matches;\n }\n\n public projectText(text: string): string {\n return projectFragmentText(text);\n }\n\n public resolveSentenceIds(span: TextSpan): SentenceId[] {\n if (span.length <= 0) {\n return [];\n }\n\n const rangeStart = span.offset;\n const rangeEnd = span.offset + span.length;\n\n return this.#sentences\n .filter(\n (sentence) =>\n sentence.endOffset > rangeStart && sentence.startOffset < rangeEnd,\n )\n .map((sentence) => sentence.sentenceId);\n }\n}\n\nexport function projectFragmentText(text: string): string {\n let result = \"\";\n\n for (const char of text) {\n result +=\n STANDARDIZATION_MAP[char as keyof typeof STANDARDIZATION_MAP] ?? char;\n }\n\n return result;\n}\n"],"mappings":"AAGA,MAAM,qBAAqB;AAE3B,MAAM,sBAAsB;AAAA,EAC1B,KAAK;AAAA,EACL,MAAM;AACR;AAgBO,MAAM,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EAEF,YAAY,WAA+C;AAChE,UAAM,qBAAkD,CAAC;AACzD,QAAI,UAAU;AACd,QAAI,gBAAgB;AACpB,QAAI,SAAS;AAEb,eAAW,CAAC,OAAO,QAAQ,KAAK,UAAU,QAAQ,GAAG;AACnD,UAAI,QAAQ,GAAG;AACb,mBAAW;AACX,yBAAiB;AACjB,kBAAU,mBAAmB;AAAA,MAC/B;AAEA,YAAM,wBAAwB,oBAAoB,SAAS,IAAI;AAC/D,YAAM,cAAc;AACpB,YAAM,YAAY,cAAc,sBAAsB;AAEtD,iBAAW,SAAS;AACpB,uBAAiB;AACjB,yBAAmB,KAAK;AAAA,QACtB;AAAA,QACA,eAAe;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,YAAY,SAAS;AAAA,MACvB,CAAC;AACD,eAAS;AAAA,IACX;AAEA,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,IAAW,gBAAwB;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,UAAkB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,YAAkD;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,iBAAiB,MAAmC;AACzD,UAAM,QAAQ,oBAAoB,IAAI,EAAE,KAAK;AAE7C,QAAI,UAAU,IAAI;AAChB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAsB,CAAC;AAC7B,QAAI,aAAa;AAEjB,WAAO,cAAc,KAAK,eAAe,SAAS,MAAM,QAAQ;AAC9D,YAAM,SAAS,KAAK,eAAe,QAAQ,OAAO,UAAU;AAE5D,UAAI,WAAW,IAAI;AACjB;AAAA,MACF;AAEA,cAAQ,KAAK;AAAA,QACX,QAAQ,MAAM;AAAA,QACd;AAAA,MACF,CAAC;AACD,mBAAa,SAAS;AAAA,IACxB;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY,MAAsB;AACvC,WAAO,oBAAoB,IAAI;AAAA,EACjC;AAAA,EAEO,mBAAmB,MAA8B;AACtD,QAAI,KAAK,UAAU,GAAG;AACpB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,aAAa,KAAK;AACxB,UAAM,WAAW,KAAK,SAAS,KAAK;AAEpC,WAAO,KAAK,WACT;AAAA,MACC,CAAC,aACC,SAAS,YAAY,cAAc,SAAS,cAAc;AAAA,IAC9D,EACC,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,EAC1C;AACF;AAEO,SAAS,oBAAoB,MAAsB;AACxD,MAAI,SAAS;AAEb,aAAW,QAAQ,MAAM;AACvB,cACE,oBAAoB,IAAwC,KAAK;AAAA,EACrE;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { extractBookCoherenceChunkBatch, extractUserFocusedChunkBatch } from './extract.js';
|
|
2
|
+
export { EvidenceResolver } from '../../evidence-selection/anchor-resolver.js';
|
|
3
|
+
export { EvidenceResolutionFailure, EvidenceResolutionResult, RankedSentenceCandidate } from '../../evidence-selection/anchor-types.js';
|
|
4
|
+
export { FragmentProjection, TextSpan } from './fragment-projection.js';
|
|
5
|
+
export { ChunkBatch, ChunkBatchOptions, ChunkExtractionScopes, ChunkExtractionSentence, ChunkImportanceAnnotation, ChunkLink, ChunkTranslationInput, ChunkTranslationOutput, CognitiveChunk, ExtractBookCoherenceInput, ExtractUserFocusedInput, ExtractUserFocusedResult, SentenceTextSource } from './types.js';
|
|
6
|
+
import '../../document/types.js';
|
|
7
|
+
import '../../common/language.js';
|
|
8
|
+
import '../../llm/client.js';
|
|
9
|
+
import '../../llm/context.js';
|
|
10
|
+
import '../../llm/cache.js';
|
|
11
|
+
import '../../llm/types.js';
|
|
12
|
+
import 'ai';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractBookCoherenceChunkBatch,
|
|
3
|
+
extractUserFocusedChunkBatch
|
|
4
|
+
} from "./extract.js";
|
|
5
|
+
import { EvidenceResolver } from "../../evidence-selection/index.js";
|
|
6
|
+
import { FragmentProjection } from "./fragment-projection.js";
|
|
7
|
+
export {
|
|
8
|
+
EvidenceResolver,
|
|
9
|
+
FragmentProjection,
|
|
10
|
+
extractBookCoherenceChunkBatch,
|
|
11
|
+
extractUserFocusedChunkBatch
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/reader/chunk-batch/index.ts"],"sourcesContent":["export {\n extractBookCoherenceChunkBatch,\n extractUserFocusedChunkBatch,\n} from \"./extract.js\";\nexport { EvidenceResolver } from \"../../evidence-selection/index.js\";\nexport { FragmentProjection } from \"./fragment-projection.js\";\nexport type { TextSpan } from \"./fragment-projection.js\";\nexport type {\n ChunkBatch,\n ChunkBatchOptions,\n ChunkExtractionScopes,\n ChunkExtractionSentence,\n ChunkImportanceAnnotation,\n ChunkLink,\n ChunkTranslationInput,\n ChunkTranslationOutput,\n CognitiveChunk,\n ExtractBookCoherenceInput,\n ExtractUserFocusedInput,\n ExtractUserFocusedResult,\n SentenceTextSource,\n} from \"./types.js\";\nexport type {\n EvidenceResolutionFailure,\n EvidenceResolutionResult,\n RankedSentenceCandidate,\n} from \"../../evidence-selection/index.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
detectLanguageCode,
|
|
3
|
+
getLanguageDetectionCode
|
|
4
|
+
} from "../../common/tinyld-language.js";
|
|
5
|
+
import {} from "../../common/language.js";
|
|
6
|
+
function needsTranslation(input) {
|
|
7
|
+
const targetLanguageCode = getLanguageDetectionCode(input.targetLanguage);
|
|
8
|
+
return fieldNeedsTranslation(input.label, targetLanguageCode) || fieldNeedsTranslation(input.content, targetLanguageCode);
|
|
9
|
+
}
|
|
10
|
+
function fieldNeedsTranslation(text, targetLanguageCode) {
|
|
11
|
+
if (text.trim() === "") {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const detectedLanguageCode = detectLanguageCode(text);
|
|
15
|
+
if (detectedLanguageCode === void 0) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return detectedLanguageCode !== targetLanguageCode;
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
needsTranslation
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/reader/chunk-batch/language.ts"],"sourcesContent":["import {\n detectLanguageCode,\n getLanguageDetectionCode,\n} from \"../../common/tinyld-language.js\";\nimport { type Language } from \"../../common/language.js\";\n\nexport function needsTranslation(input: {\n content: string;\n label: string;\n targetLanguage: Language;\n}): boolean {\n const targetLanguageCode = getLanguageDetectionCode(input.targetLanguage);\n\n return (\n fieldNeedsTranslation(input.label, targetLanguageCode) ||\n fieldNeedsTranslation(input.content, targetLanguageCode)\n );\n}\n\nfunction fieldNeedsTranslation(\n text: string,\n targetLanguageCode: string,\n): boolean {\n if (text.trim() === \"\") {\n return false;\n }\n\n const detectedLanguageCode = detectLanguageCode(text);\n\n if (detectedLanguageCode === undefined) {\n return true;\n }\n\n return detectedLanguageCode !== targetLanguageCode;\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,eAA8B;AAEvB,SAAS,iBAAiB,OAIrB;AACV,QAAM,qBAAqB,yBAAyB,MAAM,cAAc;AAExE,SACE,sBAAsB,MAAM,OAAO,kBAAkB,KACrD,sBAAsB,MAAM,SAAS,kBAAkB;AAE3D;AAEA,SAAS,sBACP,MACA,oBACS;AACT,MAAI,KAAK,KAAK,MAAM,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,mBAAmB,IAAI;AAEpD,MAAI,yBAAyB,QAAW;AACtC,WAAO;AAAA,EACT;AAEA,SAAO,yBAAyB;AAClC;","names":[]}
|