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.
Files changed (576) hide show
  1. package/LICENSE +201 -0
  2. package/data/editor/clue_reviewer.jinja +410 -0
  3. package/data/editor/clue_reviewer_generator.jinja +428 -0
  4. package/data/editor/revision_feedback.jinja +5 -0
  5. package/data/editor/text_compressor.jinja +127 -0
  6. package/data/guaranteed/response_intent_classifier.jinja +8 -0
  7. package/data/help/commands/archive/next.jinja +29 -0
  8. package/data/help/commands/gc.jinja +38 -0
  9. package/data/help/commands/legacy/migrate.jinja +20 -0
  10. package/data/help/commands/legacy.jinja +19 -0
  11. package/data/help/commands/maintenance/chapter/add.jinja +41 -0
  12. package/data/help/commands/maintenance/chapter/list.jinja +33 -0
  13. package/data/help/commands/maintenance/chapter/move.jinja +36 -0
  14. package/data/help/commands/maintenance/chapter/remove.jinja +26 -0
  15. package/data/help/commands/maintenance/chapter/reset.jinja +29 -0
  16. package/data/help/commands/maintenance/chapter/set-source.jinja +34 -0
  17. package/data/help/commands/maintenance/chapter/set-summary.jinja +31 -0
  18. package/data/help/commands/maintenance/chapter/set-title.jinja +29 -0
  19. package/data/help/commands/maintenance/chapter/tree.jinja +58 -0
  20. package/data/help/commands/maintenance/chapter.jinja +59 -0
  21. package/data/help/commands/maintenance/cover.jinja +28 -0
  22. package/data/help/commands/maintenance/meta.jinja +55 -0
  23. package/data/help/commands/predicate.jinja +460 -0
  24. package/data/help/commands/root.jinja +83 -0
  25. package/data/help/commands/transform.jinja +34 -0
  26. package/data/help/commands/uri.jinja +274 -0
  27. package/data/help/topics/config.jinja +88 -0
  28. package/data/help/topics/format.jinja +72 -0
  29. package/data/help/topics/readiness.jinja +99 -0
  30. package/data/help/topics/recipe.jinja +151 -0
  31. package/data/help/topics/runtime.jinja +62 -0
  32. package/data/help/topics/uri.jinja +178 -0
  33. package/data/output/epub/cover.xhtml.jinja +13 -0
  34. package/data/output/epub/nav.xhtml.jinja +12 -0
  35. package/data/output/epub/package.opf.xml.jinja +39 -0
  36. package/data/output/epub/section.xhtml.jinja +12 -0
  37. package/data/topologization/book_coherence_extraction.jinja +223 -0
  38. package/data/topologization/chunk_extraction.jinja +233 -0
  39. package/data/topologization/evidence_choice.jinja +38 -0
  40. package/data/topologization/translate_chunks.jinja +138 -0
  41. package/data/topologization/user_focused_extraction.jinja +378 -0
  42. package/dist/archive/query/archive-view.d.ts +26 -0
  43. package/dist/archive/query/archive-view.js +4540 -0
  44. package/dist/archive/query/archive-view.js.map +1 -0
  45. package/dist/archive/query/continuation-cursor.d.ts +61 -0
  46. package/dist/archive/query/continuation-cursor.js +363 -0
  47. package/dist/archive/query/continuation-cursor.js.map +1 -0
  48. package/dist/archive/query/index.d.ts +29 -0
  49. package/dist/archive/query/index.js +63 -0
  50. package/dist/archive/query/index.js.map +1 -0
  51. package/dist/archive/query/lexical-search.d.ts +22 -0
  52. package/dist/archive/query/lexical-search.js +137 -0
  53. package/dist/archive/query/lexical-search.js.map +1 -0
  54. package/dist/archive/query/search-cache.d.ts +192 -0
  55. package/dist/archive/query/search-cache.js +1248 -0
  56. package/dist/archive/query/search-cache.js.map +1 -0
  57. package/dist/archive/search-index/index.d.ts +26 -0
  58. package/dist/archive/search-index/index.js +29 -0
  59. package/dist/archive/search-index/index.js.map +1 -0
  60. package/dist/archive/search-index/search-index.d.ts +26 -0
  61. package/dist/archive/search-index/search-index.js +555 -0
  62. package/dist/archive/search-index/search-index.js.map +1 -0
  63. package/dist/archive/search-index/search-tokenizer.d.ts +16 -0
  64. package/dist/archive/search-index/search-tokenizer.js +225 -0
  65. package/dist/archive/search-index/search-tokenizer.js.map +1 -0
  66. package/dist/common/cli-command.d.ts +4 -0
  67. package/dist/common/cli-command.js +7 -0
  68. package/dist/common/cli-command.js.map +1 -0
  69. package/dist/common/data-dir.d.ts +3 -0
  70. package/dist/common/data-dir.js +48 -0
  71. package/dist/common/data-dir.js.map +1 -0
  72. package/dist/common/language.d.ts +55 -0
  73. package/dist/common/language.js +208 -0
  74. package/dist/common/language.js.map +1 -0
  75. package/dist/common/llm-scope.d.ts +19 -0
  76. package/dist/common/llm-scope.js +31 -0
  77. package/dist/common/llm-scope.js.map +1 -0
  78. package/dist/common/logging.d.ts +22 -0
  79. package/dist/common/logging.js +141 -0
  80. package/dist/common/logging.js.map +1 -0
  81. package/dist/common/template.d.ts +8 -0
  82. package/dist/common/template.js +54 -0
  83. package/dist/common/template.js.map +1 -0
  84. package/dist/common/tinyld-language.d.ts +6 -0
  85. package/dist/common/tinyld-language.js +34 -0
  86. package/dist/common/tinyld-language.js.map +1 -0
  87. package/dist/common/wiki-graph-dir.d.ts +10 -0
  88. package/dist/common/wiki-graph-dir.js +41 -0
  89. package/dist/common/wiki-graph-dir.js.map +1 -0
  90. package/dist/common/wiki-graph-temp.d.ts +6 -0
  91. package/dist/common/wiki-graph-temp.js +21 -0
  92. package/dist/common/wiki-graph-temp.js.map +1 -0
  93. package/dist/common/wiki-graph-uri.d.ts +28 -0
  94. package/dist/common/wiki-graph-uri.js +171 -0
  95. package/dist/common/wiki-graph-uri.js.map +1 -0
  96. package/dist/context/index.d.ts +1 -0
  97. package/dist/context/index.js +13 -0
  98. package/dist/context/index.js.map +1 -0
  99. package/dist/context/task-context.d.ts +41 -0
  100. package/dist/context/task-context.js +111 -0
  101. package/dist/context/task-context.js.map +1 -0
  102. package/dist/document/database.d.ts +30 -0
  103. package/dist/document/database.js +273 -0
  104. package/dist/document/database.js.map +1 -0
  105. package/dist/document/document.d.ts +153 -0
  106. package/dist/document/document.js +615 -0
  107. package/dist/document/document.js.map +1 -0
  108. package/dist/document/fragments.d.ts +63 -0
  109. package/dist/document/fragments.js +371 -0
  110. package/dist/document/fragments.js.map +1 -0
  111. package/dist/document/index.d.ts +13 -0
  112. package/dist/document/index.js +62 -0
  113. package/dist/document/index.js.map +1 -0
  114. package/dist/document/schema.d.ts +8 -0
  115. package/dist/document/schema.js +472 -0
  116. package/dist/document/schema.js.map +1 -0
  117. package/dist/document/shared-state-database.d.ts +9 -0
  118. package/dist/document/shared-state-database.js +193 -0
  119. package/dist/document/shared-state-database.js.map +1 -0
  120. package/dist/document/stores.d.ts +203 -0
  121. package/dist/document/stores.js +1678 -0
  122. package/dist/document/stores.js.map +1 -0
  123. package/dist/document/text-streams.d.ts +86 -0
  124. package/dist/document/text-streams.js +515 -0
  125. package/dist/document/text-streams.js.map +1 -0
  126. package/dist/document/types.d.ts +148 -0
  127. package/dist/document/types.js +69 -0
  128. package/dist/document/types.js.map +1 -0
  129. package/dist/editor/clue.d.ts +27 -0
  130. package/dist/editor/clue.js +158 -0
  131. package/dist/editor/clue.js.map +1 -0
  132. package/dist/editor/compressor.d.ts +18 -0
  133. package/dist/editor/compressor.js +68 -0
  134. package/dist/editor/compressor.js.map +1 -0
  135. package/dist/editor/editor.d.ts +39 -0
  136. package/dist/editor/editor.js +253 -0
  137. package/dist/editor/editor.js.map +1 -0
  138. package/dist/editor/feedback.d.ts +16 -0
  139. package/dist/editor/feedback.js +104 -0
  140. package/dist/editor/feedback.js.map +1 -0
  141. package/dist/editor/index.d.ts +17 -0
  142. package/dist/editor/index.js +5 -0
  143. package/dist/editor/index.js.map +1 -0
  144. package/dist/editor/language-review.d.ts +14 -0
  145. package/dist/editor/language-review.js +35 -0
  146. package/dist/editor/language-review.js.map +1 -0
  147. package/dist/editor/log.d.ts +37 -0
  148. package/dist/editor/log.js +202 -0
  149. package/dist/editor/log.js.map +1 -0
  150. package/dist/editor/markup.d.ts +20 -0
  151. package/dist/editor/markup.js +294 -0
  152. package/dist/editor/markup.js.map +1 -0
  153. package/dist/editor/prompt-templates.d.ts +6 -0
  154. package/dist/editor/prompt-templates.js +11 -0
  155. package/dist/editor/prompt-templates.js.map +1 -0
  156. package/dist/editor/response.d.ts +5 -0
  157. package/dist/editor/response.js +31 -0
  158. package/dist/editor/response.js.map +1 -0
  159. package/dist/editor/review.d.ts +34 -0
  160. package/dist/editor/review.js +189 -0
  161. package/dist/editor/review.js.map +1 -0
  162. package/dist/editor/types.d.ts +31 -0
  163. package/dist/editor/types.js +21 -0
  164. package/dist/editor/types.js.map +1 -0
  165. package/dist/evidence-selection/anchor-resolver.d.ts +43 -0
  166. package/dist/evidence-selection/anchor-resolver.js +783 -0
  167. package/dist/evidence-selection/anchor-resolver.js.map +1 -0
  168. package/dist/evidence-selection/anchor-types.d.ts +27 -0
  169. package/dist/evidence-selection/anchor-types.js +1 -0
  170. package/dist/evidence-selection/anchor-types.js.map +1 -0
  171. package/dist/evidence-selection/index.d.ts +8 -0
  172. package/dist/evidence-selection/index.js +32 -0
  173. package/dist/evidence-selection/index.js.map +1 -0
  174. package/dist/evidence-selection/prompt.d.ts +18 -0
  175. package/dist/evidence-selection/prompt.js +54 -0
  176. package/dist/evidence-selection/prompt.js.map +1 -0
  177. package/dist/evidence-selection/quote-score.d.ts +29 -0
  178. package/dist/evidence-selection/quote-score.js +331 -0
  179. package/dist/evidence-selection/quote-score.js.map +1 -0
  180. package/dist/evidence-selection/selection-resolver.d.ts +19 -0
  181. package/dist/evidence-selection/selection-resolver.js +303 -0
  182. package/dist/evidence-selection/selection-resolver.js.map +1 -0
  183. package/dist/evidence-selection/text.d.ts +4 -0
  184. package/dist/evidence-selection/text.js +66 -0
  185. package/dist/evidence-selection/text.js.map +1 -0
  186. package/dist/evidence-selection/types.d.ts +36 -0
  187. package/dist/evidence-selection/types.js +1 -0
  188. package/dist/evidence-selection/types.js.map +1 -0
  189. package/dist/facade/app.d.ts +75 -0
  190. package/dist/facade/app.js +141 -0
  191. package/dist/facade/app.js.map +1 -0
  192. package/dist/facade/build-queue.d.ts +181 -0
  193. package/dist/facade/build-queue.js +1442 -0
  194. package/dist/facade/build-queue.js.map +1 -0
  195. package/dist/facade/chapter-build.d.ts +60 -0
  196. package/dist/facade/chapter-build.js +1020 -0
  197. package/dist/facade/chapter-build.js.map +1 -0
  198. package/dist/facade/chapter.d.ts +168 -0
  199. package/dist/facade/chapter.js +944 -0
  200. package/dist/facade/chapter.js.map +1 -0
  201. package/dist/facade/digest.d.ts +55 -0
  202. package/dist/facade/digest.js +168 -0
  203. package/dist/facade/digest.js.map +1 -0
  204. package/dist/facade/graph.d.ts +60 -0
  205. package/dist/facade/graph.js +203 -0
  206. package/dist/facade/graph.js.map +1 -0
  207. package/dist/facade/import.d.ts +49 -0
  208. package/dist/facade/import.js +262 -0
  209. package/dist/facade/import.js.map +1 -0
  210. package/dist/facade/index.d.ts +39 -0
  211. package/dist/facade/index.js +171 -0
  212. package/dist/facade/index.js.map +1 -0
  213. package/dist/facade/knowledge-graph-build.d.ts +75 -0
  214. package/dist/facade/knowledge-graph-build.js +897 -0
  215. package/dist/facade/knowledge-graph-build.js.map +1 -0
  216. package/dist/facade/llm-sampling.d.ts +11 -0
  217. package/dist/facade/llm-sampling.js +58 -0
  218. package/dist/facade/llm-sampling.js.map +1 -0
  219. package/dist/facade/types.d.ts +8 -0
  220. package/dist/facade/types.js +1 -0
  221. package/dist/facade/types.js.map +1 -0
  222. package/dist/facade/wiki-graph-archive.d.ts +41 -0
  223. package/dist/facade/wiki-graph-archive.js +130 -0
  224. package/dist/facade/wiki-graph-archive.js.map +1 -0
  225. package/dist/gc/files.d.ts +15 -0
  226. package/dist/gc/files.js +141 -0
  227. package/dist/gc/files.js.map +1 -0
  228. package/dist/gc/index.d.ts +2 -0
  229. package/dist/gc/index.js +5 -0
  230. package/dist/gc/index.js.map +1 -0
  231. package/dist/gc/lock.d.ts +3 -0
  232. package/dist/gc/lock.js +137 -0
  233. package/dist/gc/lock.js.map +1 -0
  234. package/dist/gc/runner.d.ts +9 -0
  235. package/dist/gc/runner.js +129 -0
  236. package/dist/gc/runner.js.map +1 -0
  237. package/dist/gc/tmp-gc.d.ts +5 -0
  238. package/dist/gc/tmp-gc.js +57 -0
  239. package/dist/gc/tmp-gc.js.map +1 -0
  240. package/dist/gc/types.d.ts +24 -0
  241. package/dist/gc/types.js +1 -0
  242. package/dist/gc/types.js.map +1 -0
  243. package/dist/gc.cjs +10041 -0
  244. package/dist/gc.cjs.map +1 -0
  245. package/dist/gc.d.cts +10 -0
  246. package/dist/gc.d.ts +2 -0
  247. package/dist/gc.js +5 -0
  248. package/dist/gc.js.map +1 -0
  249. package/dist/guaranteed/classifier.d.ts +10 -0
  250. package/dist/guaranteed/classifier.js +88 -0
  251. package/dist/guaranteed/classifier.js.map +1 -0
  252. package/dist/guaranteed/errors.d.ts +38 -0
  253. package/dist/guaranteed/errors.js +73 -0
  254. package/dist/guaranteed/errors.js.map +1 -0
  255. package/dist/guaranteed/index.d.ts +7 -0
  256. package/dist/guaranteed/index.js +21 -0
  257. package/dist/guaranteed/index.js.map +1 -0
  258. package/dist/guaranteed/request.d.ts +8 -0
  259. package/dist/guaranteed/request.js +206 -0
  260. package/dist/guaranteed/request.js.map +1 -0
  261. package/dist/guaranteed/response.d.ts +12 -0
  262. package/dist/guaranteed/response.js +98 -0
  263. package/dist/guaranteed/response.js.map +1 -0
  264. package/dist/guaranteed/types.d.ts +20 -0
  265. package/dist/guaranteed/types.js +1 -0
  266. package/dist/guaranteed/types.js.map +1 -0
  267. package/dist/index-B8NNnQ8P.d.ts +424 -0
  268. package/dist/index.cjs +34774 -0
  269. package/dist/index.cjs.map +1 -0
  270. package/dist/index.d.cts +2462 -0
  271. package/dist/index.d.ts +79 -0
  272. package/dist/index.js +168 -0
  273. package/dist/index.js.map +1 -0
  274. package/dist/legacy-sdpub/upgrade.d.ts +7 -0
  275. package/dist/legacy-sdpub/upgrade.js +795 -0
  276. package/dist/legacy-sdpub/upgrade.js.map +1 -0
  277. package/dist/llm/cache.d.ts +13 -0
  278. package/dist/llm/cache.js +35 -0
  279. package/dist/llm/cache.js.map +1 -0
  280. package/dist/llm/client.d.ts +26 -0
  281. package/dist/llm/client.js +572 -0
  282. package/dist/llm/client.js.map +1 -0
  283. package/dist/llm/context.d.ts +22 -0
  284. package/dist/llm/context.js +78 -0
  285. package/dist/llm/context.js.map +1 -0
  286. package/dist/llm/errors.d.ts +7 -0
  287. package/dist/llm/errors.js +12 -0
  288. package/dist/llm/errors.js.map +1 -0
  289. package/dist/llm/index.d.ts +7 -0
  290. package/dist/llm/index.js +17 -0
  291. package/dist/llm/index.js.map +1 -0
  292. package/dist/llm/request-log.d.ts +9 -0
  293. package/dist/llm/request-log.js +35 -0
  294. package/dist/llm/request-log.js.map +1 -0
  295. package/dist/llm/sampling.d.ts +11 -0
  296. package/dist/llm/sampling.js +67 -0
  297. package/dist/llm/sampling.js.map +1 -0
  298. package/dist/llm/types.d.ts +50 -0
  299. package/dist/llm/types.js +1 -0
  300. package/dist/llm/types.js.map +1 -0
  301. package/dist/output/epub/archive.d.ts +9 -0
  302. package/dist/output/epub/archive.js +81 -0
  303. package/dist/output/epub/archive.js.map +1 -0
  304. package/dist/output/epub/book.d.ts +15 -0
  305. package/dist/output/epub/book.js +76 -0
  306. package/dist/output/epub/book.js.map +1 -0
  307. package/dist/output/epub/content.d.ts +9 -0
  308. package/dist/output/epub/content.js +35 -0
  309. package/dist/output/epub/content.js.map +1 -0
  310. package/dist/output/epub/index.d.ts +20 -0
  311. package/dist/output/epub/index.js +14 -0
  312. package/dist/output/epub/index.js.map +1 -0
  313. package/dist/output/epub/model.d.ts +24 -0
  314. package/dist/output/epub/model.js +1 -0
  315. package/dist/output/epub/model.js.map +1 -0
  316. package/dist/output/epub/navigation.d.ts +10 -0
  317. package/dist/output/epub/navigation.js +39 -0
  318. package/dist/output/epub/navigation.js.map +1 -0
  319. package/dist/output/epub/package.d.ts +17 -0
  320. package/dist/output/epub/package.js +29 -0
  321. package/dist/output/epub/package.js.map +1 -0
  322. package/dist/output/epub/shared.d.ts +4 -0
  323. package/dist/output/epub/shared.js +12 -0
  324. package/dist/output/epub/shared.js.map +1 -0
  325. package/dist/output/epub/templates.d.ts +35 -0
  326. package/dist/output/epub/templates.js +26 -0
  327. package/dist/output/epub/templates.js.map +1 -0
  328. package/dist/output/index.d.ts +14 -0
  329. package/dist/output/index.js +11 -0
  330. package/dist/output/index.js.map +1 -0
  331. package/dist/output/plain-text.d.ts +18 -0
  332. package/dist/output/plain-text.js +56 -0
  333. package/dist/output/plain-text.js.map +1 -0
  334. package/dist/progress/index.d.ts +3 -0
  335. package/dist/progress/index.js +14 -0
  336. package/dist/progress/index.js.map +1 -0
  337. package/dist/progress/reporter.d.ts +10 -0
  338. package/dist/progress/reporter.js +79 -0
  339. package/dist/progress/reporter.js.map +1 -0
  340. package/dist/progress/tracker.d.ts +37 -0
  341. package/dist/progress/tracker.js +119 -0
  342. package/dist/progress/tracker.js.map +1 -0
  343. package/dist/progress/types.d.ts +28 -0
  344. package/dist/progress/types.js +1 -0
  345. package/dist/progress/types.js.map +1 -0
  346. package/dist/reader/attention/attention.d.ts +39 -0
  347. package/dist/reader/attention/attention.js +123 -0
  348. package/dist/reader/attention/attention.js.map +1 -0
  349. package/dist/reader/attention/index.d.ts +9 -0
  350. package/dist/reader/attention/index.js +5 -0
  351. package/dist/reader/attention/index.js.map +1 -0
  352. package/dist/reader/attention/wave-reflection.d.ts +21 -0
  353. package/dist/reader/attention/wave-reflection.js +153 -0
  354. package/dist/reader/attention/wave-reflection.js.map +1 -0
  355. package/dist/reader/attention/working-memory.d.ts +28 -0
  356. package/dist/reader/attention/working-memory.js +62 -0
  357. package/dist/reader/attention/working-memory.js.map +1 -0
  358. package/dist/reader/chunk-batch/extract.d.ts +13 -0
  359. package/dist/reader/chunk-batch/extract.js +14 -0
  360. package/dist/reader/chunk-batch/extract.js.map +1 -0
  361. package/dist/reader/chunk-batch/extractor.d.ts +17 -0
  362. package/dist/reader/chunk-batch/extractor.js +337 -0
  363. package/dist/reader/chunk-batch/extractor.js.map +1 -0
  364. package/dist/reader/chunk-batch/fragment-projection.d.ts +34 -0
  365. package/dist/reader/chunk-batch/fragment-projection.js +94 -0
  366. package/dist/reader/chunk-batch/fragment-projection.js.map +1 -0
  367. package/dist/reader/chunk-batch/index.d.ts +12 -0
  368. package/dist/reader/chunk-batch/index.js +13 -0
  369. package/dist/reader/chunk-batch/index.js.map +1 -0
  370. package/dist/reader/chunk-batch/language.d.ts +9 -0
  371. package/dist/reader/chunk-batch/language.js +23 -0
  372. package/dist/reader/chunk-batch/language.js.map +1 -0
  373. package/dist/reader/chunk-batch/parser.d.ts +94 -0
  374. package/dist/reader/chunk-batch/parser.js +640 -0
  375. package/dist/reader/chunk-batch/parser.js.map +1 -0
  376. package/dist/reader/chunk-batch/prompt-templates.d.ts +6 -0
  377. package/dist/reader/chunk-batch/prompt-templates.js +11 -0
  378. package/dist/reader/chunk-batch/prompt-templates.js.map +1 -0
  379. package/dist/reader/chunk-batch/types.d.ts +85 -0
  380. package/dist/reader/chunk-batch/types.js +1 -0
  381. package/dist/reader/chunk-batch/types.js.map +1 -0
  382. package/dist/reader/index.d.ts +13 -0
  383. package/dist/reader/index.js +7 -0
  384. package/dist/reader/index.js.map +1 -0
  385. package/dist/reader/reader.d.ts +37 -0
  386. package/dist/reader/reader.js +82 -0
  387. package/dist/reader/reader.js.map +1 -0
  388. package/dist/reader/segment/index.d.ts +2 -0
  389. package/dist/reader/segment/index.js +5 -0
  390. package/dist/reader/segment/index.js.map +1 -0
  391. package/dist/reader/segment/intl-segmenter.d.ts +5 -0
  392. package/dist/reader/segment/intl-segmenter.js +102 -0
  393. package/dist/reader/segment/intl-segmenter.js.map +1 -0
  394. package/dist/reader/segment/segment.d.ts +5 -0
  395. package/dist/reader/segment/segment.js +9 -0
  396. package/dist/reader/segment/segment.js.map +1 -0
  397. package/dist/reader/segment/types.d.ts +14 -0
  398. package/dist/reader/segment/types.js +1 -0
  399. package/dist/reader/segment/types.js.map +1 -0
  400. package/dist/reader/types.d.ts +29 -0
  401. package/dist/reader/types.js +1 -0
  402. package/dist/reader/types.js.map +1 -0
  403. package/dist/serial.d.ts +89 -0
  404. package/dist/serial.js +476 -0
  405. package/dist/serial.js.map +1 -0
  406. package/dist/source/adapter.d.ts +15 -0
  407. package/dist/source/adapter.js +1 -0
  408. package/dist/source/adapter.js.map +1 -0
  409. package/dist/source/epub/archive.d.ts +27 -0
  410. package/dist/source/epub/archive.js +189 -0
  411. package/dist/source/epub/archive.js.map +1 -0
  412. package/dist/source/epub/content.d.ts +22 -0
  413. package/dist/source/epub/content.js +183 -0
  414. package/dist/source/epub/content.js.map +1 -0
  415. package/dist/source/epub/document.d.ts +55 -0
  416. package/dist/source/epub/document.js +179 -0
  417. package/dist/source/epub/document.js.map +1 -0
  418. package/dist/source/epub/index.d.ts +10 -0
  419. package/dist/source/epub/index.js +6 -0
  420. package/dist/source/epub/index.js.map +1 -0
  421. package/dist/source/epub/navigation.d.ts +16 -0
  422. package/dist/source/epub/navigation.js +215 -0
  423. package/dist/source/epub/navigation.js.map +1 -0
  424. package/dist/source/epub/package.d.ts +33 -0
  425. package/dist/source/epub/package.js +237 -0
  426. package/dist/source/epub/package.js.map +1 -0
  427. package/dist/source/epub/xml.d.ts +16 -0
  428. package/dist/source/epub/xml.js +111 -0
  429. package/dist/source/epub/xml.js.map +1 -0
  430. package/dist/source/index.d.ts +12 -0
  431. package/dist/source/index.js +32 -0
  432. package/dist/source/index.js.map +1 -0
  433. package/dist/source/meta.d.ts +30 -0
  434. package/dist/source/meta.js +22 -0
  435. package/dist/source/meta.js.map +1 -0
  436. package/dist/source/plain-text.d.ts +16 -0
  437. package/dist/source/plain-text.js +86 -0
  438. package/dist/source/plain-text.js.map +1 -0
  439. package/dist/source/toc.d.ts +16 -0
  440. package/dist/source/toc.js +17 -0
  441. package/dist/source/toc.js.map +1 -0
  442. package/dist/source/types.d.ts +16 -0
  443. package/dist/source/types.js +1 -0
  444. package/dist/source/types.js.map +1 -0
  445. package/dist/topology/grouping.d.ts +15 -0
  446. package/dist/topology/grouping.js +18 -0
  447. package/dist/topology/grouping.js.map +1 -0
  448. package/dist/topology/index.d.ts +21 -0
  449. package/dist/topology/index.js +5 -0
  450. package/dist/topology/index.js.map +1 -0
  451. package/dist/topology/resource-segmentation.d.ts +13 -0
  452. package/dist/topology/resource-segmentation.js +111 -0
  453. package/dist/topology/resource-segmentation.js.map +1 -0
  454. package/dist/topology/segment-incision.d.ts +18 -0
  455. package/dist/topology/segment-incision.js +197 -0
  456. package/dist/topology/segment-incision.js.map +1 -0
  457. package/dist/topology/snake-detector.d.ts +13 -0
  458. package/dist/topology/snake-detector.js +520 -0
  459. package/dist/topology/snake-detector.js.map +1 -0
  460. package/dist/topology/snake-graph-builder.d.ts +14 -0
  461. package/dist/topology/snake-graph-builder.js +76 -0
  462. package/dist/topology/snake-graph-builder.js.map +1 -0
  463. package/dist/topology/topology.d.ts +29 -0
  464. package/dist/topology/topology.js +348 -0
  465. package/dist/topology/topology.js.map +1 -0
  466. package/dist/topology/weights.d.ts +10 -0
  467. package/dist/topology/weights.js +84 -0
  468. package/dist/topology/weights.js.map +1 -0
  469. package/dist/types-FVIqiLC9.d.cts +24 -0
  470. package/dist/utils/async-semaphore.d.ts +7 -0
  471. package/dist/utils/async-semaphore.js +40 -0
  472. package/dist/utils/async-semaphore.js.map +1 -0
  473. package/dist/utils/enum.d.ts +5 -0
  474. package/dist/utils/enum.js +18 -0
  475. package/dist/utils/enum.js.map +1 -0
  476. package/dist/utils/hash.d.ts +3 -0
  477. package/dist/utils/hash.js +132 -0
  478. package/dist/utils/hash.js.map +1 -0
  479. package/dist/utils/node-error.d.ts +4 -0
  480. package/dist/utils/node-error.js +59 -0
  481. package/dist/utils/node-error.js.map +1 -0
  482. package/dist/wikg/archive-uri.d.ts +1 -0
  483. package/dist/wikg/archive-uri.js +37 -0
  484. package/dist/wikg/archive-uri.js.map +1 -0
  485. package/dist/wikg/archive.d.ts +28 -0
  486. package/dist/wikg/archive.js +496 -0
  487. package/dist/wikg/archive.js.map +1 -0
  488. package/dist/wikg/index.d.ts +31 -0
  489. package/dist/wikg/index.js +60 -0
  490. package/dist/wikg/index.js.map +1 -0
  491. package/dist/wikg/wikg-coordinator.d.ts +45 -0
  492. package/dist/wikg/wikg-coordinator.js +1687 -0
  493. package/dist/wikg/wikg-coordinator.js.map +1 -0
  494. package/dist/wikg/wiki-graph-archive-file.d.ts +42 -0
  495. package/dist/wikg/wiki-graph-archive-file.js +78 -0
  496. package/dist/wikg/wiki-graph-archive-file.js.map +1 -0
  497. package/dist/wikilink/index.d.ts +10 -0
  498. package/dist/wikilink/index.js +7 -0
  499. package/dist/wikilink/index.js.map +1 -0
  500. package/dist/wikilink/relation-discovery.d.ts +31 -0
  501. package/dist/wikilink/relation-discovery.js +477 -0
  502. package/dist/wikilink/relation-discovery.js.map +1 -0
  503. package/dist/wikilink/types.d.ts +23 -0
  504. package/dist/wikilink/types.js +1 -0
  505. package/dist/wikilink/types.js.map +1 -0
  506. package/dist/wikilink/window.d.ts +7 -0
  507. package/dist/wikilink/window.js +53 -0
  508. package/dist/wikilink/window.js.map +1 -0
  509. package/dist/wikimatch/enrichment.d.ts +10 -0
  510. package/dist/wikimatch/enrichment.js +55 -0
  511. package/dist/wikimatch/enrichment.js.map +1 -0
  512. package/dist/wikimatch/index.d.ts +16 -0
  513. package/dist/wikimatch/index.js +66 -0
  514. package/dist/wikimatch/index.js.map +1 -0
  515. package/dist/wikimatch/option-narrowing.d.ts +17 -0
  516. package/dist/wikimatch/option-narrowing.js +208 -0
  517. package/dist/wikimatch/option-narrowing.js.map +1 -0
  518. package/dist/wikimatch/options.d.ts +14 -0
  519. package/dist/wikimatch/options.js +155 -0
  520. package/dist/wikimatch/options.js.map +1 -0
  521. package/dist/wikimatch/policy-judge.d.ts +17 -0
  522. package/dist/wikimatch/policy-judge.js +430 -0
  523. package/dist/wikimatch/policy-judge.js.map +1 -0
  524. package/dist/wikimatch/range-suppression.d.ts +9 -0
  525. package/dist/wikimatch/range-suppression.js +27 -0
  526. package/dist/wikimatch/range-suppression.js.map +1 -0
  527. package/dist/wikimatch/surface-screening.d.ts +16 -0
  528. package/dist/wikimatch/surface-screening.js +168 -0
  529. package/dist/wikimatch/surface-screening.js.map +1 -0
  530. package/dist/wikimatch/surface-window.d.ts +6 -0
  531. package/dist/wikimatch/surface-window.js +44 -0
  532. package/dist/wikimatch/surface-window.js.map +1 -0
  533. package/dist/wikimatch/types.d.ts +151 -0
  534. package/dist/wikimatch/types.js +1 -0
  535. package/dist/wikimatch/types.js.map +1 -0
  536. package/dist/wikimatch/wikispine.d.ts +43 -0
  537. package/dist/wikimatch/wikispine.js +399 -0
  538. package/dist/wikimatch/wikispine.js.map +1 -0
  539. package/dist/wikimatch/window.d.ts +6 -0
  540. package/dist/wikimatch/window.js +83 -0
  541. package/dist/wikimatch/window.js.map +1 -0
  542. package/dist/wikimatch/words.d.ts +16 -0
  543. package/dist/wikimatch/words.js +66 -0
  544. package/dist/wikimatch/words.js.map +1 -0
  545. package/dist/wikipage/cache.d.ts +18 -0
  546. package/dist/wikipage/cache.js +404 -0
  547. package/dist/wikipage/cache.js.map +1 -0
  548. package/dist/wikipage/fetch-log.d.ts +17 -0
  549. package/dist/wikipage/fetch-log.js +143 -0
  550. package/dist/wikipage/fetch-log.js.map +1 -0
  551. package/dist/wikipage/index.d.ts +14 -0
  552. package/dist/wikipage/index.js +17 -0
  553. package/dist/wikipage/index.js.map +1 -0
  554. package/dist/wikipage/normalizer.d.ts +14 -0
  555. package/dist/wikipage/normalizer.js +147 -0
  556. package/dist/wikipage/normalizer.js.map +1 -0
  557. package/dist/wikipage/rate-limiter.d.ts +13 -0
  558. package/dist/wikipage/rate-limiter.js +84 -0
  559. package/dist/wikipage/rate-limiter.js.map +1 -0
  560. package/dist/wikipage/resolver.d.ts +26 -0
  561. package/dist/wikipage/resolver.js +325 -0
  562. package/dist/wikipage/resolver.js.map +1 -0
  563. package/dist/wikipage/types.d.ts +96 -0
  564. package/dist/wikipage/types.js +1 -0
  565. package/dist/wikipage/types.js.map +1 -0
  566. package/dist/wikipage/wikimedia-client.d.ts +48 -0
  567. package/dist/wikipage/wikimedia-client.js +397 -0
  568. package/dist/wikipage/wikimedia-client.js.map +1 -0
  569. package/dist/worker-BgQ0Xl8T.d.cts +181 -0
  570. package/dist/worker.cjs +5259 -0
  571. package/dist/worker.cjs.map +1 -0
  572. package/dist/worker.d.cts +2 -0
  573. package/dist/worker.d.ts +2 -0
  574. package/dist/worker.js +5 -0
  575. package/dist/worker.js.map +1 -0
  576. 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,9 @@
1
+ import { Language } from '../../common/language.js';
2
+
3
+ declare function needsTranslation(input: {
4
+ content: string;
5
+ label: string;
6
+ targetLanguage: Language;
7
+ }): boolean;
8
+
9
+ export { needsTranslation };
@@ -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":[]}