@cosmocoder/mcp-web-docs 1.0.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 (240) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +368 -0
  3. package/build/__mocks__/embeddings.d.ts +17 -0
  4. package/build/__mocks__/embeddings.js +66 -0
  5. package/build/__mocks__/embeddings.js.map +1 -0
  6. package/build/config.d.ts +44 -0
  7. package/build/config.js +158 -0
  8. package/build/config.js.map +1 -0
  9. package/build/config.test.d.ts +1 -0
  10. package/build/config.test.js +165 -0
  11. package/build/config.test.js.map +1 -0
  12. package/build/crawler/auth.d.ts +128 -0
  13. package/build/crawler/auth.js +546 -0
  14. package/build/crawler/auth.js.map +1 -0
  15. package/build/crawler/auth.test.d.ts +1 -0
  16. package/build/crawler/auth.test.js +174 -0
  17. package/build/crawler/auth.test.js.map +1 -0
  18. package/build/crawler/base.d.ts +24 -0
  19. package/build/crawler/base.js +149 -0
  20. package/build/crawler/base.js.map +1 -0
  21. package/build/crawler/base.test.d.ts +1 -0
  22. package/build/crawler/base.test.js +234 -0
  23. package/build/crawler/base.test.js.map +1 -0
  24. package/build/crawler/browser-config.d.ts +2 -0
  25. package/build/crawler/browser-config.js +29 -0
  26. package/build/crawler/browser-config.js.map +1 -0
  27. package/build/crawler/browser-config.test.d.ts +1 -0
  28. package/build/crawler/browser-config.test.js +56 -0
  29. package/build/crawler/browser-config.test.js.map +1 -0
  30. package/build/crawler/cheerio.d.ts +11 -0
  31. package/build/crawler/cheerio.js +134 -0
  32. package/build/crawler/cheerio.js.map +1 -0
  33. package/build/crawler/chromium.d.ts +21 -0
  34. package/build/crawler/chromium.js +596 -0
  35. package/build/crawler/chromium.js.map +1 -0
  36. package/build/crawler/content-extractor-types.d.ts +25 -0
  37. package/build/crawler/content-extractor-types.js +2 -0
  38. package/build/crawler/content-extractor-types.js.map +1 -0
  39. package/build/crawler/content-extractors.d.ts +9 -0
  40. package/build/crawler/content-extractors.js +9 -0
  41. package/build/crawler/content-extractors.js.map +1 -0
  42. package/build/crawler/content-utils.d.ts +2 -0
  43. package/build/crawler/content-utils.js +22 -0
  44. package/build/crawler/content-utils.js.map +1 -0
  45. package/build/crawler/content-utils.test.d.ts +1 -0
  46. package/build/crawler/content-utils.test.js +99 -0
  47. package/build/crawler/content-utils.test.js.map +1 -0
  48. package/build/crawler/crawlee-crawler.d.ts +63 -0
  49. package/build/crawler/crawlee-crawler.js +342 -0
  50. package/build/crawler/crawlee-crawler.js.map +1 -0
  51. package/build/crawler/crawlee-crawler.test.d.ts +1 -0
  52. package/build/crawler/crawlee-crawler.test.js +280 -0
  53. package/build/crawler/crawlee-crawler.test.js.map +1 -0
  54. package/build/crawler/default-extractor.d.ts +4 -0
  55. package/build/crawler/default-extractor.js +26 -0
  56. package/build/crawler/default-extractor.js.map +1 -0
  57. package/build/crawler/default-extractor.test.d.ts +1 -0
  58. package/build/crawler/default-extractor.test.js +200 -0
  59. package/build/crawler/default-extractor.test.js.map +1 -0
  60. package/build/crawler/default.d.ts +11 -0
  61. package/build/crawler/default.js +138 -0
  62. package/build/crawler/default.js.map +1 -0
  63. package/build/crawler/docs-crawler.d.ts +26 -0
  64. package/build/crawler/docs-crawler.js +97 -0
  65. package/build/crawler/docs-crawler.js.map +1 -0
  66. package/build/crawler/docs-crawler.test.d.ts +1 -0
  67. package/build/crawler/docs-crawler.test.js +185 -0
  68. package/build/crawler/docs-crawler.test.js.map +1 -0
  69. package/build/crawler/factory.d.ts +6 -0
  70. package/build/crawler/factory.js +83 -0
  71. package/build/crawler/factory.js.map +1 -0
  72. package/build/crawler/github-pages-extractor.d.ts +4 -0
  73. package/build/crawler/github-pages-extractor.js +33 -0
  74. package/build/crawler/github-pages-extractor.js.map +1 -0
  75. package/build/crawler/github-pages-extractor.test.d.ts +1 -0
  76. package/build/crawler/github-pages-extractor.test.js +184 -0
  77. package/build/crawler/github-pages-extractor.test.js.map +1 -0
  78. package/build/crawler/github.d.ts +20 -0
  79. package/build/crawler/github.js +181 -0
  80. package/build/crawler/github.js.map +1 -0
  81. package/build/crawler/github.test.d.ts +1 -0
  82. package/build/crawler/github.test.js +326 -0
  83. package/build/crawler/github.test.js.map +1 -0
  84. package/build/crawler/puppeteer.d.ts +16 -0
  85. package/build/crawler/puppeteer.js +191 -0
  86. package/build/crawler/puppeteer.js.map +1 -0
  87. package/build/crawler/queue-manager.d.ts +43 -0
  88. package/build/crawler/queue-manager.js +169 -0
  89. package/build/crawler/queue-manager.js.map +1 -0
  90. package/build/crawler/queue-manager.test.d.ts +1 -0
  91. package/build/crawler/queue-manager.test.js +509 -0
  92. package/build/crawler/queue-manager.test.js.map +1 -0
  93. package/build/crawler/site-rules.d.ts +11 -0
  94. package/build/crawler/site-rules.js +104 -0
  95. package/build/crawler/site-rules.js.map +1 -0
  96. package/build/crawler/site-rules.test.d.ts +1 -0
  97. package/build/crawler/site-rules.test.js +139 -0
  98. package/build/crawler/site-rules.test.js.map +1 -0
  99. package/build/crawler/storybook-extractor.d.ts +34 -0
  100. package/build/crawler/storybook-extractor.js +767 -0
  101. package/build/crawler/storybook-extractor.js.map +1 -0
  102. package/build/crawler/storybook-extractor.test.d.ts +1 -0
  103. package/build/crawler/storybook-extractor.test.js +491 -0
  104. package/build/crawler/storybook-extractor.test.js.map +1 -0
  105. package/build/embeddings/fastembed.d.ts +25 -0
  106. package/build/embeddings/fastembed.js +188 -0
  107. package/build/embeddings/fastembed.js.map +1 -0
  108. package/build/embeddings/fastembed.test.d.ts +1 -0
  109. package/build/embeddings/fastembed.test.js +307 -0
  110. package/build/embeddings/fastembed.test.js.map +1 -0
  111. package/build/embeddings/openai.d.ts +8 -0
  112. package/build/embeddings/openai.js +56 -0
  113. package/build/embeddings/openai.js.map +1 -0
  114. package/build/embeddings/types.d.ts +4 -0
  115. package/build/embeddings/types.js +2 -0
  116. package/build/embeddings/types.js.map +1 -0
  117. package/build/index.d.ts +2 -0
  118. package/build/index.js +1007 -0
  119. package/build/index.js.map +1 -0
  120. package/build/index.test.d.ts +1 -0
  121. package/build/index.test.js +364 -0
  122. package/build/index.test.js.map +1 -0
  123. package/build/indexing/queue-manager.d.ts +36 -0
  124. package/build/indexing/queue-manager.js +86 -0
  125. package/build/indexing/queue-manager.js.map +1 -0
  126. package/build/indexing/queue-manager.test.d.ts +1 -0
  127. package/build/indexing/queue-manager.test.js +257 -0
  128. package/build/indexing/queue-manager.test.js.map +1 -0
  129. package/build/indexing/status.d.ts +39 -0
  130. package/build/indexing/status.js +207 -0
  131. package/build/indexing/status.js.map +1 -0
  132. package/build/indexing/status.test.d.ts +1 -0
  133. package/build/indexing/status.test.js +246 -0
  134. package/build/indexing/status.test.js.map +1 -0
  135. package/build/processor/content.d.ts +16 -0
  136. package/build/processor/content.js +286 -0
  137. package/build/processor/content.js.map +1 -0
  138. package/build/processor/content.test.d.ts +1 -0
  139. package/build/processor/content.test.js +369 -0
  140. package/build/processor/content.test.js.map +1 -0
  141. package/build/processor/markdown.d.ts +11 -0
  142. package/build/processor/markdown.js +256 -0
  143. package/build/processor/markdown.js.map +1 -0
  144. package/build/processor/markdown.test.d.ts +1 -0
  145. package/build/processor/markdown.test.js +312 -0
  146. package/build/processor/markdown.test.js.map +1 -0
  147. package/build/processor/metadata-parser.d.ts +37 -0
  148. package/build/processor/metadata-parser.js +245 -0
  149. package/build/processor/metadata-parser.js.map +1 -0
  150. package/build/processor/metadata-parser.test.d.ts +1 -0
  151. package/build/processor/metadata-parser.test.js +357 -0
  152. package/build/processor/metadata-parser.test.js.map +1 -0
  153. package/build/processor/processor.d.ts +8 -0
  154. package/build/processor/processor.js +190 -0
  155. package/build/processor/processor.js.map +1 -0
  156. package/build/processor/processor.test.d.ts +1 -0
  157. package/build/processor/processor.test.js +357 -0
  158. package/build/processor/processor.test.js.map +1 -0
  159. package/build/rag/cache.d.ts +10 -0
  160. package/build/rag/cache.js +10 -0
  161. package/build/rag/cache.js.map +1 -0
  162. package/build/rag/code-generator.d.ts +11 -0
  163. package/build/rag/code-generator.js +30 -0
  164. package/build/rag/code-generator.js.map +1 -0
  165. package/build/rag/context-assembler.d.ts +23 -0
  166. package/build/rag/context-assembler.js +113 -0
  167. package/build/rag/context-assembler.js.map +1 -0
  168. package/build/rag/docs-search.d.ts +55 -0
  169. package/build/rag/docs-search.js +380 -0
  170. package/build/rag/docs-search.js.map +1 -0
  171. package/build/rag/pipeline.d.ts +26 -0
  172. package/build/rag/pipeline.js +91 -0
  173. package/build/rag/pipeline.js.map +1 -0
  174. package/build/rag/query-processor.d.ts +14 -0
  175. package/build/rag/query-processor.js +57 -0
  176. package/build/rag/query-processor.js.map +1 -0
  177. package/build/rag/reranker.d.ts +55 -0
  178. package/build/rag/reranker.js +210 -0
  179. package/build/rag/reranker.js.map +1 -0
  180. package/build/rag/response-generator.d.ts +20 -0
  181. package/build/rag/response-generator.js +101 -0
  182. package/build/rag/response-generator.js.map +1 -0
  183. package/build/rag/retriever.d.ts +19 -0
  184. package/build/rag/retriever.js +111 -0
  185. package/build/rag/retriever.js.map +1 -0
  186. package/build/rag/validator.d.ts +22 -0
  187. package/build/rag/validator.js +128 -0
  188. package/build/rag/validator.js.map +1 -0
  189. package/build/rag/version-manager.d.ts +23 -0
  190. package/build/rag/version-manager.js +98 -0
  191. package/build/rag/version-manager.js.map +1 -0
  192. package/build/setupTests.d.ts +4 -0
  193. package/build/setupTests.js +50 -0
  194. package/build/setupTests.js.map +1 -0
  195. package/build/storage/storage.d.ts +38 -0
  196. package/build/storage/storage.js +700 -0
  197. package/build/storage/storage.js.map +1 -0
  198. package/build/storage/storage.test.d.ts +1 -0
  199. package/build/storage/storage.test.js +338 -0
  200. package/build/storage/storage.test.js.map +1 -0
  201. package/build/types/rag.d.ts +27 -0
  202. package/build/types/rag.js +2 -0
  203. package/build/types/rag.js.map +1 -0
  204. package/build/types.d.ts +120 -0
  205. package/build/types.js +2 -0
  206. package/build/types.js.map +1 -0
  207. package/build/util/content-utils.d.ts +31 -0
  208. package/build/util/content-utils.js +120 -0
  209. package/build/util/content-utils.js.map +1 -0
  210. package/build/util/content.d.ts +1 -0
  211. package/build/util/content.js +16 -0
  212. package/build/util/content.js.map +1 -0
  213. package/build/util/docs.d.ts +1 -0
  214. package/build/util/docs.js +26 -0
  215. package/build/util/docs.js.map +1 -0
  216. package/build/util/docs.test.d.ts +1 -0
  217. package/build/util/docs.test.js +49 -0
  218. package/build/util/docs.test.js.map +1 -0
  219. package/build/util/favicon.d.ts +6 -0
  220. package/build/util/favicon.js +88 -0
  221. package/build/util/favicon.js.map +1 -0
  222. package/build/util/favicon.test.d.ts +1 -0
  223. package/build/util/favicon.test.js +140 -0
  224. package/build/util/favicon.test.js.map +1 -0
  225. package/build/util/logger.d.ts +17 -0
  226. package/build/util/logger.js +72 -0
  227. package/build/util/logger.js.map +1 -0
  228. package/build/util/logger.test.d.ts +1 -0
  229. package/build/util/logger.test.js +46 -0
  230. package/build/util/logger.test.js.map +1 -0
  231. package/build/util/security.d.ts +312 -0
  232. package/build/util/security.js +719 -0
  233. package/build/util/security.js.map +1 -0
  234. package/build/util/security.test.d.ts +1 -0
  235. package/build/util/security.test.js +524 -0
  236. package/build/util/security.test.js.map +1 -0
  237. package/build/util/site-detector.d.ts +22 -0
  238. package/build/util/site-detector.js +42 -0
  239. package/build/util/site-detector.js.map +1 -0
  240. package/package.json +112 -0
@@ -0,0 +1,128 @@
1
+ import OpenAI from "openai";
2
+ export class ResponseValidator {
3
+ openai;
4
+ constructor(apiKey) {
5
+ this.openai = new OpenAI({ apiKey });
6
+ }
7
+ async validateResponse(response, context) {
8
+ const [factCheck, codeCheck, consistencyCheck] = await Promise.all([
9
+ this.validateFacts(response, context),
10
+ this.validateCode(response),
11
+ this.validateConsistency(response, context)
12
+ ]);
13
+ return {
14
+ factCheck: factCheck.valid,
15
+ codeCheck: codeCheck.valid,
16
+ consistencyCheck: consistencyCheck.valid,
17
+ details: {
18
+ factCheckDetails: factCheck.details,
19
+ codeCheckDetails: codeCheck.details,
20
+ consistencyCheckDetails: consistencyCheck.details
21
+ }
22
+ };
23
+ }
24
+ async validateFacts(response, context) {
25
+ const completion = await this.openai.chat.completions.create({
26
+ model: "gpt-3.5-turbo",
27
+ messages: [
28
+ {
29
+ role: "system",
30
+ content: `You are a fact-checking assistant. Compare the generated response against the source documentation and identify any factual inconsistencies or inaccuracies. Focus on technical accuracy and completeness.
31
+
32
+ Return a JSON response in this format:
33
+ {
34
+ "isAccurate": true/false,
35
+ "issues": ["array of identified issues or inconsistencies"]
36
+ }`
37
+ },
38
+ {
39
+ role: "user",
40
+ content: `Source Documentation:\n${this.formatContext(context)}\n\nGenerated Response:\n${response.text}\n\nVerify the factual accuracy of the response.`
41
+ }
42
+ ],
43
+ response_format: { type: "json_object" }
44
+ });
45
+ const result = JSON.parse(completion.choices[0].message.content || "{}");
46
+ return {
47
+ valid: result.isAccurate || false,
48
+ details: result.issues || []
49
+ };
50
+ }
51
+ async validateCode(response) {
52
+ if (!response.codeExamples?.length) {
53
+ return { valid: true, details: [] };
54
+ }
55
+ const issues = [];
56
+ for (const example of response.codeExamples) {
57
+ try {
58
+ // Basic syntax validation
59
+ Function(`"use strict";${example}`);
60
+ // Check for common issues
61
+ const commonIssues = this.checkCommonCodeIssues(example);
62
+ issues.push(...commonIssues);
63
+ }
64
+ catch (error) {
65
+ issues.push(`Syntax error: ${error instanceof Error ? error.message : String(error)}`);
66
+ }
67
+ }
68
+ return {
69
+ valid: issues.length === 0,
70
+ details: issues
71
+ };
72
+ }
73
+ async validateConsistency(response, context) {
74
+ const completion = await this.openai.chat.completions.create({
75
+ model: "gpt-3.5-turbo",
76
+ messages: [
77
+ {
78
+ role: "system",
79
+ content: `You are a consistency checker. Verify that the response maintains consistency with the documentation context, uses consistent terminology, and provides a coherent explanation.
80
+
81
+ Return a JSON response in this format:
82
+ {
83
+ "isConsistent": true/false,
84
+ "issues": ["array of identified consistency issues"]
85
+ }`
86
+ },
87
+ {
88
+ role: "user",
89
+ content: `Context:\n${this.formatContext(context)}\n\nResponse:\n${response.text}\n\nCheck for consistency issues.`
90
+ }
91
+ ],
92
+ response_format: { type: "json_object" }
93
+ });
94
+ const result = JSON.parse(completion.choices[0].message.content || "{}");
95
+ return {
96
+ valid: result.isConsistent || false,
97
+ details: result.issues || []
98
+ };
99
+ }
100
+ formatContext(context) {
101
+ return context.hierarchicalContext
102
+ .map(chunk => `[${chunk.metadata.type}]\n${chunk.content}`)
103
+ .join('\n\n');
104
+ }
105
+ checkCommonCodeIssues(code) {
106
+ const issues = [];
107
+ // Check for undefined variables
108
+ const undefinedVarRegex = /\b(?:let|const|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*(?:;|$)/;
109
+ const matches = code.match(new RegExp(undefinedVarRegex, 'g'));
110
+ if (matches) {
111
+ const vars = matches.map(m => m.match(undefinedVarRegex)[1]);
112
+ const unusedVars = vars.filter(v => !code.includes(v));
113
+ if (unusedVars.length > 0) {
114
+ issues.push(`Unused variables: ${unusedVars.join(', ')}`);
115
+ }
116
+ }
117
+ // Check for missing error handling
118
+ if (code.includes('async') && !code.includes('try') && !code.includes('catch')) {
119
+ issues.push('Missing error handling in async code');
120
+ }
121
+ // Check for hardcoded values
122
+ if (code.match(/(['"])(?:https?:\/\/|www\.)[^\s'"]+\1/)) {
123
+ issues.push('Contains hardcoded URLs');
124
+ }
125
+ return issues;
126
+ }
127
+ }
128
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/rag/validator.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAa5B,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAA2B,EAAE,OAAyB;QAC3E,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC;SAC5C,CAAC,CAAC;QAEH,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,KAAK;YAC1B,SAAS,EAAE,SAAS,CAAC,KAAK;YAC1B,gBAAgB,EAAE,gBAAgB,CAAC,KAAK;YACxC,OAAO,EAAE;gBACP,gBAAgB,EAAE,SAAS,CAAC,OAAO;gBACnC,gBAAgB,EAAE,SAAS,CAAC,OAAO;gBACnC,uBAAuB,EAAE,gBAAgB,CAAC,OAAO;aAClD;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,QAA2B,EAAE,OAAyB;QAChF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC3D,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;;;;;;YAMP;iBACH;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,0BAA0B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,4BAA4B,QAAQ,CAAC,IAAI,kDAAkD;iBAC1J;aACF;YACD,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QACzE,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;YACjC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAA2B;QACpD,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,0BAA0B;gBAC1B,QAAQ,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;gBAEpC,0BAA0B;gBAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAA2B,EAAE,OAAyB;QACtF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC3D,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;;;;;;YAMP;iBACH;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,aAAa,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,kBAAkB,QAAQ,CAAC,IAAI,mCAAmC;iBACpH;aACF;YACD,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QACzE,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;YACnC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,OAAyB;QAC7C,OAAO,OAAO,CAAC,mBAAmB;aAC/B,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;aAC1D,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAEO,qBAAqB,CAAC,IAAY;QACxC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,gCAAgC;QAChC,MAAM,iBAAiB,GAAG,4DAA4D,CAAC;QACvF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import { AssembledContext } from "./context-assembler.js";
2
+ import { EnhancedChunk } from "../types/rag.js";
3
+ export interface VersionedContext {
4
+ compatibleChunks: EnhancedChunk[];
5
+ versionedExamples: {
6
+ version: string;
7
+ examples: string[];
8
+ compatibility: {
9
+ minVersion: string;
10
+ maxVersion?: string;
11
+ deprecatedIn?: string;
12
+ removedIn?: string;
13
+ };
14
+ }[];
15
+ }
16
+ export declare class VersionManager {
17
+ getVersionedContext(context: AssembledContext, version: string): Promise<VersionedContext>;
18
+ private filterCompatibleChunks;
19
+ private extractVersionedExamples;
20
+ private extractVersionInfo;
21
+ private isVersionCompatible;
22
+ private sortExamplesByVersion;
23
+ }
@@ -0,0 +1,98 @@
1
+ import semver from "semver";
2
+ export class VersionManager {
3
+ async getVersionedContext(context, version) {
4
+ // Extract version information from chunks
5
+ const versionedChunks = this.filterCompatibleChunks(context.hierarchicalContext, version);
6
+ // Group examples by version
7
+ const versionedExamples = this.extractVersionedExamples(versionedChunks);
8
+ // Sort examples by version compatibility
9
+ const sortedExamples = this.sortExamplesByVersion(versionedExamples, version);
10
+ return {
11
+ compatibleChunks: versionedChunks,
12
+ versionedExamples: sortedExamples
13
+ };
14
+ }
15
+ filterCompatibleChunks(chunks, targetVersion) {
16
+ return chunks.filter(chunk => {
17
+ const versionInfo = this.extractVersionInfo(chunk);
18
+ return this.isVersionCompatible(versionInfo, targetVersion);
19
+ });
20
+ }
21
+ extractVersionedExamples(chunks) {
22
+ const examples = new Map();
23
+ for (const chunk of chunks) {
24
+ if (chunk.metadata.type === 'example') {
25
+ const versionInfo = this.extractVersionInfo(chunk);
26
+ const key = versionInfo.version;
27
+ if (!examples.has(key)) {
28
+ examples.set(key, {
29
+ examples: [],
30
+ compatibility: versionInfo
31
+ });
32
+ }
33
+ examples.get(key).examples.push(chunk.content);
34
+ }
35
+ }
36
+ return Array.from(examples.entries()).map(([version, data]) => ({
37
+ version,
38
+ examples: data.examples,
39
+ compatibility: {
40
+ minVersion: data.compatibility.minVersion || version,
41
+ maxVersion: data.compatibility.maxVersion,
42
+ deprecatedIn: data.compatibility.deprecatedIn,
43
+ removedIn: data.compatibility.removedIn
44
+ }
45
+ }));
46
+ }
47
+ extractVersionInfo(chunk) {
48
+ const citationInfo = chunk.metadata.citationInfo;
49
+ return {
50
+ version: citationInfo.version,
51
+ minVersion: citationInfo.version, // Default to current version as minimum
52
+ maxVersion: undefined, // No upper bound by default
53
+ deprecatedIn: undefined,
54
+ removedIn: undefined
55
+ };
56
+ }
57
+ isVersionCompatible(versionInfo, targetVersion) {
58
+ // If no version information is available, consider it compatible
59
+ if (!versionInfo.version)
60
+ return true;
61
+ try {
62
+ // Check if the version is removed
63
+ if (versionInfo.removedIn && semver.gte(targetVersion, versionInfo.removedIn)) {
64
+ return false;
65
+ }
66
+ // Check version range compatibility
67
+ const minVersion = versionInfo.minVersion || versionInfo.version;
68
+ if (!semver.gte(targetVersion, minVersion)) {
69
+ return false;
70
+ }
71
+ if (versionInfo.maxVersion && semver.gt(targetVersion, versionInfo.maxVersion)) {
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+ catch (error) {
77
+ // If version comparison fails, default to compatible
78
+ console.warn(`Version comparison failed for ${targetVersion}:`, error);
79
+ return true;
80
+ }
81
+ }
82
+ sortExamplesByVersion(examples, targetVersion) {
83
+ return examples.sort((a, b) => {
84
+ // Prioritize non-deprecated examples
85
+ const aDeprecated = a.compatibility.deprecatedIn && semver.gte(targetVersion, a.compatibility.deprecatedIn);
86
+ const bDeprecated = b.compatibility.deprecatedIn && semver.gte(targetVersion, b.compatibility.deprecatedIn);
87
+ if (aDeprecated && !bDeprecated)
88
+ return 1;
89
+ if (!aDeprecated && bDeprecated)
90
+ return -1;
91
+ // Sort by version proximity to target
92
+ const aDistance = Math.abs(semver.compare(targetVersion, a.version));
93
+ const bDistance = Math.abs(semver.compare(targetVersion, b.version));
94
+ return aDistance - bDistance;
95
+ });
96
+ }
97
+ }
98
+ //# sourceMappingURL=version-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-manager.js","sourceRoot":"","sources":["../../src/rag/version-manager.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAwB5B,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,mBAAmB,CAAC,OAAyB,EAAE,OAAe;QAClE,0CAA0C;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAE1F,4BAA4B;QAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAEzE,yCAAyC;QACzC,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAE9E,OAAO;YACL,gBAAgB,EAAE,eAAe;YACjC,iBAAiB,EAAE,cAAc;SAClC,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,MAAuB,EAAE,aAAqB;QAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,wBAAwB,CAAC,MAAuB;QACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAGpB,CAAC;QAEL,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACtC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACnD,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC;gBAEhC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;wBAChB,QAAQ,EAAE,EAAE;wBACZ,aAAa,EAAE,WAAW;qBAC3B,CAAC,CAAC;gBACL,CAAC;gBAED,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE;gBACb,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,IAAI,OAAO;gBACpD,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU;gBACzC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY;gBAC7C,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS;aACxC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,kBAAkB,CAAC,KAAoB;QAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,wCAAwC;YAC1E,UAAU,EAAE,SAAS,EAAE,4BAA4B;YACnD,YAAY,EAAE,SAAS;YACvB,SAAS,EAAE,SAAS;SACrB,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,WAAwB,EAAE,aAAqB;QACzE,iEAAiE;QACjE,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEtC,IAAI,CAAC;YACH,kCAAkC;YAClC,IAAI,WAAW,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9E,OAAO,KAAK,CAAC;YACf,CAAC;YAED,oCAAoC;YACpC,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,OAAO,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,WAAW,CAAC,UAAU,IAAI,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/E,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qDAAqD;YACrD,OAAO,CAAC,IAAI,CAAC,iCAAiC,aAAa,GAAG,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,QAA+C,EAAE,aAAqB;QAClG,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5B,qCAAqC;YACrC,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5G,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAE5G,IAAI,WAAW,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,WAAW,IAAI,WAAW;gBAAE,OAAO,CAAC,CAAC,CAAC;YAE3C,sCAAsC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAErE,OAAO,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Global test setup for Vitest
3
+ */
4
+ export {};
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Global test setup for Vitest
3
+ */
4
+ import createFetchMock from 'vitest-fetch-mock';
5
+ // Initialize fetch mock
6
+ const fetchMocker = createFetchMock(vi);
7
+ fetchMocker.enableMocks();
8
+ // Mock the logger to prevent console output during tests
9
+ vi.mock('./util/logger.js', () => ({
10
+ logger: {
11
+ debug: vi.fn(),
12
+ info: vi.fn(),
13
+ warn: vi.fn(),
14
+ error: vi.fn(),
15
+ },
16
+ }));
17
+ // Mock cli-progress to prevent progress bar output during tests
18
+ const mockSingleBar = {
19
+ start: vi.fn(),
20
+ update: vi.fn(),
21
+ stop: vi.fn(),
22
+ increment: vi.fn(),
23
+ };
24
+ vi.mock('cli-progress', () => {
25
+ return {
26
+ SingleBar: class MockSingleBar {
27
+ start = vi.fn();
28
+ update = vi.fn();
29
+ stop = vi.fn();
30
+ increment = vi.fn();
31
+ },
32
+ MultiBar: class MockMultiBar {
33
+ create = vi.fn().mockReturnValue(mockSingleBar);
34
+ stop = vi.fn();
35
+ remove = vi.fn();
36
+ },
37
+ Presets: {
38
+ shades_classic: {},
39
+ shades_grey: {},
40
+ rect: {},
41
+ },
42
+ };
43
+ });
44
+ // Set up test environment variables
45
+ process.env.MCP_WEB_DOCS_SECRET = 'test-secret-key-for-encryption';
46
+ // Clean up after each test file
47
+ afterEach(() => {
48
+ vi.clearAllMocks();
49
+ });
50
+ //# sourceMappingURL=setupTests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupTests.js","sourceRoot":"","sources":["../src/setupTests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,wBAAwB;AACxB,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;AACxC,WAAW,CAAC,WAAW,EAAE,CAAC;AAE1B,yDAAyD;AACzD,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,MAAM,EAAE;QACN,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf;CACF,CAAC,CAAC,CAAC;AAEJ,gEAAgE;AAChE,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;IAC3B,OAAO;QACL,SAAS,EAAE,MAAM,aAAa;YAC5B,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACf,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;SACrB;QACD,QAAQ,EAAE,MAAM,YAAY;YAC1B,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;SAClB;QACD,OAAO,EAAE;YACP,cAAc,EAAE,EAAE;YAClB,WAAW,EAAE,EAAE;YACf,IAAI,EAAE,EAAE;SACT;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,oCAAoC;AACpC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,gCAAgC,CAAC;AAEnE,gCAAgC;AAChC,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { DocumentMetadata, ProcessedDocument, SearchResult, SearchOptions, StorageProvider } from '../types.js';
2
+ import { EmbeddingsProvider } from '../embeddings/types.js';
3
+ export declare class DocumentStore implements StorageProvider {
4
+ private readonly dbPath;
5
+ private readonly vectorDbPath;
6
+ private readonly embeddings;
7
+ private sqliteDb?;
8
+ private lanceConn?;
9
+ private lanceTable?;
10
+ private readonly searchCache;
11
+ private ftsIndexCreated;
12
+ constructor(dbPath: string, vectorDbPath: string, embeddings: EmbeddingsProvider, maxCacheSize?: number);
13
+ initialize(): Promise<void>;
14
+ addDocument(doc: ProcessedDocument): Promise<void>;
15
+ searchDocuments(queryVector: number[], options?: SearchOptions): Promise<SearchResult[]>;
16
+ /**
17
+ * Create full-text search index on the content field
18
+ */
19
+ private createFTSIndex;
20
+ searchByText(query: string, options?: SearchOptions): Promise<SearchResult[]>;
21
+ /**
22
+ * Merge FTS and vector results using Reciprocal Rank Fusion (RRF)
23
+ */
24
+ private mergeAndRankResults;
25
+ /**
26
+ * Format raw LanceDB results into SearchResult objects
27
+ */
28
+ private formatSearchResults;
29
+ listDocuments(): Promise<DocumentMetadata[]>;
30
+ deleteDocument(url: string): Promise<void>;
31
+ getDocument(url: string): Promise<DocumentMetadata | null>;
32
+ private clearCacheForUrl;
33
+ /**
34
+ * Validates that vectors are properly stored and retrievable from LanceDB
35
+ * @returns Promise<boolean> True if vectors are valid, false otherwise
36
+ */
37
+ validateVectors(): Promise<boolean>;
38
+ }