@wanshi-kg/wanshi 0.1.0

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 (443) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +458 -0
  3. package/dist/__tests__/helpers.js +27 -0
  4. package/dist/__tests__/helpers.js.map +1 -0
  5. package/dist/cli/commands/export.command.js +99 -0
  6. package/dist/cli/commands/export.command.js.map +1 -0
  7. package/dist/cli/commands/index.js +22 -0
  8. package/dist/cli/commands/index.js.map +1 -0
  9. package/dist/cli/commands/inspectMerges.command.js +84 -0
  10. package/dist/cli/commands/inspectMerges.command.js.map +1 -0
  11. package/dist/cli/commands/metrics.command.js +196 -0
  12. package/dist/cli/commands/metrics.command.js.map +1 -0
  13. package/dist/cli/commands/process.command.js +82 -0
  14. package/dist/cli/commands/process.command.js.map +1 -0
  15. package/dist/cli/commands/watch.command.js +91 -0
  16. package/dist/cli/commands/watch.command.js.map +1 -0
  17. package/dist/cli/index.js +269 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/cli/optionsToConfig.js +160 -0
  20. package/dist/cli/optionsToConfig.js.map +1 -0
  21. package/dist/config/index.js +59 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/config/legacyHints.js +113 -0
  24. package/dist/config/legacyHints.js.map +1 -0
  25. package/dist/config/schema.js +803 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/config/ui.js +221 -0
  28. package/dist/config/ui.js.map +1 -0
  29. package/dist/core/DirectoryProcessor.js +725 -0
  30. package/dist/core/DirectoryProcessor.js.map +1 -0
  31. package/dist/core/adapters/IStructuredAdapter.js +3 -0
  32. package/dist/core/adapters/IStructuredAdapter.js.map +1 -0
  33. package/dist/core/adapters/SqliteAdapter.js +267 -0
  34. package/dist/core/adapters/SqliteAdapter.js.map +1 -0
  35. package/dist/core/adapters/StructuredAdapterRegistry.js +31 -0
  36. package/dist/core/adapters/StructuredAdapterRegistry.js.map +1 -0
  37. package/dist/core/adapters/index.js +20 -0
  38. package/dist/core/adapters/index.js.map +1 -0
  39. package/dist/core/checkpoint/CheckpointService.js +188 -0
  40. package/dist/core/checkpoint/CheckpointService.js.map +1 -0
  41. package/dist/core/checkpoint/index.js +18 -0
  42. package/dist/core/checkpoint/index.js.map +1 -0
  43. package/dist/core/corpus/CorpusAnalyzer.js +266 -0
  44. package/dist/core/corpus/CorpusAnalyzer.js.map +1 -0
  45. package/dist/core/corpus/CorpusProfileStore.js +92 -0
  46. package/dist/core/corpus/CorpusProfileStore.js.map +1 -0
  47. package/dist/core/corpus/index.js +21 -0
  48. package/dist/core/corpus/index.js.map +1 -0
  49. package/dist/core/corpus/normalizeGlossary.js +60 -0
  50. package/dist/core/corpus/normalizeGlossary.js.map +1 -0
  51. package/dist/core/corpus/relPath.js +52 -0
  52. package/dist/core/corpus/relPath.js.map +1 -0
  53. package/dist/core/corpus/termFrequency.js +86 -0
  54. package/dist/core/corpus/termFrequency.js.map +1 -0
  55. package/dist/core/cost/CostMeter.js +235 -0
  56. package/dist/core/cost/CostMeter.js.map +1 -0
  57. package/dist/core/cost/index.js +19 -0
  58. package/dist/core/cost/index.js.map +1 -0
  59. package/dist/core/cost/prices.js +38 -0
  60. package/dist/core/cost/prices.js.map +1 -0
  61. package/dist/core/cv/ObjectDetectionService.js +119 -0
  62. package/dist/core/cv/ObjectDetectionService.js.map +1 -0
  63. package/dist/core/di/ContainerFactory.js +670 -0
  64. package/dist/core/di/ContainerFactory.js.map +1 -0
  65. package/dist/core/di/DIContainer.js +103 -0
  66. package/dist/core/di/DIContainer.js.map +1 -0
  67. package/dist/core/di/index.js +19 -0
  68. package/dist/core/di/index.js.map +1 -0
  69. package/dist/core/errors/CustomErrors.js +342 -0
  70. package/dist/core/errors/CustomErrors.js.map +1 -0
  71. package/dist/core/errors/index.js +18 -0
  72. package/dist/core/errors/index.js.map +1 -0
  73. package/dist/core/export/KnowledgeGraphExportService.js +56 -0
  74. package/dist/core/export/KnowledgeGraphExportService.js.map +1 -0
  75. package/dist/core/export/index.js +19 -0
  76. package/dist/core/export/index.js.map +1 -0
  77. package/dist/core/export/strategies/GraphitiExportStrategy.js +115 -0
  78. package/dist/core/export/strategies/GraphitiExportStrategy.js.map +1 -0
  79. package/dist/core/export/strategies/GraphvizDotExportStrategy.js +331 -0
  80. package/dist/core/export/strategies/GraphvizDotExportStrategy.js.map +1 -0
  81. package/dist/core/export/strategies/IExportStrategy.js +3 -0
  82. package/dist/core/export/strategies/IExportStrategy.js.map +1 -0
  83. package/dist/core/export/strategies/JsonExportStrategy.js +19 -0
  84. package/dist/core/export/strategies/JsonExportStrategy.js.map +1 -0
  85. package/dist/core/export/strategies/JsonlExportStrategy.js +69 -0
  86. package/dist/core/export/strategies/JsonlExportStrategy.js.map +1 -0
  87. package/dist/core/export/strategies/KblamExportStrategy.js +36 -0
  88. package/dist/core/export/strategies/KblamExportStrategy.js.map +1 -0
  89. package/dist/core/export/strategies/LoraExportStrategy.js +46 -0
  90. package/dist/core/export/strategies/LoraExportStrategy.js.map +1 -0
  91. package/dist/core/export/strategies/McpExportStrategy.js +67 -0
  92. package/dist/core/export/strategies/McpExportStrategy.js.map +1 -0
  93. package/dist/core/export/strategies/index.js +25 -0
  94. package/dist/core/export/strategies/index.js.map +1 -0
  95. package/dist/core/export/strategies/kbTriples.js +60 -0
  96. package/dist/core/export/strategies/kbTriples.js.map +1 -0
  97. package/dist/core/index.js +22 -0
  98. package/dist/core/index.js.map +1 -0
  99. package/dist/core/knowledge/KnowledgeGraphBuilder.js +627 -0
  100. package/dist/core/knowledge/KnowledgeGraphBuilder.js.map +1 -0
  101. package/dist/core/knowledge/MergeRecord.js +3 -0
  102. package/dist/core/knowledge/MergeRecord.js.map +1 -0
  103. package/dist/core/knowledge/canon/Canonicalizer.js +414 -0
  104. package/dist/core/knowledge/canon/Canonicalizer.js.map +1 -0
  105. package/dist/core/knowledge/canon/index.js +18 -0
  106. package/dist/core/knowledge/canon/index.js.map +1 -0
  107. package/dist/core/knowledge/contradiction/HeuristicContradictionChecker.js +92 -0
  108. package/dist/core/knowledge/contradiction/HeuristicContradictionChecker.js.map +1 -0
  109. package/dist/core/knowledge/contradiction/LlmContradictionChecker.js +52 -0
  110. package/dist/core/knowledge/contradiction/LlmContradictionChecker.js.map +1 -0
  111. package/dist/core/knowledge/contradiction/index.js +19 -0
  112. package/dist/core/knowledge/contradiction/index.js.map +1 -0
  113. package/dist/core/knowledge/grounding/KeywordGroundingChecker.js +33 -0
  114. package/dist/core/knowledge/grounding/KeywordGroundingChecker.js.map +1 -0
  115. package/dist/core/knowledge/grounding/MiniCheckGroundingChecker.js +82 -0
  116. package/dist/core/knowledge/grounding/MiniCheckGroundingChecker.js.map +1 -0
  117. package/dist/core/knowledge/grounding/index.js +20 -0
  118. package/dist/core/knowledge/grounding/index.js.map +1 -0
  119. package/dist/core/knowledge/grounding/verbalize.js +38 -0
  120. package/dist/core/knowledge/grounding/verbalize.js.map +1 -0
  121. package/dist/core/knowledge/images/imageMetaGraph.js +136 -0
  122. package/dist/core/knowledge/images/imageMetaGraph.js.map +1 -0
  123. package/dist/core/knowledge/index.js +20 -0
  124. package/dist/core/knowledge/index.js.map +1 -0
  125. package/dist/core/knowledge/merging/KnowledgeMerger.js +624 -0
  126. package/dist/core/knowledge/merging/KnowledgeMerger.js.map +1 -0
  127. package/dist/core/knowledge/references/ReferenceResolver.js +184 -0
  128. package/dist/core/knowledge/references/ReferenceResolver.js.map +1 -0
  129. package/dist/core/knowledge/references/citations/CitationEvidenceProcessor.js +401 -0
  130. package/dist/core/knowledge/references/citations/CitationEvidenceProcessor.js.map +1 -0
  131. package/dist/core/knowledge/references/citations/CitationResolver.js +95 -0
  132. package/dist/core/knowledge/references/citations/CitationResolver.js.map +1 -0
  133. package/dist/core/knowledge/references/citations/GrobidClient.js +143 -0
  134. package/dist/core/knowledge/references/citations/GrobidClient.js.map +1 -0
  135. package/dist/core/knowledge/references/citations/TitleIdResolver.js +101 -0
  136. package/dist/core/knowledge/references/citations/TitleIdResolver.js.map +1 -0
  137. package/dist/core/knowledge/references/web/FetchCacheService.js +114 -0
  138. package/dist/core/knowledge/references/web/FetchCacheService.js.map +1 -0
  139. package/dist/core/knowledge/references/web/GatedFetcher.js +228 -0
  140. package/dist/core/knowledge/references/web/GatedFetcher.js.map +1 -0
  141. package/dist/core/knowledge/references/web/WebReferenceProcessor.js +164 -0
  142. package/dist/core/knowledge/references/web/WebReferenceProcessor.js.map +1 -0
  143. package/dist/core/knowledge/search/KnowledgeGraphSearch.js +261 -0
  144. package/dist/core/knowledge/search/KnowledgeGraphSearch.js.map +1 -0
  145. package/dist/core/knowledge/vocabulary.js +162 -0
  146. package/dist/core/knowledge/vocabulary.js.map +1 -0
  147. package/dist/core/llm/EmbeddingService.js +113 -0
  148. package/dist/core/llm/EmbeddingService.js.map +1 -0
  149. package/dist/core/llm/OllamaService.js +146 -0
  150. package/dist/core/llm/OllamaService.js.map +1 -0
  151. package/dist/core/llm/OpenAICompatibleService.js +190 -0
  152. package/dist/core/llm/OpenAICompatibleService.js.map +1 -0
  153. package/dist/core/llm/OpenAIEmbeddingService.js +129 -0
  154. package/dist/core/llm/OpenAIEmbeddingService.js.map +1 -0
  155. package/dist/core/llm/embeddingUtils.js +25 -0
  156. package/dist/core/llm/embeddingUtils.js.map +1 -0
  157. package/dist/core/llm/index.js +23 -0
  158. package/dist/core/llm/index.js.map +1 -0
  159. package/dist/core/llm/prompts/PromptManager.js +388 -0
  160. package/dist/core/llm/prompts/PromptManager.js.map +1 -0
  161. package/dist/core/llm/prompts/PromptTemplateEngine.js +257 -0
  162. package/dist/core/llm/prompts/PromptTemplateEngine.js.map +1 -0
  163. package/dist/core/llm/prompts/templates/partials/examples/EXAMPLE_STYLE_GUIDE.md +84 -0
  164. package/dist/core/llm/prompts/templates/partials/examples/article.md +187 -0
  165. package/dist/core/llm/prompts/templates/partials/examples/code.md +229 -0
  166. package/dist/core/llm/prompts/templates/partials/examples/communication.md +205 -0
  167. package/dist/core/llm/prompts/templates/partials/examples/documentation.md +262 -0
  168. package/dist/core/llm/prompts/templates/partials/examples/financial.md +157 -0
  169. package/dist/core/llm/prompts/templates/partials/examples/legal.md +153 -0
  170. package/dist/core/llm/prompts/templates/partials/examples/logs.md +127 -0
  171. package/dist/core/llm/prompts/templates/partials/examples/medical.md +218 -0
  172. package/dist/core/llm/prompts/templates/partials/examples/notes.md +201 -0
  173. package/dist/core/llm/prompts/templates/partials/examples/research.md +208 -0
  174. package/dist/core/llm/prompts/templates/partials/examples/tabular.md +178 -0
  175. package/dist/core/llm/prompts/templates/partials/examples/transcript.md +204 -0
  176. package/dist/core/llm/prompts/templates/partials/retrieved-context.hbs +18 -0
  177. package/dist/core/llm/prompts/templates/v1/system.hbs +371 -0
  178. package/dist/core/llm/prompts/templates/v1/user.hbs +20 -0
  179. package/dist/core/llm/prompts/templates/v2/system.hbs +573 -0
  180. package/dist/core/llm/prompts/templates/v2/user.hbs +20 -0
  181. package/dist/core/llm/prompts/templates/v3/system.hbs +861 -0
  182. package/dist/core/llm/prompts/templates/v3/user.hbs +16 -0
  183. package/dist/core/llm/prompts/templates/v4/system.hbs +800 -0
  184. package/dist/core/llm/prompts/templates/v4/user.hbs +40 -0
  185. package/dist/core/llm/prompts/templates/v4.5/system.hbs +71 -0
  186. package/dist/core/llm/prompts/templates/v4.5/user.hbs +46 -0
  187. package/dist/core/llm/prompts/templates/v5/glossary/system.hbs +40 -0
  188. package/dist/core/llm/prompts/templates/v5/glossary/user.hbs +11 -0
  189. package/dist/core/llm/prompts/templates/v5/system.hbs +163 -0
  190. package/dist/core/llm/prompts/templates/v5/user.hbs +55 -0
  191. package/dist/core/pipeline/GroundingTransform.js +52 -0
  192. package/dist/core/pipeline/GroundingTransform.js.map +1 -0
  193. package/dist/core/pipeline/PipelineRunner.js +51 -0
  194. package/dist/core/pipeline/PipelineRunner.js.map +1 -0
  195. package/dist/core/pipeline/RelationFilterTransform.js +72 -0
  196. package/dist/core/pipeline/RelationFilterTransform.js.map +1 -0
  197. package/dist/core/pipeline/index.js +20 -0
  198. package/dist/core/pipeline/index.js.map +1 -0
  199. package/dist/core/processor/FileProcessor.js +184 -0
  200. package/dist/core/processor/FileProcessor.js.map +1 -0
  201. package/dist/core/processor/ProcessedRegistry.js +38 -0
  202. package/dist/core/processor/ProcessedRegistry.js.map +1 -0
  203. package/dist/core/processor/ast/AstSeedService.js +0 -0
  204. package/dist/core/processor/ast/AstSeedService.js.map +1 -0
  205. package/dist/core/processor/ast/AstSymbolStore.js +110 -0
  206. package/dist/core/processor/ast/AstSymbolStore.js.map +1 -0
  207. package/dist/core/processor/ast/index.js +19 -0
  208. package/dist/core/processor/ast/index.js.map +1 -0
  209. package/dist/core/processor/chunking/TextChunker.js +98 -0
  210. package/dist/core/processor/chunking/TextChunker.js.map +1 -0
  211. package/dist/core/processor/chunking/index.js +18 -0
  212. package/dist/core/processor/chunking/index.js.map +1 -0
  213. package/dist/core/processor/classifier/CONTENT_CLASSES.js +294 -0
  214. package/dist/core/processor/classifier/CONTENT_CLASSES.js.map +1 -0
  215. package/dist/core/processor/classifier/CascadeContentClassifier.js +107 -0
  216. package/dist/core/processor/classifier/CascadeContentClassifier.js.map +1 -0
  217. package/dist/core/processor/classifier/HeuristicContentClassifier.js +113 -0
  218. package/dist/core/processor/classifier/HeuristicContentClassifier.js.map +1 -0
  219. package/dist/core/processor/classifier/IContentTypeClassifier.js +3 -0
  220. package/dist/core/processor/classifier/IContentTypeClassifier.js.map +1 -0
  221. package/dist/core/processor/classifier/LlmContentClassifier.js +107 -0
  222. package/dist/core/processor/classifier/LlmContentClassifier.js.map +1 -0
  223. package/dist/core/processor/classifier/NER_DOMAIN_EXAMPLES.js +498 -0
  224. package/dist/core/processor/classifier/NER_DOMAIN_EXAMPLES.js.map +1 -0
  225. package/dist/core/processor/classifier/index.js +21 -0
  226. package/dist/core/processor/classifier/index.js.map +1 -0
  227. package/dist/core/processor/classifier/mergeClassifications.js +32 -0
  228. package/dist/core/processor/classifier/mergeClassifications.js.map +1 -0
  229. package/dist/core/processor/index.js +20 -0
  230. package/dist/core/processor/index.js.map +1 -0
  231. package/dist/core/processor/readers/AudioReader.js +462 -0
  232. package/dist/core/processor/readers/AudioReader.js.map +1 -0
  233. package/dist/core/processor/readers/BinaryReader.js +90 -0
  234. package/dist/core/processor/readers/BinaryReader.js.map +1 -0
  235. package/dist/core/processor/readers/ChandraPdfReader.js +187 -0
  236. package/dist/core/processor/readers/ChandraPdfReader.js.map +1 -0
  237. package/dist/core/processor/readers/ChatExportReader.js +365 -0
  238. package/dist/core/processor/readers/ChatExportReader.js.map +1 -0
  239. package/dist/core/processor/readers/DoclingReader.js +445 -0
  240. package/dist/core/processor/readers/DoclingReader.js.map +1 -0
  241. package/dist/core/processor/readers/EmailReader.js +259 -0
  242. package/dist/core/processor/readers/EmailReader.js.map +1 -0
  243. package/dist/core/processor/readers/EpubReader.js +175 -0
  244. package/dist/core/processor/readers/EpubReader.js.map +1 -0
  245. package/dist/core/processor/readers/FileReader.js +90 -0
  246. package/dist/core/processor/readers/FileReader.js.map +1 -0
  247. package/dist/core/processor/readers/FileReaderFactory.js +49 -0
  248. package/dist/core/processor/readers/FileReaderFactory.js.map +1 -0
  249. package/dist/core/processor/readers/HtmlReader.js +371 -0
  250. package/dist/core/processor/readers/HtmlReader.js.map +1 -0
  251. package/dist/core/processor/readers/ImageReader.js +162 -0
  252. package/dist/core/processor/readers/ImageReader.js.map +1 -0
  253. package/dist/core/processor/readers/JsonFileReader.js +232 -0
  254. package/dist/core/processor/readers/JsonFileReader.js.map +1 -0
  255. package/dist/core/processor/readers/JupyterReader.js +178 -0
  256. package/dist/core/processor/readers/JupyterReader.js.map +1 -0
  257. package/dist/core/processor/readers/LatexReader.js +176 -0
  258. package/dist/core/processor/readers/LatexReader.js.map +1 -0
  259. package/dist/core/processor/readers/MarkdownReader.js +289 -0
  260. package/dist/core/processor/readers/MarkdownReader.js.map +1 -0
  261. package/dist/core/processor/readers/MarkerPdfReader.js +193 -0
  262. package/dist/core/processor/readers/MarkerPdfReader.js.map +1 -0
  263. package/dist/core/processor/readers/MistralOcrReader.js +198 -0
  264. package/dist/core/processor/readers/MistralOcrReader.js.map +1 -0
  265. package/dist/core/processor/readers/OfficeReader.js +174 -0
  266. package/dist/core/processor/readers/OfficeReader.js.map +1 -0
  267. package/dist/core/processor/readers/PdfReader.js +116 -0
  268. package/dist/core/processor/readers/PdfReader.js.map +1 -0
  269. package/dist/core/processor/readers/RtfReader.js +107 -0
  270. package/dist/core/processor/readers/RtfReader.js.map +1 -0
  271. package/dist/core/processor/readers/SubtitleReader.js +145 -0
  272. package/dist/core/processor/readers/SubtitleReader.js.map +1 -0
  273. package/dist/core/processor/readers/TesseractPdfReader.js +183 -0
  274. package/dist/core/processor/readers/TesseractPdfReader.js.map +1 -0
  275. package/dist/core/processor/readers/TextReader.js +129 -0
  276. package/dist/core/processor/readers/TextReader.js.map +1 -0
  277. package/dist/core/processor/readers/TranscriptReader.js +234 -0
  278. package/dist/core/processor/readers/TranscriptReader.js.map +1 -0
  279. package/dist/core/processor/readers/image/imageMetadata.js +155 -0
  280. package/dist/core/processor/readers/image/imageMetadata.js.map +1 -0
  281. package/dist/core/processor/readers/index.js +41 -0
  282. package/dist/core/processor/readers/index.js.map +1 -0
  283. package/dist/core/processor/readers/referenceExtraction.js +198 -0
  284. package/dist/core/processor/readers/referenceExtraction.js.map +1 -0
  285. package/dist/core/processor/readers/stripReferences.js +59 -0
  286. package/dist/core/processor/readers/stripReferences.js.map +1 -0
  287. package/dist/core/processor/readers/transcript/turnPacking.js +81 -0
  288. package/dist/core/processor/readers/transcript/turnPacking.js.map +1 -0
  289. package/dist/core/progress/NdjsonProgressEmitter.js +30 -0
  290. package/dist/core/progress/NdjsonProgressEmitter.js.map +1 -0
  291. package/dist/core/progress/NoopProgressEmitter.js +15 -0
  292. package/dist/core/progress/NoopProgressEmitter.js.map +1 -0
  293. package/dist/core/progress/index.js +19 -0
  294. package/dist/core/progress/index.js.map +1 -0
  295. package/dist/core/trace/TraceWriter.js +100 -0
  296. package/dist/core/trace/TraceWriter.js.map +1 -0
  297. package/dist/core/trace/events.js +13 -0
  298. package/dist/core/trace/events.js.map +1 -0
  299. package/dist/core/trace/index.js +20 -0
  300. package/dist/core/trace/index.js.map +1 -0
  301. package/dist/core/trace/lineage.js +97 -0
  302. package/dist/core/trace/lineage.js.map +1 -0
  303. package/dist/evaluation/BenchmarkRunner.js +171 -0
  304. package/dist/evaluation/BenchmarkRunner.js.map +1 -0
  305. package/dist/evaluation/classifier/ClassifierAccuracy.js +185 -0
  306. package/dist/evaluation/classifier/ClassifierAccuracy.js.map +1 -0
  307. package/dist/evaluation/classifier/labeledSamples.js +379 -0
  308. package/dist/evaluation/classifier/labeledSamples.js.map +1 -0
  309. package/dist/evaluation/compare/goldCompare.js +126 -0
  310. package/dist/evaluation/compare/goldCompare.js.map +1 -0
  311. package/dist/evaluation/crossre/compareScoring.js +30 -0
  312. package/dist/evaluation/crossre/compareScoring.js.map +1 -0
  313. package/dist/evaluation/datasets/CrossREDataset.js +170 -0
  314. package/dist/evaluation/datasets/CrossREDataset.js.map +1 -0
  315. package/dist/evaluation/datasets/IDataset.js +3 -0
  316. package/dist/evaluation/datasets/IDataset.js.map +1 -0
  317. package/dist/evaluation/datasets/RebelDataset.js +117 -0
  318. package/dist/evaluation/datasets/RebelDataset.js.map +1 -0
  319. package/dist/evaluation/datasets/RedocredDataset.js +218 -0
  320. package/dist/evaluation/datasets/RedocredDataset.js.map +1 -0
  321. package/dist/evaluation/datasets/SemEval2010Dataset.js +150 -0
  322. package/dist/evaluation/datasets/SemEval2010Dataset.js.map +1 -0
  323. package/dist/evaluation/index.js +33 -0
  324. package/dist/evaluation/index.js.map +1 -0
  325. package/dist/evaluation/matching/ExactMatcher.js +75 -0
  326. package/dist/evaluation/matching/ExactMatcher.js.map +1 -0
  327. package/dist/evaluation/matching/SemanticMatcher.js +143 -0
  328. package/dist/evaluation/matching/SemanticMatcher.js.map +1 -0
  329. package/dist/evaluation/metrics/TripleMetrics.js +64 -0
  330. package/dist/evaluation/metrics/TripleMetrics.js.map +1 -0
  331. package/dist/evaluation/mine/MineCheckpoint.js +114 -0
  332. package/dist/evaluation/mine/MineCheckpoint.js.map +1 -0
  333. package/dist/evaluation/mine/MineDataset.js +208 -0
  334. package/dist/evaluation/mine/MineDataset.js.map +1 -0
  335. package/dist/evaluation/mine/MineReporter.js +98 -0
  336. package/dist/evaluation/mine/MineReporter.js.map +1 -0
  337. package/dist/evaluation/mine/MineRunner.js +148 -0
  338. package/dist/evaluation/mine/MineRunner.js.map +1 -0
  339. package/dist/evaluation/mine/MineScorer.js +127 -0
  340. package/dist/evaluation/mine/MineScorer.js.map +1 -0
  341. package/dist/evaluation/mine/types.js +12 -0
  342. package/dist/evaluation/mine/types.js.map +1 -0
  343. package/dist/evaluation/reporters/ConsoleReporter.js +55 -0
  344. package/dist/evaluation/reporters/ConsoleReporter.js.map +1 -0
  345. package/dist/evaluation/reporters/JsonReporter.js +50 -0
  346. package/dist/evaluation/reporters/JsonReporter.js.map +1 -0
  347. package/dist/index.js +28 -0
  348. package/dist/index.js.map +1 -0
  349. package/dist/quality/CompositeScore.js +61 -0
  350. package/dist/quality/CompositeScore.js.map +1 -0
  351. package/dist/quality/ConsistencyMetrics.js +70 -0
  352. package/dist/quality/ConsistencyMetrics.js.map +1 -0
  353. package/dist/quality/FactualMetrics.js +76 -0
  354. package/dist/quality/FactualMetrics.js.map +1 -0
  355. package/dist/quality/GraphHealthMetrics.js +68 -0
  356. package/dist/quality/GraphHealthMetrics.js.map +1 -0
  357. package/dist/quality/SemanticMetrics.js +102 -0
  358. package/dist/quality/SemanticMetrics.js.map +1 -0
  359. package/dist/quality/StructuralMetrics.js +60 -0
  360. package/dist/quality/StructuralMetrics.js.map +1 -0
  361. package/dist/quality/index.js +23 -0
  362. package/dist/quality/index.js.map +1 -0
  363. package/dist/shared/index.js +20 -0
  364. package/dist/shared/index.js.map +1 -0
  365. package/dist/shared/logger/Logger.js +3 -0
  366. package/dist/shared/logger/Logger.js.map +1 -0
  367. package/dist/shared/logger/LoggerFactory.js +75 -0
  368. package/dist/shared/logger/LoggerFactory.js.map +1 -0
  369. package/dist/shared/logger/index.js +19 -0
  370. package/dist/shared/logger/index.js.map +1 -0
  371. package/dist/shared/shutdown.js +30 -0
  372. package/dist/shared/shutdown.js.map +1 -0
  373. package/dist/shared/utils/agglomerativeCluster.js +269 -0
  374. package/dist/shared/utils/agglomerativeCluster.js.map +1 -0
  375. package/dist/shared/utils/astSymbols.js +69 -0
  376. package/dist/shared/utils/astSymbols.js.map +1 -0
  377. package/dist/shared/utils/cosineSimilarity.js +18 -0
  378. package/dist/shared/utils/cosineSimilarity.js.map +1 -0
  379. package/dist/shared/utils/directoryTree.js +184 -0
  380. package/dist/shared/utils/directoryTree.js.map +1 -0
  381. package/dist/shared/utils/documentOutline.js +74 -0
  382. package/dist/shared/utils/documentOutline.js.map +1 -0
  383. package/dist/shared/utils/index.js +24 -0
  384. package/dist/shared/utils/index.js.map +1 -0
  385. package/dist/shared/utils/jaroWinklerSimilarity.js +60 -0
  386. package/dist/shared/utils/jaroWinklerSimilarity.js.map +1 -0
  387. package/dist/shared/utils/parseJsonLenient.js +27 -0
  388. package/dist/shared/utils/parseJsonLenient.js.map +1 -0
  389. package/dist/shared/utils/readConfig.js +42 -0
  390. package/dist/shared/utils/readConfig.js.map +1 -0
  391. package/dist/shared/utils/readRtf.js +216 -0
  392. package/dist/shared/utils/readRtf.js.map +1 -0
  393. package/dist/shared/utils/softmax.js +26 -0
  394. package/dist/shared/utils/softmax.js.map +1 -0
  395. package/dist/types/ContentClass.js +3 -0
  396. package/dist/types/ContentClass.js.map +1 -0
  397. package/dist/types/CorpusProfile.js +3 -0
  398. package/dist/types/CorpusProfile.js.map +1 -0
  399. package/dist/types/IContradictionChecker.js +3 -0
  400. package/dist/types/IContradictionChecker.js.map +1 -0
  401. package/dist/types/ICorpusAnalyzer.js +3 -0
  402. package/dist/types/ICorpusAnalyzer.js.map +1 -0
  403. package/dist/types/IDirectoryProcessor.js +3 -0
  404. package/dist/types/IDirectoryProcessor.js.map +1 -0
  405. package/dist/types/IEmbeddingProvider.js +3 -0
  406. package/dist/types/IEmbeddingProvider.js.map +1 -0
  407. package/dist/types/IEmbeddingService.js +6 -0
  408. package/dist/types/IEmbeddingService.js.map +1 -0
  409. package/dist/types/IFileProcessor.js +3 -0
  410. package/dist/types/IFileProcessor.js.map +1 -0
  411. package/dist/types/IGroundingChecker.js +3 -0
  412. package/dist/types/IGroundingChecker.js.map +1 -0
  413. package/dist/types/IKnowledgeGraphBuilder.js +3 -0
  414. package/dist/types/IKnowledgeGraphBuilder.js.map +1 -0
  415. package/dist/types/IKnowledgeGraphExporter.js +3 -0
  416. package/dist/types/IKnowledgeGraphExporter.js.map +1 -0
  417. package/dist/types/IKnowledgeGraphMerger.js +3 -0
  418. package/dist/types/IKnowledgeGraphMerger.js.map +1 -0
  419. package/dist/types/IKnowledgeGraphSearch.js +3 -0
  420. package/dist/types/IKnowledgeGraphSearch.js.map +1 -0
  421. package/dist/types/ILLMProvider.js +3 -0
  422. package/dist/types/ILLMProvider.js.map +1 -0
  423. package/dist/types/ILLMService.js +3 -0
  424. package/dist/types/ILLMService.js.map +1 -0
  425. package/dist/types/IObjectDetector.js +3 -0
  426. package/dist/types/IObjectDetector.js.map +1 -0
  427. package/dist/types/IProcessingService.js +3 -0
  428. package/dist/types/IProcessingService.js.map +1 -0
  429. package/dist/types/IProgressEmitter.js +3 -0
  430. package/dist/types/IProgressEmitter.js.map +1 -0
  431. package/dist/types/IPromptManager.js +3 -0
  432. package/dist/types/IPromptManager.js.map +1 -0
  433. package/dist/types/KnowledgeGraph.js +3 -0
  434. package/dist/types/KnowledgeGraph.js.map +1 -0
  435. package/dist/types/MCPKnowledgeGraph.js +3 -0
  436. package/dist/types/MCPKnowledgeGraph.js.map +1 -0
  437. package/dist/types/Observation.js +21 -0
  438. package/dist/types/Observation.js.map +1 -0
  439. package/dist/types/ProcessingOptions.js +3 -0
  440. package/dist/types/ProcessingOptions.js.map +1 -0
  441. package/dist/types/index.js +40 -0
  442. package/dist/types/index.js.map +1 -0
  443. package/package.json +122 -0
@@ -0,0 +1,670 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.ContainerFactory = exports.TYPES = void 0;
46
+ const DIContainer_1 = require("./DIContainer");
47
+ const processor_1 = require("../processor");
48
+ const LlmContentClassifier_1 = require("../processor/classifier/LlmContentClassifier");
49
+ const ObjectDetectionService_1 = require("../cv/ObjectDetectionService");
50
+ const vocabulary_1 = require("../knowledge/vocabulary");
51
+ const crypto_1 = require("crypto");
52
+ const trace_1 = require("../trace");
53
+ const cost_1 = require("../cost");
54
+ /**
55
+ * Service identifiers for dependency injection
56
+ */
57
+ exports.TYPES = {
58
+ Logger: Symbol.for("Logger"),
59
+ LLMService: Symbol.for("LLMService"),
60
+ EmbeddingService: Symbol.for("EmbeddingService"),
61
+ PromptManager: Symbol.for("PromptManager"),
62
+ FileDiscoveryService: Symbol.for("FileDiscoveryService"),
63
+ FileReaderFactory: Symbol.for("FileReaderFactory"),
64
+ FileProcessor: Symbol.for("FileProcessor"),
65
+ ContentClassifier: Symbol.for("ContentClassifier"),
66
+ TextChunker: Symbol.for("TextChunker"),
67
+ KnowledgeGraphBuilder: Symbol.for("KnowledgeGraphBuilder"),
68
+ KnowledgeGraphSearch: Symbol.for("KnowledgeGraphSearch"),
69
+ KnowledgeGraphMerger: Symbol.for("KnowledgeGraphMerger"),
70
+ DirectoryProcessor: Symbol.for("DirectoryProcessor"),
71
+ KnowledgeGraphExportService: Symbol.for("KnowledgeGraphExportService"),
72
+ ProcessingOptions: Symbol.for("ProcessingOptions"),
73
+ CheckpointService: Symbol.for("CheckpointService"),
74
+ ProgressEmitter: Symbol.for("ProgressEmitter"),
75
+ CorpusAnalyzer: Symbol.for("CorpusAnalyzer"),
76
+ AstSeedService: Symbol.for("AstSeedService"),
77
+ FetchCacheService: Symbol.for("FetchCacheService"),
78
+ GatedFetcher: Symbol.for("GatedFetcher"),
79
+ // Phase 2 — citation span-fetch
80
+ CitationResolver: Symbol.for("CitationResolver"),
81
+ GrobidClient: Symbol.for("GrobidClient"),
82
+ CitationFetcher: Symbol.for("CitationFetcher"),
83
+ CitationFetchCache: Symbol.for("CitationFetchCache"),
84
+ StructuredAdapterRegistry: Symbol.for("StructuredAdapterRegistry"),
85
+ };
86
+ /**
87
+ * Factory for creating configured DI containers
88
+ */
89
+ class ContainerFactory {
90
+ /**
91
+ * Create a fully configured container
92
+ */
93
+ static createContainer(config) {
94
+ var _a, _b, _c, _d, _e, _f, _g;
95
+ const container = new DIContainer_1.DIContainer();
96
+ const processingOptions = config.processingOptions;
97
+ // Apply run-global domain-gate thresholds (A1) before any lazy factory — the
98
+ // enum path, prompt hints, cascade, and harness then all gate on the same
99
+ // configured values (KG-05 single source).
100
+ (0, vocabulary_1.configureDomainGate)({
101
+ lowConfidence: (_a = processingOptions.classifier) === null || _a === void 0 ? void 0 : _a.lowConfidenceThreshold,
102
+ mixedDomain: (_b = processingOptions.classifier) === null || _b === void 0 ? void 0 : _b.mixedDomainThreshold,
103
+ });
104
+ // Configure the run-global debug trace singleton (observe-only; off by default).
105
+ // Mint a runId from time + a config digest so each run's trace is identifiable.
106
+ const traceCfg = (_c = processingOptions.trace) !== null && _c !== void 0 ? _c : { enabled: false };
107
+ const runId = new Date().toISOString() +
108
+ "-" +
109
+ (0, crypto_1.createHash)("sha1")
110
+ .update(`${processingOptions.output}␟${(_d = processingOptions.llm) === null || _d === void 0 ? void 0 : _d.model}␟${(_e = processingOptions.llm) === null || _e === void 0 ? void 0 : _e.promptVersion}`)
111
+ .digest("hex")
112
+ .slice(0, 8);
113
+ trace_1.trace.configure({
114
+ enabled: !!traceCfg.enabled,
115
+ path: traceCfg.path || (processingOptions.output ? `${processingOptions.output}.trace.jsonl` : undefined),
116
+ runId,
117
+ });
118
+ // Configure the run-global cost meter singleton (off by default; logger attached
119
+ // later in DirectoryProcessor where it's resolved). Setting maxCost auto-enables.
120
+ const costCfg = (_f = processingOptions.cost) !== null && _f !== void 0 ? _f : { enabled: false, currency: "USD", prices: {} };
121
+ cost_1.meter.configure({
122
+ enabled: !!costCfg.enabled || costCfg.maxCost != null,
123
+ maxCost: costCfg.maxCost,
124
+ currency: costCfg.currency || "USD",
125
+ prices: (_g = costCfg.prices) !== null && _g !== void 0 ? _g : {},
126
+ ledgerPath: costCfg.ledgerPath || (processingOptions.output ? `${processingOptions.output}.cost.json` : undefined),
127
+ });
128
+ // Register configuration
129
+ container.registerValue(exports.TYPES.ProcessingOptions, processingOptions);
130
+ // Register logger
131
+ container.register(exports.TYPES.Logger, (c) => __awaiter(this, void 0, void 0, function* () {
132
+ const { LoggerFactory } = yield Promise.resolve().then(() => __importStar(require("../../shared/logger")));
133
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
134
+ return LoggerFactory.createLogger(options);
135
+ }));
136
+ // Register progress emitter. NDJSON-on-stdout when --progress-ndjson is set
137
+ // (for a parent process / UI), otherwise a no-op so the normal path is
138
+ // unaffected.
139
+ container.register(exports.TYPES.ProgressEmitter, (c) => __awaiter(this, void 0, void 0, function* () {
140
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
141
+ const { NoopProgressEmitter, NdjsonProgressEmitter } = yield Promise.resolve().then(() => __importStar(require("../progress")));
142
+ return options.logging.progressNdjson
143
+ ? new NdjsonProgressEmitter(process.stdout)
144
+ : new NoopProgressEmitter();
145
+ }));
146
+ // Register LLM services (provider-selectable: local Ollama or OpenAI-compatible)
147
+ container.register(exports.TYPES.LLMService, (c) => __awaiter(this, void 0, void 0, function* () {
148
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
149
+ const logger = yield c.resolve(exports.TYPES.Logger);
150
+ const llmOptions = {
151
+ model: options.llm.model,
152
+ host: options.llm.host,
153
+ apiKey: options.llm.apiKey,
154
+ images: options.readers.images !== "disabled",
155
+ temperature: options.llm.temperature,
156
+ contextLength: options.llm.contextLength,
157
+ repeatPenalty: options.llm.repeatPenalty,
158
+ seed: options.llm.seed,
159
+ maxTokens: options.llm.maxTokens,
160
+ };
161
+ if (options.llm.provider === "openai") {
162
+ const { OpenAICompatibleService } = yield Promise.resolve().then(() => __importStar(require("../llm/OpenAICompatibleService")));
163
+ logger.info(`Using OpenAI-compatible provider at ${options.llm.host}`);
164
+ return new OpenAICompatibleService(llmOptions, logger);
165
+ }
166
+ const { OllamaService } = yield Promise.resolve().then(() => __importStar(require("../llm/OllamaService")));
167
+ return new OllamaService(llmOptions, logger);
168
+ }));
169
+ // Register Embedding service (independent provider from generation)
170
+ container.register(exports.TYPES.EmbeddingService, (c) => __awaiter(this, void 0, void 0, function* () {
171
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
172
+ const logger = yield c.resolve(exports.TYPES.Logger);
173
+ const embeddingsModel = options.embeddings.model;
174
+ const embeddingsHost = options.embeddings.host;
175
+ if (options.embeddings.provider === "openai") {
176
+ const { OpenAIEmbeddingService } = yield Promise.resolve().then(() => __importStar(require("../llm/OpenAIEmbeddingService")));
177
+ logger.info(`Using OpenAI-compatible embeddings provider at ${embeddingsHost}`);
178
+ return new OpenAIEmbeddingService({
179
+ model: embeddingsModel,
180
+ host: embeddingsHost,
181
+ apiKey: options.embeddings.apiKey,
182
+ maxInputChars: options.embeddings.maxInputChars,
183
+ }, logger);
184
+ }
185
+ const { EmbeddingService } = yield Promise.resolve().then(() => __importStar(require("../llm/EmbeddingService")));
186
+ return new EmbeddingService({
187
+ model: embeddingsModel,
188
+ host: embeddingsHost,
189
+ maxInputChars: options.embeddings.maxInputChars,
190
+ }, logger);
191
+ }));
192
+ // Register Prompt Manager
193
+ container.register(exports.TYPES.PromptManager, (c) => __awaiter(this, void 0, void 0, function* () {
194
+ var _a, _b, _c, _d;
195
+ const { PromptManager } = yield Promise.resolve().then(() => __importStar(require("../llm/prompts/PromptManager")));
196
+ const logger = yield c.resolve(exports.TYPES.Logger);
197
+ const manager = new PromptManager(logger, undefined, (_b = (_a = config.processingOptions) === null || _a === void 0 ? void 0 : _a.readers) === null || _b === void 0 ? void 0 : _b.outline);
198
+ const options = config.processingOptions;
199
+ if ((_c = options === null || options === void 0 ? void 0 : options.llm) === null || _c === void 0 ? void 0 : _c.promptVersion) {
200
+ manager.setPromptVersion(options.llm.promptVersion);
201
+ }
202
+ if ((_d = options === null || options === void 0 ? void 0 : options.llm) === null || _d === void 0 ? void 0 : _d.system) {
203
+ manager.setCustomSystemPrompt(options.llm.system);
204
+ }
205
+ return manager;
206
+ }));
207
+ container.register(exports.TYPES.FileDiscoveryService, (c) => __awaiter(this, void 0, void 0, function* () {
208
+ const { FileDiscoveryService } = yield Promise.resolve().then(() => __importStar(require("..")));
209
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
210
+ const logger = yield c.resolve(exports.TYPES.Logger);
211
+ return new FileDiscoveryService(options, logger);
212
+ }));
213
+ container.register(exports.TYPES.TextChunker, (c) => __awaiter(this, void 0, void 0, function* () {
214
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
215
+ const logger = yield c.resolve(exports.TYPES.Logger);
216
+ return new processor_1.TextChunker({
217
+ enabled: options.chunking.mode !== "disabled",
218
+ maxChunkSize: options.chunking.size,
219
+ overlapSize: options.chunking.overlap,
220
+ }, logger);
221
+ }));
222
+ // Structured-emit adapter registry (data-sink track). Empty by default;
223
+ // concrete adapters (SQLite, OpenAPI, iCal, …) register here in their own briefs.
224
+ container.register(exports.TYPES.StructuredAdapterRegistry, (c) => __awaiter(this, void 0, void 0, function* () {
225
+ var _a;
226
+ const { StructuredAdapterRegistry } = yield Promise.resolve().then(() => __importStar(require("../adapters")));
227
+ const registry = new StructuredAdapterRegistry();
228
+ // Concrete adapters register only when enabled (registry stays empty otherwise →
229
+ // default run unaffected). SQLite is the first (data-sink Class A).
230
+ const sqliteCfg = (_a = processingOptions.adapters) === null || _a === void 0 ? void 0 : _a.sqlite;
231
+ if (sqliteCfg === null || sqliteCfg === void 0 ? void 0 : sqliteCfg.enabled) {
232
+ const { SqliteAdapter } = yield Promise.resolve().then(() => __importStar(require("../adapters/SqliteAdapter")));
233
+ const logger = yield c.resolve(exports.TYPES.Logger);
234
+ registry.register(new SqliteAdapter({
235
+ extensions: sqliteCfg.extensions,
236
+ maxRowsPerTable: sqliteCfg.maxRowsPerTable,
237
+ excludeTables: sqliteCfg.excludeTables,
238
+ }, logger));
239
+ }
240
+ return registry;
241
+ }));
242
+ // Register File REader Factory
243
+ container.register(exports.TYPES.FileReaderFactory, (c) => __awaiter(this, void 0, void 0, function* () {
244
+ var _a, _b;
245
+ const { FileReaderFactory, AudioReader, BinaryReader, ChatExportReader, MarkdownReader, DoclingReader, EmailReader, EpubReader, JupyterReader, LatexReader, MarkerPdfReader, MistralOcrReader, TesseractPdfReader, ChandraPdfReader, HtmlReader, ImageReader, JsonFileReader, OfficeReader, SubtitleReader, TextReader, TranscriptReader, PdfReader, RtfReader } = yield Promise.resolve().then(() => __importStar(require("../processor/readers")));
246
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
247
+ const logger = yield c.resolve(exports.TYPES.Logger);
248
+ const chunker = yield c.resolve(exports.TYPES.TextChunker);
249
+ const factory = new FileReaderFactory(logger);
250
+ // Reference-following and web-fetch both need links extracted, so they
251
+ // auto-imply internalLinks extraction.
252
+ const refLinks = options.references.internalLinks.enabled ||
253
+ options.references.follow.enabled ||
254
+ options.references.web.enabled;
255
+ // Citation span-fetch (Phase 2) needs the bibliography extracted to know
256
+ // what to resolve/fetch, so it auto-implies citation extraction.
257
+ const refCites = options.references.citations.enabled || options.references.citations.fetch.enabled;
258
+ // Standard non-PDF readers are always registered; the PDF slot is chosen by
259
+ // readers.pdfEngine below (first-match-wins, so these win their own formats).
260
+ factory.registerReader(new RtfReader(chunker, logger));
261
+ factory.registerReader(new MarkdownReader(chunker, logger, options.readers.stripReferences, refLinks, refCites));
262
+ factory.registerReader(new HtmlReader(chunker, logger, refLinks));
263
+ // CV pre-pass object detector (opt-in) — a singleton (loads the model once),
264
+ // injected into ImageReader; undefined when disabled ⇒ no detection, no cost.
265
+ const cvDet = options.readers.cv.detection;
266
+ const objectDetector = cvDet.enabled
267
+ ? new ObjectDetectionService_1.ObjectDetectionService({
268
+ mode: cvDet.mode,
269
+ model: cvDet.model,
270
+ threshold: cvDet.threshold,
271
+ labels: cvDet.labels,
272
+ maxObjects: cvDet.maxObjects,
273
+ cacheDir: cvDet.cacheDir,
274
+ allowRemote: cvDet.allowRemote,
275
+ }, logger)
276
+ : undefined;
277
+ factory.registerReader(new ImageReader(chunker, logger, {
278
+ exif: options.readers.exif.enabled,
279
+ c2pa: { enabled: options.readers.c2pa.enabled, command: options.readers.c2pa.command },
280
+ }, objectDetector));
281
+ factory.registerReader(new OfficeReader(chunker, logger));
282
+ // PDF engine selector. The built-in pdf2json reader doubles as the graceful
283
+ // fallback for the marker/mistral engines (any failure → pdf2json).
284
+ const pdf2json = new PdfReader(chunker, logger, options.readers.stripReferences, refCites);
285
+ switch (options.readers.pdfEngine) {
286
+ case "docling":
287
+ logger.info(`PDF engine: docling`);
288
+ factory.registerReader(new DoclingReader(undefined, undefined, undefined, "./temp", chunker, logger, [".pdf"]));
289
+ break;
290
+ case "marker": {
291
+ const m = options.readers.marker;
292
+ logger.info(`PDF engine: marker${m.useLlm ? " (--use_llm)" : ""}`);
293
+ factory.registerReader(new MarkerPdfReader({ command: m.command, useLlm: m.useLlm, forceOcr: m.forceOcr, timeoutMs: m.timeoutMs }, { apiKey: options.llm.apiKey, host: options.llm.host, model: options.llm.model }, pdf2json, "./temp", chunker, logger));
294
+ break;
295
+ }
296
+ case "mistral": {
297
+ const mi = options.readers.mistral;
298
+ logger.info(`PDF engine: mistral (${mi.model})`);
299
+ factory.registerReader(new MistralOcrReader({ apiKey: (_a = mi.apiKey) !== null && _a !== void 0 ? _a : process.env.MISTRAL_API_KEY, host: mi.host, model: mi.model, timeoutMs: mi.timeoutMs }, pdf2json, chunker, logger));
300
+ break;
301
+ }
302
+ case "tesseract": {
303
+ const t = options.readers.tesseract;
304
+ logger.info(`PDF engine: tesseract (${t.lang})`);
305
+ factory.registerReader(new TesseractPdfReader({ lang: t.lang, scale: t.scale, oem: t.oem, psm: t.psm, langPath: t.langPath }, pdf2json, chunker, logger));
306
+ break;
307
+ }
308
+ case "chandra": {
309
+ const ch = options.readers.chandra;
310
+ logger.info(`PDF engine: chandra (${ch.method})`);
311
+ factory.registerReader(new ChandraPdfReader({ command: ch.command, method: ch.method, timeoutMs: ch.timeoutMs }, pdf2json, "./temp", chunker, logger));
312
+ break;
313
+ }
314
+ default:
315
+ factory.registerReader(pdf2json);
316
+ }
317
+ // Transcript reader claims speaker-labeled text (.parakeet.txt, …) and
318
+ // transcript-shaped JSON (recua turns / chat exports). Registered before
319
+ // JsonFileReader and TextReader (first-match-wins) so it wins for those;
320
+ // its content-sniffing canRead defers everything else.
321
+ factory.registerReader(new TranscriptReader(chunker, logger, options.chunking.size));
322
+ // Email reader claims .eml/.mbox (otherwise unclaimed → skipped as binary).
323
+ // Each message becomes a conversational turn (sender→speaker, Date→occurredAt),
324
+ // reusing the shared transcript turn-packing. Registered before TextReader.
325
+ factory.registerReader(new EmailReader(chunker, logger, options.chunking.size, options.readers.email));
326
+ // Chat-export reader sniffs chat-shaped .txt (WhatsApp) / .json (Telegram,
327
+ // Discord, Slack) and defers everything else. Registered after Transcript
328
+ // (Claude/ChatGPT exports stay there) and before Json/Text. Each message
329
+ // becomes a turn (sender→speaker, timestamp→occurredAt) via packTurns.
330
+ factory.registerReader(new ChatExportReader(chunker, logger, options.chunking.size, options.readers.chat));
331
+ // Class C structure-rich text (.srt/.vtt subtitles, .tex LaTeX) — both
332
+ // currently unclaimed (→ BinaryReader). Subtitles denoise captions (+ <v>
333
+ // turns); LaTeX cleans the body and feeds \cite{} into the reference
334
+ // pipeline (refCites) → cites edges. Registered before Text/Binary.
335
+ factory.registerReader(new SubtitleReader(chunker, logger, options.chunking.size));
336
+ factory.registerReader(new LatexReader(chunker, logger, refCites));
337
+ // EPUB (zip→spine→chapter chunking) and Jupyter (cell-aware) — extensions
338
+ // were unclaimed (→ BinaryReader). Registered before Text/Binary.
339
+ factory.registerReader(new EpubReader(chunker, logger, options.chunking.size));
340
+ factory.registerReader(new JupyterReader(chunker, logger, options.readers.jupyter));
341
+ // JSON reader claims .json/.jsonl/.geojson — must be registered before
342
+ // TextReader (first-match-wins) so it handles them instead of TextReader.
343
+ factory.registerReader(new JsonFileReader({
344
+ strategy: options.readers.json.strategy,
345
+ maxChunkSize: (_b = options.readers.json.maxChunkSize) !== null && _b !== void 0 ? _b : options.chunking.size,
346
+ }, chunker, logger));
347
+ // ASR audio reader before TextReader so audio never falls through to text;
348
+ // only registered when ASR is enabled (otherwise audio routes to the
349
+ // BinaryReader catch-all below and is skipped gracefully).
350
+ if (options.readers.asr.mode !== "disabled") {
351
+ logger.info(`Using automatic speech recognition pipeline`);
352
+ const asr = options.readers.asr;
353
+ if (asr.engine === "dual") {
354
+ logger.info(`ASR engine: dual (vendored Python audio-pipeline at ${asr.dual.projectDir})`);
355
+ }
356
+ factory.registerReader(new AudioReader({
357
+ modelName: asr.whisperModel,
358
+ language: asr.language,
359
+ translate: asr.translate,
360
+ engine: asr.engine,
361
+ maxChunkSize: options.chunking.size,
362
+ dual: {
363
+ projectDir: asr.dual.projectDir,
364
+ pythonPath: asr.dual.pythonPath,
365
+ asr: asr.dual.asr,
366
+ diarize: asr.dual.diarize,
367
+ numSpeakers: asr.dual.numSpeakers,
368
+ device: asr.dual.device,
369
+ timeoutMs: asr.dual.timeoutMs,
370
+ },
371
+ }, "./temp", chunker, logger));
372
+ }
373
+ factory.registerReader(new TextReader(chunker, logger));
374
+ // Final catch-all: claims anything no specific reader recognized and skips
375
+ // it gracefully (no UTF-8 mojibake, no LLM call). MUST be registered last.
376
+ factory.registerReader(new BinaryReader(chunker, logger));
377
+ return factory;
378
+ }));
379
+ // Register Content Classifier
380
+ container.register(exports.TYPES.ContentClassifier, (c) => __awaiter(this, void 0, void 0, function* () {
381
+ const { HeuristicContentClassifier, CascadeContentClassifier, } = yield Promise.resolve().then(() => __importStar(require("../processor/classifier")));
382
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
383
+ const logger = yield c.resolve(exports.TYPES.Logger);
384
+ switch (options.classifier.mode) {
385
+ case "heuristic":
386
+ return new HeuristicContentClassifier(logger, options.classifier.temperature, options.classifier.crossValidationFactor);
387
+ case "llm": {
388
+ // Share the selected generation provider (KG-15) so --classifier llm
389
+ // works on cloud (OpenAI-compatible) backends, not just local Ollama.
390
+ const llm = yield c.resolve(exports.TYPES.LLMService);
391
+ return new LlmContentClassifier_1.LlmContentClassifier(llm, logger);
392
+ }
393
+ case "cascade": {
394
+ // Phase-B cascade: heuristic decides the easy majority; only top-2 ties
395
+ // escalate to the LLM (same shared provider). Degrades to heuristic-multi
396
+ // when the budget is spent or the provider is unreachable.
397
+ const llm = yield c.resolve(exports.TYPES.LLMService);
398
+ return new CascadeContentClassifier(new HeuristicContentClassifier(logger, options.classifier.temperature, options.classifier.crossValidationFactor), new LlmContentClassifier_1.LlmContentClassifier(llm, logger), logger, options.classifier.maxEscalations);
399
+ }
400
+ default: return undefined;
401
+ }
402
+ }));
403
+ // Register File Processor
404
+ container.register(exports.TYPES.FileProcessor, (c) => __awaiter(this, void 0, void 0, function* () {
405
+ const { FileProcessor } = yield Promise.resolve().then(() => __importStar(require("../processor")));
406
+ const factory = yield c.resolve(exports.TYPES.FileReaderFactory);
407
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
408
+ const classifier = yield c.resolve(exports.TYPES.ContentClassifier);
409
+ const logger = yield c.resolve(exports.TYPES.Logger);
410
+ return new FileProcessor(factory, classifier, options.readers.images !== "disabled", logger);
411
+ }));
412
+ // Register Corpus Analyzer (used only when --corpus-profiling is enabled)
413
+ container.register(exports.TYPES.CorpusAnalyzer, (c) => __awaiter(this, void 0, void 0, function* () {
414
+ const { CorpusAnalyzer } = yield Promise.resolve().then(() => __importStar(require("../corpus")));
415
+ const llmService = yield c.resolve(exports.TYPES.LLMService);
416
+ const classifier = yield c.resolve(exports.TYPES.ContentClassifier);
417
+ const factory = yield c.resolve(exports.TYPES.FileReaderFactory);
418
+ const logger = yield c.resolve(exports.TYPES.Logger);
419
+ const promptManager = yield c.resolve(exports.TYPES.PromptManager);
420
+ return new CorpusAnalyzer(llmService, classifier, factory, logger, promptManager);
421
+ }));
422
+ // Register the AST symbol seed service (Phase 8; used when ast.mode=enabled)
423
+ container.register(exports.TYPES.AstSeedService, (c) => __awaiter(this, void 0, void 0, function* () {
424
+ const { AstSeedService, AstSymbolStore } = yield Promise.resolve().then(() => __importStar(require("../processor/ast")));
425
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
426
+ const logger = yield c.resolve(exports.TYPES.Logger);
427
+ const cachePath = options.ast.cachePath || `${options.output}.ast-cache.json`;
428
+ const store = new AstSymbolStore(cachePath, logger);
429
+ return new AstSeedService(store, logger, options.input);
430
+ }));
431
+ // Register the web reference fetch cache + gated fetcher (Phase 1; used only
432
+ // when references.web.enabled). Network layer is never constructed otherwise.
433
+ container.register(exports.TYPES.FetchCacheService, (c) => __awaiter(this, void 0, void 0, function* () {
434
+ const { FetchCacheService } = yield Promise.resolve().then(() => __importStar(require("../knowledge/references/web/FetchCacheService")));
435
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
436
+ const logger = yield c.resolve(exports.TYPES.Logger);
437
+ const cachePath = options.references.web.cachePath || `${options.output}.fetch-cache.jsonl`;
438
+ const cache = new FetchCacheService(cachePath, logger);
439
+ yield cache.load();
440
+ return cache;
441
+ }));
442
+ container.register(exports.TYPES.GatedFetcher, (c) => __awaiter(this, void 0, void 0, function* () {
443
+ const { GatedFetcher } = yield Promise.resolve().then(() => __importStar(require("../knowledge/references/web/GatedFetcher")));
444
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
445
+ const logger = yield c.resolve(exports.TYPES.Logger);
446
+ const llm = yield c.resolve(exports.TYPES.LLMService);
447
+ const w = options.references.web;
448
+ return new GatedFetcher({
449
+ allowlist: w.allowlist,
450
+ rejectlist: w.rejectlist,
451
+ maxFetches: w.maxFetches,
452
+ timeoutMs: w.timeoutMs,
453
+ maxBytes: w.maxBytes,
454
+ relevanceCheck: w.relevanceCheck,
455
+ robots: w.robots,
456
+ }, llm, logger);
457
+ }));
458
+ // Phase 2 — citation span-fetch services. Constructed only when
459
+ // references.citations.fetch.enabled; a default run never builds them.
460
+ container.register(exports.TYPES.CitationFetchCache, (c) => __awaiter(this, void 0, void 0, function* () {
461
+ const { FetchCacheService } = yield Promise.resolve().then(() => __importStar(require("../knowledge/references/web/FetchCacheService")));
462
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
463
+ const logger = yield c.resolve(exports.TYPES.Logger);
464
+ const cachePath = options.references.citations.fetch.cachePath || `${options.output}.citation-cache.jsonl`;
465
+ const cache = new FetchCacheService(cachePath, logger);
466
+ yield cache.load();
467
+ return cache;
468
+ }));
469
+ container.register(exports.TYPES.CitationFetcher, (c) => __awaiter(this, void 0, void 0, function* () {
470
+ const { GatedFetcher } = yield Promise.resolve().then(() => __importStar(require("../knowledge/references/web/GatedFetcher")));
471
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
472
+ const logger = yield c.resolve(exports.TYPES.Logger);
473
+ const llm = yield c.resolve(exports.TYPES.LLMService);
474
+ const f = options.references.citations.fetch;
475
+ return new GatedFetcher({
476
+ allowlist: f.allowlist,
477
+ rejectlist: f.rejectlist,
478
+ maxFetches: f.maxFetches,
479
+ timeoutMs: f.timeoutMs,
480
+ maxBytes: f.maxBytes,
481
+ relevanceCheck: false, // OA full text — the allowlist is the gate
482
+ robots: true,
483
+ allowPdf: true,
484
+ }, llm, logger);
485
+ }));
486
+ container.register(exports.TYPES.CitationResolver, (c) => __awaiter(this, void 0, void 0, function* () {
487
+ const { CitationResolver } = yield Promise.resolve().then(() => __importStar(require("../knowledge/references/citations/CitationResolver")));
488
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
489
+ const logger = yield c.resolve(exports.TYPES.Logger);
490
+ const cfg = options.references.citations;
491
+ let titleResolver = null;
492
+ if (cfg.titleResolver.enabled) {
493
+ const { TitleIdResolver } = yield Promise.resolve().then(() => __importStar(require("../knowledge/references/citations/TitleIdResolver")));
494
+ const t = cfg.titleResolver;
495
+ titleResolver = new TitleIdResolver({
496
+ mailto: t.mailto,
497
+ openAlexKey: t.openAlexKey,
498
+ semanticScholarKey: t.semanticScholarKey,
499
+ minTitleSimilarity: t.minTitleSimilarity,
500
+ }, logger);
501
+ }
502
+ const unpaywallEmail = cfg.fetch.unpaywallEmail || process.env.UNPAYWALL_EMAIL;
503
+ return new CitationResolver({ unpaywallEmail }, logger, titleResolver);
504
+ }));
505
+ container.register(exports.TYPES.GrobidClient, (c) => __awaiter(this, void 0, void 0, function* () {
506
+ const { GrobidClient } = yield Promise.resolve().then(() => __importStar(require("../knowledge/references/citations/GrobidClient")));
507
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
508
+ const logger = yield c.resolve(exports.TYPES.Logger);
509
+ return new GrobidClient(options.references.citations.grobid.url, logger);
510
+ }));
511
+ // Register Checkpoint service (used only when --resume is set)
512
+ container.register(exports.TYPES.CheckpointService, (c) => __awaiter(this, void 0, void 0, function* () {
513
+ const { CheckpointService } = yield Promise.resolve().then(() => __importStar(require("../checkpoint")));
514
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
515
+ const logger = yield c.resolve(exports.TYPES.Logger);
516
+ const checkpointPath = options.resume.checkpointPath || `${options.output}.checkpoint.jsonl`;
517
+ const service = new CheckpointService(checkpointPath, logger, {
518
+ model: options.llm.model,
519
+ promptVersion: options.llm.promptVersion,
520
+ });
521
+ if (options.resume.enabled) {
522
+ yield service.load();
523
+ }
524
+ return service;
525
+ }));
526
+ // Register Knowledge Graph Builder
527
+ container.register(exports.TYPES.KnowledgeGraphBuilder, (c) => __awaiter(this, void 0, void 0, function* () {
528
+ const { KnowledgeGraphBuilder } = yield Promise.resolve().then(() => __importStar(require("../knowledge/KnowledgeGraphBuilder")));
529
+ const logger = yield c.resolve(exports.TYPES.Logger);
530
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
531
+ const llmService = yield c.resolve(exports.TYPES.LLMService);
532
+ const promptManager = yield c.resolve(exports.TYPES.PromptManager);
533
+ const checkpoint = yield c.resolve(exports.TYPES.CheckpointService);
534
+ const progress = yield c.resolve(exports.TYPES.ProgressEmitter);
535
+ // Inline grounding checker: minicheck (local NLI, with keyword pre-filter)
536
+ // when selected & active; otherwise the builder defaults to the keyword
537
+ // checker. The grounding signature is folded into the checkpoint key so
538
+ // toggling the gate between --resume runs re-extracts affected chunks
539
+ // (disabled ⇒ empty signature == legacy key, preserving old checkpoints).
540
+ const g = options.grounding;
541
+ const groundingSignature = g.mode === "disabled" ? "" : `${g.mode}|${g.checker}|${g.minScore}|${g.model}`;
542
+ let groundingChecker;
543
+ if (g.mode !== "disabled" && g.checker === "minicheck") {
544
+ const { MiniCheckGroundingChecker } = yield Promise.resolve().then(() => __importStar(require("../knowledge/grounding")));
545
+ groundingChecker = new MiniCheckGroundingChecker({ model: g.model, host: g.host, min: g.minScore, escalateAbove: g.escalateAbove }, logger);
546
+ }
547
+ return new KnowledgeGraphBuilder({
548
+ llmService,
549
+ promptManager: promptManager,
550
+ checkpoint,
551
+ resume: options.resume.enabled,
552
+ model: options.llm.model,
553
+ promptVersion: options.llm.promptVersion,
554
+ inputRoot: options.input,
555
+ progress,
556
+ grounding: options.grounding.mode,
557
+ groundingMinScore: options.grounding.minScore,
558
+ groundingChecker,
559
+ groundingSignature,
560
+ // Stamp edge source spans only when the pipeline grounding gate needs
561
+ // them, so the baseline graph stays free of the extra weight.
562
+ attachSourceSpans: options.pipeline.grounding.enabled,
563
+ // Free-vocabulary extraction (canonicalization-tax measurement): drops the
564
+ // closed entity/relation enum so the model emits any predicate/type.
565
+ openPredicate: options.pipeline.extraction.openPredicate,
566
+ // Strict closed vocabulary: a supplied glossary REPLACES (not augments) the
567
+ // base/domain vocab — feed a known ontology as the authoritative schema.
568
+ strictVocabulary: options.pipeline.extraction.strictVocabulary,
569
+ }, logger);
570
+ }));
571
+ // Register Knowledge Graph Search
572
+ container.register(exports.TYPES.KnowledgeGraphSearch, (c) => __awaiter(this, void 0, void 0, function* () {
573
+ const { KnowledgeGraphSearch } = yield Promise.resolve().then(() => __importStar(require("../knowledge")));
574
+ const logger = yield c.resolve(exports.TYPES.Logger);
575
+ const embeddingService = yield c.resolve(exports.TYPES.EmbeddingService);
576
+ return new KnowledgeGraphSearch(embeddingService, logger);
577
+ }));
578
+ // Register Knowledge Graph Merger
579
+ container.register(exports.TYPES.KnowledgeGraphMerger, (c) => __awaiter(this, void 0, void 0, function* () {
580
+ const { mergeKnowledgeGraphs } = yield Promise.resolve().then(() => __importStar(require("../knowledge")));
581
+ const logger = yield c.resolve(exports.TYPES.Logger);
582
+ const options = yield c.resolve(exports.TYPES.ProcessingOptions);
583
+ const embeddingService = yield c.resolve(exports.TYPES.EmbeddingService);
584
+ // Merge-time supersession checker (KG-10): heuristic (cheap, default off) or
585
+ // LLM-backed; off ⇒ no supersession. The LLM checker reuses the generation
586
+ // provider (resolved lazily so a heuristic/disabled run needs no LLM).
587
+ let contradictionChecker;
588
+ if (options.merging.supersession === "heuristic") {
589
+ const { HeuristicContradictionChecker } = yield Promise.resolve().then(() => __importStar(require("../knowledge/contradiction")));
590
+ contradictionChecker = new HeuristicContradictionChecker();
591
+ }
592
+ else if (options.merging.supersession === "llm") {
593
+ const { LlmContradictionChecker } = yield Promise.resolve().then(() => __importStar(require("../knowledge/contradiction")));
594
+ const llm = yield c.resolve(exports.TYPES.LLMService);
595
+ contradictionChecker = new LlmContradictionChecker(llm, logger);
596
+ }
597
+ // Return a wrapper that implements the interface
598
+ return {
599
+ merge: (graphs) => __awaiter(this, void 0, void 0, function* () {
600
+ var _a;
601
+ const records = [];
602
+ const wantMergeLog = options.inspection.emitMergeLog;
603
+ // The merge-log seam doubles as the trace merge-decision source: fold each
604
+ // non-canonical surface form's mentions onto the winner (lineage thread)
605
+ // and emit one merge_decision event per fusion.
606
+ const onMergeRecord = wantMergeLog || trace_1.trace.enabled
607
+ ? (r) => {
608
+ var _a;
609
+ if (wantMergeLog)
610
+ records.push(r);
611
+ if (trace_1.trace.enabled) {
612
+ const foldedMentionIds = [];
613
+ for (const sf of r.surface_forms) {
614
+ if (sf === r.canonical_chosen)
615
+ continue;
616
+ foldedMentionIds.push(...trace_1.trace.lineage.fold(sf, r.canonical_chosen).map((m) => m.mentionId));
617
+ }
618
+ trace_1.trace.emit({
619
+ stage: "merge",
620
+ type: "merge_decision",
621
+ mergeDecisionId: r.cluster_id,
622
+ target: r.target,
623
+ canonical: r.canonical_chosen,
624
+ surfaceForms: r.surface_forms,
625
+ foldedMentionIds,
626
+ cosine: (_a = r.intra_cluster_sim) === null || _a === void 0 ? void 0 : _a.max,
627
+ method: r.method,
628
+ verdict: "accept",
629
+ });
630
+ }
631
+ }
632
+ : undefined;
633
+ const result = yield mergeKnowledgeGraphs(graphs, {
634
+ entitySimilarityThreshold: options.merging.entitySimilarityThreshold,
635
+ observationSimilarityThreshold: options.merging.observationSimilarityThreshold,
636
+ enableSimilarityMerging: options.merging.enableSimilarityMerging,
637
+ contradictionChecker,
638
+ onMergeRecord,
639
+ }, embeddingService, logger);
640
+ // String-merge fusions land next to the canon merge log (same JSONL shape,
641
+ // readable by `wanshi inspect-merges`).
642
+ if (options.inspection.emitMergeLog && records.length > 0) {
643
+ const path = yield Promise.resolve().then(() => __importStar(require("path")));
644
+ const fs = yield Promise.resolve().then(() => __importStar(require("fs")));
645
+ const base = (_a = options.inspection.mergeLogPath) !== null && _a !== void 0 ? _a : path.join("runs", new Date().toISOString().replace(/[:.]/g, "-"), "merges.jsonl");
646
+ const logPath = path.join(path.dirname(base), "string-merges.jsonl");
647
+ fs.mkdirSync(path.dirname(logPath), { recursive: true });
648
+ fs.writeFileSync(logPath, records.map((r) => JSON.stringify(r)).join("\n") + "\n");
649
+ logger.info(`String-merge log written to ${logPath} (${records.length} fusion(s))`);
650
+ }
651
+ return result;
652
+ }),
653
+ };
654
+ }));
655
+ // Register Knowledge Graph Export Service
656
+ container.register(exports.TYPES.KnowledgeGraphExportService, () => __awaiter(this, void 0, void 0, function* () {
657
+ const { JsonExportStrategy, JsonlExportStrategy, McpExportStrategy, GraphvizDotExportStrategy, KblamExportStrategy, LoraExportStrategy, GraphitiExportStrategy, } = yield Promise.resolve().then(() => __importStar(require("../export/strategies")));
658
+ const { KnowledgeGraphExportService } = yield Promise.resolve().then(() => __importStar(require("../export/KnowledgeGraphExportService")));
659
+ return new KnowledgeGraphExportService(new JsonExportStrategy(), new JsonlExportStrategy(), new McpExportStrategy(), new GraphvizDotExportStrategy(), new KblamExportStrategy(), new LoraExportStrategy(), new GraphitiExportStrategy());
660
+ }));
661
+ // Register Directory Processor (depends on all other services)
662
+ container.register(exports.TYPES.DirectoryProcessor, (c) => __awaiter(this, void 0, void 0, function* () {
663
+ const { DirectoryProcessor } = yield Promise.resolve().then(() => __importStar(require("../DirectoryProcessor")));
664
+ return new DirectoryProcessor(c);
665
+ }));
666
+ return container;
667
+ }
668
+ }
669
+ exports.ContainerFactory = ContainerFactory;
670
+ //# sourceMappingURL=ContainerFactory.js.map