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,202 @@
1
+ import { appendFile, writeFile } from "fs/promises";
2
+ import { allocateArtifactPath } from "../common/logging.js";
3
+ import { formatIssuesForLog } from "./feedback.js";
4
+ class CompressionLog {
5
+ #compressionRatio;
6
+ #groupId;
7
+ #logDirPath;
8
+ #maxIterations;
9
+ #serialId;
10
+ #filePath;
11
+ constructor(serialId, groupId, options) {
12
+ this.#compressionRatio = options.compressionRatio;
13
+ this.#groupId = groupId;
14
+ this.#logDirPath = options.logDirPath;
15
+ this.#maxIterations = options.maxIterations;
16
+ this.#serialId = serialId;
17
+ }
18
+ async appendCompressionResult(input) {
19
+ if (this.#filePath === void 0) {
20
+ return;
21
+ }
22
+ const parts = [];
23
+ if (input.thinkingText !== "") {
24
+ parts.push(
25
+ "Thinking:",
26
+ "-".repeat(80),
27
+ input.thinkingText,
28
+ "-".repeat(80),
29
+ ""
30
+ );
31
+ }
32
+ parts.push(
33
+ `Compressed Text (${input.compressedText.length} characters):`,
34
+ "-".repeat(80),
35
+ input.compressedText,
36
+ "-".repeat(80),
37
+ "",
38
+ ""
39
+ );
40
+ await appendFile(this.#filePath, `${parts.join("\n")}
41
+ `, "utf8");
42
+ }
43
+ async appendFinalSelection(bestVersion, originalLength) {
44
+ if (this.#filePath === void 0) {
45
+ return;
46
+ }
47
+ const parts = [
48
+ "",
49
+ "=".repeat(80),
50
+ "FINAL SELECTION",
51
+ "=".repeat(80),
52
+ "",
53
+ `Selected: Iteration ${bestVersion.iteration}/${this.#maxIterations}`,
54
+ `Score: ${bestVersion.score.toFixed(2)}`,
55
+ `Length: ${bestVersion.text.length} characters`,
56
+ `Compression ratio: ${(bestVersion.text.length / originalLength).toFixed(1)}%`,
57
+ "",
58
+ "=".repeat(80),
59
+ ""
60
+ ];
61
+ if (bestVersion.score > 0) {
62
+ parts.push(
63
+ "REMAINING UNRESOLVED ISSUES",
64
+ "=".repeat(80),
65
+ "",
66
+ formatIssuesForLog(bestVersion.reviews),
67
+ "=".repeat(80),
68
+ ""
69
+ );
70
+ }
71
+ await appendFile(this.#filePath, `${parts.join("\n")}
72
+ `, "utf8");
73
+ }
74
+ async appendIterationHeader(iteration, revisionFeedback) {
75
+ if (this.#filePath === void 0) {
76
+ return;
77
+ }
78
+ const parts = [
79
+ "",
80
+ "=".repeat(80),
81
+ `ITERATION ${iteration}/${this.#maxIterations}`,
82
+ "=".repeat(80),
83
+ ""
84
+ ];
85
+ if (revisionFeedback !== void 0 && revisionFeedback.trim() !== "") {
86
+ parts.push(
87
+ "Revision Feedback:",
88
+ "-".repeat(80),
89
+ revisionFeedback,
90
+ "-".repeat(80),
91
+ ""
92
+ );
93
+ }
94
+ await appendFile(this.#filePath, `${parts.join("\n")}
95
+ `, "utf8");
96
+ }
97
+ async appendLanguageMismatch(input) {
98
+ if (this.#filePath === void 0) {
99
+ return;
100
+ }
101
+ const issue = input.review.issues[0];
102
+ if (issue === void 0) {
103
+ return;
104
+ }
105
+ const parts = [
106
+ "",
107
+ "!".repeat(80),
108
+ "LANGUAGE MISMATCH DETECTED",
109
+ "!".repeat(80),
110
+ `Expected: ${input.targetLanguageCode} (${input.userLanguage ?? "unknown"})`,
111
+ `Detected: ${input.detectedLanguageCode}`,
112
+ `Issue: ${issue.problem}`,
113
+ `Suggestion: ${issue.suggestion}`,
114
+ "!".repeat(80),
115
+ ""
116
+ ];
117
+ await appendFile(this.#filePath, `${parts.join("\n")}
118
+ `, "utf8");
119
+ }
120
+ async initialize(clues) {
121
+ if (this.#logDirPath === void 0) {
122
+ return;
123
+ }
124
+ const timestamp = formatTimestamp(/* @__PURE__ */ new Date());
125
+ this.#filePath = allocateArtifactPath({
126
+ category: "editor",
127
+ logDirPath: this.#logDirPath,
128
+ prefix: `compression-serial-${this.#serialId}-group-${this.#groupId}`
129
+ });
130
+ if (this.#filePath === void 0) {
131
+ return;
132
+ }
133
+ await writeFile(
134
+ this.#filePath,
135
+ [
136
+ "=== Text Compression Log ===",
137
+ `Serial: ${this.#serialId}, Group: ${this.#groupId}`,
138
+ `Started at: ${timestamp}`,
139
+ `Compression ratio target: ${Math.round(this.#compressionRatio * 100)}%`,
140
+ `Max iterations: ${this.#maxIterations}`,
141
+ "",
142
+ "",
143
+ formatChunkHierarchy(clues, this.#groupId, this.#serialId),
144
+ ""
145
+ ].join("\n"),
146
+ "utf8"
147
+ );
148
+ }
149
+ }
150
+ function formatChunkHierarchy(clues, groupId, serialId) {
151
+ const parts = [
152
+ "=".repeat(80),
153
+ `CHUNK HIERARCHY - Serial ${serialId}, Group ${groupId}`,
154
+ "=".repeat(80),
155
+ ""
156
+ ];
157
+ for (let clueIndex = 0; clueIndex < clues.length; clueIndex += 1) {
158
+ const clue = clues[clueIndex];
159
+ if (clue === void 0) {
160
+ continue;
161
+ }
162
+ parts.push(
163
+ `Clue #${clueIndex + 1} (ID: ${clue.clueId})`,
164
+ `|- Weight: ${clue.weight.toFixed(4)}`,
165
+ `|- Label: ${clue.label}`,
166
+ `|- Source snakes: ${clue.sourceSnakeIds.join(", ")}`,
167
+ `|- Merged: ${clue.isMerged ? "yes" : "no"}`,
168
+ `\\- Chunks: ${clue.chunks.length}`,
169
+ ""
170
+ );
171
+ for (let chunkIndex = 0; chunkIndex < clue.chunks.length; chunkIndex += 1) {
172
+ const chunk = clue.chunks[chunkIndex];
173
+ if (chunk === void 0) {
174
+ continue;
175
+ }
176
+ const contentPreview = chunk.content.length > 60 ? `${chunk.content.slice(0, 60)}...` : chunk.content;
177
+ parts.push(
178
+ ` - Chunk ${chunkIndex + 1}/${clue.chunks.length} (ID: ${chunk.id})`,
179
+ ` Label: ${chunk.label}`,
180
+ ` Retention: ${chunk.retention ?? "N/A"}`,
181
+ ` Importance: ${chunk.importance ?? "N/A"}`,
182
+ ` Content: ${contentPreview}`,
183
+ ""
184
+ );
185
+ }
186
+ }
187
+ parts.push("=".repeat(80), "");
188
+ return parts.join("\n");
189
+ }
190
+ function formatTimestamp(date) {
191
+ const year = date.getFullYear();
192
+ const month = String(date.getMonth() + 1).padStart(2, "0");
193
+ const day = String(date.getDate()).padStart(2, "0");
194
+ const hours = String(date.getHours()).padStart(2, "0");
195
+ const minutes = String(date.getMinutes()).padStart(2, "0");
196
+ const seconds = String(date.getSeconds()).padStart(2, "0");
197
+ return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;
198
+ }
199
+ export {
200
+ CompressionLog
201
+ };
202
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/editor/log.ts"],"sourcesContent":["import { appendFile, writeFile } from \"fs/promises\";\nimport { allocateArtifactPath } from \"../common/logging.js\";\n\nimport type { Language } from \"../common/language.js\";\nimport type { Clue } from \"./clue.js\";\nimport { formatIssuesForLog } from \"./feedback.js\";\nimport type { CompressionVersion, ReviewResult } from \"./types.js\";\n\nexport class CompressionLog {\n readonly #compressionRatio: number;\n readonly #groupId: number;\n readonly #logDirPath: string | undefined;\n readonly #maxIterations: number;\n readonly #serialId: number;\n #filePath: string | undefined;\n\n public constructor(\n serialId: number,\n groupId: number,\n options: {\n readonly compressionRatio: number;\n readonly logDirPath?: string;\n readonly maxIterations: number;\n },\n ) {\n this.#compressionRatio = options.compressionRatio;\n this.#groupId = groupId;\n this.#logDirPath = options.logDirPath;\n this.#maxIterations = options.maxIterations;\n this.#serialId = serialId;\n }\n\n public async appendCompressionResult(input: {\n compressedText: string;\n thinkingText: string;\n }): Promise<void> {\n if (this.#filePath === undefined) {\n return;\n }\n\n const parts: string[] = [];\n\n if (input.thinkingText !== \"\") {\n parts.push(\n \"Thinking:\",\n \"-\".repeat(80),\n input.thinkingText,\n \"-\".repeat(80),\n \"\",\n );\n }\n\n parts.push(\n `Compressed Text (${input.compressedText.length} characters):`,\n \"-\".repeat(80),\n input.compressedText,\n \"-\".repeat(80),\n \"\",\n \"\",\n );\n\n await appendFile(this.#filePath, `${parts.join(\"\\n\")}\\n`, \"utf8\");\n }\n\n public async appendFinalSelection(\n bestVersion: CompressionVersion,\n originalLength: number,\n ): Promise<void> {\n if (this.#filePath === undefined) {\n return;\n }\n\n const parts = [\n \"\",\n \"=\".repeat(80),\n \"FINAL SELECTION\",\n \"=\".repeat(80),\n \"\",\n `Selected: Iteration ${bestVersion.iteration}/${this.#maxIterations}`,\n `Score: ${bestVersion.score.toFixed(2)}`,\n `Length: ${bestVersion.text.length} characters`,\n `Compression ratio: ${(bestVersion.text.length / originalLength).toFixed(1)}%`,\n \"\",\n \"=\".repeat(80),\n \"\",\n ];\n\n if (bestVersion.score > 0) {\n parts.push(\n \"REMAINING UNRESOLVED ISSUES\",\n \"=\".repeat(80),\n \"\",\n formatIssuesForLog(bestVersion.reviews),\n \"=\".repeat(80),\n \"\",\n );\n }\n\n await appendFile(this.#filePath, `${parts.join(\"\\n\")}\\n`, \"utf8\");\n }\n\n public async appendIterationHeader(\n iteration: number,\n revisionFeedback: string | undefined,\n ): Promise<void> {\n if (this.#filePath === undefined) {\n return;\n }\n\n const parts = [\n \"\",\n \"=\".repeat(80),\n `ITERATION ${iteration}/${this.#maxIterations}`,\n \"=\".repeat(80),\n \"\",\n ];\n\n if (revisionFeedback !== undefined && revisionFeedback.trim() !== \"\") {\n parts.push(\n \"Revision Feedback:\",\n \"-\".repeat(80),\n revisionFeedback,\n \"-\".repeat(80),\n \"\",\n );\n }\n\n await appendFile(this.#filePath, `${parts.join(\"\\n\")}\\n`, \"utf8\");\n }\n\n public async appendLanguageMismatch(input: {\n detectedLanguageCode: string;\n review: ReviewResult;\n targetLanguageCode: string;\n userLanguage: Language | undefined;\n }): Promise<void> {\n if (this.#filePath === undefined) {\n return;\n }\n\n const issue = input.review.issues[0];\n\n if (issue === undefined) {\n return;\n }\n\n const parts = [\n \"\",\n \"!\".repeat(80),\n \"LANGUAGE MISMATCH DETECTED\",\n \"!\".repeat(80),\n `Expected: ${input.targetLanguageCode} (${input.userLanguage ?? \"unknown\"})`,\n `Detected: ${input.detectedLanguageCode}`,\n `Issue: ${issue.problem}`,\n `Suggestion: ${issue.suggestion}`,\n \"!\".repeat(80),\n \"\",\n ];\n\n await appendFile(this.#filePath, `${parts.join(\"\\n\")}\\n`, \"utf8\");\n }\n\n public async initialize(clues: readonly Clue[]): Promise<void> {\n if (this.#logDirPath === undefined) {\n return;\n }\n\n const timestamp = formatTimestamp(new Date());\n\n this.#filePath = allocateArtifactPath({\n category: \"editor\",\n logDirPath: this.#logDirPath,\n prefix: `compression-serial-${this.#serialId}-group-${this.#groupId}`,\n });\n\n if (this.#filePath === undefined) {\n return;\n }\n\n await writeFile(\n this.#filePath,\n [\n \"=== Text Compression Log ===\",\n `Serial: ${this.#serialId}, Group: ${this.#groupId}`,\n `Started at: ${timestamp}`,\n `Compression ratio target: ${Math.round(this.#compressionRatio * 100)}%`,\n `Max iterations: ${this.#maxIterations}`,\n \"\",\n \"\",\n formatChunkHierarchy(clues, this.#groupId, this.#serialId),\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n }\n}\n\nfunction formatChunkHierarchy(\n clues: readonly Clue[],\n groupId: number,\n serialId: number,\n): string {\n const parts = [\n \"=\".repeat(80),\n `CHUNK HIERARCHY - Serial ${serialId}, Group ${groupId}`,\n \"=\".repeat(80),\n \"\",\n ];\n\n for (let clueIndex = 0; clueIndex < clues.length; clueIndex += 1) {\n const clue = clues[clueIndex];\n\n if (clue === undefined) {\n continue;\n }\n\n parts.push(\n `Clue #${clueIndex + 1} (ID: ${clue.clueId})`,\n `|- Weight: ${clue.weight.toFixed(4)}`,\n `|- Label: ${clue.label}`,\n `|- Source snakes: ${clue.sourceSnakeIds.join(\", \")}`,\n `|- Merged: ${clue.isMerged ? \"yes\" : \"no\"}`,\n `\\\\- Chunks: ${clue.chunks.length}`,\n \"\",\n );\n\n for (let chunkIndex = 0; chunkIndex < clue.chunks.length; chunkIndex += 1) {\n const chunk = clue.chunks[chunkIndex];\n\n if (chunk === undefined) {\n continue;\n }\n\n const contentPreview =\n chunk.content.length > 60\n ? `${chunk.content.slice(0, 60)}...`\n : chunk.content;\n\n parts.push(\n ` - Chunk ${chunkIndex + 1}/${clue.chunks.length} (ID: ${chunk.id})`,\n ` Label: ${chunk.label}`,\n ` Retention: ${chunk.retention ?? \"N/A\"}`,\n ` Importance: ${chunk.importance ?? \"N/A\"}`,\n ` Content: ${contentPreview}`,\n \"\",\n );\n }\n }\n\n parts.push(\"=\".repeat(80), \"\");\n\n return parts.join(\"\\n\");\n}\n\nfunction formatTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,20 @@
1
+ import { ReadonlySerialTextStream } from '../document/text-streams.js';
2
+ import { ChunkRecord } from '../document/types.js';
3
+ import '../document/database.js';
4
+ import 'sqlite3';
5
+
6
+ declare function formatClueAsBook(input: {
7
+ chunks: readonly ChunkRecord[];
8
+ serialFragments: ReadonlySerialTextStream;
9
+ fullMarkup?: boolean;
10
+ wrapHighRetention?: boolean;
11
+ }): Promise<string>;
12
+ declare function formatChunksAsBook(input: {
13
+ chunks: readonly ChunkRecord[];
14
+ segmentStartIndexes: readonly number[];
15
+ serialFragments: ReadonlySerialTextStream;
16
+ fullMarkup?: boolean;
17
+ wrapHighRetention?: boolean;
18
+ }): Promise<string>;
19
+
20
+ export { formatChunksAsBook, formatClueAsBook };
@@ -0,0 +1,294 @@
1
+ import {
2
+ ChunkRetention
3
+ } from "../document/index.js";
4
+ async function formatClueAsBook(input) {
5
+ return await formatChunksAsBook({
6
+ chunks: input.chunks,
7
+ segmentStartIndexes: await listSegmentStartIndexesCoveringChunks(
8
+ input.chunks,
9
+ input.serialFragments
10
+ ),
11
+ serialFragments: input.serialFragments,
12
+ ...input.fullMarkup === void 0 ? {} : {
13
+ fullMarkup: input.fullMarkup
14
+ },
15
+ ...input.wrapHighRetention === void 0 ? {} : {
16
+ wrapHighRetention: input.wrapHighRetention
17
+ }
18
+ });
19
+ }
20
+ async function formatChunksAsBook(input) {
21
+ if (input.segmentStartIndexes.length === 0) {
22
+ return "";
23
+ }
24
+ const chunkCoverage = createChunkCoverage(input.chunks);
25
+ const segmentStartIndexes = [...input.segmentStartIndexes].sort(
26
+ compareNumber
27
+ );
28
+ const allSegmentStartIndexes = [
29
+ ...await input.serialFragments.listFragmentIds()
30
+ ].sort(compareNumber);
31
+ const fragments = await loadFragments(
32
+ listRequiredSegmentStartIndexes(
33
+ segmentStartIndexes,
34
+ allSegmentStartIndexes
35
+ ),
36
+ input.serialFragments
37
+ );
38
+ const resultParts = [];
39
+ for (let index = 0; index < segmentStartIndexes.length; index += 1) {
40
+ const startSentenceIndex = segmentStartIndexes[index];
41
+ if (startSentenceIndex === void 0) {
42
+ continue;
43
+ }
44
+ const fragment = fragments[String(startSentenceIndex)];
45
+ if (fragment === void 0) {
46
+ continue;
47
+ }
48
+ if (index > 0) {
49
+ const previousStartSentenceIndex = segmentStartIndexes[index - 1];
50
+ if (previousStartSentenceIndex !== void 0 && startSentenceIndex > previousStartSentenceIndex) {
51
+ const skippedSummary = collectSkippedSummary({
52
+ fragments,
53
+ skippedStartIndexes: listSkippedSegmentStartIndexes(
54
+ allSegmentStartIndexes,
55
+ previousStartSentenceIndex,
56
+ startSentenceIndex
57
+ )
58
+ });
59
+ if (skippedSummary !== "") {
60
+ resultParts.push(skippedSummary);
61
+ }
62
+ }
63
+ }
64
+ resultParts.push(
65
+ buildFragmentMarkup({
66
+ chunkCoverage,
67
+ fragment,
68
+ fullMarkup: input.fullMarkup ?? false,
69
+ wrapHighRetention: input.wrapHighRetention ?? false
70
+ })
71
+ );
72
+ }
73
+ return resultParts.join("\n\n");
74
+ }
75
+ function buildFragmentMarkup(input) {
76
+ const sentenceRanges = [];
77
+ const { fragment } = input;
78
+ let sentenceIndex = 0;
79
+ while (sentenceIndex < fragment.sentences.length) {
80
+ const sentence = fragment.sentences[sentenceIndex];
81
+ if (sentence === void 0) {
82
+ sentenceIndex += 1;
83
+ continue;
84
+ }
85
+ const sentenceId = createSentenceKey(
86
+ fragment.serialId,
87
+ fragment.fragmentId + sentenceIndex
88
+ );
89
+ const coveredChunks = input.chunkCoverage[sentenceId];
90
+ if (coveredChunks === void 0) {
91
+ sentenceRanges.push({
92
+ endIndex: sentenceIndex + 1,
93
+ startIndex: sentenceIndex
94
+ });
95
+ sentenceIndex += 1;
96
+ continue;
97
+ }
98
+ const chunkAttributes = mergeChunkAttributes(coveredChunks);
99
+ let endIndex = sentenceIndex + 1;
100
+ while (endIndex < fragment.sentences.length) {
101
+ const nextSentenceId = createSentenceKey(
102
+ fragment.serialId,
103
+ fragment.fragmentId + endIndex
104
+ );
105
+ const nextCoveredChunks = input.chunkCoverage[nextSentenceId];
106
+ if (nextCoveredChunks === void 0) {
107
+ break;
108
+ }
109
+ const nextAttributes = mergeChunkAttributes(nextCoveredChunks);
110
+ if (nextAttributes.label !== chunkAttributes.label) {
111
+ break;
112
+ }
113
+ endIndex += 1;
114
+ }
115
+ sentenceRanges.push({
116
+ chunkAttributes,
117
+ endIndex,
118
+ startIndex: sentenceIndex
119
+ });
120
+ sentenceIndex = endIndex;
121
+ }
122
+ const parts = sentenceRanges.map(
123
+ (range) => renderSentenceRange({
124
+ fragment,
125
+ fullMarkup: input.fullMarkup,
126
+ range,
127
+ wrapHighRetention: input.wrapHighRetention
128
+ })
129
+ );
130
+ return parts.join(" ");
131
+ }
132
+ function collectSkippedSummary(input) {
133
+ const summaries = [];
134
+ for (const startSentenceIndex of input.skippedStartIndexes) {
135
+ const summary = input.fragments[String(startSentenceIndex)]?.summary?.trim() ?? "";
136
+ if (summary !== "") {
137
+ summaries.push(summary);
138
+ }
139
+ }
140
+ return summaries.join(" ");
141
+ }
142
+ function createChunkCoverage(chunks) {
143
+ const coverage = /* @__PURE__ */ Object.create(null);
144
+ for (const chunk of chunks) {
145
+ for (const sentenceId of chunk.sentenceIds) {
146
+ const coverageKey = createSentenceKey(...sentenceId);
147
+ const coveredChunks = coverage[coverageKey];
148
+ coverage[coverageKey] = coveredChunks === void 0 ? [chunk] : [...coveredChunks, chunk];
149
+ }
150
+ }
151
+ return coverage;
152
+ }
153
+ function createSentenceKey(serialId, sentenceIndex) {
154
+ return `${serialId}:${sentenceIndex}`;
155
+ }
156
+ function listRequiredSegmentStartIndexes(selectedStartIndexes, allStartIndexes) {
157
+ const required = new Set(selectedStartIndexes);
158
+ for (let index = 1; index < selectedStartIndexes.length; index += 1) {
159
+ const previousStartIndex = selectedStartIndexes[index - 1];
160
+ const nextStartIndex = selectedStartIndexes[index];
161
+ if (previousStartIndex === void 0 || nextStartIndex === void 0) {
162
+ continue;
163
+ }
164
+ for (const skippedStartIndex of listSkippedSegmentStartIndexes(
165
+ allStartIndexes,
166
+ previousStartIndex,
167
+ nextStartIndex
168
+ )) {
169
+ required.add(skippedStartIndex);
170
+ }
171
+ }
172
+ return [...required].sort(compareNumber);
173
+ }
174
+ function listSkippedSegmentStartIndexes(allStartIndexes, previousStartIndex, nextStartIndex) {
175
+ return allStartIndexes.filter(
176
+ (startIndex) => startIndex > previousStartIndex && startIndex < nextStartIndex
177
+ );
178
+ }
179
+ async function listSegmentStartIndexesCoveringChunks(chunks, serialFragments) {
180
+ const allSegmentStartIndexes = [
181
+ ...await serialFragments.listFragmentIds()
182
+ ].sort(compareNumber);
183
+ const startIndexRecord = /* @__PURE__ */ Object.create(null);
184
+ const startIndexes = [];
185
+ for (const chunk of chunks) {
186
+ for (const sentenceId of chunk.sentenceIds) {
187
+ const startSentenceIndex = findContainingSegmentStartIndex(
188
+ allSegmentStartIndexes,
189
+ sentenceId[1]
190
+ );
191
+ if (startSentenceIndex === void 0) {
192
+ continue;
193
+ }
194
+ const startIndexKey = String(startSentenceIndex);
195
+ if (startIndexRecord[startIndexKey] === true) {
196
+ continue;
197
+ }
198
+ startIndexRecord[startIndexKey] = true;
199
+ startIndexes.push(startSentenceIndex);
200
+ }
201
+ }
202
+ startIndexes.sort(compareNumber);
203
+ return startIndexes;
204
+ }
205
+ function findContainingSegmentStartIndex(segmentStartIndexes, sentenceIndex) {
206
+ let containingStartIndex;
207
+ for (const startIndex of segmentStartIndexes) {
208
+ if (startIndex > sentenceIndex) {
209
+ break;
210
+ }
211
+ containingStartIndex = startIndex;
212
+ }
213
+ return containingStartIndex;
214
+ }
215
+ async function loadFragments(startSentenceIndexes, serialFragments) {
216
+ const fragments = /* @__PURE__ */ Object.create(null);
217
+ await Promise.all(
218
+ startSentenceIndexes.map(async (startSentenceIndex) => {
219
+ fragments[String(startSentenceIndex)] = await serialFragments.getFragment(startSentenceIndex);
220
+ })
221
+ );
222
+ return fragments;
223
+ }
224
+ function compareNumber(left, right) {
225
+ return left - right;
226
+ }
227
+ function mergeChunkAttributes(chunksAtPosition) {
228
+ const retentionOrder = createMetadataOrder({
229
+ detailed: 3,
230
+ focused: 2,
231
+ relevant: 1,
232
+ verbatim: 4
233
+ });
234
+ const importanceOrder = createMetadataOrder({
235
+ critical: 3,
236
+ helpful: 1,
237
+ important: 2
238
+ });
239
+ let bestRetentionChunk = chunksAtPosition[0];
240
+ let bestImportanceChunk = chunksAtPosition[0];
241
+ for (const chunk of chunksAtPosition) {
242
+ if (getMetadataRank(chunk.retention, retentionOrder) > getMetadataRank(bestRetentionChunk?.retention, retentionOrder)) {
243
+ bestRetentionChunk = chunk;
244
+ }
245
+ if (getMetadataRank(chunk.importance, importanceOrder) > getMetadataRank(bestImportanceChunk?.importance, importanceOrder)) {
246
+ bestImportanceChunk = chunk;
247
+ }
248
+ }
249
+ const bestChunk = getMetadataRank(bestRetentionChunk?.retention, retentionOrder) >= getMetadataRank(bestImportanceChunk?.importance, importanceOrder) ? bestRetentionChunk : bestImportanceChunk;
250
+ return {
251
+ label: bestChunk?.label ?? "",
252
+ ...bestImportanceChunk?.importance === void 0 ? {} : {
253
+ importance: bestImportanceChunk.importance
254
+ },
255
+ ...bestRetentionChunk?.retention === void 0 ? {} : {
256
+ retention: bestRetentionChunk.retention
257
+ }
258
+ };
259
+ }
260
+ function createMetadataOrder(values) {
261
+ return Object.freeze(values);
262
+ }
263
+ function getMetadataRank(value, order) {
264
+ if (value === void 0) {
265
+ return 0;
266
+ }
267
+ return order[value] ?? 0;
268
+ }
269
+ function renderSentenceRange(input) {
270
+ const textSegment = input.fragment.sentences.slice(input.range.startIndex, input.range.endIndex).map((sentence) => sentence.text).join(" ");
271
+ const chunkAttributes = input.range.chunkAttributes;
272
+ if (chunkAttributes === void 0) {
273
+ return textSegment;
274
+ }
275
+ if (input.fullMarkup) {
276
+ const attributes = [`label="${chunkAttributes.label}"`];
277
+ if (chunkAttributes.retention !== void 0) {
278
+ attributes.push(`retention="${chunkAttributes.retention}"`);
279
+ }
280
+ if (chunkAttributes.importance !== void 0) {
281
+ attributes.push(`importance="${chunkAttributes.importance}"`);
282
+ }
283
+ return `<chunk ${attributes.join(" ")}>${textSegment}</chunk>`;
284
+ }
285
+ if (input.wrapHighRetention && (chunkAttributes.retention === ChunkRetention.Verbatim || chunkAttributes.retention === ChunkRetention.Detailed)) {
286
+ return `<chunk retention="${chunkAttributes.retention}">${textSegment}</chunk>`;
287
+ }
288
+ return textSegment;
289
+ }
290
+ export {
291
+ formatChunksAsBook,
292
+ formatClueAsBook
293
+ };
294
+ //# sourceMappingURL=markup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/editor/markup.ts"],"sourcesContent":["import {\n ChunkRetention,\n type ChunkImportance,\n type ChunkRecord,\n type FragmentRecord,\n type ReadonlySerialFragments,\n} from \"../document/index.js\";\nexport async function formatClueAsBook(input: {\n chunks: readonly ChunkRecord[];\n serialFragments: ReadonlySerialFragments;\n fullMarkup?: boolean;\n wrapHighRetention?: boolean;\n}): Promise<string> {\n return await formatChunksAsBook({\n chunks: input.chunks,\n segmentStartIndexes: await listSegmentStartIndexesCoveringChunks(\n input.chunks,\n input.serialFragments,\n ),\n serialFragments: input.serialFragments,\n ...(input.fullMarkup === undefined\n ? {}\n : {\n fullMarkup: input.fullMarkup,\n }),\n ...(input.wrapHighRetention === undefined\n ? {}\n : {\n wrapHighRetention: input.wrapHighRetention,\n }),\n });\n}\n\nexport async function formatChunksAsBook(input: {\n chunks: readonly ChunkRecord[];\n segmentStartIndexes: readonly number[];\n serialFragments: ReadonlySerialFragments;\n fullMarkup?: boolean;\n wrapHighRetention?: boolean;\n}): Promise<string> {\n if (input.segmentStartIndexes.length === 0) {\n return \"\";\n }\n\n const chunkCoverage = createChunkCoverage(input.chunks);\n const segmentStartIndexes = [...input.segmentStartIndexes].sort(\n compareNumber,\n );\n const allSegmentStartIndexes = [\n ...(await input.serialFragments.listFragmentIds()),\n ].sort(compareNumber);\n const fragments = await loadFragments(\n listRequiredSegmentStartIndexes(\n segmentStartIndexes,\n allSegmentStartIndexes,\n ),\n input.serialFragments,\n );\n const resultParts: string[] = [];\n\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 fragment = fragments[String(startSentenceIndex)];\n\n if (fragment === undefined) {\n continue;\n }\n\n if (index > 0) {\n const previousStartSentenceIndex = segmentStartIndexes[index - 1];\n\n if (\n previousStartSentenceIndex !== undefined &&\n startSentenceIndex > previousStartSentenceIndex\n ) {\n const skippedSummary = collectSkippedSummary({\n fragments,\n skippedStartIndexes: listSkippedSegmentStartIndexes(\n allSegmentStartIndexes,\n previousStartSentenceIndex,\n startSentenceIndex,\n ),\n });\n\n if (skippedSummary !== \"\") {\n resultParts.push(skippedSummary);\n }\n }\n }\n\n resultParts.push(\n buildFragmentMarkup({\n chunkCoverage,\n fragment,\n fullMarkup: input.fullMarkup ?? false,\n wrapHighRetention: input.wrapHighRetention ?? false,\n }),\n );\n }\n\n return resultParts.join(\"\\n\\n\");\n}\n\nfunction buildFragmentMarkup(input: {\n chunkCoverage: Record<string, readonly ChunkRecord[] | undefined>;\n fragment: FragmentRecord;\n fullMarkup: boolean;\n wrapHighRetention: boolean;\n}): string {\n const sentenceRanges: Array<{\n readonly endIndex: number;\n readonly startIndex: number;\n readonly chunkAttributes?: ChunkAttributes;\n }> = [];\n const { fragment } = input;\n let sentenceIndex = 0;\n\n while (sentenceIndex < fragment.sentences.length) {\n const sentence = fragment.sentences[sentenceIndex];\n\n if (sentence === undefined) {\n sentenceIndex += 1;\n continue;\n }\n\n const sentenceId = createSentenceKey(\n fragment.serialId,\n fragment.fragmentId + sentenceIndex,\n );\n const coveredChunks = input.chunkCoverage[sentenceId];\n\n if (coveredChunks === undefined) {\n sentenceRanges.push({\n endIndex: sentenceIndex + 1,\n startIndex: sentenceIndex,\n });\n sentenceIndex += 1;\n continue;\n }\n\n const chunkAttributes = mergeChunkAttributes(coveredChunks);\n let endIndex = sentenceIndex + 1;\n\n while (endIndex < fragment.sentences.length) {\n const nextSentenceId = createSentenceKey(\n fragment.serialId,\n fragment.fragmentId + endIndex,\n );\n const nextCoveredChunks = input.chunkCoverage[nextSentenceId];\n\n if (nextCoveredChunks === undefined) {\n break;\n }\n\n const nextAttributes = mergeChunkAttributes(nextCoveredChunks);\n\n if (nextAttributes.label !== chunkAttributes.label) {\n break;\n }\n\n endIndex += 1;\n }\n\n sentenceRanges.push({\n chunkAttributes,\n endIndex,\n startIndex: sentenceIndex,\n });\n sentenceIndex = endIndex;\n }\n\n const parts = sentenceRanges.map((range) =>\n renderSentenceRange({\n fragment,\n fullMarkup: input.fullMarkup,\n range,\n wrapHighRetention: input.wrapHighRetention,\n }),\n );\n\n return parts.join(\" \");\n}\n\nfunction collectSkippedSummary(input: {\n fragments: Record<string, FragmentRecord | undefined>;\n skippedStartIndexes: readonly number[];\n}): string {\n const summaries: string[] = [];\n\n for (const startSentenceIndex of input.skippedStartIndexes) {\n const summary =\n input.fragments[String(startSentenceIndex)]?.summary?.trim() ?? \"\";\n\n if (summary !== \"\") {\n summaries.push(summary);\n }\n }\n\n return summaries.join(\" \");\n}\n\nfunction createChunkCoverage(\n chunks: readonly ChunkRecord[],\n): Record<string, readonly ChunkRecord[] | undefined> {\n const coverage = Object.create(null) as Record<\n string,\n readonly ChunkRecord[] | undefined\n >;\n\n for (const chunk of chunks) {\n for (const sentenceId of chunk.sentenceIds) {\n const coverageKey = createSentenceKey(...sentenceId);\n const coveredChunks = coverage[coverageKey];\n\n coverage[coverageKey] =\n coveredChunks === undefined ? [chunk] : [...coveredChunks, chunk];\n }\n }\n\n return coverage;\n}\n\nfunction createSentenceKey(serialId: number, sentenceIndex: number): string {\n return `${serialId}:${sentenceIndex}`;\n}\n\nfunction listRequiredSegmentStartIndexes(\n selectedStartIndexes: readonly number[],\n allStartIndexes: readonly number[],\n): number[] {\n const required = new Set(selectedStartIndexes);\n\n for (let index = 1; index < selectedStartIndexes.length; index += 1) {\n const previousStartIndex = selectedStartIndexes[index - 1];\n const nextStartIndex = selectedStartIndexes[index];\n\n if (previousStartIndex === undefined || nextStartIndex === undefined) {\n continue;\n }\n\n for (const skippedStartIndex of listSkippedSegmentStartIndexes(\n allStartIndexes,\n previousStartIndex,\n nextStartIndex,\n )) {\n required.add(skippedStartIndex);\n }\n }\n\n return [...required].sort(compareNumber);\n}\n\nfunction listSkippedSegmentStartIndexes(\n allStartIndexes: readonly number[],\n previousStartIndex: number,\n nextStartIndex: number,\n): number[] {\n return allStartIndexes.filter(\n (startIndex) =>\n startIndex > previousStartIndex && startIndex < nextStartIndex,\n );\n}\n\nasync function listSegmentStartIndexesCoveringChunks(\n chunks: readonly ChunkRecord[],\n serialFragments: ReadonlySerialFragments,\n): Promise<number[]> {\n const allSegmentStartIndexes = [\n ...(await serialFragments.listFragmentIds()),\n ].sort(compareNumber);\n const startIndexRecord = Object.create(null) as Record<string, true>;\n const startIndexes: number[] = [];\n\n for (const chunk of chunks) {\n for (const sentenceId of chunk.sentenceIds) {\n const startSentenceIndex = findContainingSegmentStartIndex(\n allSegmentStartIndexes,\n sentenceId[1],\n );\n\n if (startSentenceIndex === undefined) {\n continue;\n }\n\n const startIndexKey = String(startSentenceIndex);\n\n if (startIndexRecord[startIndexKey] === true) {\n continue;\n }\n\n startIndexRecord[startIndexKey] = true;\n startIndexes.push(startSentenceIndex);\n }\n }\n\n startIndexes.sort(compareNumber);\n\n return startIndexes;\n}\n\nfunction findContainingSegmentStartIndex(\n segmentStartIndexes: readonly number[],\n sentenceIndex: number,\n): number | undefined {\n let containingStartIndex: number | undefined;\n\n for (const startIndex of segmentStartIndexes) {\n if (startIndex > sentenceIndex) {\n break;\n }\n\n containingStartIndex = startIndex;\n }\n\n return containingStartIndex;\n}\n\nasync function loadFragments(\n startSentenceIndexes: readonly number[],\n serialFragments: ReadonlySerialFragments,\n): Promise<Record<string, FragmentRecord | undefined>> {\n const fragments = Object.create(null) as Record<\n string,\n FragmentRecord | undefined\n >;\n\n await Promise.all(\n startSentenceIndexes.map(async (startSentenceIndex) => {\n fragments[String(startSentenceIndex)] =\n await serialFragments.getFragment(startSentenceIndex);\n }),\n );\n\n return fragments;\n}\n\nfunction compareNumber(left: number, right: number): number {\n return left - right;\n}\n\ninterface ChunkAttributes {\n readonly importance?: ChunkImportance;\n readonly label: string;\n readonly retention?: ChunkRetention;\n}\n\nfunction mergeChunkAttributes(\n chunksAtPosition: readonly ChunkRecord[],\n): ChunkAttributes {\n const retentionOrder = createMetadataOrder({\n detailed: 3,\n focused: 2,\n relevant: 1,\n verbatim: 4,\n });\n const importanceOrder = createMetadataOrder({\n critical: 3,\n helpful: 1,\n important: 2,\n });\n let bestRetentionChunk = chunksAtPosition[0];\n let bestImportanceChunk = chunksAtPosition[0];\n\n for (const chunk of chunksAtPosition) {\n if (\n getMetadataRank(chunk.retention, retentionOrder) >\n getMetadataRank(bestRetentionChunk?.retention, retentionOrder)\n ) {\n bestRetentionChunk = chunk;\n }\n\n if (\n getMetadataRank(chunk.importance, importanceOrder) >\n getMetadataRank(bestImportanceChunk?.importance, importanceOrder)\n ) {\n bestImportanceChunk = chunk;\n }\n }\n\n const bestChunk =\n getMetadataRank(bestRetentionChunk?.retention, retentionOrder) >=\n getMetadataRank(bestImportanceChunk?.importance, importanceOrder)\n ? bestRetentionChunk\n : bestImportanceChunk;\n\n return {\n label: bestChunk?.label ?? \"\",\n ...(bestImportanceChunk?.importance === undefined\n ? {}\n : {\n importance: bestImportanceChunk.importance,\n }),\n ...(bestRetentionChunk?.retention === undefined\n ? {}\n : {\n retention: bestRetentionChunk.retention,\n }),\n };\n}\n\nfunction createMetadataOrder<TValue extends string>(\n values: Record<TValue, number>,\n): Readonly<Record<TValue, number>> {\n return Object.freeze(values);\n}\n\nfunction getMetadataRank<TValue extends string>(\n value: TValue | undefined,\n order: Readonly<Record<TValue, number>>,\n): number {\n if (value === undefined) {\n return 0;\n }\n\n return order[value] ?? 0;\n}\n\nfunction renderSentenceRange(input: {\n fragment: FragmentRecord;\n fullMarkup: boolean;\n range: {\n readonly endIndex: number;\n readonly startIndex: number;\n readonly chunkAttributes?: ChunkAttributes;\n };\n wrapHighRetention: boolean;\n}): string {\n const textSegment = input.fragment.sentences\n .slice(input.range.startIndex, input.range.endIndex)\n .map((sentence) => sentence.text)\n .join(\" \");\n const chunkAttributes = input.range.chunkAttributes;\n\n if (chunkAttributes === undefined) {\n return textSegment;\n }\n\n if (input.fullMarkup) {\n const attributes = [`label=\"${chunkAttributes.label}\"`];\n\n if (chunkAttributes.retention !== undefined) {\n attributes.push(`retention=\"${chunkAttributes.retention}\"`);\n }\n\n if (chunkAttributes.importance !== undefined) {\n attributes.push(`importance=\"${chunkAttributes.importance}\"`);\n }\n\n return `<chunk ${attributes.join(\" \")}>${textSegment}</chunk>`;\n }\n\n if (\n input.wrapHighRetention &&\n (chunkAttributes.retention === ChunkRetention.Verbatim ||\n chunkAttributes.retention === ChunkRetention.Detailed)\n ) {\n return `<chunk retention=\"${chunkAttributes.retention}\">${textSegment}</chunk>`;\n }\n\n return textSegment;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,6 @@
1
+ declare const CLUE_REVIEWER_PROMPT_TEMPLATE = "editor/clue_reviewer";
2
+ declare const CLUE_REVIEWER_GENERATOR_PROMPT_TEMPLATE = "editor/clue_reviewer_generator";
3
+ declare const REVISION_FEEDBACK_PROMPT_TEMPLATE = "editor/revision_feedback";
4
+ declare const TEXT_COMPRESSOR_PROMPT_TEMPLATE = "editor/text_compressor";
5
+
6
+ export { CLUE_REVIEWER_GENERATOR_PROMPT_TEMPLATE, CLUE_REVIEWER_PROMPT_TEMPLATE, REVISION_FEEDBACK_PROMPT_TEMPLATE, TEXT_COMPRESSOR_PROMPT_TEMPLATE };
@@ -0,0 +1,11 @@
1
+ const CLUE_REVIEWER_PROMPT_TEMPLATE = "editor/clue_reviewer";
2
+ const CLUE_REVIEWER_GENERATOR_PROMPT_TEMPLATE = "editor/clue_reviewer_generator";
3
+ const REVISION_FEEDBACK_PROMPT_TEMPLATE = "editor/revision_feedback";
4
+ const TEXT_COMPRESSOR_PROMPT_TEMPLATE = "editor/text_compressor";
5
+ export {
6
+ CLUE_REVIEWER_GENERATOR_PROMPT_TEMPLATE,
7
+ CLUE_REVIEWER_PROMPT_TEMPLATE,
8
+ REVISION_FEEDBACK_PROMPT_TEMPLATE,
9
+ TEXT_COMPRESSOR_PROMPT_TEMPLATE
10
+ };
11
+ //# sourceMappingURL=prompt-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/editor/prompt-templates.ts"],"sourcesContent":["export const CLUE_REVIEWER_PROMPT_TEMPLATE = \"editor/clue_reviewer\";\nexport const CLUE_REVIEWER_GENERATOR_PROMPT_TEMPLATE =\n \"editor/clue_reviewer_generator\";\nexport const REVISION_FEEDBACK_PROMPT_TEMPLATE = \"editor/revision_feedback\";\nexport const TEXT_COMPRESSOR_PROMPT_TEMPLATE = \"editor/text_compressor\";\n"],"mappings":"AAAO,MAAM,gCAAgC;AACtC,MAAM,0CACX;AACK,MAAM,oCAAoC;AAC1C,MAAM,kCAAkC;","names":[]}
@@ -0,0 +1,5 @@
1
+ declare function cleanChunkTags(text: string): string;
2
+ declare function extractCompressedText(fullResponse: string): string;
3
+ declare function extractThinkingText(fullResponse: string): string;
4
+
5
+ export { cleanChunkTags, extractCompressedText, extractThinkingText };
@@ -0,0 +1,31 @@
1
+ function cleanChunkTags(text) {
2
+ return text.replace(/<chunk(?:\s+[^>]*)?>/g, "").replace(/<\/chunk>/g, "");
3
+ }
4
+ function extractCompressedText(fullResponse) {
5
+ const matchedCompressedSection = fullResponse.match(
6
+ /##\s*(?:Compressed\s+Text|压缩文本)\s*\n+(.*?)(?:\n+---|\*\*CRITICAL\*\*|$)/is
7
+ );
8
+ if (matchedCompressedSection?.[1] !== void 0) {
9
+ return unwrapMarkdownCodeFence(matchedCompressedSection[1].trim());
10
+ }
11
+ return unwrapMarkdownCodeFence(fullResponse.trim());
12
+ }
13
+ function extractThinkingText(fullResponse) {
14
+ const matchedCompressedSection = fullResponse.match(
15
+ /##\s*(?:Compressed\s+Text|压缩文本)\s*/i
16
+ );
17
+ if (matchedCompressedSection?.index === void 0) {
18
+ return "";
19
+ }
20
+ return fullResponse.slice(0, matchedCompressedSection.index).trim();
21
+ }
22
+ function unwrapMarkdownCodeFence(text) {
23
+ const matchedFence = text.match(/^```(?:\w+)?\s*\n([\s\S]*?)\n```$/);
24
+ return matchedFence?.[1]?.trim() ?? text;
25
+ }
26
+ export {
27
+ cleanChunkTags,
28
+ extractCompressedText,
29
+ extractThinkingText
30
+ };
31
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/editor/response.ts"],"sourcesContent":["export function cleanChunkTags(text: string): string {\n return text.replace(/<chunk(?:\\s+[^>]*)?>/g, \"\").replace(/<\\/chunk>/g, \"\");\n}\n\nexport function extractCompressedText(fullResponse: string): string {\n const matchedCompressedSection = fullResponse.match(\n /##\\s*(?:Compressed\\s+Text|压缩文本)\\s*\\n+(.*?)(?:\\n+---|\\*\\*CRITICAL\\*\\*|$)/is,\n );\n\n if (matchedCompressedSection?.[1] !== undefined) {\n return unwrapMarkdownCodeFence(matchedCompressedSection[1].trim());\n }\n\n return unwrapMarkdownCodeFence(fullResponse.trim());\n}\n\nexport function extractThinkingText(fullResponse: string): string {\n const matchedCompressedSection = fullResponse.match(\n /##\\s*(?:Compressed\\s+Text|压缩文本)\\s*/i,\n );\n\n if (matchedCompressedSection?.index === undefined) {\n return \"\";\n }\n\n return fullResponse.slice(0, matchedCompressedSection.index).trim();\n}\n\nfunction unwrapMarkdownCodeFence(text: string): string {\n const matchedFence = text.match(/^```(?:\\w+)?\\s*\\n([\\s\\S]*?)\\n```$/);\n\n return matchedFence?.[1]?.trim() ?? text;\n}\n"],"mappings":"AAAO,SAAS,eAAe,MAAsB;AACnD,SAAO,KAAK,QAAQ,yBAAyB,EAAE,EAAE,QAAQ,cAAc,EAAE;AAC3E;AAEO,SAAS,sBAAsB,cAA8B;AAClE,QAAM,2BAA2B,aAAa;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,2BAA2B,CAAC,MAAM,QAAW;AAC/C,WAAO,wBAAwB,yBAAyB,CAAC,EAAE,KAAK,CAAC;AAAA,EACnE;AAEA,SAAO,wBAAwB,aAAa,KAAK,CAAC;AACpD;AAEO,SAAS,oBAAoB,cAA8B;AAChE,QAAM,2BAA2B,aAAa;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,0BAA0B,UAAU,QAAW;AACjD,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,MAAM,GAAG,yBAAyB,KAAK,EAAE,KAAK;AACpE;AAEA,SAAS,wBAAwB,MAAsB;AACrD,QAAM,eAAe,KAAK,MAAM,mCAAmC;AAEnE,SAAO,eAAe,CAAC,GAAG,KAAK,KAAK;AACtC;","names":[]}