@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,26 @@
1
+ /**
2
+ * SIF Generator — two-phase SIF generation pipeline.
3
+ *
4
+ * Phase 1 (prepare): Assembles RAG context + prompt for the LLM.
5
+ * Phase 2 (finalize): Validates LLM output, indexes into knowledge store.
6
+ *
7
+ * The module does NOT call any LLM — it stays pure and testable.
8
+ */
9
+ import { KnowledgeStore } from "../store/knowledge-store.js";
10
+ import { type SifGenerationContext } from "./sif-context-assembler.js";
11
+ import type { SifGenerationRequest, SifGenerationResult } from "../../schemas/siebel.schema.js";
12
+ /**
13
+ * Phase 1: Prepare SIF generation context.
14
+ *
15
+ * Returns a structured context with prompt, templates, existing objects,
16
+ * and validation rules for the LLM to use.
17
+ */
18
+ export declare function prepareSifGeneration(knowledgeStore: KnowledgeStore, request: SifGenerationRequest): SifGenerationContext;
19
+ /**
20
+ * Phase 2: Finalize SIF generation.
21
+ *
22
+ * Validates the LLM-generated XML, checks for collisions with existing objects,
23
+ * runs best-practice checks, and indexes the result into the knowledge store.
24
+ */
25
+ export declare function finalizeSifGeneration(knowledgeStore: KnowledgeStore, generatedXml: string, request: SifGenerationRequest): SifGenerationResult;
26
+ //# sourceMappingURL=sif-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sif-generator.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/sif-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,gCAAgC,CAAC;AAExC;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAOtB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,oBAAoB,GAC5B,mBAAmB,CAsFrB"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * SIF Generator — two-phase SIF generation pipeline.
3
+ *
4
+ * Phase 1 (prepare): Assembles RAG context + prompt for the LLM.
5
+ * Phase 2 (finalize): Validates LLM output, indexes into knowledge store.
6
+ *
7
+ * The module does NOT call any LLM — it stays pure and testable.
8
+ */
9
+ import { logger } from "../utils/logger.js";
10
+ import { parseSifContent } from "./sif-parser.js";
11
+ import { indexSifContent } from "../../core/rag/siebel-indexer.js";
12
+ import { assembleSifContext, } from "./sif-context-assembler.js";
13
+ /**
14
+ * Phase 1: Prepare SIF generation context.
15
+ *
16
+ * Returns a structured context with prompt, templates, existing objects,
17
+ * and validation rules for the LLM to use.
18
+ */
19
+ export function prepareSifGeneration(knowledgeStore, request) {
20
+ logger.info("Preparing SIF generation", {
21
+ types: request.objectTypes.join(","),
22
+ description: request.description.slice(0, 100),
23
+ });
24
+ return assembleSifContext(knowledgeStore, request);
25
+ }
26
+ /**
27
+ * Phase 2: Finalize SIF generation.
28
+ *
29
+ * Validates the LLM-generated XML, checks for collisions with existing objects,
30
+ * runs best-practice checks, and indexes the result into the knowledge store.
31
+ */
32
+ export function finalizeSifGeneration(knowledgeStore, generatedXml, request) {
33
+ logger.info("Finalizing SIF generation", {
34
+ xmlLength: String(generatedXml.length),
35
+ requestTypes: request.objectTypes.join(","),
36
+ });
37
+ const messages = [];
38
+ // 1. Parse the generated XML
39
+ let parseResult;
40
+ try {
41
+ parseResult = parseSifContent(generatedXml, "generated.sif");
42
+ messages.push({
43
+ level: "info",
44
+ message: `Parsed ${parseResult.objects.length} objects, ${parseResult.dependencies.length} dependencies`,
45
+ });
46
+ }
47
+ catch (err) {
48
+ const errMsg = err instanceof Error ? err.message : String(err);
49
+ logger.error("SIF generation validation failed: invalid XML", { error: errMsg });
50
+ messages.push({
51
+ level: "error",
52
+ message: `Invalid SIF XML: ${errMsg}`,
53
+ });
54
+ return {
55
+ sifContent: generatedXml,
56
+ objects: [],
57
+ validation: {
58
+ status: "invalid",
59
+ messages,
60
+ score: 0,
61
+ },
62
+ metadata: {
63
+ generatedAt: new Date().toISOString(),
64
+ requestDescription: request.description,
65
+ objectCount: 0,
66
+ },
67
+ };
68
+ }
69
+ // 2. Check for name collisions with existing objects
70
+ checkNameCollisions(knowledgeStore, parseResult, messages);
71
+ // 3. Run best-practice checks
72
+ runBestPracticeChecks(parseResult, messages);
73
+ // 4. Calculate score
74
+ const score = calculateScore(parseResult, messages);
75
+ // 5. Determine status
76
+ const hasErrors = messages.some((m) => m.level === "error");
77
+ const hasWarnings = messages.some((m) => m.level === "warning");
78
+ const status = hasErrors ? "invalid" : hasWarnings ? "warnings" : "valid";
79
+ // 6. Index into knowledge store (only if valid or warnings)
80
+ if (!hasErrors) {
81
+ try {
82
+ indexSifContent(knowledgeStore, parseResult);
83
+ logger.info("Generated SIF indexed into knowledge store", {
84
+ objectCount: String(parseResult.objects.length),
85
+ });
86
+ }
87
+ catch (err) {
88
+ logger.error("Failed to index generated SIF", {
89
+ error: err instanceof Error ? err.message : String(err),
90
+ });
91
+ }
92
+ }
93
+ const result = {
94
+ sifContent: generatedXml,
95
+ objects: parseResult.objects.map((o) => ({ name: o.name, type: o.type })),
96
+ validation: { status, messages, score },
97
+ metadata: {
98
+ generatedAt: new Date().toISOString(),
99
+ requestDescription: request.description,
100
+ objectCount: parseResult.objects.length,
101
+ },
102
+ };
103
+ logger.info("SIF generation finalized", {
104
+ status,
105
+ score: String(score),
106
+ objectCount: String(parseResult.objects.length),
107
+ });
108
+ return result;
109
+ }
110
+ function checkNameCollisions(knowledgeStore, parseResult, messages) {
111
+ for (const obj of parseResult.objects) {
112
+ try {
113
+ // Search by object name — simpler query for better FTS5 matching
114
+ const existing = knowledgeStore.search(obj.name, 10);
115
+ const collision = existing.find((doc) => doc.sourceType === "siebel_sif" &&
116
+ doc.title.toLowerCase().includes(obj.name.toLowerCase()) &&
117
+ (doc.title.toLowerCase().includes(obj.type) ||
118
+ doc.title.toLowerCase().includes(obj.type.replace(/_/g, " "))));
119
+ if (collision) {
120
+ messages.push({
121
+ level: "warning",
122
+ message: `Name collision: ${obj.type} "${obj.name}" already exists in indexed objects`,
123
+ objectName: obj.name,
124
+ });
125
+ }
126
+ }
127
+ catch {
128
+ // Search might fail on empty knowledge store — that's OK
129
+ }
130
+ }
131
+ }
132
+ function runBestPracticeChecks(parseResult, messages) {
133
+ for (const obj of parseResult.objects) {
134
+ // BCs without TABLE
135
+ if (obj.type === "business_component") {
136
+ const hasTable = obj.properties.some((p) => p.name === "TABLE");
137
+ if (!hasTable) {
138
+ messages.push({
139
+ level: "warning",
140
+ message: `Business Component "${obj.name}" is missing TABLE attribute`,
141
+ objectName: obj.name,
142
+ });
143
+ }
144
+ }
145
+ // Applets without BUS_COMP
146
+ if (obj.type === "applet") {
147
+ const hasBusComp = obj.properties.some((p) => p.name === "BUS_COMP");
148
+ if (!hasBusComp) {
149
+ messages.push({
150
+ level: "warning",
151
+ message: `Applet "${obj.name}" is missing BUS_COMP attribute`,
152
+ objectName: obj.name,
153
+ });
154
+ }
155
+ }
156
+ // Views without BUS_OBJECT
157
+ if (obj.type === "view") {
158
+ const hasBusObject = obj.properties.some((p) => p.name === "BUS_OBJECT");
159
+ if (!hasBusObject) {
160
+ messages.push({
161
+ level: "warning",
162
+ message: `View "${obj.name}" is missing BUS_OBJECT attribute`,
163
+ objectName: obj.name,
164
+ });
165
+ }
166
+ }
167
+ // Objects without name (shouldn't happen but defensive)
168
+ if (!obj.name || obj.name.trim() === "") {
169
+ messages.push({
170
+ level: "error",
171
+ message: "Object found without a NAME attribute",
172
+ objectName: "unknown",
173
+ });
174
+ }
175
+ }
176
+ // Check circular dependencies
177
+ if (parseResult.dependencies.length > 0) {
178
+ // Build adjacency map for cycle detection
179
+ const adjMap = new Map();
180
+ for (const dep of parseResult.dependencies) {
181
+ const fromKey = `${dep.from.type}:${dep.from.name}`;
182
+ const toKey = `${dep.to.type}:${dep.to.name}`;
183
+ const existing = adjMap.get(fromKey) ?? [];
184
+ existing.push(toKey);
185
+ adjMap.set(fromKey, existing);
186
+ }
187
+ // Simple DFS cycle detection
188
+ const visited = new Set();
189
+ const inStack = new Set();
190
+ function hasCycle(node) {
191
+ visited.add(node);
192
+ inStack.add(node);
193
+ for (const neighbor of adjMap.get(node) ?? []) {
194
+ if (inStack.has(neighbor))
195
+ return true;
196
+ if (!visited.has(neighbor) && hasCycle(neighbor))
197
+ return true;
198
+ }
199
+ inStack.delete(node);
200
+ return false;
201
+ }
202
+ for (const key of adjMap.keys()) {
203
+ if (!visited.has(key) && hasCycle(key)) {
204
+ messages.push({
205
+ level: "warning",
206
+ message: "Circular dependency detected in generated objects",
207
+ });
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ }
213
+ function calculateScore(parseResult, messages) {
214
+ let score = 100;
215
+ const errors = messages.filter((m) => m.level === "error").length;
216
+ const warnings = messages.filter((m) => m.level === "warning").length;
217
+ // Deduct for errors
218
+ score -= errors * 30;
219
+ // Deduct for warnings
220
+ score -= warnings * 10;
221
+ // Bonus for having dependencies (well-connected objects)
222
+ if (parseResult.dependencies.length > 0) {
223
+ score = Math.min(score + 5, 100);
224
+ }
225
+ // Bonus for having children (detailed objects)
226
+ const hasChildren = parseResult.objects.some((o) => o.children.length > 0);
227
+ if (hasChildren) {
228
+ score = Math.min(score + 5, 100);
229
+ }
230
+ return Math.max(0, Math.min(100, score));
231
+ }
232
+ //# sourceMappingURL=sif-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sif-generator.js","sourceRoot":"","sources":["../../../src/core/siebel/sif-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SIF Parser — parses Siebel Import Files (.sif) into typed Siebel objects.
3
+ *
4
+ * SIF files are XML-based archives following the hierarchy:
5
+ * Repository → Project → Object Types (Applet, BC, BO, etc.) → Child Elements
6
+ */
7
+ import type { SiebelSifParseResult } from "../../schemas/siebel.schema.js";
8
+ /**
9
+ * Parse SIF XML content string into typed Siebel objects.
10
+ */
11
+ export declare function parseSifContent(content: string, fileName: string): SiebelSifParseResult;
12
+ /**
13
+ * Parse SIF from a file path.
14
+ */
15
+ export declare function parseSifFile(filePath: string): Promise<SiebelSifParseResult>;
16
+ //# sourceMappingURL=sif-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sif-parser.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/sif-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAKV,oBAAoB,EAErB,MAAM,gCAAgC,CAAC;AA0CxC;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CAqEvF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CASlF"}
@@ -0,0 +1,355 @@
1
+ /**
2
+ * SIF Parser — parses Siebel Import Files (.sif) into typed Siebel objects.
3
+ *
4
+ * SIF files are XML-based archives following the hierarchy:
5
+ * Repository → Project → Object Types (Applet, BC, BO, etc.) → Child Elements
6
+ */
7
+ import { XMLParser } from "fast-xml-parser";
8
+ import { readFile } from "node:fs/promises";
9
+ import { basename } from "node:path";
10
+ import { logger } from "../utils/logger.js";
11
+ import { FileNotFoundError, ValidationError } from "../utils/errors.js";
12
+ /**
13
+ * Mapping from SIF XML tag names to Siebel object types.
14
+ */
15
+ const TAG_TO_TYPE = {
16
+ APPLET: "applet",
17
+ BUSINESS_COMPONENT: "business_component",
18
+ BUSINESS_OBJECT: "business_object",
19
+ VIEW: "view",
20
+ SCREEN: "screen",
21
+ WORKFLOW: "workflow",
22
+ INTEGRATION_OBJECT: "integration_object",
23
+ BUSINESS_SERVICE: "business_service",
24
+ WEB_TEMPLATE: "web_template",
25
+ PICK_LIST: "pick_list",
26
+ TABLE: "table",
27
+ };
28
+ /**
29
+ * Child element tag names and their mapped types.
30
+ */
31
+ const CHILD_TAG_TO_TYPE = {
32
+ FIELD: "field",
33
+ COLUMN: "column",
34
+ CONTROL: "control",
35
+ LIST_COLUMN: "list_column",
36
+ LINK: "link",
37
+ APPLET_WEB_TEMPLATE: "web_template",
38
+ VIEW_WEB_TEMPLATE: "web_template",
39
+ VIEW_APPLET: "applet",
40
+ SCREEN_VIEW: "view",
41
+ APPLET_METHOD_MENU_ITEM: "menu_item",
42
+ BUSINESS_OBJECT_COMPONENT: "business_component",
43
+ BUSINESS_SERVICE_METHOD: "business_service",
44
+ WORKFLOW_STEP: "workflow",
45
+ INTEGRATION_COMPONENT: "business_component",
46
+ };
47
+ /** Reserved XML attribute names that are not properties. */
48
+ const RESERVED_ATTRS = new Set(["NAME", "INACTIVE"]);
49
+ /**
50
+ * Parse SIF XML content string into typed Siebel objects.
51
+ */
52
+ export function parseSifContent(content, fileName) {
53
+ if (!content || content.trim().length === 0) {
54
+ throw new ValidationError("SIF content is empty", [{ field: "content", message: "empty" }]);
55
+ }
56
+ const parser = new XMLParser({
57
+ ignoreAttributes: false,
58
+ attributeNamePrefix: "@_",
59
+ allowBooleanAttributes: true,
60
+ parseAttributeValue: false,
61
+ isArray: () => {
62
+ // Force array for repeating elements
63
+ return true;
64
+ },
65
+ });
66
+ let parsed;
67
+ try {
68
+ parsed = parser.parse(content);
69
+ }
70
+ catch (err) {
71
+ throw new ValidationError("Invalid SIF XML", [
72
+ { field: "xml", message: err instanceof Error ? err.message : String(err) },
73
+ ]);
74
+ }
75
+ // Navigate to REPOSITORY root
76
+ const repositories = getArray(parsed, "REPOSITORY");
77
+ if (repositories.length === 0) {
78
+ throw new ValidationError("SIF file missing REPOSITORY root element", [
79
+ { field: "structure", message: "no REPOSITORY found" },
80
+ ]);
81
+ }
82
+ const repo = repositories[0];
83
+ const repositoryName = getAttr(repo, "NAME") ?? "Unknown";
84
+ // Navigate to PROJECT(s)
85
+ const projects = getArray(repo, "PROJECT");
86
+ const projectName = projects.length > 0 ? getAttr(projects[0], "NAME") : undefined;
87
+ const objects = [];
88
+ for (const proj of projects) {
89
+ const projObj = proj;
90
+ const projName = getAttr(projObj, "NAME") ?? "Unknown";
91
+ extractObjectsFromProject(projObj, projName, objects);
92
+ }
93
+ const dependencies = inferDependencies(objects);
94
+ const objectTypes = [...new Set(objects.map((o) => o.type))];
95
+ const metadata = {
96
+ fileName,
97
+ repositoryName,
98
+ projectName,
99
+ objectCount: objects.length,
100
+ objectTypes,
101
+ extractedAt: new Date().toISOString(),
102
+ };
103
+ logger.info("SIF parsed", {
104
+ fileName,
105
+ objectCount: String(objects.length),
106
+ dependencyCount: String(dependencies.length),
107
+ objectTypes: objectTypes.join(","),
108
+ });
109
+ return { metadata, objects, dependencies };
110
+ }
111
+ /**
112
+ * Parse SIF from a file path.
113
+ */
114
+ export async function parseSifFile(filePath) {
115
+ let content;
116
+ try {
117
+ content = await readFile(filePath, "utf-8");
118
+ }
119
+ catch {
120
+ throw new FileNotFoundError(filePath);
121
+ }
122
+ return parseSifContent(content, basename(filePath));
123
+ }
124
+ /**
125
+ * Extract top-level objects from a PROJECT element.
126
+ */
127
+ function extractObjectsFromProject(projObj, projectName, objects) {
128
+ for (const [tag, siebelType] of Object.entries(TAG_TO_TYPE)) {
129
+ const elements = getArray(projObj, tag);
130
+ for (const elem of elements) {
131
+ const obj = elementToSiebelObject(elem, siebelType, projectName);
132
+ if (obj) {
133
+ objects.push(obj);
134
+ }
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Convert a single XML element into a SiebelObject.
140
+ */
141
+ function elementToSiebelObject(elem, type, projectName) {
142
+ const name = getAttr(elem, "NAME");
143
+ if (!name)
144
+ return null;
145
+ const properties = extractProperties(elem);
146
+ const children = extractChildren(elem, name);
147
+ const inactive = getAttr(elem, "INACTIVE") === "Y";
148
+ return {
149
+ name,
150
+ type,
151
+ project: projectName,
152
+ properties,
153
+ children,
154
+ inactive: inactive || undefined,
155
+ };
156
+ }
157
+ /**
158
+ * Extract properties from element attributes.
159
+ */
160
+ function extractProperties(elem) {
161
+ const props = [];
162
+ for (const [key, value] of Object.entries(elem)) {
163
+ if (key.startsWith("@_") && !RESERVED_ATTRS.has(key.slice(2))) {
164
+ props.push({ name: key.slice(2), value: String(value) });
165
+ }
166
+ }
167
+ return props;
168
+ }
169
+ /**
170
+ * Extract child elements from a parent element.
171
+ */
172
+ function extractChildren(elem, parentName) {
173
+ const children = [];
174
+ for (const [tag, childType] of Object.entries(CHILD_TAG_TO_TYPE)) {
175
+ const elements = getArray(elem, tag);
176
+ for (const child of elements) {
177
+ const childObj = child;
178
+ const name = getAttr(childObj, "NAME");
179
+ if (!name)
180
+ continue;
181
+ children.push({
182
+ name,
183
+ type: childType,
184
+ properties: extractProperties(childObj),
185
+ children: [],
186
+ parentName,
187
+ });
188
+ }
189
+ }
190
+ return children;
191
+ }
192
+ /**
193
+ * Infer dependencies between Siebel objects based on known patterns.
194
+ */
195
+ function inferDependencies(objects) {
196
+ const deps = [];
197
+ const objectIndex = new Map();
198
+ for (const obj of objects) {
199
+ objectIndex.set(`${obj.type}:${obj.name}`, obj);
200
+ }
201
+ for (const obj of objects) {
202
+ // Applet → BC (via BUS_COMP attribute)
203
+ if (obj.type === "applet") {
204
+ const busComp = findProperty(obj, "BUS_COMP");
205
+ if (busComp && objectIndex.has(`business_component:${busComp}`)) {
206
+ deps.push({
207
+ from: { name: obj.name, type: "applet" },
208
+ to: { name: busComp, type: "business_component" },
209
+ relationType: "references",
210
+ inferred: true,
211
+ });
212
+ }
213
+ }
214
+ // View → BO (via BUS_OBJECT attribute)
215
+ if (obj.type === "view") {
216
+ const busObject = findProperty(obj, "BUS_OBJECT");
217
+ if (busObject && objectIndex.has(`business_object:${busObject}`)) {
218
+ deps.push({
219
+ from: { name: obj.name, type: "view" },
220
+ to: { name: busObject, type: "business_object" },
221
+ relationType: "references",
222
+ inferred: true,
223
+ });
224
+ }
225
+ // View → Applet (via VIEW_APPLET children)
226
+ for (const child of obj.children) {
227
+ if (child.type === "applet") {
228
+ const appletName = findProperty(child, "APPLET") ?? child.name;
229
+ if (objectIndex.has(`applet:${appletName}`)) {
230
+ deps.push({
231
+ from: { name: obj.name, type: "view" },
232
+ to: { name: appletName, type: "applet" },
233
+ relationType: "contains",
234
+ inferred: true,
235
+ });
236
+ }
237
+ }
238
+ }
239
+ }
240
+ // Screen → View (via SCREEN_VIEW children)
241
+ if (obj.type === "screen") {
242
+ for (const child of obj.children) {
243
+ if (child.type === "view") {
244
+ const viewName = findProperty(child, "VIEW") ?? child.name;
245
+ if (objectIndex.has(`view:${viewName}`)) {
246
+ deps.push({
247
+ from: { name: obj.name, type: "screen" },
248
+ to: { name: viewName, type: "view" },
249
+ relationType: "contains",
250
+ inferred: true,
251
+ });
252
+ }
253
+ }
254
+ }
255
+ }
256
+ // BO → BC (via BUSINESS_OBJECT_COMPONENT children)
257
+ if (obj.type === "business_object") {
258
+ for (const child of obj.children) {
259
+ if (child.type === "business_component") {
260
+ const bcName = findProperty(child, "BUS_COMP") ?? child.name;
261
+ if (objectIndex.has(`business_component:${bcName}`)) {
262
+ deps.push({
263
+ from: { name: obj.name, type: "business_object" },
264
+ to: { name: bcName, type: "business_component" },
265
+ relationType: "contains",
266
+ inferred: true,
267
+ });
268
+ }
269
+ }
270
+ }
271
+ }
272
+ // Workflow → BO (via BUS_OBJECT attribute)
273
+ if (obj.type === "workflow") {
274
+ const busObject = findProperty(obj, "BUS_OBJECT");
275
+ if (busObject && objectIndex.has(`business_object:${busObject}`)) {
276
+ deps.push({
277
+ from: { name: obj.name, type: "workflow" },
278
+ to: { name: busObject, type: "business_object" },
279
+ relationType: "references",
280
+ inferred: true,
281
+ });
282
+ }
283
+ // Workflow → BS (via workflow steps)
284
+ for (const child of obj.children) {
285
+ const busService = findProperty(child, "BUS_SERVICE");
286
+ if (busService && objectIndex.has(`business_service:${busService}`)) {
287
+ deps.push({
288
+ from: { name: obj.name, type: "workflow" },
289
+ to: { name: busService, type: "business_service" },
290
+ relationType: "uses",
291
+ inferred: true,
292
+ });
293
+ }
294
+ }
295
+ }
296
+ // Integration Object → BC (via BUS_COMP attribute or INTEGRATION_COMPONENT children)
297
+ if (obj.type === "integration_object") {
298
+ const busComp = findProperty(obj, "BUS_COMP");
299
+ if (busComp && objectIndex.has(`business_component:${busComp}`)) {
300
+ deps.push({
301
+ from: { name: obj.name, type: "integration_object" },
302
+ to: { name: busComp, type: "business_component" },
303
+ relationType: "references",
304
+ inferred: true,
305
+ });
306
+ }
307
+ }
308
+ // BC → Table (via TABLE attribute)
309
+ if (obj.type === "business_component") {
310
+ const table = findProperty(obj, "TABLE");
311
+ if (table) {
312
+ deps.push({
313
+ from: { name: obj.name, type: "business_component" },
314
+ to: { name: table, type: "table" },
315
+ relationType: "based_on",
316
+ inferred: true,
317
+ });
318
+ }
319
+ // BC → BC (via LINK children's CHILD_BC)
320
+ for (const child of obj.children) {
321
+ if (child.type === "link") {
322
+ const childBc = findProperty(child, "CHILD_BC");
323
+ if (childBc && objectIndex.has(`business_component:${childBc}`)) {
324
+ deps.push({
325
+ from: { name: obj.name, type: "business_component" },
326
+ to: { name: childBc, type: "business_component" },
327
+ relationType: "linked_to",
328
+ inferred: true,
329
+ });
330
+ }
331
+ }
332
+ }
333
+ }
334
+ }
335
+ return deps;
336
+ }
337
+ /** Find a property value by name. */
338
+ function findProperty(obj, propName) {
339
+ return obj.properties.find((p) => p.name === propName)?.value;
340
+ }
341
+ /** Safely get an array of elements from parsed XML. */
342
+ function getArray(obj, key) {
343
+ const val = obj[key];
344
+ if (Array.isArray(val))
345
+ return val;
346
+ if (val != null)
347
+ return [val];
348
+ return [];
349
+ }
350
+ /** Get an XML attribute value. */
351
+ function getAttr(obj, name) {
352
+ const val = obj[`@_${name}`];
353
+ return val != null ? String(val) : undefined;
354
+ }
355
+ //# sourceMappingURL=sif-parser.js.map