@mcp-graph-workflow/mcp-graph 5.5.3 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/dist/api/router.d.ts.map +1 -1
  2. package/dist/api/router.js +4 -0
  3. package/dist/api/router.js.map +1 -1
  4. package/dist/api/routes/code-graph.d.ts.map +1 -1
  5. package/dist/api/routes/code-graph.js +4 -1
  6. package/dist/api/routes/code-graph.js.map +1 -1
  7. package/dist/api/routes/journey.d.ts +4 -0
  8. package/dist/api/routes/journey.d.ts.map +1 -0
  9. package/dist/api/routes/journey.js +263 -0
  10. package/dist/api/routes/journey.js.map +1 -0
  11. package/dist/api/routes/siebel.d.ts +7 -0
  12. package/dist/api/routes/siebel.d.ts.map +1 -0
  13. package/dist/api/routes/siebel.js +305 -0
  14. package/dist/api/routes/siebel.js.map +1 -0
  15. package/dist/core/code/code-indexer.d.ts.map +1 -1
  16. package/dist/core/code/code-indexer.js +17 -2
  17. package/dist/core/code/code-indexer.js.map +1 -1
  18. package/dist/core/code/code-types.d.ts +1 -0
  19. package/dist/core/code/code-types.d.ts.map +1 -1
  20. package/dist/core/code/code-types.js.map +1 -1
  21. package/dist/core/code/ts-analyzer.d.ts +6 -0
  22. package/dist/core/code/ts-analyzer.d.ts.map +1 -1
  23. package/dist/core/code/ts-analyzer.js +9 -0
  24. package/dist/core/code/ts-analyzer.js.map +1 -1
  25. package/dist/core/context/rag-context.d.ts.map +1 -1
  26. package/dist/core/context/rag-context.js +21 -5
  27. package/dist/core/context/rag-context.js.map +1 -1
  28. package/dist/core/events/event-types.d.ts +63 -1
  29. package/dist/core/events/event-types.d.ts.map +1 -1
  30. package/dist/core/integrations/integration-orchestrator.d.ts +12 -0
  31. package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -1
  32. package/dist/core/integrations/integration-orchestrator.js +36 -2
  33. package/dist/core/integrations/integration-orchestrator.js.map +1 -1
  34. package/dist/core/journey/journey-store.d.ts +137 -0
  35. package/dist/core/journey/journey-store.d.ts.map +1 -0
  36. package/dist/core/journey/journey-store.js +210 -0
  37. package/dist/core/journey/journey-store.js.map +1 -0
  38. package/dist/core/parser/file-reader.d.ts.map +1 -1
  39. package/dist/core/parser/file-reader.js +16 -1
  40. package/dist/core/parser/file-reader.js.map +1 -1
  41. package/dist/core/parser/read-docx.d.ts +17 -0
  42. package/dist/core/parser/read-docx.d.ts.map +1 -0
  43. package/dist/core/parser/read-docx.js +79 -0
  44. package/dist/core/parser/read-docx.js.map +1 -0
  45. package/dist/core/parser/read-swagger.d.ts +49 -0
  46. package/dist/core/parser/read-swagger.d.ts.map +1 -0
  47. package/dist/core/parser/read-swagger.js +332 -0
  48. package/dist/core/parser/read-swagger.js.map +1 -0
  49. package/dist/core/rag/chunk-text.d.ts +5 -0
  50. package/dist/core/rag/chunk-text.d.ts.map +1 -1
  51. package/dist/core/rag/chunk-text.js +135 -0
  52. package/dist/core/rag/chunk-text.js.map +1 -1
  53. package/dist/core/rag/code-context-indexer.d.ts +27 -0
  54. package/dist/core/rag/code-context-indexer.d.ts.map +1 -0
  55. package/dist/core/rag/code-context-indexer.js +53 -0
  56. package/dist/core/rag/code-context-indexer.js.map +1 -0
  57. package/dist/core/rag/decision-indexer.d.ts +20 -0
  58. package/dist/core/rag/decision-indexer.d.ts.map +1 -0
  59. package/dist/core/rag/decision-indexer.js +32 -0
  60. package/dist/core/rag/decision-indexer.js.map +1 -0
  61. package/dist/core/rag/journey-indexer.d.ts +16 -0
  62. package/dist/core/rag/journey-indexer.d.ts.map +1 -0
  63. package/dist/core/rag/journey-indexer.js +182 -0
  64. package/dist/core/rag/journey-indexer.js.map +1 -0
  65. package/dist/core/rag/knowledge-feedback.d.ts +15 -0
  66. package/dist/core/rag/knowledge-feedback.d.ts.map +1 -0
  67. package/dist/core/rag/knowledge-feedback.js +46 -0
  68. package/dist/core/rag/knowledge-feedback.js.map +1 -0
  69. package/dist/core/rag/knowledge-linker.d.ts +20 -0
  70. package/dist/core/rag/knowledge-linker.d.ts.map +1 -0
  71. package/dist/core/rag/knowledge-linker.js +107 -0
  72. package/dist/core/rag/knowledge-linker.js.map +1 -0
  73. package/dist/core/rag/knowledge-quality.d.ts +31 -0
  74. package/dist/core/rag/knowledge-quality.d.ts.map +1 -0
  75. package/dist/core/rag/knowledge-quality.js +127 -0
  76. package/dist/core/rag/knowledge-quality.js.map +1 -0
  77. package/dist/core/rag/knowledge-synthesizer.d.ts +17 -0
  78. package/dist/core/rag/knowledge-synthesizer.d.ts.map +1 -0
  79. package/dist/core/rag/knowledge-synthesizer.js +115 -0
  80. package/dist/core/rag/knowledge-synthesizer.js.map +1 -0
  81. package/dist/core/rag/memory-rag-query.d.ts +3 -3
  82. package/dist/core/rag/memory-rag-query.d.ts.map +1 -1
  83. package/dist/core/rag/memory-rag-query.js +18 -0
  84. package/dist/core/rag/memory-rag-query.js.map +1 -1
  85. package/dist/core/rag/multi-strategy-retrieval.d.ts +46 -0
  86. package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -0
  87. package/dist/core/rag/multi-strategy-retrieval.js +140 -0
  88. package/dist/core/rag/multi-strategy-retrieval.js.map +1 -0
  89. package/dist/core/rag/rag-pipeline.d.ts +11 -0
  90. package/dist/core/rag/rag-pipeline.d.ts.map +1 -1
  91. package/dist/core/rag/rag-pipeline.js +39 -0
  92. package/dist/core/rag/rag-pipeline.js.map +1 -1
  93. package/dist/core/rag/siebel-indexer.d.ts +16 -0
  94. package/dist/core/rag/siebel-indexer.d.ts.map +1 -0
  95. package/dist/core/rag/siebel-indexer.js +75 -0
  96. package/dist/core/rag/siebel-indexer.js.map +1 -0
  97. package/dist/core/rag/swagger-indexer.d.ts +16 -0
  98. package/dist/core/rag/swagger-indexer.d.ts.map +1 -0
  99. package/dist/core/rag/swagger-indexer.js +119 -0
  100. package/dist/core/rag/swagger-indexer.js.map +1 -0
  101. package/dist/core/rag/validation-indexer.d.ts +23 -0
  102. package/dist/core/rag/validation-indexer.d.ts.map +1 -0
  103. package/dist/core/rag/validation-indexer.js +35 -0
  104. package/dist/core/rag/validation-indexer.js.map +1 -0
  105. package/dist/core/siebel/composer-automation.d.ts +77 -0
  106. package/dist/core/siebel/composer-automation.d.ts.map +1 -0
  107. package/dist/core/siebel/composer-automation.js +110 -0
  108. package/dist/core/siebel/composer-automation.js.map +1 -0
  109. package/dist/core/siebel/dependency-analyzer.d.ts +24 -0
  110. package/dist/core/siebel/dependency-analyzer.d.ts.map +1 -0
  111. package/dist/core/siebel/dependency-analyzer.js +174 -0
  112. package/dist/core/siebel/dependency-analyzer.js.map +1 -0
  113. package/dist/core/siebel/siebel-config.d.ts +28 -0
  114. package/dist/core/siebel/siebel-config.d.ts.map +1 -0
  115. package/dist/core/siebel/siebel-config.js +86 -0
  116. package/dist/core/siebel/siebel-config.js.map +1 -0
  117. package/dist/core/siebel/sif-context-assembler.d.ts +37 -0
  118. package/dist/core/siebel/sif-context-assembler.d.ts.map +1 -0
  119. package/dist/core/siebel/sif-context-assembler.js +259 -0
  120. package/dist/core/siebel/sif-context-assembler.js.map +1 -0
  121. package/dist/core/siebel/sif-generator.d.ts +26 -0
  122. package/dist/core/siebel/sif-generator.d.ts.map +1 -0
  123. package/dist/core/siebel/sif-generator.js +232 -0
  124. package/dist/core/siebel/sif-generator.js.map +1 -0
  125. package/dist/core/siebel/sif-parser.d.ts +16 -0
  126. package/dist/core/siebel/sif-parser.d.ts.map +1 -0
  127. package/dist/core/siebel/sif-parser.js +355 -0
  128. package/dist/core/siebel/sif-parser.js.map +1 -0
  129. package/dist/core/siebel/sif-templates.d.ts +45 -0
  130. package/dist/core/siebel/sif-templates.d.ts.map +1 -0
  131. package/dist/core/siebel/sif-templates.js +179 -0
  132. package/dist/core/siebel/sif-templates.js.map +1 -0
  133. package/dist/core/siebel/sif-to-graph.d.ts +20 -0
  134. package/dist/core/siebel/sif-to-graph.d.ts.map +1 -0
  135. package/dist/core/siebel/sif-to-graph.js +176 -0
  136. package/dist/core/siebel/sif-to-graph.js.map +1 -0
  137. package/dist/core/store/knowledge-store.d.ts +25 -0
  138. package/dist/core/store/knowledge-store.d.ts.map +1 -1
  139. package/dist/core/store/knowledge-store.js +72 -0
  140. package/dist/core/store/knowledge-store.js.map +1 -1
  141. package/dist/core/store/migrations.d.ts.map +1 -1
  142. package/dist/core/store/migrations.js +96 -0
  143. package/dist/core/store/migrations.js.map +1 -1
  144. package/dist/mcp/tools/index.d.ts.map +1 -1
  145. package/dist/mcp/tools/index.js +26 -0
  146. package/dist/mcp/tools/index.js.map +1 -1
  147. package/dist/mcp/tools/journey.d.ts +4 -0
  148. package/dist/mcp/tools/journey.d.ts.map +1 -0
  149. package/dist/mcp/tools/journey.js +154 -0
  150. package/dist/mcp/tools/journey.js.map +1 -0
  151. package/dist/mcp/tools/knowledge-feedback.d.ts +8 -0
  152. package/dist/mcp/tools/knowledge-feedback.d.ts.map +1 -0
  153. package/dist/mcp/tools/knowledge-feedback.js +35 -0
  154. package/dist/mcp/tools/knowledge-feedback.js.map +1 -0
  155. package/dist/mcp/tools/knowledge-stats.d.ts +9 -0
  156. package/dist/mcp/tools/knowledge-stats.d.ts.map +1 -0
  157. package/dist/mcp/tools/knowledge-stats.js +83 -0
  158. package/dist/mcp/tools/knowledge-stats.js.map +1 -0
  159. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
  160. package/dist/mcp/tools/plan-sprint.js +7 -1
  161. package/dist/mcp/tools/plan-sprint.js.map +1 -1
  162. package/dist/mcp/tools/rag-context.d.ts.map +1 -1
  163. package/dist/mcp/tools/rag-context.js +43 -2
  164. package/dist/mcp/tools/rag-context.js.map +1 -1
  165. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
  166. package/dist/mcp/tools/reindex-knowledge.js +23 -2
  167. package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
  168. package/dist/mcp/tools/siebel-analyze.d.ts +8 -0
  169. package/dist/mcp/tools/siebel-analyze.d.ts.map +1 -0
  170. package/dist/mcp/tools/siebel-analyze.js +107 -0
  171. package/dist/mcp/tools/siebel-analyze.js.map +1 -0
  172. package/dist/mcp/tools/siebel-composer.d.ts +12 -0
  173. package/dist/mcp/tools/siebel-composer.d.ts.map +1 -0
  174. package/dist/mcp/tools/siebel-composer.js +59 -0
  175. package/dist/mcp/tools/siebel-composer.js.map +1 -0
  176. package/dist/mcp/tools/siebel-env.d.ts +8 -0
  177. package/dist/mcp/tools/siebel-env.d.ts.map +1 -0
  178. package/dist/mcp/tools/siebel-env.js +60 -0
  179. package/dist/mcp/tools/siebel-env.js.map +1 -0
  180. package/dist/mcp/tools/siebel-generate-sif.d.ts +8 -0
  181. package/dist/mcp/tools/siebel-generate-sif.d.ts.map +1 -0
  182. package/dist/mcp/tools/siebel-generate-sif.js +91 -0
  183. package/dist/mcp/tools/siebel-generate-sif.js.map +1 -0
  184. package/dist/mcp/tools/siebel-import-docs.d.ts +9 -0
  185. package/dist/mcp/tools/siebel-import-docs.d.ts.map +1 -0
  186. package/dist/mcp/tools/siebel-import-docs.js +106 -0
  187. package/dist/mcp/tools/siebel-import-docs.js.map +1 -0
  188. package/dist/mcp/tools/siebel-import-sif.d.ts +8 -0
  189. package/dist/mcp/tools/siebel-import-sif.d.ts.map +1 -0
  190. package/dist/mcp/tools/siebel-import-sif.js +68 -0
  191. package/dist/mcp/tools/siebel-import-sif.js.map +1 -0
  192. package/dist/mcp/tools/siebel-search.d.ts +8 -0
  193. package/dist/mcp/tools/siebel-search.d.ts.map +1 -0
  194. package/dist/mcp/tools/siebel-search.js +47 -0
  195. package/dist/mcp/tools/siebel-search.js.map +1 -0
  196. package/dist/mcp/tools/siebel-validate.d.ts +8 -0
  197. package/dist/mcp/tools/siebel-validate.d.ts.map +1 -0
  198. package/dist/mcp/tools/siebel-validate.js +107 -0
  199. package/dist/mcp/tools/siebel-validate.js.map +1 -0
  200. package/dist/mcp/tools/update-status.d.ts.map +1 -1
  201. package/dist/mcp/tools/update-status.js +22 -1
  202. package/dist/mcp/tools/update-status.js.map +1 -1
  203. package/dist/mcp/tools/validate.d.ts.map +1 -1
  204. package/dist/mcp/tools/validate.js +21 -0
  205. package/dist/mcp/tools/validate.js.map +1 -1
  206. package/dist/schemas/knowledge.schema.d.ts +66 -0
  207. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  208. package/dist/schemas/knowledge.schema.js +28 -0
  209. package/dist/schemas/knowledge.schema.js.map +1 -1
  210. package/dist/schemas/siebel.schema.d.ts +564 -0
  211. package/dist/schemas/siebel.schema.d.ts.map +1 -0
  212. package/dist/schemas/siebel.schema.js +197 -0
  213. package/dist/schemas/siebel.schema.js.map +1 -0
  214. package/dist/web/dashboard/dist/assets/{benchmark-tab-C5fwIqgM.js → benchmark-tab-BoMsoQjO.js} +1 -1
  215. package/dist/web/dashboard/dist/assets/{context-tab-ChCyrRlr.js → context-tab-BLT4qQ77.js} +1 -1
  216. package/dist/web/dashboard/dist/assets/{gitnexus-tab-DnlGT63w.js → gitnexus-tab-DDw7DUED.js} +4 -4
  217. package/dist/web/dashboard/dist/assets/graph-tab-DG9Q6nko.js +1 -0
  218. package/dist/web/dashboard/dist/assets/graph-utils-BpYHKE87.js +1 -0
  219. package/dist/web/dashboard/dist/assets/index-Cu23WCcu.css +1 -0
  220. package/dist/web/dashboard/dist/assets/index-DtkPX5ZZ.js +55 -0
  221. package/dist/web/dashboard/dist/assets/{index-DlZhNCGR.js → index-F9dY4AG_.js} +1 -1
  222. package/dist/web/dashboard/dist/assets/{insights-tab-Cj4f85vS.js → insights-tab-YN7G6mjm.js} +1 -1
  223. package/dist/web/dashboard/dist/assets/journey-tab-BcweuR82.js +1 -0
  224. package/dist/web/dashboard/dist/assets/{logs-tab-C4C2Vn8-.js → logs-tab-BjdAURdy.js} +1 -1
  225. package/dist/web/dashboard/dist/assets/{memories-tab-NtNwoxbT.js → memories-tab-CQ2xM2aw.js} +1 -1
  226. package/dist/web/dashboard/dist/assets/prd-backlog-tab-CIeCpE1a.js +1 -0
  227. package/dist/web/dashboard/dist/assets/siebel-tab-bj5CT4-Z.js +3 -0
  228. package/dist/web/dashboard/dist/assets/{skills-tab-CIj4z1Ol.js → skills-tab-Bgk72mKO.js} +1 -1
  229. package/dist/web/dashboard/dist/assets/style-Da3qWU01.js +7 -0
  230. package/dist/web/dashboard/dist/index.html +2 -2
  231. package/package.json +15 -3
  232. package/dist/web/dashboard/dist/assets/graph-tab-DjV9RD41.js +0 -1
  233. package/dist/web/dashboard/dist/assets/graph-utils-C6bvcT4d.js +0 -7
  234. package/dist/web/dashboard/dist/assets/index-DQqYFXms.css +0 -1
  235. package/dist/web/dashboard/dist/assets/index-dCyMex_p.js +0 -53
  236. package/dist/web/dashboard/dist/assets/prd-backlog-tab-Bxt7qiVG.js +0 -1
  237. /package/dist/web/dashboard/dist/assets/{graph-utils-BZV40eAE.css → style-BZV40eAE.css} +0 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * DOCX Parser — extracts text content from .doc and .docx files using mammoth.
3
+ *
4
+ * Dependency: mammoth (~200KB, pure JS, zero native deps).
5
+ * Uses dynamic import to avoid startup cost.
6
+ */
7
+ import { readFile } from "node:fs/promises";
8
+ import { logger } from "../utils/logger.js";
9
+ import { FileNotFoundError } from "../utils/errors.js";
10
+ const DOCX_EXTENSIONS = new Set([".doc", ".docx"]);
11
+ /**
12
+ * Check if a file extension is a supported Word document format.
13
+ */
14
+ export function isDocxSupported(ext) {
15
+ return DOCX_EXTENSIONS.has(ext.toLowerCase());
16
+ }
17
+ /**
18
+ * Extract text content from a .docx file using mammoth.
19
+ * For .doc (legacy binary format), mammoth will attempt extraction
20
+ * but may have limited formatting support.
21
+ */
22
+ export async function readDocxContent(filePath) {
23
+ let buffer;
24
+ try {
25
+ buffer = await readFile(filePath);
26
+ }
27
+ catch {
28
+ throw new FileNotFoundError(filePath);
29
+ }
30
+ if (buffer.length === 0) {
31
+ throw new FileNotFoundError(`File is empty: ${filePath}`);
32
+ }
33
+ logger.info("Parsing DOCX file", { filePath, sizeBytes: buffer.length });
34
+ // Dynamic import — mammoth is heavy, lazy-load
35
+ const mammoth = await import("mammoth");
36
+ const result = await mammoth.convertToHtml({ buffer });
37
+ // Convert HTML output to plain text with markdown-like headings
38
+ const text = htmlToText(result.value);
39
+ if (result.messages.length > 0) {
40
+ logger.debug("DOCX parse messages", {
41
+ filePath,
42
+ messages: result.messages.map((m) => m.message).join("; "),
43
+ });
44
+ }
45
+ logger.info("DOCX parsed", { filePath, textLength: text.length });
46
+ return text;
47
+ }
48
+ /**
49
+ * Simple HTML-to-text conversion for mammoth output.
50
+ * Mammoth produces clean HTML — we just need headings, lists, paragraphs.
51
+ */
52
+ function htmlToText(html) {
53
+ let text = html;
54
+ // Convert headings to markdown
55
+ text = text.replace(/<h1[^>]*>(.*?)<\/h1>/gi, "\n# $1\n");
56
+ text = text.replace(/<h2[^>]*>(.*?)<\/h2>/gi, "\n## $1\n");
57
+ text = text.replace(/<h3[^>]*>(.*?)<\/h3>/gi, "\n### $1\n");
58
+ text = text.replace(/<h4[^>]*>(.*?)<\/h4>/gi, "\n#### $1\n");
59
+ // Convert list items
60
+ text = text.replace(/<li[^>]*>(.*?)<\/li>/gi, "\n- $1");
61
+ // Convert paragraphs to newlines
62
+ text = text.replace(/<p[^>]*>(.*?)<\/p>/gi, "\n$1\n");
63
+ // Convert line breaks
64
+ text = text.replace(/<br\s*\/?>/gi, "\n");
65
+ // Strip all remaining HTML tags
66
+ text = text.replace(/<[^>]+>/g, "");
67
+ // Decode HTML entities
68
+ text = text.replace(/&amp;/g, "&");
69
+ text = text.replace(/&lt;/g, "<");
70
+ text = text.replace(/&gt;/g, ">");
71
+ text = text.replace(/&quot;/g, '"');
72
+ text = text.replace(/&#39;/g, "'");
73
+ text = text.replace(/&nbsp;/g, " ");
74
+ // Normalize whitespace
75
+ text = text.replace(/[ \t]+/g, " ");
76
+ text = text.replace(/\n{3,}/g, "\n\n");
77
+ return text.trim();
78
+ }
79
+ //# sourceMappingURL=read-docx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-docx.js","sourceRoot":"","sources":["../../../src/core/parser/read-docx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Swagger/WSDL Parser — parses OpenAPI 2.0/3.0 (YAML/JSON) and WSDL (XML)
3
+ * into a normalized structure for knowledge store indexing.
4
+ *
5
+ * Zero new dependencies: uses `yaml` (already in project) for YAML parsing
6
+ * and `fast-xml-parser` (already in project) for WSDL parsing.
7
+ */
8
+ export interface SwaggerEndpointParam {
9
+ name: string;
10
+ location: string;
11
+ type: string;
12
+ required: boolean;
13
+ }
14
+ export interface SwaggerEndpoint {
15
+ method: string;
16
+ path: string;
17
+ operationId: string;
18
+ summary: string;
19
+ parameters: SwaggerEndpointParam[];
20
+ requestBody: string | undefined;
21
+ responses: string[];
22
+ }
23
+ export interface SwaggerSchemaProperty {
24
+ name: string;
25
+ type: string;
26
+ required: boolean;
27
+ }
28
+ export interface SwaggerSchema {
29
+ name: string;
30
+ type: string;
31
+ properties: SwaggerSchemaProperty[];
32
+ required: string[];
33
+ }
34
+ export interface SwaggerParseResult {
35
+ title: string;
36
+ version: string;
37
+ endpoints: SwaggerEndpoint[];
38
+ schemas: SwaggerSchema[];
39
+ format: "openapi2" | "openapi3" | "wsdl";
40
+ }
41
+ /**
42
+ * Parse OpenAPI 2.0/3.0 content (YAML or JSON) into SwaggerParseResult.
43
+ */
44
+ export declare function parseSwaggerContent(content: string): SwaggerParseResult;
45
+ /**
46
+ * Parse WSDL XML content into SwaggerParseResult.
47
+ */
48
+ export declare function parseWsdlContent(content: string): SwaggerParseResult;
49
+ //# sourceMappingURL=read-swagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-swagger.d.ts","sourceRoot":"","sources":["../../../src/core/parser/read-swagger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;CAC1C;AAQD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAoBvE;AAyLD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CA2HpE"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Swagger/WSDL Parser — parses OpenAPI 2.0/3.0 (YAML/JSON) and WSDL (XML)
3
+ * into a normalized structure for knowledge store indexing.
4
+ *
5
+ * Zero new dependencies: uses `yaml` (already in project) for YAML parsing
6
+ * and `fast-xml-parser` (already in project) for WSDL parsing.
7
+ */
8
+ import { XMLParser } from "fast-xml-parser";
9
+ import YAML from "yaml";
10
+ import { logger } from "../utils/logger.js";
11
+ import { ValidationError } from "../utils/errors.js";
12
+ // ---- HTTP method list for path extraction ----
13
+ const HTTP_METHODS = new Set(["get", "post", "put", "delete", "patch", "options", "head"]);
14
+ // ---- OpenAPI Parsing ----
15
+ /**
16
+ * Parse OpenAPI 2.0/3.0 content (YAML or JSON) into SwaggerParseResult.
17
+ */
18
+ export function parseSwaggerContent(content) {
19
+ if (!content || content.trim().length === 0) {
20
+ throw new ValidationError("Swagger/OpenAPI content is empty", [
21
+ { field: "content", message: "empty" },
22
+ ]);
23
+ }
24
+ const doc = parseYamlOrJson(content);
25
+ if (doc.openapi && typeof doc.openapi === "string" && doc.openapi.startsWith("3")) {
26
+ return parseOpenApi3(doc);
27
+ }
28
+ if (doc.swagger && typeof doc.swagger === "string" && doc.swagger.startsWith("2")) {
29
+ return parseOpenApi2(doc);
30
+ }
31
+ throw new ValidationError("Unrecognized API spec format. Expected OpenAPI 2.0 or 3.0", [
32
+ { field: "format", message: "neither 'openapi' nor 'swagger' field found" },
33
+ ]);
34
+ }
35
+ function parseOpenApi3(doc) {
36
+ const info = (doc.info ?? {});
37
+ const title = String(info.title ?? "Untitled API");
38
+ const version = String(info.version ?? "0.0.0");
39
+ logger.info("Parsing OpenAPI 3.0", { title, version });
40
+ const endpoints = extractPathEndpoints(doc.paths);
41
+ const schemas = extractComponentSchemas(doc.components?.schemas);
42
+ logger.debug("OpenAPI 3.0 parsed", {
43
+ endpoints: String(endpoints.length),
44
+ schemas: String(schemas.length),
45
+ });
46
+ return { title, version, endpoints, schemas, format: "openapi3" };
47
+ }
48
+ function parseOpenApi2(doc) {
49
+ const info = (doc.info ?? {});
50
+ const title = String(info.title ?? "Untitled API");
51
+ const version = String(info.version ?? "0.0.0");
52
+ logger.info("Parsing OpenAPI 2.0 (Swagger)", { title, version });
53
+ const endpoints = extractPathEndpoints(doc.paths);
54
+ const schemas = extractComponentSchemas(doc.definitions);
55
+ logger.debug("OpenAPI 2.0 parsed", {
56
+ endpoints: String(endpoints.length),
57
+ schemas: String(schemas.length),
58
+ });
59
+ return { title, version, endpoints, schemas, format: "openapi2" };
60
+ }
61
+ function extractPathEndpoints(paths) {
62
+ if (!paths)
63
+ return [];
64
+ const endpoints = [];
65
+ for (const [path, methods] of Object.entries(paths)) {
66
+ if (!methods || typeof methods !== "object")
67
+ continue;
68
+ const methodsObj = methods;
69
+ for (const [method, operation] of Object.entries(methodsObj)) {
70
+ if (!HTTP_METHODS.has(method.toLowerCase()))
71
+ continue;
72
+ if (!operation || typeof operation !== "object")
73
+ continue;
74
+ const op = operation;
75
+ const parameters = [];
76
+ const rawParams = op.parameters;
77
+ if (Array.isArray(rawParams)) {
78
+ for (const p of rawParams) {
79
+ parameters.push({
80
+ name: String(p.name ?? ""),
81
+ location: String(p.in ?? "query"),
82
+ type: extractParamType(p),
83
+ required: Boolean(p.required),
84
+ });
85
+ }
86
+ }
87
+ const responses = [];
88
+ const rawResponses = op.responses;
89
+ if (rawResponses) {
90
+ for (const [code, resp] of Object.entries(rawResponses)) {
91
+ const desc = typeof resp === "object" && resp
92
+ ? String(resp.description ?? "")
93
+ : "";
94
+ responses.push(`${code}: ${desc}`);
95
+ }
96
+ }
97
+ let requestBody;
98
+ if (op.requestBody && typeof op.requestBody === "object") {
99
+ const rb = op.requestBody;
100
+ const content = rb.content;
101
+ if (content) {
102
+ const firstMime = Object.values(content)[0];
103
+ if (firstMime?.schema) {
104
+ requestBody = extractRefName(firstMime.schema);
105
+ }
106
+ }
107
+ }
108
+ endpoints.push({
109
+ method: method.toUpperCase(),
110
+ path,
111
+ operationId: String(op.operationId ?? `${method}_${path}`),
112
+ summary: String(op.summary ?? ""),
113
+ parameters,
114
+ requestBody,
115
+ responses,
116
+ });
117
+ }
118
+ }
119
+ return endpoints;
120
+ }
121
+ function extractComponentSchemas(schemas) {
122
+ if (!schemas)
123
+ return [];
124
+ const result = [];
125
+ for (const [name, schema] of Object.entries(schemas)) {
126
+ if (!schema || typeof schema !== "object")
127
+ continue;
128
+ const s = schema;
129
+ const requiredFields = Array.isArray(s.required)
130
+ ? s.required
131
+ : [];
132
+ const properties = [];
133
+ const rawProps = s.properties;
134
+ if (rawProps) {
135
+ for (const [propName, propDef] of Object.entries(rawProps)) {
136
+ const def = propDef;
137
+ properties.push({
138
+ name: propName,
139
+ type: def ? String(def.type ?? "object") : "unknown",
140
+ required: requiredFields.includes(propName),
141
+ });
142
+ }
143
+ }
144
+ result.push({
145
+ name,
146
+ type: String(s.type ?? "object"),
147
+ properties,
148
+ required: requiredFields,
149
+ });
150
+ }
151
+ return result;
152
+ }
153
+ function extractParamType(param) {
154
+ if (param.schema && typeof param.schema === "object") {
155
+ return String(param.schema.type ?? "string");
156
+ }
157
+ return String(param.type ?? "string");
158
+ }
159
+ function extractRefName(schema) {
160
+ const ref = schema.$ref;
161
+ if (ref) {
162
+ const parts = ref.split("/");
163
+ return parts[parts.length - 1];
164
+ }
165
+ return String(schema.type ?? "object");
166
+ }
167
+ function parseYamlOrJson(content) {
168
+ const trimmed = content.trim();
169
+ // Try JSON first (faster check)
170
+ if (trimmed.startsWith("{")) {
171
+ try {
172
+ return JSON.parse(trimmed);
173
+ }
174
+ catch {
175
+ // Fall through to YAML
176
+ }
177
+ }
178
+ // Try YAML
179
+ try {
180
+ const parsed = YAML.parse(trimmed);
181
+ if (parsed && typeof parsed === "object") {
182
+ return parsed;
183
+ }
184
+ }
185
+ catch {
186
+ // Fall through
187
+ }
188
+ throw new ValidationError("Failed to parse content as YAML or JSON", [
189
+ { field: "content", message: "not valid YAML or JSON" },
190
+ ]);
191
+ }
192
+ // ---- WSDL Parsing ----
193
+ /**
194
+ * Parse WSDL XML content into SwaggerParseResult.
195
+ */
196
+ export function parseWsdlContent(content) {
197
+ if (!content || content.trim().length === 0) {
198
+ throw new ValidationError("WSDL content is empty", [
199
+ { field: "content", message: "empty" },
200
+ ]);
201
+ }
202
+ const parser = new XMLParser({
203
+ ignoreAttributes: false,
204
+ attributeNamePrefix: "@_",
205
+ parseAttributeValue: false,
206
+ isArray: () => true,
207
+ });
208
+ let parsed;
209
+ try {
210
+ parsed = parser.parse(content);
211
+ }
212
+ catch (err) {
213
+ throw new ValidationError("Invalid WSDL XML", [
214
+ { field: "xml", message: err instanceof Error ? err.message : String(err) },
215
+ ]);
216
+ }
217
+ // Navigate to definitions root
218
+ const definitions = getFirst(parsed, "definitions");
219
+ if (!definitions) {
220
+ throw new ValidationError("WSDL missing <definitions> root element", [
221
+ { field: "structure", message: "no <definitions> found" },
222
+ ]);
223
+ }
224
+ const serviceName = getAttr(definitions, "name") ?? "Unknown Service";
225
+ logger.info("Parsing WSDL", { serviceName });
226
+ // Extract operations from portType
227
+ const endpoints = [];
228
+ const portTypes = getArraySafe(definitions, "portType");
229
+ for (const pt of portTypes) {
230
+ const operations = getArraySafe(pt, "operation");
231
+ for (const op of operations) {
232
+ const opName = getAttr(op, "name") ?? "unknown";
233
+ endpoints.push({
234
+ method: "SOAP",
235
+ path: opName,
236
+ operationId: opName,
237
+ summary: `SOAP operation: ${opName}`,
238
+ parameters: [],
239
+ requestBody: undefined,
240
+ responses: [],
241
+ });
242
+ }
243
+ }
244
+ // Extract schemas from types
245
+ const schemas = [];
246
+ const typesArr = getArraySafe(definitions, "types");
247
+ for (const types of typesArr) {
248
+ const schemaElems = getArraySafe(types, "xsd:schema");
249
+ // Also try without prefix
250
+ const schemaElemsAlt = getArraySafe(types, "schema");
251
+ for (const schemaElem of [...schemaElems, ...schemaElemsAlt]) {
252
+ const elements = [
253
+ ...getArraySafe(schemaElem, "xsd:element"),
254
+ ...getArraySafe(schemaElem, "element"),
255
+ ];
256
+ for (const elem of elements) {
257
+ const elemName = getAttr(elem, "name");
258
+ if (!elemName)
259
+ continue;
260
+ const properties = [];
261
+ // Look for complexType → sequence → element
262
+ const complexTypes = [
263
+ ...getArraySafe(elem, "xsd:complexType"),
264
+ ...getArraySafe(elem, "complexType"),
265
+ ];
266
+ for (const ct of complexTypes) {
267
+ const sequences = [
268
+ ...getArraySafe(ct, "xsd:sequence"),
269
+ ...getArraySafe(ct, "sequence"),
270
+ ];
271
+ for (const seq of sequences) {
272
+ const seqElems = [
273
+ ...getArraySafe(seq, "xsd:element"),
274
+ ...getArraySafe(seq, "element"),
275
+ ];
276
+ for (const se of seqElems) {
277
+ const propName = getAttr(se, "name");
278
+ const propType = getAttr(se, "type") ?? "string";
279
+ if (propName) {
280
+ properties.push({
281
+ name: propName,
282
+ type: propType.replace(/^xsd:/, ""),
283
+ required: false,
284
+ });
285
+ }
286
+ }
287
+ }
288
+ }
289
+ schemas.push({
290
+ name: elemName,
291
+ type: "object",
292
+ properties,
293
+ required: [],
294
+ });
295
+ }
296
+ }
297
+ }
298
+ logger.debug("WSDL parsed", {
299
+ serviceName,
300
+ operations: String(endpoints.length),
301
+ schemas: String(schemas.length),
302
+ });
303
+ return {
304
+ title: serviceName,
305
+ version: "1.0",
306
+ endpoints,
307
+ schemas,
308
+ format: "wsdl",
309
+ };
310
+ }
311
+ // ---- XML Helpers ----
312
+ function getFirst(obj, key) {
313
+ const val = obj[key];
314
+ if (Array.isArray(val) && val.length > 0)
315
+ return val[0];
316
+ if (val && typeof val === "object")
317
+ return val;
318
+ return undefined;
319
+ }
320
+ function getArraySafe(obj, key) {
321
+ const val = obj[key];
322
+ if (Array.isArray(val))
323
+ return val;
324
+ if (val && typeof val === "object")
325
+ return [val];
326
+ return [];
327
+ }
328
+ function getAttr(obj, name) {
329
+ const val = obj[`@_${name}`];
330
+ return val != null ? String(val) : undefined;
331
+ }
332
+ //# sourceMappingURL=read-swagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-swagger.js","sourceRoot":"","sources":["../../../src/core/parser/read-swagger.ts"],"names":[],"mappings":"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"}
@@ -24,4 +24,9 @@ export interface TextChunk {
24
24
  * If text fits in a single chunk, returns one chunk.
25
25
  */
26
26
  export declare function chunkText(text: string, options?: ChunkOptions): TextChunk[];
27
+ /**
28
+ * Content-type-aware chunking strategy.
29
+ * Selects chunk size and splitting strategy based on source type.
30
+ */
31
+ export declare function smartChunk(text: string, contentType: string, options?: ChunkOptions): TextChunk[];
27
32
  //# sourceMappingURL=chunk-text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-text.d.ts","sourceRoot":"","sources":["../../../src/core/rag/chunk-text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,EAAE,CA+D3E"}
1
+ {"version":3,"file":"chunk-text.d.ts","sourceRoot":"","sources":["../../../src/core/rag/chunk-text.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,EAAE,CA+D3E;AAgCD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,EAAE,CAuCjG"}
@@ -94,6 +94,141 @@ function hardSplit(text, maxTokens, overlapTokens) {
94
94
  }
95
95
  return chunks;
96
96
  }
97
+ /**
98
+ * Content-type-aware chunking strategy.
99
+ * Selects chunk size and splitting strategy based on source type.
100
+ */
101
+ export function smartChunk(text, contentType, options) {
102
+ const trimmed = text.trim();
103
+ if (!trimmed)
104
+ return [];
105
+ switch (contentType) {
106
+ case "docs":
107
+ return chunkByStrategy(trimmed, {
108
+ maxTokens: options?.maxTokens ?? 800,
109
+ overlapTokens: options?.overlapTokens ?? 80,
110
+ splitFn: splitPreservingCodeBlocks,
111
+ });
112
+ case "prd":
113
+ case "design":
114
+ return chunkByStrategy(trimmed, {
115
+ maxTokens: options?.maxTokens ?? 600,
116
+ overlapTokens: options?.overlapTokens ?? 60,
117
+ splitFn: splitByMarkdownHeaders,
118
+ });
119
+ case "memory":
120
+ case "ai_decision":
121
+ case "synthesis":
122
+ return chunkText(trimmed, {
123
+ maxTokens: options?.maxTokens ?? 300,
124
+ overlapTokens: options?.overlapTokens ?? 30,
125
+ });
126
+ case "code_context":
127
+ return chunkByStrategy(trimmed, {
128
+ maxTokens: options?.maxTokens ?? 500,
129
+ overlapTokens: options?.overlapTokens ?? 50,
130
+ splitFn: splitByCodeBoundaries,
131
+ });
132
+ case "web_capture":
133
+ return chunkText(trimmed, {
134
+ maxTokens: options?.maxTokens ?? 500,
135
+ overlapTokens: options?.overlapTokens ?? 50,
136
+ });
137
+ default:
138
+ return chunkText(trimmed, options);
139
+ }
140
+ }
141
+ /**
142
+ * Chunk text using a custom split function, then merge segments up to maxTokens.
143
+ */
144
+ function chunkByStrategy(text, opts) {
145
+ const totalTokens = estimateTokens(text);
146
+ if (totalTokens <= opts.maxTokens) {
147
+ return [{ index: 0, content: text, tokens: totalTokens }];
148
+ }
149
+ const segments = opts.splitFn(text);
150
+ const chunks = [];
151
+ let current = [];
152
+ let currentTokens = 0;
153
+ for (const segment of segments) {
154
+ const segTokens = estimateTokens(segment);
155
+ // If single segment exceeds max, chunk it with default splitter
156
+ if (segTokens > opts.maxTokens && current.length === 0) {
157
+ const subChunks = chunkText(segment, {
158
+ maxTokens: opts.maxTokens,
159
+ overlapTokens: opts.overlapTokens,
160
+ });
161
+ for (const sc of subChunks) {
162
+ chunks.push({ index: chunks.length, content: sc.content, tokens: sc.tokens });
163
+ }
164
+ continue;
165
+ }
166
+ if (currentTokens + segTokens > opts.maxTokens && current.length > 0) {
167
+ const chunkContent = current.join("\n\n").trim();
168
+ if (chunkContent) {
169
+ chunks.push({
170
+ index: chunks.length,
171
+ content: chunkContent,
172
+ tokens: estimateTokens(chunkContent),
173
+ });
174
+ }
175
+ current = [];
176
+ currentTokens = 0;
177
+ }
178
+ current.push(segment);
179
+ currentTokens += segTokens;
180
+ }
181
+ if (current.length > 0) {
182
+ const chunkContent = current.join("\n\n").trim();
183
+ if (chunkContent) {
184
+ chunks.push({
185
+ index: chunks.length,
186
+ content: chunkContent,
187
+ tokens: estimateTokens(chunkContent),
188
+ });
189
+ }
190
+ }
191
+ return chunks;
192
+ }
193
+ /**
194
+ * Split text preserving code blocks as atomic units.
195
+ */
196
+ function splitPreservingCodeBlocks(text) {
197
+ const parts = [];
198
+ const codeBlockRegex = /```[\s\S]*?```/g;
199
+ let lastIndex = 0;
200
+ let match;
201
+ while ((match = codeBlockRegex.exec(text)) !== null) {
202
+ // Text before code block
203
+ const before = text.slice(lastIndex, match.index).trim();
204
+ if (before) {
205
+ parts.push(...before.split(/\n\n+/).filter((s) => s.trim()));
206
+ }
207
+ // Code block as atomic unit
208
+ parts.push(match[0]);
209
+ lastIndex = match.index + match[0].length;
210
+ }
211
+ // Remaining text
212
+ const remaining = text.slice(lastIndex).trim();
213
+ if (remaining) {
214
+ parts.push(...remaining.split(/\n\n+/).filter((s) => s.trim()));
215
+ }
216
+ return parts;
217
+ }
218
+ /**
219
+ * Split by markdown headers (h1, h2, h3).
220
+ */
221
+ function splitByMarkdownHeaders(text) {
222
+ const sections = text.split(/(?=^#{1,3}\s)/m);
223
+ return sections.filter((s) => s.trim());
224
+ }
225
+ /**
226
+ * Split by code boundaries (function/class/export declarations).
227
+ */
228
+ function splitByCodeBoundaries(text) {
229
+ const sections = text.split(/(?=\n(?:export\s+)?(?:function|class|interface|type|const|enum)\s)/);
230
+ return sections.filter((s) => s.trim());
231
+ }
97
232
  /**
98
233
  * Build overlap sentences from the tail of the current sentence list.
99
234
  */