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,253 @@
|
|
|
1
|
+
import { extractCluesFromDocument } from "./clue.js";
|
|
2
|
+
import { CompressionRequester } from "./compressor.js";
|
|
3
|
+
import {
|
|
4
|
+
calculateScore,
|
|
5
|
+
createRevisionFeedback,
|
|
6
|
+
pickBestVersion
|
|
7
|
+
} from "./feedback.js";
|
|
8
|
+
import { checkOutputLanguage } from "./language-review.js";
|
|
9
|
+
import { CompressionLog } from "./log.js";
|
|
10
|
+
import { formatChunksAsBook } from "./markup.js";
|
|
11
|
+
import {
|
|
12
|
+
cleanChunkTags,
|
|
13
|
+
extractCompressedText,
|
|
14
|
+
extractThinkingText
|
|
15
|
+
} from "./response.js";
|
|
16
|
+
import { CompressionReviewer } from "./review.js";
|
|
17
|
+
async function compressText(options) {
|
|
18
|
+
return await new EditorOperation(options).run();
|
|
19
|
+
}
|
|
20
|
+
class EditorOperation {
|
|
21
|
+
#compressionRatio;
|
|
22
|
+
#groupId;
|
|
23
|
+
#llm;
|
|
24
|
+
#log;
|
|
25
|
+
#maxClues;
|
|
26
|
+
#maxIterations;
|
|
27
|
+
#compressor;
|
|
28
|
+
#reviewer;
|
|
29
|
+
#reviewScope;
|
|
30
|
+
#serialFragments;
|
|
31
|
+
#serialId;
|
|
32
|
+
#userLanguage;
|
|
33
|
+
#document;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
const document = resolveDocument(options);
|
|
36
|
+
this.#compressionRatio = options.compressionRatio ?? 0.2;
|
|
37
|
+
this.#groupId = options.groupId;
|
|
38
|
+
this.#llm = options.llm;
|
|
39
|
+
this.#maxClues = options.maxClues ?? 10;
|
|
40
|
+
this.#maxIterations = options.maxIterations ?? 5;
|
|
41
|
+
this.#reviewScope = options.scopes;
|
|
42
|
+
this.#serialFragments = document.getSerialFragments(options.serialId);
|
|
43
|
+
this.#serialId = options.serialId;
|
|
44
|
+
this.#userLanguage = options.userLanguage;
|
|
45
|
+
this.#document = document;
|
|
46
|
+
this.#compressor = new CompressionRequester(
|
|
47
|
+
this.#llm,
|
|
48
|
+
options.scopes.compress,
|
|
49
|
+
this.#compressionRatio,
|
|
50
|
+
this.#userLanguage
|
|
51
|
+
);
|
|
52
|
+
this.#log = new CompressionLog(this.#serialId, this.#groupId, {
|
|
53
|
+
compressionRatio: this.#compressionRatio,
|
|
54
|
+
maxIterations: this.#maxIterations,
|
|
55
|
+
...options.logDirPath === void 0 ? {} : {
|
|
56
|
+
logDirPath: options.logDirPath
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
this.#reviewer = new CompressionReviewer(
|
|
60
|
+
this.#llm,
|
|
61
|
+
this.#serialFragments,
|
|
62
|
+
{
|
|
63
|
+
review: this.#reviewScope.review,
|
|
64
|
+
reviewGuide: this.#reviewScope.reviewGuide
|
|
65
|
+
},
|
|
66
|
+
this.#userLanguage
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
async run() {
|
|
70
|
+
const groups = await this.#listTargetGroups();
|
|
71
|
+
const segmentStartIndexes = await this.#getGroupSegmentStartIndexes(groups);
|
|
72
|
+
if (segmentStartIndexes.length === 0) {
|
|
73
|
+
return "";
|
|
74
|
+
}
|
|
75
|
+
const clues = await extractCluesFromDocument({
|
|
76
|
+
document: this.#document,
|
|
77
|
+
groupId: this.#groupId,
|
|
78
|
+
maxClues: this.#maxClues,
|
|
79
|
+
serialId: this.#serialId
|
|
80
|
+
});
|
|
81
|
+
const originalText = await this.#getFullText(groups);
|
|
82
|
+
if (originalText.trim() === "") {
|
|
83
|
+
return "";
|
|
84
|
+
}
|
|
85
|
+
await this.#log.initialize(clues);
|
|
86
|
+
const markedOriginalText = await formatChunksAsBook({
|
|
87
|
+
chunks: listClueChunks(clues),
|
|
88
|
+
segmentStartIndexes,
|
|
89
|
+
serialFragments: this.#serialFragments,
|
|
90
|
+
wrapHighRetention: true
|
|
91
|
+
});
|
|
92
|
+
const clueReviewers = await this.#reviewer.generateClueReviewers(clues);
|
|
93
|
+
const targetLength = Math.floor(
|
|
94
|
+
originalText.length * this.#compressionRatio
|
|
95
|
+
);
|
|
96
|
+
const versions = [];
|
|
97
|
+
const reviewerHistories = /* @__PURE__ */ Object.create(null);
|
|
98
|
+
let previousCompressedText;
|
|
99
|
+
let revisionFeedback;
|
|
100
|
+
for (let iteration = 1; iteration <= this.#maxIterations; iteration += 1) {
|
|
101
|
+
await this.#log.appendIterationHeader(iteration, revisionFeedback);
|
|
102
|
+
const fullResponse = await this.#compressor.request({
|
|
103
|
+
markedText: markedOriginalText,
|
|
104
|
+
targetLength,
|
|
105
|
+
...previousCompressedText === void 0 ? {} : {
|
|
106
|
+
previousCompressedText
|
|
107
|
+
},
|
|
108
|
+
...revisionFeedback === void 0 ? {} : {
|
|
109
|
+
revisionFeedback
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
const compressedText = cleanChunkTags(
|
|
113
|
+
extractCompressedText(fullResponse)
|
|
114
|
+
);
|
|
115
|
+
const thinkingText = extractThinkingText(fullResponse);
|
|
116
|
+
await this.#log.appendCompressionResult({
|
|
117
|
+
compressedText,
|
|
118
|
+
thinkingText
|
|
119
|
+
});
|
|
120
|
+
const reviewOutput = await this.#reviewer.reviewCompression(
|
|
121
|
+
compressedText,
|
|
122
|
+
clueReviewers,
|
|
123
|
+
reviewerHistories
|
|
124
|
+
);
|
|
125
|
+
const reviews = [...reviewOutput.reviews];
|
|
126
|
+
const languageReview = checkOutputLanguage({
|
|
127
|
+
compressedText,
|
|
128
|
+
...this.#userLanguage === void 0 ? {} : {
|
|
129
|
+
userLanguage: this.#userLanguage
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
if (languageReview !== void 0) {
|
|
133
|
+
reviews.push(languageReview.review);
|
|
134
|
+
await this.#log.appendLanguageMismatch({
|
|
135
|
+
detectedLanguageCode: languageReview.detectedLanguageCode,
|
|
136
|
+
review: languageReview.review,
|
|
137
|
+
targetLanguageCode: languageReview.targetLanguageCode,
|
|
138
|
+
userLanguage: this.#userLanguage
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const score = calculateScore(reviews);
|
|
142
|
+
versions.push({
|
|
143
|
+
iteration,
|
|
144
|
+
reviews,
|
|
145
|
+
score,
|
|
146
|
+
text: compressedText
|
|
147
|
+
});
|
|
148
|
+
if (score === 0) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
if (iteration >= this.#maxIterations) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
revisionFeedback = createRevisionFeedback({
|
|
155
|
+
llm: this.#llm,
|
|
156
|
+
reviews
|
|
157
|
+
});
|
|
158
|
+
previousCompressedText = compressedText;
|
|
159
|
+
for (const clueId of Object.keys(reviewOutput.rawResponses)) {
|
|
160
|
+
const rawResponse = reviewOutput.rawResponses[clueId];
|
|
161
|
+
if (rawResponse === void 0) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
reviewerHistories[clueId] = [compressedText, rawResponse];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const bestVersion = pickBestVersion(versions);
|
|
168
|
+
await this.#log.appendFinalSelection(bestVersion, originalText.length);
|
|
169
|
+
return bestVersion.text;
|
|
170
|
+
}
|
|
171
|
+
async #listTargetGroups() {
|
|
172
|
+
return (await this.#document.fragmentGroups.listBySerial(this.#serialId)).filter((record) => record.groupId === this.#groupId).map((record) => ({
|
|
173
|
+
endSentenceIndex: record.endSentenceIndex,
|
|
174
|
+
startSentenceIndex: record.startSentenceIndex
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
async #getGroupSegmentStartIndexes(groups) {
|
|
178
|
+
const segmentStartIndexes = [
|
|
179
|
+
...await this.#serialFragments.listFragmentIds()
|
|
180
|
+
].sort(compareNumber);
|
|
181
|
+
const coveredStartIndexes = /* @__PURE__ */ new Set();
|
|
182
|
+
for (const group of groups) {
|
|
183
|
+
for (let index = 0; index < segmentStartIndexes.length; index += 1) {
|
|
184
|
+
const startSentenceIndex = segmentStartIndexes[index];
|
|
185
|
+
if (startSentenceIndex === void 0) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const nextStartSentenceIndex = segmentStartIndexes[index + 1];
|
|
189
|
+
const endSentenceIndex = nextStartSentenceIndex === void 0 ? Infinity : nextStartSentenceIndex - 1;
|
|
190
|
+
if (startSentenceIndex <= group.endSentenceIndex && endSentenceIndex >= group.startSentenceIndex) {
|
|
191
|
+
coveredStartIndexes.add(startSentenceIndex);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return [...coveredStartIndexes].sort(compareNumber);
|
|
196
|
+
}
|
|
197
|
+
async #getFullText(groups) {
|
|
198
|
+
const fragments = await Promise.all(
|
|
199
|
+
groups.map(async (group) => ({
|
|
200
|
+
sentences: await this.#listGroupSentences(
|
|
201
|
+
group.startSentenceIndex,
|
|
202
|
+
group.endSentenceIndex
|
|
203
|
+
)
|
|
204
|
+
}))
|
|
205
|
+
);
|
|
206
|
+
return fragments.flatMap(
|
|
207
|
+
(fragment) => fragment.sentences.map((sentence) => sentence.text)
|
|
208
|
+
).join(" ");
|
|
209
|
+
}
|
|
210
|
+
async #listGroupSentences(startSentenceIndex, endSentenceIndex) {
|
|
211
|
+
if (this.#serialFragments.listSentencesInRange !== void 0) {
|
|
212
|
+
return await this.#serialFragments.listSentencesInRange(
|
|
213
|
+
startSentenceIndex,
|
|
214
|
+
endSentenceIndex
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
const segmentStartIndexes = [
|
|
218
|
+
...await this.#serialFragments.listFragmentIds()
|
|
219
|
+
].sort(compareNumber);
|
|
220
|
+
const fragments = await Promise.all(
|
|
221
|
+
segmentStartIndexes.filter((segmentStartIndex, index) => {
|
|
222
|
+
const nextStartSentenceIndex = segmentStartIndexes[index + 1];
|
|
223
|
+
const segmentEndSentenceIndex = nextStartSentenceIndex === void 0 ? Infinity : nextStartSentenceIndex - 1;
|
|
224
|
+
return segmentStartIndex <= endSentenceIndex && segmentEndSentenceIndex >= startSentenceIndex;
|
|
225
|
+
}).map(
|
|
226
|
+
async (startSentenceIndex2) => await this.#serialFragments.getFragment(startSentenceIndex2)
|
|
227
|
+
)
|
|
228
|
+
);
|
|
229
|
+
return fragments.flatMap(
|
|
230
|
+
(fragment) => fragment.sentences.filter((_sentence, index) => {
|
|
231
|
+
const sentenceIndex = fragment.fragmentId + index;
|
|
232
|
+
return sentenceIndex >= startSentenceIndex && sentenceIndex <= endSentenceIndex;
|
|
233
|
+
})
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function compareNumber(left, right) {
|
|
238
|
+
return left - right;
|
|
239
|
+
}
|
|
240
|
+
function listClueChunks(clues) {
|
|
241
|
+
return clues.flatMap((clue) => clue.chunks);
|
|
242
|
+
}
|
|
243
|
+
function resolveDocument(options) {
|
|
244
|
+
const document = options.document ?? options.workspace;
|
|
245
|
+
if (document === void 0) {
|
|
246
|
+
throw new Error("Editor requires a document");
|
|
247
|
+
}
|
|
248
|
+
return document;
|
|
249
|
+
}
|
|
250
|
+
export {
|
|
251
|
+
compressText
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/editor/editor.ts"],"sourcesContent":["import type { Language } from \"../common/language.js\";\nimport type { LLM } from \"../llm/index.js\";\nimport type {\n ChunkRecord,\n ReadonlyDocument,\n ReadonlySerialFragments,\n} from \"../document/index.js\";\nimport { extractCluesFromDocument, type Clue } from \"./clue.js\";\nimport { CompressionRequester } from \"./compressor.js\";\nimport {\n calculateScore,\n createRevisionFeedback,\n pickBestVersion,\n} from \"./feedback.js\";\nimport { checkOutputLanguage } from \"./language-review.js\";\nimport { CompressionLog } from \"./log.js\";\nimport { formatChunksAsBook } from \"./markup.js\";\nimport {\n cleanChunkTags,\n extractCompressedText,\n extractThinkingText,\n} from \"./response.js\";\nimport { CompressionReviewer, type ReviewerHistories } from \"./review.js\";\nimport type { CompressionVersion } from \"./types.js\";\n\nexport interface EditorScopes<S extends string> {\n readonly compress: S;\n readonly review: S;\n readonly reviewGuide: S;\n}\n\nexport interface EditorOptions<S extends string> {\n readonly compressionRatio?: number;\n readonly document?: ReadonlyDocument;\n readonly groupId: number;\n readonly llm: LLM<S>;\n readonly logDirPath?: string;\n readonly maxClues?: number;\n readonly maxIterations?: number;\n readonly scopes: EditorScopes<S>;\n readonly serialId: number;\n readonly userLanguage?: Language;\n /** @deprecated Use `document` instead. */\n readonly workspace?: ReadonlyDocument;\n}\n\nexport async function compressText<S extends string>(\n options: EditorOptions<S>,\n): Promise<string> {\n return await new EditorOperation(options).run();\n}\n\nclass EditorOperation<S extends string> {\n readonly #compressionRatio: number;\n readonly #groupId: number;\n readonly #llm: LLM<S>;\n readonly #log: CompressionLog;\n readonly #maxClues: number;\n readonly #maxIterations: number;\n readonly #compressor: CompressionRequester<S>;\n readonly #reviewer: CompressionReviewer<S>;\n readonly #reviewScope: EditorScopes<S>;\n readonly #serialFragments: ReadonlySerialFragments;\n readonly #serialId: number;\n readonly #userLanguage: Language | undefined;\n readonly #document: ReadonlyDocument;\n\n public constructor(options: EditorOptions<S>) {\n const document = resolveDocument(options);\n\n this.#compressionRatio = options.compressionRatio ?? 0.2;\n this.#groupId = options.groupId;\n this.#llm = options.llm;\n this.#maxClues = options.maxClues ?? 10;\n this.#maxIterations = options.maxIterations ?? 5;\n this.#reviewScope = options.scopes;\n this.#serialFragments = document.getSerialFragments(options.serialId);\n this.#serialId = options.serialId;\n this.#userLanguage = options.userLanguage;\n this.#document = document;\n this.#compressor = new CompressionRequester(\n this.#llm,\n options.scopes.compress,\n this.#compressionRatio,\n this.#userLanguage,\n );\n this.#log = new CompressionLog(this.#serialId, this.#groupId, {\n compressionRatio: this.#compressionRatio,\n maxIterations: this.#maxIterations,\n ...(options.logDirPath === undefined\n ? {}\n : {\n logDirPath: options.logDirPath,\n }),\n });\n this.#reviewer = new CompressionReviewer(\n this.#llm,\n this.#serialFragments,\n {\n review: this.#reviewScope.review,\n reviewGuide: this.#reviewScope.reviewGuide,\n },\n this.#userLanguage,\n );\n }\n\n public async run(): Promise<string> {\n const groups = await this.#listTargetGroups();\n const segmentStartIndexes = await this.#getGroupSegmentStartIndexes(groups);\n\n if (segmentStartIndexes.length === 0) {\n return \"\";\n }\n\n const clues = await extractCluesFromDocument({\n document: this.#document,\n groupId: this.#groupId,\n maxClues: this.#maxClues,\n serialId: this.#serialId,\n });\n const originalText = await this.#getFullText(groups);\n\n if (originalText.trim() === \"\") {\n return \"\";\n }\n\n await this.#log.initialize(clues);\n\n const markedOriginalText = await formatChunksAsBook({\n chunks: listClueChunks(clues),\n segmentStartIndexes,\n serialFragments: this.#serialFragments,\n wrapHighRetention: true,\n });\n const clueReviewers = await this.#reviewer.generateClueReviewers(clues);\n const targetLength = Math.floor(\n originalText.length * this.#compressionRatio,\n );\n const versions: CompressionVersion[] = [];\n const reviewerHistories = Object.create(null) as ReviewerHistories;\n let previousCompressedText: string | undefined;\n let revisionFeedback: string | undefined;\n\n for (let iteration = 1; iteration <= this.#maxIterations; iteration += 1) {\n await this.#log.appendIterationHeader(iteration, revisionFeedback);\n\n const fullResponse = await this.#compressor.request({\n markedText: markedOriginalText,\n targetLength,\n ...(previousCompressedText === undefined\n ? {}\n : {\n previousCompressedText,\n }),\n ...(revisionFeedback === undefined\n ? {}\n : {\n revisionFeedback,\n }),\n });\n const compressedText = cleanChunkTags(\n extractCompressedText(fullResponse),\n );\n const thinkingText = extractThinkingText(fullResponse);\n\n await this.#log.appendCompressionResult({\n compressedText,\n thinkingText,\n });\n\n const reviewOutput = await this.#reviewer.reviewCompression(\n compressedText,\n clueReviewers,\n reviewerHistories,\n );\n const reviews = [...reviewOutput.reviews];\n const languageReview = checkOutputLanguage({\n compressedText,\n ...(this.#userLanguage === undefined\n ? {}\n : {\n userLanguage: this.#userLanguage,\n }),\n });\n\n if (languageReview !== undefined) {\n reviews.push(languageReview.review);\n await this.#log.appendLanguageMismatch({\n detectedLanguageCode: languageReview.detectedLanguageCode,\n review: languageReview.review,\n targetLanguageCode: languageReview.targetLanguageCode,\n userLanguage: this.#userLanguage,\n });\n }\n\n const score = calculateScore(reviews);\n\n versions.push({\n iteration,\n reviews,\n score,\n text: compressedText,\n });\n\n if (score === 0) {\n break;\n }\n\n if (iteration >= this.#maxIterations) {\n continue;\n }\n\n revisionFeedback = createRevisionFeedback({\n llm: this.#llm,\n reviews,\n });\n previousCompressedText = compressedText;\n\n for (const clueId of Object.keys(reviewOutput.rawResponses)) {\n const rawResponse = reviewOutput.rawResponses[clueId];\n\n if (rawResponse === undefined) {\n continue;\n }\n\n reviewerHistories[clueId] = [compressedText, rawResponse];\n }\n }\n\n const bestVersion = pickBestVersion(versions);\n\n await this.#log.appendFinalSelection(bestVersion, originalText.length);\n\n return bestVersion.text;\n }\n\n async #listTargetGroups(): Promise<readonly SentenceGroup[]> {\n return (await this.#document.fragmentGroups.listBySerial(this.#serialId))\n .filter((record) => record.groupId === this.#groupId)\n .map((record) => ({\n endSentenceIndex: record.endSentenceIndex,\n startSentenceIndex: record.startSentenceIndex,\n }));\n }\n\n async #getGroupSegmentStartIndexes(\n groups: readonly SentenceGroup[],\n ): Promise<number[]> {\n const segmentStartIndexes = [\n ...(await this.#serialFragments.listFragmentIds()),\n ].sort(compareNumber);\n const coveredStartIndexes = new Set<number>();\n\n for (const group of groups) {\n for (let index = 0; index < segmentStartIndexes.length; index += 1) {\n const startSentenceIndex = segmentStartIndexes[index];\n\n if (startSentenceIndex === undefined) {\n continue;\n }\n\n const nextStartSentenceIndex = segmentStartIndexes[index + 1];\n const endSentenceIndex =\n nextStartSentenceIndex === undefined\n ? Infinity\n : nextStartSentenceIndex - 1;\n\n if (\n startSentenceIndex <= group.endSentenceIndex &&\n endSentenceIndex >= group.startSentenceIndex\n ) {\n coveredStartIndexes.add(startSentenceIndex);\n }\n }\n }\n\n return [...coveredStartIndexes].sort(compareNumber);\n }\n\n async #getFullText(groups: readonly SentenceGroup[]): Promise<string> {\n const fragments = await Promise.all(\n groups.map(async (group) => ({\n sentences: await this.#listGroupSentences(\n group.startSentenceIndex,\n group.endSentenceIndex,\n ),\n })),\n );\n\n return fragments\n .flatMap((fragment) =>\n fragment.sentences.map((sentence) => sentence.text),\n )\n .join(\" \");\n }\n\n async #listGroupSentences(\n startSentenceIndex: number,\n endSentenceIndex: number,\n ): Promise<readonly { readonly text: string }[]> {\n if (this.#serialFragments.listSentencesInRange !== undefined) {\n return await this.#serialFragments.listSentencesInRange(\n startSentenceIndex,\n endSentenceIndex,\n );\n }\n\n const segmentStartIndexes = [\n ...(await this.#serialFragments.listFragmentIds()),\n ].sort(compareNumber);\n const fragments = await Promise.all(\n segmentStartIndexes\n .filter((segmentStartIndex, index) => {\n const nextStartSentenceIndex = segmentStartIndexes[index + 1];\n const segmentEndSentenceIndex =\n nextStartSentenceIndex === undefined\n ? Infinity\n : nextStartSentenceIndex - 1;\n\n return (\n segmentStartIndex <= endSentenceIndex &&\n segmentEndSentenceIndex >= startSentenceIndex\n );\n })\n .map(\n async (startSentenceIndex) =>\n await this.#serialFragments.getFragment(startSentenceIndex),\n ),\n );\n\n return fragments.flatMap((fragment) =>\n fragment.sentences.filter((_sentence, index) => {\n const sentenceIndex = fragment.fragmentId + index;\n\n return (\n sentenceIndex >= startSentenceIndex &&\n sentenceIndex <= endSentenceIndex\n );\n }),\n );\n }\n}\n\ninterface SentenceGroup {\n readonly endSentenceIndex: number;\n readonly startSentenceIndex: number;\n}\n\nfunction compareNumber(left: number, right: number): number {\n return left - right;\n}\n\nfunction listClueChunks(clues: readonly Clue[]): ChunkRecord[] {\n return clues.flatMap((clue) => clue.chunks);\n}\n\nfunction resolveDocument<S extends string>(\n options: EditorOptions<S>,\n): ReadonlyDocument {\n const document = options.document ?? options.workspace;\n\n if (document === undefined) {\n throw new Error(\"Editor requires a document\");\n }\n\n return document;\n}\n"],"mappings":"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","names":["startSentenceIndex"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LLM } from '../llm/client.js';
|
|
2
|
+
import { ReviewResult, CompressionVersion } from './types.js';
|
|
3
|
+
import '../llm/context.js';
|
|
4
|
+
import '../llm/cache.js';
|
|
5
|
+
import '../llm/types.js';
|
|
6
|
+
import 'ai';
|
|
7
|
+
|
|
8
|
+
declare function calculateScore(reviews: readonly ReviewResult[]): number;
|
|
9
|
+
declare function createRevisionFeedback<S extends string>(input: {
|
|
10
|
+
llm: LLM<S>;
|
|
11
|
+
reviews: readonly ReviewResult[];
|
|
12
|
+
}): string;
|
|
13
|
+
declare function formatIssuesForLog(reviews: readonly ReviewResult[]): string;
|
|
14
|
+
declare function pickBestVersion(versions: readonly CompressionVersion[]): CompressionVersion;
|
|
15
|
+
|
|
16
|
+
export { calculateScore, createRevisionFeedback, formatIssuesForLog, pickBestVersion };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { REVISION_FEEDBACK_PROMPT_TEMPLATE } from "./prompt-templates.js";
|
|
2
|
+
import { ReviewSeverity } from "./types.js";
|
|
3
|
+
const REVIEW_SEVERITY_VALUE = Object.freeze({
|
|
4
|
+
[ReviewSeverity.Critical]: 9,
|
|
5
|
+
[ReviewSeverity.Major]: 3,
|
|
6
|
+
[ReviewSeverity.Minor]: 1
|
|
7
|
+
});
|
|
8
|
+
function calculateScore(reviews) {
|
|
9
|
+
let totalScore = 0;
|
|
10
|
+
for (const review of reviews) {
|
|
11
|
+
for (const issue of review.issues) {
|
|
12
|
+
totalScore += REVIEW_SEVERITY_VALUE[issue.severity] * review.weight;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return totalScore;
|
|
16
|
+
}
|
|
17
|
+
function createRevisionFeedback(input) {
|
|
18
|
+
const allIssues = collectIssues(input.reviews);
|
|
19
|
+
const visibleIssues = allIssues.slice(0, 9);
|
|
20
|
+
const hiddenCount = allIssues.length - visibleIssues.length;
|
|
21
|
+
const issueLines = [];
|
|
22
|
+
for (let index = 0; index < visibleIssues.length; index += 1) {
|
|
23
|
+
const issue = visibleIssues[index];
|
|
24
|
+
if (issue === void 0) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
issueLines.push(
|
|
28
|
+
`${index + 1}. [${issue.severity.toUpperCase()}]`,
|
|
29
|
+
` Problem: ${issue.problem}`
|
|
30
|
+
);
|
|
31
|
+
if (issue.suggestion !== "") {
|
|
32
|
+
issueLines.push(` Suggestion: ${issue.suggestion}`);
|
|
33
|
+
}
|
|
34
|
+
issueLines.push("");
|
|
35
|
+
}
|
|
36
|
+
if (hiddenCount > 0) {
|
|
37
|
+
issueLines.push(
|
|
38
|
+
`... and ${hiddenCount} more issues hidden (lower priority)`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
return input.llm.loadSystemPrompt(REVISION_FEEDBACK_PROMPT_TEMPLATE, {
|
|
42
|
+
issues_description: issueLines.join("\n")
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function formatIssuesForLog(reviews) {
|
|
46
|
+
const issues = collectIssues(reviews);
|
|
47
|
+
if (issues.length === 0) {
|
|
48
|
+
return "No issues found - all reviewers are satisfied.\n";
|
|
49
|
+
}
|
|
50
|
+
const lines = [];
|
|
51
|
+
for (let index = 0; index < issues.length; index += 1) {
|
|
52
|
+
const issue = issues[index];
|
|
53
|
+
if (issue === void 0) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
lines.push(
|
|
57
|
+
`${index + 1}. [${issue.severity.toUpperCase()}]`,
|
|
58
|
+
` Problem: ${issue.problem}`
|
|
59
|
+
);
|
|
60
|
+
if (issue.suggestion !== "") {
|
|
61
|
+
lines.push(` Suggestion: ${issue.suggestion}`);
|
|
62
|
+
}
|
|
63
|
+
lines.push("");
|
|
64
|
+
}
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
}
|
|
67
|
+
function pickBestVersion(versions) {
|
|
68
|
+
const bestVersion = versions.reduce(
|
|
69
|
+
(currentBest, version) => {
|
|
70
|
+
if (currentBest === void 0 || version.score < currentBest.score) {
|
|
71
|
+
return version;
|
|
72
|
+
}
|
|
73
|
+
return currentBest;
|
|
74
|
+
},
|
|
75
|
+
void 0
|
|
76
|
+
);
|
|
77
|
+
if (bestVersion === void 0) {
|
|
78
|
+
throw new Error("Compression failed: no versions generated");
|
|
79
|
+
}
|
|
80
|
+
return bestVersion;
|
|
81
|
+
}
|
|
82
|
+
function collectIssues(reviews) {
|
|
83
|
+
const issues = reviews.flatMap(
|
|
84
|
+
(review) => review.issues.map((issue) => ({
|
|
85
|
+
...issue,
|
|
86
|
+
weight: review.weight
|
|
87
|
+
}))
|
|
88
|
+
);
|
|
89
|
+
issues.sort((left, right) => {
|
|
90
|
+
const severityDelta = REVIEW_SEVERITY_VALUE[right.severity] - REVIEW_SEVERITY_VALUE[left.severity];
|
|
91
|
+
if (severityDelta !== 0) {
|
|
92
|
+
return severityDelta;
|
|
93
|
+
}
|
|
94
|
+
return right.weight - left.weight;
|
|
95
|
+
});
|
|
96
|
+
return issues;
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
calculateScore,
|
|
100
|
+
createRevisionFeedback,
|
|
101
|
+
formatIssuesForLog,
|
|
102
|
+
pickBestVersion
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/editor/feedback.ts"],"sourcesContent":["import type { LLM } from \"../llm/index.js\";\nimport { REVISION_FEEDBACK_PROMPT_TEMPLATE } from \"./prompt-templates.js\";\nimport type { CompressionVersion, ReviewIssue, ReviewResult } from \"./types.js\";\nimport { ReviewSeverity } from \"./types.js\";\n\nconst REVIEW_SEVERITY_VALUE: Readonly<Record<ReviewSeverity, number>> =\n Object.freeze({\n [ReviewSeverity.Critical]: 9,\n [ReviewSeverity.Major]: 3,\n [ReviewSeverity.Minor]: 1,\n });\n\nexport function calculateScore(reviews: readonly ReviewResult[]): number {\n let totalScore = 0;\n\n for (const review of reviews) {\n for (const issue of review.issues) {\n totalScore += REVIEW_SEVERITY_VALUE[issue.severity] * review.weight;\n }\n }\n\n return totalScore;\n}\n\nexport function createRevisionFeedback<S extends string>(input: {\n llm: LLM<S>;\n reviews: readonly ReviewResult[];\n}): string {\n const allIssues = collectIssues(input.reviews);\n const visibleIssues = allIssues.slice(0, 9);\n const hiddenCount = allIssues.length - visibleIssues.length;\n const issueLines: string[] = [];\n\n for (let index = 0; index < visibleIssues.length; index += 1) {\n const issue = visibleIssues[index];\n\n if (issue === undefined) {\n continue;\n }\n\n issueLines.push(\n `${index + 1}. [${issue.severity.toUpperCase()}]`,\n ` Problem: ${issue.problem}`,\n );\n\n if (issue.suggestion !== \"\") {\n issueLines.push(` Suggestion: ${issue.suggestion}`);\n }\n\n issueLines.push(\"\");\n }\n\n if (hiddenCount > 0) {\n issueLines.push(\n `... and ${hiddenCount} more issues hidden (lower priority)`,\n );\n }\n\n return input.llm.loadSystemPrompt(REVISION_FEEDBACK_PROMPT_TEMPLATE, {\n issues_description: issueLines.join(\"\\n\"),\n });\n}\n\nexport function formatIssuesForLog(reviews: readonly ReviewResult[]): string {\n const issues = collectIssues(reviews);\n\n if (issues.length === 0) {\n return \"No issues found - all reviewers are satisfied.\\n\";\n }\n\n const lines: string[] = [];\n\n for (let index = 0; index < issues.length; index += 1) {\n const issue = issues[index];\n\n if (issue === undefined) {\n continue;\n }\n\n lines.push(\n `${index + 1}. [${issue.severity.toUpperCase()}]`,\n ` Problem: ${issue.problem}`,\n );\n\n if (issue.suggestion !== \"\") {\n lines.push(` Suggestion: ${issue.suggestion}`);\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function pickBestVersion(\n versions: readonly CompressionVersion[],\n): CompressionVersion {\n const bestVersion = versions.reduce<CompressionVersion | undefined>(\n (currentBest, version) => {\n if (currentBest === undefined || version.score < currentBest.score) {\n return version;\n }\n\n return currentBest;\n },\n undefined,\n );\n\n if (bestVersion === undefined) {\n throw new Error(\"Compression failed: no versions generated\");\n }\n\n return bestVersion;\n}\n\nfunction collectIssues(\n reviews: readonly ReviewResult[],\n): Array<ReviewIssue & { readonly weight: number }> {\n const issues = reviews.flatMap((review) =>\n review.issues.map((issue) => ({\n ...issue,\n weight: review.weight,\n })),\n );\n\n issues.sort((left, right) => {\n const severityDelta =\n REVIEW_SEVERITY_VALUE[right.severity] -\n REVIEW_SEVERITY_VALUE[left.severity];\n\n if (severityDelta !== 0) {\n return severityDelta;\n }\n\n return right.weight - left.weight;\n });\n\n return issues;\n}\n"],"mappings":"AACA,SAAS,yCAAyC;AAElD,SAAS,sBAAsB;AAE/B,MAAM,wBACJ,OAAO,OAAO;AAAA,EACZ,CAAC,eAAe,QAAQ,GAAG;AAAA,EAC3B,CAAC,eAAe,KAAK,GAAG;AAAA,EACxB,CAAC,eAAe,KAAK,GAAG;AAC1B,CAAC;AAEI,SAAS,eAAe,SAA0C;AACvE,MAAI,aAAa;AAEjB,aAAW,UAAU,SAAS;AAC5B,eAAW,SAAS,OAAO,QAAQ;AACjC,oBAAc,sBAAsB,MAAM,QAAQ,IAAI,OAAO;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBAAyC,OAG9C;AACT,QAAM,YAAY,cAAc,MAAM,OAAO;AAC7C,QAAM,gBAAgB,UAAU,MAAM,GAAG,CAAC;AAC1C,QAAM,cAAc,UAAU,SAAS,cAAc;AACrD,QAAM,aAAuB,CAAC;AAE9B,WAAS,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS,GAAG;AAC5D,UAAM,QAAQ,cAAc,KAAK;AAEjC,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AAEA,eAAW;AAAA,MACT,GAAG,QAAQ,CAAC,MAAM,MAAM,SAAS,YAAY,CAAC;AAAA,MAC9C,eAAe,MAAM,OAAO;AAAA,IAC9B;AAEA,QAAI,MAAM,eAAe,IAAI;AAC3B,iBAAW,KAAK,kBAAkB,MAAM,UAAU,EAAE;AAAA,IACtD;AAEA,eAAW,KAAK,EAAE;AAAA,EACpB;AAEA,MAAI,cAAc,GAAG;AACnB,eAAW;AAAA,MACT,WAAW,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,MAAM,IAAI,iBAAiB,mCAAmC;AAAA,IACnE,oBAAoB,WAAW,KAAK,IAAI;AAAA,EAC1C,CAAC;AACH;AAEO,SAAS,mBAAmB,SAA0C;AAC3E,QAAM,SAAS,cAAc,OAAO;AAEpC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AAEzB,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,QAAQ,OAAO,KAAK;AAE1B,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,GAAG,QAAQ,CAAC,MAAM,MAAM,SAAS,YAAY,CAAC;AAAA,MAC9C,eAAe,MAAM,OAAO;AAAA,IAC9B;AAEA,QAAI,MAAM,eAAe,IAAI;AAC3B,YAAM,KAAK,kBAAkB,MAAM,UAAU,EAAE;AAAA,IACjD;AAEA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,gBACd,UACoB;AACpB,QAAM,cAAc,SAAS;AAAA,IAC3B,CAAC,aAAa,YAAY;AACxB,UAAI,gBAAgB,UAAa,QAAQ,QAAQ,YAAY,OAAO;AAClE,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,EACF;AAEA,MAAI,gBAAgB,QAAW;AAC7B,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,SAAO;AACT;AAEA,SAAS,cACP,SACkD;AAClD,QAAM,SAAS,QAAQ;AAAA,IAAQ,CAAC,WAC9B,OAAO,OAAO,IAAI,CAAC,WAAW;AAAA,MAC5B,GAAG;AAAA,MACH,QAAQ,OAAO;AAAA,IACjB,EAAE;AAAA,EACJ;AAEA,SAAO,KAAK,CAAC,MAAM,UAAU;AAC3B,UAAM,gBACJ,sBAAsB,MAAM,QAAQ,IACpC,sBAAsB,KAAK,QAAQ;AAErC,QAAI,kBAAkB,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,CAAC;AAED,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { EditorOptions, EditorScopes, compressText } from './editor.js';
|
|
2
|
+
import '../common/language.js';
|
|
3
|
+
import '../llm/client.js';
|
|
4
|
+
import '../llm/context.js';
|
|
5
|
+
import '../llm/cache.js';
|
|
6
|
+
import '../llm/types.js';
|
|
7
|
+
import 'ai';
|
|
8
|
+
import '../document/document.js';
|
|
9
|
+
import '../source/meta.js';
|
|
10
|
+
import 'zod';
|
|
11
|
+
import '../source/toc.js';
|
|
12
|
+
import '../source/types.js';
|
|
13
|
+
import '../document/database.js';
|
|
14
|
+
import 'sqlite3';
|
|
15
|
+
import '../document/text-streams.js';
|
|
16
|
+
import '../document/types.js';
|
|
17
|
+
import '../document/stores.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/editor/index.ts"],"sourcesContent":["export { compressText } from \"./editor.js\";\nexport type { EditorOptions, EditorScopes } from \"./editor.js\";\n"],"mappings":"AAAA,SAAS,oBAAoB;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Language } from '../common/language.js';
|
|
2
|
+
import { ReviewResult } from './types.js';
|
|
3
|
+
|
|
4
|
+
interface LanguageReview {
|
|
5
|
+
readonly detectedLanguageCode: string;
|
|
6
|
+
readonly review: ReviewResult;
|
|
7
|
+
readonly targetLanguageCode: string;
|
|
8
|
+
}
|
|
9
|
+
declare function checkOutputLanguage(input: {
|
|
10
|
+
compressedText: string;
|
|
11
|
+
userLanguage?: Language;
|
|
12
|
+
}): LanguageReview | undefined;
|
|
13
|
+
|
|
14
|
+
export { type LanguageReview, checkOutputLanguage };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
detectLanguageCode,
|
|
3
|
+
getLanguageDetectionCode
|
|
4
|
+
} from "../common/tinyld-language.js";
|
|
5
|
+
import {} from "../common/language.js";
|
|
6
|
+
import { ReviewSeverity } from "./types.js";
|
|
7
|
+
function checkOutputLanguage(input) {
|
|
8
|
+
if (input.userLanguage === void 0) {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
const targetLanguageCode = getLanguageDetectionCode(input.userLanguage);
|
|
12
|
+
const detectedLanguageCode = detectLanguageCode(input.compressedText);
|
|
13
|
+
if (detectedLanguageCode === void 0 || detectedLanguageCode === targetLanguageCode) {
|
|
14
|
+
return void 0;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
detectedLanguageCode,
|
|
18
|
+
review: {
|
|
19
|
+
clueId: -1,
|
|
20
|
+
issues: [
|
|
21
|
+
{
|
|
22
|
+
problem: `Output language error: detected ${detectedLanguageCode}, but ${targetLanguageCode} (${input.userLanguage}) is required.`,
|
|
23
|
+
severity: ReviewSeverity.Critical,
|
|
24
|
+
suggestion: `Please translate the entire compressed text to ${input.userLanguage}. Maintain all information integrity and ensure the translation sounds natural and native, not machine-translated.`
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
weight: 1
|
|
28
|
+
},
|
|
29
|
+
targetLanguageCode
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
checkOutputLanguage
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=language-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/editor/language-review.ts"],"sourcesContent":["import {\n detectLanguageCode,\n getLanguageDetectionCode,\n} from \"../common/tinyld-language.js\";\nimport { type Language } from \"../common/language.js\";\nimport { ReviewSeverity, type ReviewResult } from \"./types.js\";\n\nexport interface LanguageReview {\n readonly detectedLanguageCode: string;\n readonly review: ReviewResult;\n readonly targetLanguageCode: string;\n}\n\nexport function checkOutputLanguage(input: {\n compressedText: string;\n userLanguage?: Language;\n}): LanguageReview | undefined {\n if (input.userLanguage === undefined) {\n return undefined;\n }\n\n const targetLanguageCode = getLanguageDetectionCode(input.userLanguage);\n\n const detectedLanguageCode = detectLanguageCode(input.compressedText);\n\n if (\n detectedLanguageCode === undefined ||\n detectedLanguageCode === targetLanguageCode\n ) {\n return undefined;\n }\n\n return {\n detectedLanguageCode,\n review: {\n clueId: -1,\n issues: [\n {\n problem: `Output language error: detected ${detectedLanguageCode}, but ${targetLanguageCode} (${input.userLanguage}) is required.`,\n severity: ReviewSeverity.Critical,\n suggestion: `Please translate the entire compressed text to ${input.userLanguage}. Maintain all information integrity and ensure the translation sounds natural and native, not machine-translated.`,\n },\n ],\n weight: 1,\n },\n targetLanguageCode,\n };\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,eAA8B;AAC9B,SAAS,sBAAyC;AAQ3C,SAAS,oBAAoB,OAGL;AAC7B,MAAI,MAAM,iBAAiB,QAAW;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,yBAAyB,MAAM,YAAY;AAEtE,QAAM,uBAAuB,mBAAmB,MAAM,cAAc;AAEpE,MACE,yBAAyB,UACzB,yBAAyB,oBACzB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,SAAS,mCAAmC,oBAAoB,SAAS,kBAAkB,KAAK,MAAM,YAAY;AAAA,UAClH,UAAU,eAAe;AAAA,UACzB,YAAY,kDAAkD,MAAM,YAAY;AAAA,QAClF;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Language } from '../common/language.js';
|
|
2
|
+
import { Clue } from './clue.js';
|
|
3
|
+
import { CompressionVersion, ReviewResult } from './types.js';
|
|
4
|
+
import '../document/types.js';
|
|
5
|
+
import '../document/document.js';
|
|
6
|
+
import '../source/meta.js';
|
|
7
|
+
import 'zod';
|
|
8
|
+
import '../source/toc.js';
|
|
9
|
+
import '../source/types.js';
|
|
10
|
+
import '../document/database.js';
|
|
11
|
+
import 'sqlite3';
|
|
12
|
+
import '../document/text-streams.js';
|
|
13
|
+
import '../document/stores.js';
|
|
14
|
+
|
|
15
|
+
declare class CompressionLog {
|
|
16
|
+
#private;
|
|
17
|
+
constructor(serialId: number, groupId: number, options: {
|
|
18
|
+
readonly compressionRatio: number;
|
|
19
|
+
readonly logDirPath?: string;
|
|
20
|
+
readonly maxIterations: number;
|
|
21
|
+
});
|
|
22
|
+
appendCompressionResult(input: {
|
|
23
|
+
compressedText: string;
|
|
24
|
+
thinkingText: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
appendFinalSelection(bestVersion: CompressionVersion, originalLength: number): Promise<void>;
|
|
27
|
+
appendIterationHeader(iteration: number, revisionFeedback: string | undefined): Promise<void>;
|
|
28
|
+
appendLanguageMismatch(input: {
|
|
29
|
+
detectedLanguageCode: string;
|
|
30
|
+
review: ReviewResult;
|
|
31
|
+
targetLanguageCode: string;
|
|
32
|
+
userLanguage: Language | undefined;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
initialize(clues: readonly Clue[]): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { CompressionLog };
|