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,572 @@
1
+ import { existsSync, mkdirSync, statSync } from "fs";
2
+ import { resolve } from "path";
3
+ import { setTimeout as sleep } from "timers/promises";
4
+ import {
5
+ APICallError,
6
+ generateText,
7
+ streamText
8
+ } from "ai";
9
+ import { getLogger } from "../common/logging.js";
10
+ import { createEnv } from "../common/template.js";
11
+ import { AsyncSemaphore } from "../utils/async-semaphore.js";
12
+ import { createHash } from "../utils/hash.js";
13
+ import { formatError } from "../utils/node-error.js";
14
+ import { LLMCache } from "./cache.js";
15
+ import { LLMContext } from "./context.js";
16
+ import { LLMPaymentRequiredError } from "./errors.js";
17
+ import { createRequestLog } from "./request-log.js";
18
+ import { getScopeDefaults, resolveSamplingSetting } from "./sampling.js";
19
+ const DEFAULT_TIMEOUT_MS = 36e4;
20
+ const DEFAULT_CONCURRENT_REQUESTS = 6;
21
+ const ABORT_ERROR_NAMES = /* @__PURE__ */ new Set([
22
+ "AbortError",
23
+ "ResponseAborted",
24
+ "TimeoutError"
25
+ ]);
26
+ const RETRYABLE_HTTP_STATUS_CODES = /* @__PURE__ */ new Set([
27
+ 408,
28
+ 409,
29
+ 425,
30
+ 429,
31
+ 500,
32
+ 502,
33
+ 503,
34
+ 504,
35
+ 520,
36
+ 522,
37
+ 524,
38
+ 529
39
+ ]);
40
+ const RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
41
+ "ECONNRESET",
42
+ "ECONNREFUSED",
43
+ "EAI_AGAIN",
44
+ "ETIMEDOUT",
45
+ "EPIPE",
46
+ "UND_ERR_CONNECT_TIMEOUT",
47
+ "UND_ERR_HEADERS_TIMEOUT",
48
+ "UND_ERR_SOCKET"
49
+ ]);
50
+ const RETRYABLE_ERROR_KEYWORDS = [
51
+ "connection",
52
+ "terminated",
53
+ "timeout",
54
+ "network",
55
+ "rate limit"
56
+ ];
57
+ let contextIdCounter = 0;
58
+ class LLM {
59
+ #cache;
60
+ #lazyRequestLimiter;
61
+ #logDirPath;
62
+ #model;
63
+ #modelProvider;
64
+ #modelId;
65
+ #modelIdentity;
66
+ #onStreamProgress;
67
+ #onTokenUsage;
68
+ #requestLimiter;
69
+ #retryIntervalSeconds;
70
+ #retryTimes;
71
+ #sampling;
72
+ #stream;
73
+ #templateEnvironment;
74
+ #temperature;
75
+ #timeoutMs;
76
+ #topP;
77
+ config;
78
+ constructor(options) {
79
+ const concurrent = options.concurrent ?? DEFAULT_CONCURRENT_REQUESTS;
80
+ const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;
81
+ const temperature = options.temperature ?? 0.6;
82
+ const topP = options.topP ?? 0.6;
83
+ const sampling = options.sampling;
84
+ const stream = options.stream ?? false;
85
+ const modelInfo = resolveModelInfo(options.model);
86
+ this.config = Object.freeze({
87
+ concurrent,
88
+ modelId: modelInfo.modelId,
89
+ temperature,
90
+ stream,
91
+ timeout,
92
+ topP,
93
+ ...modelInfo.provider === void 0 ? {} : { provider: modelInfo.provider },
94
+ ...sampling === void 0 ? {} : { sampling }
95
+ });
96
+ this.#cache = createCache(options.cacheDirPath);
97
+ this.#lazyRequestLimiter = new AsyncSemaphore(concurrent);
98
+ this.#logDirPath = ensureDirectoryPath(options.logDirPath);
99
+ this.#model = options.model;
100
+ this.#modelProvider = modelInfo.provider;
101
+ this.#modelId = modelInfo.modelId;
102
+ this.#modelIdentity = modelInfo.identity;
103
+ this.#onStreamProgress = options.onStreamProgress;
104
+ this.#onTokenUsage = options.onTokenUsage;
105
+ this.#requestLimiter = new AsyncSemaphore(concurrent);
106
+ this.#retryIntervalSeconds = options.retryIntervalSeconds ?? 6;
107
+ this.#retryTimes = options.retryTimes ?? 5;
108
+ this.#sampling = sampling;
109
+ this.#stream = stream;
110
+ this.#templateEnvironment = createEnv(options.dataDirPath);
111
+ this.#temperature = temperature;
112
+ this.#timeoutMs = timeout;
113
+ this.#topP = topP;
114
+ }
115
+ context() {
116
+ contextIdCounter += 1;
117
+ const sessionId = contextIdCounter;
118
+ return new LLMContext(
119
+ sessionId,
120
+ async (input) => await this.#requestWithSession({
121
+ ...input.options,
122
+ messages: input.messages,
123
+ sessionId,
124
+ ...input.logFiles === void 0 ? {} : { logFiles: input.logFiles },
125
+ ...input.pendingCacheEntries === void 0 ? {} : { pendingCacheEntries: input.pendingCacheEntries }
126
+ }),
127
+ this.#cache
128
+ );
129
+ }
130
+ async withContext(operation) {
131
+ return await this.context().run(operation);
132
+ }
133
+ async request(input, options = {}) {
134
+ if (typeof input === "function") {
135
+ return await this.#lazyRequestLimiter.use(
136
+ async () => await input(this.#requestOnce)
137
+ );
138
+ }
139
+ return await this.#requestOnce(input, options);
140
+ }
141
+ #requestOnce = async (messages, options = {}) => await this.#requestWithSession({
142
+ messages,
143
+ ...options
144
+ });
145
+ loadSystemPrompt(templateName, templateContext = {}) {
146
+ return this.#templateEnvironment.render(templateName, templateContext);
147
+ }
148
+ async #requestWithSession(input) {
149
+ const defaultSampling = getScopeDefaults(
150
+ input.scope,
151
+ this.#sampling,
152
+ this.#temperature,
153
+ this.#topP
154
+ );
155
+ const temperature = input.temperature ?? defaultSampling.temperature;
156
+ const topP = input.topP ?? defaultSampling.topP;
157
+ const resolvedTemperature = resolveSamplingSetting(
158
+ temperature,
159
+ "temperature",
160
+ input.retryIndex,
161
+ input.retryMax
162
+ );
163
+ const resolvedTopP = resolveSamplingSetting(
164
+ topP,
165
+ "top_p",
166
+ input.retryIndex,
167
+ input.retryMax
168
+ );
169
+ const useCache = (input.useCache ?? true) && hasVisibleNonSystemContent(input.messages);
170
+ const cacheKey = this.#cache !== void 0 && useCache ? createHash({
171
+ messages: input.messages.map((message) => ({
172
+ content: message.content,
173
+ role: message.role
174
+ })),
175
+ modelId: this.#modelId,
176
+ provider: this.#modelProvider ?? null,
177
+ temperature: resolvedTemperature ?? null,
178
+ topP: resolvedTopP ?? null
179
+ }) : void 0;
180
+ const requestLog = createRequestLog(this.#logDirPath);
181
+ if (requestLog.filePath !== void 0 && input.logFiles !== void 0) {
182
+ input.logFiles.push(requestLog.filePath);
183
+ }
184
+ await requestLog.append(
185
+ formatRequestParameters({
186
+ cacheKey,
187
+ modelId: this.#modelId,
188
+ modelIdentity: this.#modelIdentity,
189
+ modelProvider: this.#modelProvider,
190
+ resolvedTemperature,
191
+ resolvedTopP,
192
+ retryIndex: input.retryIndex,
193
+ retryMax: input.retryMax,
194
+ scope: input.scope,
195
+ sessionId: input.sessionId,
196
+ temperature,
197
+ topP
198
+ })
199
+ );
200
+ await requestLog.append(formatRequestMessages(input.messages));
201
+ if (cacheKey !== void 0 && this.#cache !== void 0 && useCache) {
202
+ const cachedResponse = await this.#cache.read(cacheKey);
203
+ if (cachedResponse !== void 0) {
204
+ getLogger({
205
+ component: "llm",
206
+ scope: input.scope,
207
+ sessionId: input.sessionId
208
+ }).info(
209
+ `[Cache Hit] Using cached response (key: ${cacheKey.slice(0, 12)}...)`
210
+ );
211
+ await requestLog.append(
212
+ `[[Response]] (from cache):
213
+ ${cachedResponse}
214
+
215
+ `
216
+ );
217
+ await requestLog.append(formatRequestResultLog("cache-hit"));
218
+ return cachedResponse;
219
+ }
220
+ }
221
+ let response;
222
+ let tokenUsage;
223
+ let lastError;
224
+ for (let attempt = 0; attempt <= this.#retryTimes; attempt += 1) {
225
+ try {
226
+ response = await this.#requestLimiter.use(async () => {
227
+ const generationInput = normalizeGenerationInput({
228
+ maxRetries: 0,
229
+ messages: [...input.messages],
230
+ model: this.#model,
231
+ timeout: this.#timeoutMs
232
+ });
233
+ if (input.signal !== void 0) {
234
+ generationInput.abortSignal = input.signal;
235
+ }
236
+ if (resolvedTemperature !== void 0) {
237
+ generationInput.temperature = resolvedTemperature;
238
+ }
239
+ if (resolvedTopP !== void 0) {
240
+ generationInput.topP = resolvedTopP;
241
+ }
242
+ if (this.#stream) {
243
+ const textChunks = [];
244
+ const result = streamText(generationInput);
245
+ for await (const chunk of result.textStream) {
246
+ textChunks.push(chunk);
247
+ await this.#emitStreamProgress(chunk.length);
248
+ }
249
+ tokenUsage = await result.totalUsage;
250
+ await this.#emitTokenUsage(tokenUsage);
251
+ return textChunks.join("");
252
+ } else {
253
+ const result = await generateText(generationInput);
254
+ tokenUsage = result.usage;
255
+ await this.#emitStreamProgress(result.text.length);
256
+ await this.#emitTokenUsage(tokenUsage);
257
+ return result.text;
258
+ }
259
+ });
260
+ await requestLog.append(`[[Response]]:
261
+ ${response}
262
+
263
+ `);
264
+ break;
265
+ } catch (error) {
266
+ lastError = error;
267
+ if (isPaymentRequiredError(error)) {
268
+ const paymentError = new LLMPaymentRequiredError(void 0, {
269
+ cause: error
270
+ });
271
+ await requestLog.append(
272
+ `[[Error]]:
273
+ ${formatError(paymentError)}
274
+
275
+ `
276
+ );
277
+ await requestLog.append(formatRequestResultLog(tokenUsage, error));
278
+ throw paymentError;
279
+ }
280
+ if (!isRetryableError(error)) {
281
+ await requestLog.append(`[[Error]]:
282
+ ${formatError(error)}
283
+
284
+ `);
285
+ await requestLog.append(formatRequestResultLog(tokenUsage, error));
286
+ throw error;
287
+ }
288
+ await requestLog.append(
289
+ `[[Warning]]:
290
+ Request failed with connection error, retrying... (${attempt + 1} times)
291
+
292
+ `
293
+ );
294
+ if (attempt < this.#retryTimes && this.#retryIntervalSeconds > 0) {
295
+ await sleep(this.#retryIntervalSeconds * 1e3, void 0, {
296
+ signal: input.signal
297
+ });
298
+ }
299
+ }
300
+ }
301
+ if (response === void 0) {
302
+ const failureMessage = lastError === void 0 ? `LLM request failed after ${this.#retryTimes + 1} attempts` : `LLM request failed after ${this.#retryTimes + 1} attempts: ${formatError(lastError)}`;
303
+ await requestLog.append(`[[Error]]:
304
+ ${failureMessage}
305
+
306
+ `);
307
+ await requestLog.append(formatRequestResultLog(tokenUsage, lastError));
308
+ throw new Error(failureMessage, {
309
+ ...lastError === void 0 ? {} : { cause: lastError }
310
+ });
311
+ }
312
+ if (cacheKey !== void 0 && this.#cache !== void 0 && useCache) {
313
+ const entry = this.#cache.createEntry(cacheKey, response);
314
+ if (input.sessionId !== void 0 && input.pendingCacheEntries !== void 0) {
315
+ input.pendingCacheEntries.set(entry.cacheKey, entry);
316
+ } else {
317
+ await this.#cache.write(entry);
318
+ }
319
+ }
320
+ await requestLog.append(formatRequestResultLog(tokenUsage));
321
+ return response;
322
+ }
323
+ async #emitStreamProgress(outputCharacters) {
324
+ if (this.#onStreamProgress === void 0) {
325
+ return;
326
+ }
327
+ try {
328
+ await this.#onStreamProgress({ outputCharacters });
329
+ } catch {
330
+ return;
331
+ }
332
+ }
333
+ async #emitTokenUsage(usage) {
334
+ if (this.#onTokenUsage === void 0 || usage === void 0) {
335
+ return;
336
+ }
337
+ try {
338
+ await this.#onTokenUsage({
339
+ ...usage.inputTokenDetails.cacheReadTokens === void 0 ? {} : { cacheReadTokens: usage.inputTokenDetails.cacheReadTokens },
340
+ ...usage.inputTokens === void 0 ? {} : { inputTokens: usage.inputTokens },
341
+ ...usage.outputTokens === void 0 ? {} : { outputTokens: usage.outputTokens }
342
+ });
343
+ } catch {
344
+ return;
345
+ }
346
+ }
347
+ }
348
+ function normalizeGenerationInput(input) {
349
+ const systemMessages = [];
350
+ let firstNonSystemIndex = 0;
351
+ while (firstNonSystemIndex < input.messages.length) {
352
+ const message = input.messages[firstNonSystemIndex];
353
+ if (message === void 0 || message.role !== "system") {
354
+ break;
355
+ }
356
+ systemMessages.push(message);
357
+ firstNonSystemIndex += 1;
358
+ }
359
+ if (systemMessages.length === 0) {
360
+ return input;
361
+ }
362
+ if (systemMessages.length === 1) {
363
+ const [systemMessage] = systemMessages;
364
+ if (systemMessage === void 0) {
365
+ return input;
366
+ }
367
+ return {
368
+ ...input,
369
+ messages: input.messages.slice(firstNonSystemIndex),
370
+ system: systemMessage
371
+ };
372
+ }
373
+ return {
374
+ ...input,
375
+ messages: input.messages.slice(firstNonSystemIndex),
376
+ system: systemMessages
377
+ };
378
+ }
379
+ function ensureDirectoryPath(dirPath) {
380
+ if (dirPath === void 0) {
381
+ return void 0;
382
+ }
383
+ const resolvedDirPath = resolve(dirPath);
384
+ if (!existsSync(resolvedDirPath)) {
385
+ mkdirSync(resolvedDirPath, { recursive: true });
386
+ return resolvedDirPath;
387
+ }
388
+ if (!statSync(resolvedDirPath).isDirectory()) {
389
+ return void 0;
390
+ }
391
+ return resolvedDirPath;
392
+ }
393
+ function createCache(cacheDirPath) {
394
+ const resolvedCacheDirPath = ensureDirectoryPath(cacheDirPath);
395
+ if (resolvedCacheDirPath === void 0) {
396
+ return void 0;
397
+ }
398
+ return new LLMCache(resolvedCacheDirPath);
399
+ }
400
+ function hasVisibleNonSystemContent(messages) {
401
+ return messages.some(
402
+ (message) => message.role !== "system" && (typeof message.content !== "string" || message.content.trim() !== "")
403
+ );
404
+ }
405
+ function formatRequestParameters(input) {
406
+ const lines = [
407
+ "[[Parameters]]:",
408
+ ` model=${input.modelIdentity}`,
409
+ ` temperature=${String(input.resolvedTemperature)}`,
410
+ ` top_p=${String(input.resolvedTopP)}`
411
+ ];
412
+ if (input.modelProvider !== void 0) {
413
+ lines.push(` provider=${input.modelProvider}`);
414
+ }
415
+ lines.push(` model_id=${input.modelId}`);
416
+ if (input.scope !== void 0) {
417
+ lines.push(` scope=${input.scope}`);
418
+ }
419
+ if (Array.isArray(input.temperature)) {
420
+ lines.push(` temperature_schedule=${JSON.stringify(input.temperature)}`);
421
+ }
422
+ if (Array.isArray(input.topP)) {
423
+ lines.push(` top_p_schedule=${JSON.stringify(input.topP)}`);
424
+ }
425
+ if (input.retryIndex !== void 0 && input.retryMax !== void 0) {
426
+ lines.push(` retry_progress=${input.retryIndex}/${input.retryMax}`);
427
+ }
428
+ if (input.cacheKey !== void 0) {
429
+ lines.push(` cache_key=${input.cacheKey}`);
430
+ }
431
+ if (input.sessionId !== void 0) {
432
+ lines.push(` session_id=${input.sessionId}`);
433
+ }
434
+ return `${lines.join("\n")}
435
+
436
+ `;
437
+ }
438
+ function formatRequestMessages(messages) {
439
+ const body = messages.map(
440
+ (message) => `${capitalize(message.role)}:
441
+ ${formatMessageContent(message.content)}`
442
+ ).join("\n\n");
443
+ return `[[Request]]:
444
+ ${body}
445
+
446
+ `;
447
+ }
448
+ function formatRequestResultLog(usage, error) {
449
+ return [
450
+ formatRequestUsageLog(usage),
451
+ ...error === void 0 ? [] : [formatRequestErrorStackLog(error)]
452
+ ].join("");
453
+ }
454
+ function formatRequestUsageLog(usage) {
455
+ if (usage === "cache-hit") {
456
+ return "[[Usage]]:\ncache-hit\n\n";
457
+ }
458
+ return [
459
+ "[[Usage]]:",
460
+ `input: ${formatTokenCount(usage?.inputTokens)}`,
461
+ `cache: ${formatTokenCount(usage?.inputTokenDetails.cacheReadTokens)}`,
462
+ `output: ${formatTokenCount(usage?.outputTokens)}`,
463
+ "",
464
+ ""
465
+ ].join("\n");
466
+ }
467
+ function formatTokenCount(value) {
468
+ return value === void 0 ? "unavailable" : String(value);
469
+ }
470
+ function formatRequestErrorStackLog(error) {
471
+ return `[[Error Stack]]:
472
+ ${formatErrorStack(error)}
473
+
474
+ `;
475
+ }
476
+ function formatErrorStack(error) {
477
+ if (error instanceof Error) {
478
+ return error.stack ?? formatError(error);
479
+ }
480
+ return formatError(error);
481
+ }
482
+ function formatMessageContent(content) {
483
+ if (typeof content === "string") {
484
+ return content;
485
+ }
486
+ const serializedContent = JSON.stringify(content, null, 2);
487
+ if (typeof serializedContent === "string") {
488
+ return serializedContent;
489
+ }
490
+ return "";
491
+ }
492
+ function capitalize(value) {
493
+ if (value.length === 0) {
494
+ return value;
495
+ }
496
+ return `${value[0]?.toUpperCase() ?? ""}${value.slice(1)}`;
497
+ }
498
+ function isRetryableError(error) {
499
+ if (APICallError.isInstance(error)) {
500
+ if (isPaymentRequiredError(error)) {
501
+ return false;
502
+ }
503
+ if (error.isRetryable) {
504
+ return true;
505
+ }
506
+ return isRetryableStatusCode(error.statusCode);
507
+ }
508
+ return !isAbortLikeError(error) && isRetryableTransportError(error);
509
+ }
510
+ function isPaymentRequiredError(error) {
511
+ return APICallError.isInstance(error) && error.statusCode === 402;
512
+ }
513
+ function isRetryableStatusCode(statusCode) {
514
+ return typeof statusCode === "number" && RETRYABLE_HTTP_STATUS_CODES.has(statusCode);
515
+ }
516
+ function isAbortLikeError(error) {
517
+ return someErrorInChain(
518
+ error,
519
+ (currentError) => ABORT_ERROR_NAMES.has(currentError.name)
520
+ );
521
+ }
522
+ function isRetryableTransportError(error) {
523
+ return someErrorInChain(error, (currentError) => {
524
+ const nodeError = currentError;
525
+ const errorCode = typeof nodeError.code === "string" ? nodeError.code.toUpperCase() : void 0;
526
+ if (errorCode !== void 0 && RETRYABLE_ERROR_CODES.has(errorCode)) {
527
+ return true;
528
+ }
529
+ const errorMessage = currentError.message.toLowerCase();
530
+ return RETRYABLE_ERROR_KEYWORDS.some(
531
+ (keyword) => errorMessage.includes(keyword)
532
+ );
533
+ });
534
+ }
535
+ function someErrorInChain(error, matcher) {
536
+ const visited = /* @__PURE__ */ new Set();
537
+ let current = error;
538
+ while (current instanceof Error && !visited.has(current)) {
539
+ if (matcher(current)) {
540
+ return true;
541
+ }
542
+ visited.add(current);
543
+ current = current.cause;
544
+ }
545
+ return false;
546
+ }
547
+ function resolveModelInfo(model) {
548
+ if (typeof model === "string") {
549
+ return {
550
+ identity: model,
551
+ modelId: model
552
+ };
553
+ }
554
+ if (hasModelMetadata(model)) {
555
+ return {
556
+ identity: model.provider === void 0 ? model.modelId : `${model.provider}:${model.modelId}`,
557
+ modelId: model.modelId,
558
+ ...model.provider === void 0 ? {} : { provider: model.provider }
559
+ };
560
+ }
561
+ return {
562
+ identity: "unknown-model",
563
+ modelId: "unknown-model"
564
+ };
565
+ }
566
+ function hasModelMetadata(model) {
567
+ return typeof model === "object" && model !== null && "modelId" in model && typeof model.modelId === "string" && (!("provider" in model) || typeof model.provider === "string");
568
+ }
569
+ export {
570
+ LLM
571
+ };
572
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/llm/client.ts"],"sourcesContent":["import { existsSync, mkdirSync, statSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { setTimeout as sleep } from \"timers/promises\";\n\nimport {\n APICallError,\n generateText,\n streamText,\n type LanguageModel,\n type LanguageModelUsage,\n type ModelMessage,\n type SystemModelMessage,\n} from \"ai\";\nimport type { Environment } from \"nunjucks\";\n\nimport { getLogger } from \"../common/logging.js\";\nimport { createEnv } from \"../common/template.js\";\nimport { AsyncSemaphore } from \"../utils/async-semaphore.js\";\nimport { createHash } from \"../utils/hash.js\";\nimport { formatError } from \"../utils/node-error.js\";\nimport { LLMCache } from \"./cache.js\";\nimport { LLMContext, type LLMContextRequestInput } from \"./context.js\";\nimport { LLMPaymentRequiredError } from \"./errors.js\";\nimport { createRequestLog } from \"./request-log.js\";\nimport { getScopeDefaults, resolveSamplingSetting } from \"./sampling.js\";\nimport type {\n LLMessage,\n LLMModel,\n LLMOptions,\n LLMLazyRequestOperation,\n LLMRequestOptions,\n LLMRequestFunction,\n LLMStreamProgressCallback,\n LLMTokenUsageCallback,\n SamplingScopeConfig,\n TemperatureSetting,\n} from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 360_000;\nconst DEFAULT_CONCURRENT_REQUESTS = 6;\nconst ABORT_ERROR_NAMES = new Set([\n \"AbortError\",\n \"ResponseAborted\",\n \"TimeoutError\",\n]);\nconst RETRYABLE_HTTP_STATUS_CODES = new Set([\n 408, 409, 425, 429, 500, 502, 503, 504, 520, 522, 524, 529,\n]);\n// undici commonly reports transient transport failures through low-level error\n// codes and generic `terminated` fetch errors instead of retryable HTTP\n// responses. The issues below are representative cases we want to treat as\n// retryable at our LLM boundary:\n// https://github.com/nodejs/undici/issues/1490\n// https://github.com/nodejs/undici/issues/1414\n// https://github.com/nodejs/undici/issues/1531\n// https://github.com/nodejs/undici/issues/1864\n// https://github.com/nodejs/undici/issues/2362\n// https://github.com/nodejs/undici/issues/3410\n// https://github.com/nodejs/undici/issues/4215\nconst RETRYABLE_ERROR_CODES = new Set([\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"EAI_AGAIN\",\n \"ETIMEDOUT\",\n \"EPIPE\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n]);\nconst RETRYABLE_ERROR_KEYWORDS = [\n \"connection\",\n \"terminated\",\n \"timeout\",\n \"network\",\n \"rate limit\",\n];\n\nlet contextIdCounter = 0;\n\ntype LLMRequestSessionInput<S extends string> = Omit<\n LLMContextRequestInput<S>,\n \"options\"\n> &\n LLMRequestOptions<S> & {\n sessionId?: number;\n };\n\nexport class LLM<S extends string> {\n readonly #cache: LLMCache | undefined;\n readonly #lazyRequestLimiter: AsyncSemaphore;\n readonly #logDirPath: string | undefined;\n readonly #model: LLMModel;\n readonly #modelProvider: string | undefined;\n readonly #modelId: string;\n readonly #modelIdentity: string;\n readonly #onStreamProgress: LLMStreamProgressCallback | undefined;\n readonly #onTokenUsage: LLMTokenUsageCallback | undefined;\n readonly #requestLimiter: AsyncSemaphore;\n readonly #retryIntervalSeconds: number;\n readonly #retryTimes: number;\n readonly #sampling: SamplingScopeConfig<S> | undefined;\n readonly #stream: boolean;\n readonly #templateEnvironment: Environment;\n readonly #temperature: TemperatureSetting;\n readonly #timeoutMs: number;\n readonly #topP: TemperatureSetting;\n\n public readonly config: Readonly<{\n concurrent: number;\n provider?: string;\n modelId: string;\n sampling?: SamplingScopeConfig<S>;\n stream: boolean;\n timeout: number;\n temperature: TemperatureSetting;\n topP: TemperatureSetting;\n }>;\n\n public constructor(options: LLMOptions<S>) {\n const concurrent = options.concurrent ?? DEFAULT_CONCURRENT_REQUESTS;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n const temperature = options.temperature ?? 0.6;\n const topP = options.topP ?? 0.6;\n const sampling = options.sampling;\n const stream = options.stream ?? false;\n const modelInfo = resolveModelInfo(options.model);\n\n this.config = Object.freeze({\n concurrent,\n modelId: modelInfo.modelId,\n temperature,\n stream,\n timeout,\n topP,\n ...(modelInfo.provider === undefined\n ? {}\n : { provider: modelInfo.provider }),\n ...(sampling === undefined ? {} : { sampling }),\n });\n this.#cache = createCache(options.cacheDirPath);\n this.#lazyRequestLimiter = new AsyncSemaphore(concurrent);\n this.#logDirPath = ensureDirectoryPath(options.logDirPath);\n this.#model = options.model;\n this.#modelProvider = modelInfo.provider;\n this.#modelId = modelInfo.modelId;\n this.#modelIdentity = modelInfo.identity;\n this.#onStreamProgress = options.onStreamProgress;\n this.#onTokenUsage = options.onTokenUsage;\n this.#requestLimiter = new AsyncSemaphore(concurrent);\n this.#retryIntervalSeconds = options.retryIntervalSeconds ?? 6;\n this.#retryTimes = options.retryTimes ?? 5;\n this.#sampling = sampling;\n this.#stream = stream;\n this.#templateEnvironment = createEnv(options.dataDirPath);\n this.#temperature = temperature;\n this.#timeoutMs = timeout;\n this.#topP = topP;\n }\n\n public context(): LLMContext<S> {\n contextIdCounter += 1;\n const sessionId = contextIdCounter;\n\n return new LLMContext(\n sessionId,\n async (input) =>\n await this.#requestWithSession({\n ...input.options,\n messages: input.messages,\n sessionId,\n ...(input.logFiles === undefined ? {} : { logFiles: input.logFiles }),\n ...(input.pendingCacheEntries === undefined\n ? {}\n : { pendingCacheEntries: input.pendingCacheEntries }),\n }),\n this.#cache,\n );\n }\n\n public async withContext<T>(\n operation: (context: LLMContext<S>) => Promise<T>,\n ): Promise<T> {\n return await this.context().run(operation);\n }\n\n public async request(\n messages: readonly LLMessage[],\n options?: LLMRequestOptions<S>,\n ): Promise<string>;\n public async request<T>(operation: LLMLazyRequestOperation<S, T>): Promise<T>;\n public async request<T>(\n input: readonly LLMessage[] | LLMLazyRequestOperation<S, T>,\n options: LLMRequestOptions<S> = {},\n ): Promise<string | T> {\n if (typeof input === \"function\") {\n return await this.#lazyRequestLimiter.use(\n async () => await input(this.#requestOnce),\n );\n }\n\n return await this.#requestOnce(input, options);\n }\n\n readonly #requestOnce: LLMRequestFunction<S> = async (\n messages,\n options = {},\n ) =>\n await this.#requestWithSession({\n messages,\n ...options,\n });\n\n public loadSystemPrompt(\n templateName: string,\n templateContext: Record<string, unknown> = {},\n ): string {\n return this.#templateEnvironment.render(templateName, templateContext);\n }\n\n async #requestWithSession(input: LLMRequestSessionInput<S>): Promise<string> {\n const defaultSampling = getScopeDefaults(\n input.scope,\n this.#sampling,\n this.#temperature,\n this.#topP,\n );\n const temperature = input.temperature ?? defaultSampling.temperature;\n const topP = input.topP ?? defaultSampling.topP;\n const resolvedTemperature = resolveSamplingSetting(\n temperature,\n \"temperature\",\n input.retryIndex,\n input.retryMax,\n );\n const resolvedTopP = resolveSamplingSetting(\n topP,\n \"top_p\",\n input.retryIndex,\n input.retryMax,\n );\n const useCache =\n (input.useCache ?? true) && hasVisibleNonSystemContent(input.messages);\n const cacheKey =\n this.#cache !== undefined && useCache\n ? createHash({\n messages: input.messages.map((message) => ({\n content: message.content,\n role: message.role,\n })),\n modelId: this.#modelId,\n provider: this.#modelProvider ?? null,\n temperature: resolvedTemperature ?? null,\n topP: resolvedTopP ?? null,\n })\n : undefined;\n const requestLog = createRequestLog(this.#logDirPath);\n\n if (requestLog.filePath !== undefined && input.logFiles !== undefined) {\n input.logFiles.push(requestLog.filePath);\n }\n\n await requestLog.append(\n formatRequestParameters({\n cacheKey,\n modelId: this.#modelId,\n modelIdentity: this.#modelIdentity,\n modelProvider: this.#modelProvider,\n resolvedTemperature,\n resolvedTopP,\n retryIndex: input.retryIndex,\n retryMax: input.retryMax,\n scope: input.scope,\n sessionId: input.sessionId,\n temperature,\n topP,\n }),\n );\n await requestLog.append(formatRequestMessages(input.messages));\n\n if (cacheKey !== undefined && this.#cache !== undefined && useCache) {\n const cachedResponse = await this.#cache.read(cacheKey);\n\n if (cachedResponse !== undefined) {\n getLogger({\n component: \"llm\",\n scope: input.scope,\n sessionId: input.sessionId,\n }).info(\n `[Cache Hit] Using cached response (key: ${cacheKey.slice(0, 12)}...)`,\n );\n await requestLog.append(\n `[[Response]] (from cache):\\n${cachedResponse}\\n\\n`,\n );\n await requestLog.append(formatRequestResultLog(\"cache-hit\"));\n return cachedResponse;\n }\n }\n\n let response: string | undefined;\n let tokenUsage: LanguageModelUsage | undefined;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.#retryTimes; attempt += 1) {\n try {\n response = await this.#requestLimiter.use(async () => {\n const generationInput: {\n abortSignal?: AbortSignal;\n maxRetries: number;\n messages: ModelMessage[];\n model: LanguageModel;\n system?: string | SystemModelMessage | SystemModelMessage[];\n temperature?: number;\n timeout?: number;\n topP?: number;\n } = normalizeGenerationInput({\n maxRetries: 0,\n messages: [...input.messages],\n model: this.#model,\n timeout: this.#timeoutMs,\n });\n\n if (input.signal !== undefined) {\n generationInput.abortSignal = input.signal;\n }\n\n if (resolvedTemperature !== undefined) {\n generationInput.temperature = resolvedTemperature;\n }\n\n if (resolvedTopP !== undefined) {\n generationInput.topP = resolvedTopP;\n }\n\n if (this.#stream) {\n const textChunks: string[] = [];\n const result = streamText(generationInput);\n\n for await (const chunk of result.textStream) {\n textChunks.push(chunk);\n await this.#emitStreamProgress(chunk.length);\n }\n tokenUsage = await result.totalUsage;\n await this.#emitTokenUsage(tokenUsage);\n return textChunks.join(\"\");\n } else {\n const result = await generateText(generationInput);\n\n tokenUsage = result.usage;\n await this.#emitStreamProgress(result.text.length);\n await this.#emitTokenUsage(tokenUsage);\n return result.text;\n }\n });\n\n await requestLog.append(`[[Response]]:\\n${response}\\n\\n`);\n break;\n } catch (error) {\n lastError = error;\n\n if (isPaymentRequiredError(error)) {\n const paymentError = new LLMPaymentRequiredError(undefined, {\n cause: error,\n });\n\n await requestLog.append(\n `[[Error]]:\\n${formatError(paymentError)}\\n\\n`,\n );\n await requestLog.append(formatRequestResultLog(tokenUsage, error));\n throw paymentError;\n }\n\n if (!isRetryableError(error)) {\n await requestLog.append(`[[Error]]:\\n${formatError(error)}\\n\\n`);\n await requestLog.append(formatRequestResultLog(tokenUsage, error));\n throw error;\n }\n\n await requestLog.append(\n `[[Warning]]:\\nRequest failed with connection error, retrying... (${attempt + 1} times)\\n\\n`,\n );\n\n if (attempt < this.#retryTimes && this.#retryIntervalSeconds > 0) {\n await sleep(this.#retryIntervalSeconds * 1000, undefined, {\n signal: input.signal,\n });\n }\n }\n }\n\n if (response === undefined) {\n const failureMessage =\n lastError === undefined\n ? `LLM request failed after ${this.#retryTimes + 1} attempts`\n : `LLM request failed after ${this.#retryTimes + 1} attempts: ${formatError(lastError)}`;\n\n await requestLog.append(`[[Error]]:\\n${failureMessage}\\n\\n`);\n await requestLog.append(formatRequestResultLog(tokenUsage, lastError));\n\n throw new Error(failureMessage, {\n ...(lastError === undefined ? {} : { cause: lastError }),\n });\n }\n\n if (cacheKey !== undefined && this.#cache !== undefined && useCache) {\n const entry = this.#cache.createEntry(cacheKey, response);\n\n if (\n input.sessionId !== undefined &&\n input.pendingCacheEntries !== undefined\n ) {\n input.pendingCacheEntries.set(entry.cacheKey, entry);\n } else {\n await this.#cache.write(entry);\n }\n }\n\n await requestLog.append(formatRequestResultLog(tokenUsage));\n return response;\n }\n\n async #emitStreamProgress(outputCharacters: number): Promise<void> {\n if (this.#onStreamProgress === undefined) {\n return;\n }\n\n try {\n await this.#onStreamProgress({ outputCharacters });\n } catch {\n return;\n }\n }\n\n async #emitTokenUsage(usage: LanguageModelUsage | undefined): Promise<void> {\n if (this.#onTokenUsage === undefined || usage === undefined) {\n return;\n }\n\n try {\n await this.#onTokenUsage({\n ...(usage.inputTokenDetails.cacheReadTokens === undefined\n ? {}\n : { cacheReadTokens: usage.inputTokenDetails.cacheReadTokens }),\n ...(usage.inputTokens === undefined\n ? {}\n : { inputTokens: usage.inputTokens }),\n ...(usage.outputTokens === undefined\n ? {}\n : { outputTokens: usage.outputTokens }),\n });\n } catch {\n return;\n }\n }\n}\n\nfunction normalizeGenerationInput(input: {\n maxRetries: number;\n messages: ModelMessage[];\n model: LanguageModel;\n timeout: number;\n}): {\n maxRetries: number;\n messages: ModelMessage[];\n model: LanguageModel;\n system?: string | SystemModelMessage | SystemModelMessage[];\n timeout: number;\n} {\n const systemMessages: SystemModelMessage[] = [];\n let firstNonSystemIndex = 0;\n\n while (firstNonSystemIndex < input.messages.length) {\n const message = input.messages[firstNonSystemIndex];\n\n if (message === undefined || message.role !== \"system\") {\n break;\n }\n\n systemMessages.push(message);\n firstNonSystemIndex += 1;\n }\n\n if (systemMessages.length === 0) {\n return input;\n }\n\n if (systemMessages.length === 1) {\n const [systemMessage] = systemMessages;\n\n if (systemMessage === undefined) {\n return input;\n }\n\n return {\n ...input,\n messages: input.messages.slice(firstNonSystemIndex),\n system: systemMessage,\n };\n }\n\n return {\n ...input,\n messages: input.messages.slice(firstNonSystemIndex),\n system: systemMessages,\n };\n}\n\nfunction ensureDirectoryPath(dirPath?: string): string | undefined {\n if (dirPath === undefined) {\n return undefined;\n }\n\n const resolvedDirPath = resolve(dirPath);\n\n if (!existsSync(resolvedDirPath)) {\n mkdirSync(resolvedDirPath, { recursive: true });\n return resolvedDirPath;\n }\n\n if (!statSync(resolvedDirPath).isDirectory()) {\n return undefined;\n }\n\n return resolvedDirPath;\n}\n\nfunction createCache(cacheDirPath?: string): LLMCache | undefined {\n const resolvedCacheDirPath = ensureDirectoryPath(cacheDirPath);\n\n if (resolvedCacheDirPath === undefined) {\n return undefined;\n }\n\n return new LLMCache(resolvedCacheDirPath);\n}\n\nfunction hasVisibleNonSystemContent(messages: readonly LLMessage[]): boolean {\n return messages.some(\n (message) =>\n message.role !== \"system\" &&\n (typeof message.content !== \"string\" || message.content.trim() !== \"\"),\n );\n}\n\nfunction formatRequestParameters(input: {\n cacheKey?: string | undefined;\n modelId: string;\n modelIdentity: string;\n modelProvider?: string | undefined;\n resolvedTemperature: number | undefined;\n resolvedTopP: number | undefined;\n retryIndex?: number | undefined;\n retryMax?: number | undefined;\n scope?: string | undefined;\n sessionId?: number | undefined;\n temperature: TemperatureSetting;\n topP: TemperatureSetting;\n}): string {\n const lines = [\n \"[[Parameters]]:\",\n `\\tmodel=${input.modelIdentity}`,\n `\\ttemperature=${String(input.resolvedTemperature)}`,\n `\\ttop_p=${String(input.resolvedTopP)}`,\n ];\n\n if (input.modelProvider !== undefined) {\n lines.push(`\\tprovider=${input.modelProvider}`);\n }\n\n lines.push(`\\tmodel_id=${input.modelId}`);\n\n if (input.scope !== undefined) {\n lines.push(`\\tscope=${input.scope}`);\n }\n\n if (Array.isArray(input.temperature)) {\n lines.push(`\\ttemperature_schedule=${JSON.stringify(input.temperature)}`);\n }\n\n if (Array.isArray(input.topP)) {\n lines.push(`\\ttop_p_schedule=${JSON.stringify(input.topP)}`);\n }\n\n if (input.retryIndex !== undefined && input.retryMax !== undefined) {\n lines.push(`\\tretry_progress=${input.retryIndex}/${input.retryMax}`);\n }\n\n if (input.cacheKey !== undefined) {\n lines.push(`\\tcache_key=${input.cacheKey}`);\n }\n\n if (input.sessionId !== undefined) {\n lines.push(`\\tsession_id=${input.sessionId}`);\n }\n\n return `${lines.join(\"\\n\")}\\n\\n`;\n}\n\nfunction formatRequestMessages(messages: readonly LLMessage[]): string {\n const body = messages\n .map(\n (message) =>\n `${capitalize(message.role)}:\\n${formatMessageContent(message.content)}`,\n )\n .join(\"\\n\\n\");\n\n return `[[Request]]:\\n${body}\\n\\n`;\n}\n\nfunction formatRequestResultLog(\n usage: LanguageModelUsage | \"cache-hit\" | undefined,\n error?: unknown,\n): string {\n return [\n formatRequestUsageLog(usage),\n ...(error === undefined ? [] : [formatRequestErrorStackLog(error)]),\n ].join(\"\");\n}\n\nfunction formatRequestUsageLog(\n usage: LanguageModelUsage | \"cache-hit\" | undefined,\n): string {\n if (usage === \"cache-hit\") {\n return \"[[Usage]]:\\ncache-hit\\n\\n\";\n }\n\n return [\n \"[[Usage]]:\",\n `input: ${formatTokenCount(usage?.inputTokens)}`,\n `cache: ${formatTokenCount(usage?.inputTokenDetails.cacheReadTokens)}`,\n `output: ${formatTokenCount(usage?.outputTokens)}`,\n \"\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatTokenCount(value: number | undefined): string {\n return value === undefined ? \"unavailable\" : String(value);\n}\n\nfunction formatRequestErrorStackLog(error: unknown): string {\n return `[[Error Stack]]:\\n${formatErrorStack(error)}\\n\\n`;\n}\n\nfunction formatErrorStack(error: unknown): string {\n if (error instanceof Error) {\n return error.stack ?? formatError(error);\n }\n\n return formatError(error);\n}\n\nfunction formatMessageContent(content: LLMessage[\"content\"]): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n const serializedContent = JSON.stringify(content, null, 2);\n\n if (typeof serializedContent === \"string\") {\n return serializedContent;\n }\n\n return \"\";\n}\n\nfunction capitalize(value: string): string {\n if (value.length === 0) {\n return value;\n }\n\n return `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction isRetryableError(error: unknown): boolean {\n if (APICallError.isInstance(error)) {\n if (isPaymentRequiredError(error)) {\n return false;\n }\n\n if (error.isRetryable) {\n return true;\n }\n\n return isRetryableStatusCode(error.statusCode);\n }\n\n return !isAbortLikeError(error) && isRetryableTransportError(error);\n}\n\nfunction isPaymentRequiredError(error: unknown): boolean {\n return APICallError.isInstance(error) && error.statusCode === 402;\n}\n\nfunction isRetryableStatusCode(statusCode: number | undefined): boolean {\n return (\n typeof statusCode === \"number\" &&\n RETRYABLE_HTTP_STATUS_CODES.has(statusCode)\n );\n}\n\nfunction isAbortLikeError(error: unknown): boolean {\n return someErrorInChain(error, (currentError) =>\n ABORT_ERROR_NAMES.has(currentError.name),\n );\n}\n\nfunction isRetryableTransportError(error: unknown): boolean {\n return someErrorInChain(error, (currentError) => {\n const nodeError = currentError as NodeJS.ErrnoException;\n const errorCode =\n typeof nodeError.code === \"string\"\n ? nodeError.code.toUpperCase()\n : undefined;\n\n if (errorCode !== undefined && RETRYABLE_ERROR_CODES.has(errorCode)) {\n return true;\n }\n\n const errorMessage = currentError.message.toLowerCase();\n\n return RETRYABLE_ERROR_KEYWORDS.some((keyword) =>\n errorMessage.includes(keyword),\n );\n });\n}\n\nfunction someErrorInChain(\n error: unknown,\n matcher: (error: Error) => boolean,\n): boolean {\n const visited = new Set<unknown>();\n let current: unknown = error;\n\n while (current instanceof Error && !visited.has(current)) {\n if (matcher(current)) {\n return true;\n }\n\n visited.add(current);\n current = current.cause;\n }\n\n return false;\n}\n\nfunction resolveModelInfo(model: LLMModel): {\n readonly identity: string;\n readonly modelId: string;\n readonly provider?: string;\n} {\n if (typeof model === \"string\") {\n return {\n identity: model,\n modelId: model,\n };\n }\n\n if (hasModelMetadata(model)) {\n return {\n identity:\n model.provider === undefined\n ? model.modelId\n : `${model.provider}:${model.modelId}`,\n modelId: model.modelId,\n ...(model.provider === undefined ? {} : { provider: model.provider }),\n };\n }\n\n return {\n identity: \"unknown-model\",\n modelId: \"unknown-model\",\n };\n}\n\nfunction hasModelMetadata(\n model: LLMModel,\n): model is LLMModel & { modelId: string; provider?: string } {\n return (\n typeof model === \"object\" &&\n model !== null &&\n \"modelId\" in model &&\n typeof model.modelId === \"string\" &&\n (!(\"provider\" in model) || typeof model.provider === \"string\")\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,22 @@
1
+ import { PendingCacheEntry, LLMCache } from './cache.js';
2
+ import { LLMessage, LLMRequestOptions } from './types.js';
3
+ import 'ai';
4
+
5
+ interface LLMContextRequestInput<S extends string> {
6
+ messages: readonly LLMessage[];
7
+ options: LLMRequestOptions<S>;
8
+ pendingCacheEntries?: Map<string, PendingCacheEntry>;
9
+ logFiles?: string[];
10
+ }
11
+ type LLMContextRequest<S extends string> = (input: LLMContextRequestInput<S>) => Promise<string>;
12
+ declare class LLMContext<S extends string> {
13
+ #private;
14
+ readonly sessionId: number;
15
+ constructor(sessionId: number, requestFn: LLMContextRequest<S>, cache?: LLMCache);
16
+ request(messages: readonly LLMessage[], options?: LLMRequestOptions<S>): Promise<string>;
17
+ commit(): Promise<void>;
18
+ rollback(): Promise<void>;
19
+ run<T>(operation: (context: LLMContext<S>) => Promise<T>): Promise<T>;
20
+ }
21
+
22
+ export { LLMContext, type LLMContextRequestInput };