@mcp-graph-workflow/mcp-graph 5.10.0 → 5.12.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 (256) hide show
  1. package/dist/api/routes/code-graph.d.ts.map +1 -1
  2. package/dist/api/routes/code-graph.js +163 -0
  3. package/dist/api/routes/code-graph.js.map +1 -1
  4. package/dist/api/routes/siebel.d.ts.map +1 -1
  5. package/dist/api/routes/siebel.js +170 -0
  6. package/dist/api/routes/siebel.js.map +1 -1
  7. package/dist/core/code/code-indexer.d.ts +5 -3
  8. package/dist/core/code/code-indexer.d.ts.map +1 -1
  9. package/dist/core/code/code-indexer.js +57 -10
  10. package/dist/core/code/code-indexer.js.map +1 -1
  11. package/dist/core/code/code-types.d.ts +8 -0
  12. package/dist/core/code/code-types.d.ts.map +1 -1
  13. package/dist/core/code/code-types.js.map +1 -1
  14. package/dist/core/code/graph-traversal.d.ts +15 -0
  15. package/dist/core/code/graph-traversal.d.ts.map +1 -1
  16. package/dist/core/code/graph-traversal.js +53 -0
  17. package/dist/core/code/graph-traversal.js.map +1 -1
  18. package/dist/core/code/ts-analyzer.d.ts +6 -1
  19. package/dist/core/code/ts-analyzer.d.ts.map +1 -1
  20. package/dist/core/code/ts-analyzer.js +8 -0
  21. package/dist/core/code/ts-analyzer.js.map +1 -1
  22. package/dist/core/config/config-schema.d.ts +8 -0
  23. package/dist/core/config/config-schema.d.ts.map +1 -1
  24. package/dist/core/config/config-schema.js +3 -1
  25. package/dist/core/config/config-schema.js.map +1 -1
  26. package/dist/core/context/context-assembler.d.ts +2 -0
  27. package/dist/core/context/context-assembler.d.ts.map +1 -1
  28. package/dist/core/context/context-assembler.js +15 -0
  29. package/dist/core/context/context-assembler.js.map +1 -1
  30. package/dist/core/lsp/language-detector.d.ts +11 -0
  31. package/dist/core/lsp/language-detector.d.ts.map +1 -0
  32. package/dist/core/lsp/language-detector.js +149 -0
  33. package/dist/core/lsp/language-detector.js.map +1 -0
  34. package/dist/core/lsp/lsp-analyzer.d.ts +16 -0
  35. package/dist/core/lsp/lsp-analyzer.d.ts.map +1 -0
  36. package/dist/core/lsp/lsp-analyzer.js +30 -0
  37. package/dist/core/lsp/lsp-analyzer.js.map +1 -0
  38. package/dist/core/lsp/lsp-bridge.d.ts +40 -0
  39. package/dist/core/lsp/lsp-bridge.d.ts.map +1 -0
  40. package/dist/core/lsp/lsp-bridge.js +349 -0
  41. package/dist/core/lsp/lsp-bridge.js.map +1 -0
  42. package/dist/core/lsp/lsp-cache.d.ts +33 -0
  43. package/dist/core/lsp/lsp-cache.d.ts.map +1 -0
  44. package/dist/core/lsp/lsp-cache.js +134 -0
  45. package/dist/core/lsp/lsp-cache.js.map +1 -0
  46. package/dist/core/lsp/lsp-client.d.ts +47 -0
  47. package/dist/core/lsp/lsp-client.d.ts.map +1 -0
  48. package/dist/core/lsp/lsp-client.js +256 -0
  49. package/dist/core/lsp/lsp-client.js.map +1 -0
  50. package/dist/core/lsp/lsp-diagnostics.d.ts +40 -0
  51. package/dist/core/lsp/lsp-diagnostics.d.ts.map +1 -0
  52. package/dist/core/lsp/lsp-diagnostics.js +113 -0
  53. package/dist/core/lsp/lsp-diagnostics.js.map +1 -0
  54. package/dist/core/lsp/lsp-server-manager.d.ts +56 -0
  55. package/dist/core/lsp/lsp-server-manager.d.ts.map +1 -0
  56. package/dist/core/lsp/lsp-server-manager.js +330 -0
  57. package/dist/core/lsp/lsp-server-manager.js.map +1 -0
  58. package/dist/core/lsp/lsp-types.d.ts +130 -0
  59. package/dist/core/lsp/lsp-types.d.ts.map +1 -0
  60. package/dist/core/lsp/lsp-types.js +131 -0
  61. package/dist/core/lsp/lsp-types.js.map +1 -0
  62. package/dist/core/lsp/server-registry.d.ts +19 -0
  63. package/dist/core/lsp/server-registry.d.ts.map +1 -0
  64. package/dist/core/lsp/server-registry.js +188 -0
  65. package/dist/core/lsp/server-registry.js.map +1 -0
  66. package/dist/core/rag/multi-strategy-retrieval.d.ts +6 -0
  67. package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -1
  68. package/dist/core/rag/multi-strategy-retrieval.js +31 -3
  69. package/dist/core/rag/multi-strategy-retrieval.js.map +1 -1
  70. package/dist/core/rag/siebel-indexer.d.ts.map +1 -1
  71. package/dist/core/rag/siebel-indexer.js +57 -1
  72. package/dist/core/rag/siebel-indexer.js.map +1 -1
  73. package/dist/core/rag/wsdl-indexer.d.ts +16 -0
  74. package/dist/core/rag/wsdl-indexer.d.ts.map +1 -0
  75. package/dist/core/rag/wsdl-indexer.js +115 -0
  76. package/dist/core/rag/wsdl-indexer.js.map +1 -0
  77. package/dist/core/siebel/auto-wiring.d.ts +29 -0
  78. package/dist/core/siebel/auto-wiring.d.ts.map +1 -0
  79. package/dist/core/siebel/auto-wiring.js +211 -0
  80. package/dist/core/siebel/auto-wiring.js.map +1 -0
  81. package/dist/core/siebel/best-practices.d.ts +16 -0
  82. package/dist/core/siebel/best-practices.d.ts.map +1 -0
  83. package/dist/core/siebel/best-practices.js +92 -0
  84. package/dist/core/siebel/best-practices.js.map +1 -0
  85. package/dist/core/siebel/change-simulator.d.ts +32 -0
  86. package/dist/core/siebel/change-simulator.d.ts.map +1 -0
  87. package/dist/core/siebel/change-simulator.js +138 -0
  88. package/dist/core/siebel/change-simulator.js.map +1 -0
  89. package/dist/core/siebel/clone-adapt.d.ts +21 -0
  90. package/dist/core/siebel/clone-adapt.d.ts.map +1 -0
  91. package/dist/core/siebel/clone-adapt.js +157 -0
  92. package/dist/core/siebel/clone-adapt.js.map +1 -0
  93. package/dist/core/siebel/code-review.d.ts +36 -0
  94. package/dist/core/siebel/code-review.d.ts.map +1 -0
  95. package/dist/core/siebel/code-review.js +239 -0
  96. package/dist/core/siebel/code-review.js.map +1 -0
  97. package/dist/core/siebel/complexity-metrics.d.ts +24 -0
  98. package/dist/core/siebel/complexity-metrics.d.ts.map +1 -0
  99. package/dist/core/siebel/complexity-metrics.js +41 -0
  100. package/dist/core/siebel/complexity-metrics.js.map +1 -0
  101. package/dist/core/siebel/context-enrichment.d.ts +18 -0
  102. package/dist/core/siebel/context-enrichment.d.ts.map +1 -0
  103. package/dist/core/siebel/context-enrichment.js +91 -0
  104. package/dist/core/siebel/context-enrichment.js.map +1 -0
  105. package/dist/core/siebel/cross-project-analyzer.d.ts +30 -0
  106. package/dist/core/siebel/cross-project-analyzer.d.ts.map +1 -0
  107. package/dist/core/siebel/cross-project-analyzer.js +108 -0
  108. package/dist/core/siebel/cross-project-analyzer.js.map +1 -0
  109. package/dist/core/siebel/definition-of-ready.d.ts +25 -0
  110. package/dist/core/siebel/definition-of-ready.d.ts.map +1 -0
  111. package/dist/core/siebel/definition-of-ready.js +164 -0
  112. package/dist/core/siebel/definition-of-ready.js.map +1 -0
  113. package/dist/core/siebel/escript-crossref.d.ts +18 -0
  114. package/dist/core/siebel/escript-crossref.d.ts.map +1 -0
  115. package/dist/core/siebel/escript-crossref.js +50 -0
  116. package/dist/core/siebel/escript-crossref.js.map +1 -0
  117. package/dist/core/siebel/escript-generator.d.ts +33 -0
  118. package/dist/core/siebel/escript-generator.d.ts.map +1 -0
  119. package/dist/core/siebel/escript-generator.js +200 -0
  120. package/dist/core/siebel/escript-generator.js.map +1 -0
  121. package/dist/core/siebel/escript-patterns.d.ts +20 -0
  122. package/dist/core/siebel/escript-patterns.d.ts.map +1 -0
  123. package/dist/core/siebel/escript-patterns.js +69 -0
  124. package/dist/core/siebel/escript-patterns.js.map +1 -0
  125. package/dist/core/siebel/escript-refactor.d.ts +23 -0
  126. package/dist/core/siebel/escript-refactor.d.ts.map +1 -0
  127. package/dist/core/siebel/escript-refactor.js +270 -0
  128. package/dist/core/siebel/escript-refactor.js.map +1 -0
  129. package/dist/core/siebel/field-suggestion.d.ts +29 -0
  130. package/dist/core/siebel/field-suggestion.d.ts.map +1 -0
  131. package/dist/core/siebel/field-suggestion.js +105 -0
  132. package/dist/core/siebel/field-suggestion.js.map +1 -0
  133. package/dist/core/siebel/health-check.d.ts +21 -0
  134. package/dist/core/siebel/health-check.d.ts.map +1 -0
  135. package/dist/core/siebel/health-check.js +51 -0
  136. package/dist/core/siebel/health-check.js.map +1 -0
  137. package/dist/core/siebel/integration-test-gen.d.ts +26 -0
  138. package/dist/core/siebel/integration-test-gen.d.ts.map +1 -0
  139. package/dist/core/siebel/integration-test-gen.js +131 -0
  140. package/dist/core/siebel/integration-test-gen.js.map +1 -0
  141. package/dist/core/siebel/lov-mapper.d.ts +23 -0
  142. package/dist/core/siebel/lov-mapper.d.ts.map +1 -0
  143. package/dist/core/siebel/lov-mapper.js +42 -0
  144. package/dist/core/siebel/lov-mapper.js.map +1 -0
  145. package/dist/core/siebel/migration-package.d.ts +38 -0
  146. package/dist/core/siebel/migration-package.d.ts.map +1 -0
  147. package/dist/core/siebel/migration-package.js +276 -0
  148. package/dist/core/siebel/migration-package.js.map +1 -0
  149. package/dist/core/siebel/naming-convention-validator.d.ts +38 -0
  150. package/dist/core/siebel/naming-convention-validator.d.ts.map +1 -0
  151. package/dist/core/siebel/naming-convention-validator.js +165 -0
  152. package/dist/core/siebel/naming-convention-validator.js.map +1 -0
  153. package/dist/core/siebel/object-erd.d.ts +28 -0
  154. package/dist/core/siebel/object-erd.d.ts.map +1 -0
  155. package/dist/core/siebel/object-erd.js +82 -0
  156. package/dist/core/siebel/object-erd.js.map +1 -0
  157. package/dist/core/siebel/orphan-detector.d.ts +21 -0
  158. package/dist/core/siebel/orphan-detector.d.ts.map +1 -0
  159. package/dist/core/siebel/orphan-detector.js +64 -0
  160. package/dist/core/siebel/orphan-detector.js.map +1 -0
  161. package/dist/core/siebel/pattern-analyzer.d.ts +32 -0
  162. package/dist/core/siebel/pattern-analyzer.d.ts.map +1 -0
  163. package/dist/core/siebel/pattern-analyzer.js +155 -0
  164. package/dist/core/siebel/pattern-analyzer.js.map +1 -0
  165. package/dist/core/siebel/profileattr-flow.d.ts +26 -0
  166. package/dist/core/siebel/profileattr-flow.d.ts.map +1 -0
  167. package/dist/core/siebel/profileattr-flow.js +50 -0
  168. package/dist/core/siebel/profileattr-flow.js.map +1 -0
  169. package/dist/core/siebel/runtime-dep-builder.d.ts +9 -0
  170. package/dist/core/siebel/runtime-dep-builder.d.ts.map +1 -0
  171. package/dist/core/siebel/runtime-dep-builder.js +47 -0
  172. package/dist/core/siebel/runtime-dep-builder.js.map +1 -0
  173. package/dist/core/siebel/scaffold-generator.d.ts +25 -0
  174. package/dist/core/siebel/scaffold-generator.d.ts.map +1 -0
  175. package/dist/core/siebel/scaffold-generator.js +278 -0
  176. package/dist/core/siebel/scaffold-generator.js.map +1 -0
  177. package/dist/core/siebel/siebel-context-builder.d.ts +10 -0
  178. package/dist/core/siebel/siebel-context-builder.d.ts.map +1 -0
  179. package/dist/core/siebel/siebel-context-builder.js +75 -0
  180. package/dist/core/siebel/siebel-context-builder.js.map +1 -0
  181. package/dist/core/siebel/siebel-rag-booster.d.ts +19 -0
  182. package/dist/core/siebel/siebel-rag-booster.d.ts.map +1 -0
  183. package/dist/core/siebel/siebel-rag-booster.js +41 -0
  184. package/dist/core/siebel/siebel-rag-booster.js.map +1 -0
  185. package/dist/core/siebel/siebel-validators.d.ts +73 -0
  186. package/dist/core/siebel/siebel-validators.d.ts.map +1 -0
  187. package/dist/core/siebel/siebel-validators.js +269 -0
  188. package/dist/core/siebel/siebel-validators.js.map +1 -0
  189. package/dist/core/siebel/sif-batch-importer.d.ts +27 -0
  190. package/dist/core/siebel/sif-batch-importer.d.ts.map +1 -0
  191. package/dist/core/siebel/sif-batch-importer.js +68 -0
  192. package/dist/core/siebel/sif-batch-importer.js.map +1 -0
  193. package/dist/core/siebel/sif-diff.d.ts +57 -0
  194. package/dist/core/siebel/sif-diff.d.ts.map +1 -0
  195. package/dist/core/siebel/sif-diff.js +198 -0
  196. package/dist/core/siebel/sif-diff.js.map +1 -0
  197. package/dist/core/siebel/sif-parser.d.ts.map +1 -1
  198. package/dist/core/siebel/sif-parser.js +86 -0
  199. package/dist/core/siebel/sif-parser.js.map +1 -1
  200. package/dist/core/siebel/similarity-detector.d.ts +20 -0
  201. package/dist/core/siebel/similarity-detector.d.ts.map +1 -0
  202. package/dist/core/siebel/similarity-detector.js +83 -0
  203. package/dist/core/siebel/similarity-detector.js.map +1 -0
  204. package/dist/core/siebel/template-learner.d.ts +25 -0
  205. package/dist/core/siebel/template-learner.d.ts.map +1 -0
  206. package/dist/core/siebel/template-learner.js +129 -0
  207. package/dist/core/siebel/template-learner.js.map +1 -0
  208. package/dist/core/siebel/troubleshoot.d.ts +37 -0
  209. package/dist/core/siebel/troubleshoot.d.ts.map +1 -0
  210. package/dist/core/siebel/troubleshoot.js +249 -0
  211. package/dist/core/siebel/troubleshoot.js.map +1 -0
  212. package/dist/core/siebel/wsdl-correlation.d.ts +22 -0
  213. package/dist/core/siebel/wsdl-correlation.d.ts.map +1 -0
  214. package/dist/core/siebel/wsdl-correlation.js +64 -0
  215. package/dist/core/siebel/wsdl-correlation.js.map +1 -0
  216. package/dist/core/siebel/wsdl-parser.d.ts +57 -0
  217. package/dist/core/siebel/wsdl-parser.d.ts.map +1 -0
  218. package/dist/core/siebel/wsdl-parser.js +226 -0
  219. package/dist/core/siebel/wsdl-parser.js.map +1 -0
  220. package/dist/core/siebel/wsdl-to-sif.d.ts +22 -0
  221. package/dist/core/siebel/wsdl-to-sif.d.ts.map +1 -0
  222. package/dist/core/siebel/wsdl-to-sif.js +184 -0
  223. package/dist/core/siebel/wsdl-to-sif.js.map +1 -0
  224. package/dist/core/store/migrations.d.ts.map +1 -1
  225. package/dist/core/store/migrations.js +21 -0
  226. package/dist/core/store/migrations.js.map +1 -1
  227. package/dist/mcp/tools/code-intelligence.d.ts +15 -0
  228. package/dist/mcp/tools/code-intelligence.d.ts.map +1 -0
  229. package/dist/mcp/tools/code-intelligence.js +276 -0
  230. package/dist/mcp/tools/code-intelligence.js.map +1 -0
  231. package/dist/mcp/tools/index.d.ts.map +1 -1
  232. package/dist/mcp/tools/index.js +4 -0
  233. package/dist/mcp/tools/index.js.map +1 -1
  234. package/dist/mcp/tools/siebel-analyze.d.ts.map +1 -1
  235. package/dist/mcp/tools/siebel-analyze.js +89 -6
  236. package/dist/mcp/tools/siebel-analyze.js.map +1 -1
  237. package/dist/mcp/tools/siebel-composer.d.ts.map +1 -1
  238. package/dist/mcp/tools/siebel-composer.js +40 -3
  239. package/dist/mcp/tools/siebel-composer.js.map +1 -1
  240. package/dist/mcp/tools/siebel-generate-sif.d.ts.map +1 -1
  241. package/dist/mcp/tools/siebel-generate-sif.js +188 -3
  242. package/dist/mcp/tools/siebel-generate-sif.js.map +1 -1
  243. package/dist/mcp/tools/siebel-search.js +1 -1
  244. package/dist/mcp/tools/siebel-search.js.map +1 -1
  245. package/dist/mcp/tools/siebel-validate.d.ts.map +1 -1
  246. package/dist/mcp/tools/siebel-validate.js +94 -5
  247. package/dist/mcp/tools/siebel-validate.js.map +1 -1
  248. package/dist/schemas/knowledge.schema.d.ts +6 -0
  249. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  250. package/dist/schemas/knowledge.schema.js +2 -1
  251. package/dist/schemas/knowledge.schema.js.map +1 -1
  252. package/dist/schemas/siebel.schema.d.ts +42 -0
  253. package/dist/schemas/siebel.schema.d.ts.map +1 -1
  254. package/dist/schemas/siebel.schema.js +4 -0
  255. package/dist/schemas/siebel.schema.js.map +1 -1
  256. package/package.json +2 -2
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Siebel Troubleshooting Assistant — analyzes errors and suggests causes/fixes
3
+ * based on object dependencies, script patterns, and common Siebel issues.
4
+ */
5
+ import { logger } from "../utils/logger.js";
6
+ // --- Helpers ---
7
+ function extractObjectNames(text, objects) {
8
+ const found = [];
9
+ const seen = new Set();
10
+ for (const obj of objects) {
11
+ if (text.includes(obj.name) && !seen.has(obj.name)) {
12
+ seen.add(obj.name);
13
+ found.push({ name: obj.name, type: obj.type });
14
+ }
15
+ }
16
+ return found;
17
+ }
18
+ function findRelatedScripts(relatedNames, objects) {
19
+ const scripts = [];
20
+ for (const obj of objects) {
21
+ // Check if object itself is related or if its name appears in error
22
+ const isRelated = relatedNames.has(obj.name);
23
+ for (const child of obj.children) {
24
+ if (child.type !== "escript")
25
+ continue;
26
+ const code = child.properties.find((p) => p.name === "SOURCE_CODE")?.value ?? "";
27
+ if (!code.trim())
28
+ continue;
29
+ // Include if parent is related, or script references a related object
30
+ const referencesRelated = [...relatedNames].some((name) => code.includes(name));
31
+ if (isRelated || referencesRelated) {
32
+ scripts.push({
33
+ parentObject: obj.name,
34
+ methodName: child.name,
35
+ snippet: code.substring(0, 200),
36
+ });
37
+ }
38
+ }
39
+ }
40
+ return scripts;
41
+ }
42
+ function buildDependencyChain(relatedRefs, dependencies) {
43
+ if (relatedRefs.length === 0 || dependencies.length === 0)
44
+ return [];
45
+ const relatedKeys = new Set(relatedRefs.map((r) => `${r.type}:${r.name}`));
46
+ const chain = [];
47
+ const visited = new Set();
48
+ // BFS from related objects through dependency graph
49
+ const queue = [...relatedRefs];
50
+ for (const ref of queue) {
51
+ visited.add(`${ref.type}:${ref.name}`);
52
+ }
53
+ while (queue.length > 0) {
54
+ const current = queue.shift();
55
+ const currentKey = `${current.type}:${current.name}`;
56
+ // Find objects that depend on current (reverse deps)
57
+ for (const dep of dependencies) {
58
+ const toKey = `${dep.to.type}:${dep.to.name}`;
59
+ const fromKey = `${dep.from.type}:${dep.from.name}`;
60
+ if (toKey === currentKey && !visited.has(fromKey)) {
61
+ visited.add(fromKey);
62
+ chain.push(dep.from);
63
+ queue.push(dep.from);
64
+ }
65
+ // Also follow forward deps
66
+ if (fromKey === currentKey && !visited.has(toKey)) {
67
+ visited.add(toKey);
68
+ chain.push(dep.to);
69
+ queue.push(dep.to);
70
+ }
71
+ }
72
+ }
73
+ return chain;
74
+ }
75
+ function checkConfigIssues(relatedNames, objects) {
76
+ const issues = [];
77
+ for (const obj of objects) {
78
+ if (!relatedNames.has(obj.name))
79
+ continue;
80
+ // Check for empty User Properties
81
+ const userProps = obj.children.filter((c) => c.type === "user_property");
82
+ for (const up of userProps) {
83
+ const value = up.properties.find((p) => p.name === "VALUE")?.value;
84
+ if (value !== undefined && value.trim() === "") {
85
+ issues.push({
86
+ objectName: obj.name,
87
+ issueType: "empty_user_property",
88
+ detail: `User Property "${up.name}" has empty value`,
89
+ });
90
+ }
91
+ }
92
+ // Check for missing BUS_COMP in applets
93
+ if (obj.type === "applet") {
94
+ const busComp = obj.properties.find((p) => p.name === "BUS_COMP")?.value;
95
+ if (!busComp) {
96
+ issues.push({
97
+ objectName: obj.name,
98
+ issueType: "missing_bus_comp",
99
+ detail: "Applet has no BUS_COMP property",
100
+ });
101
+ }
102
+ }
103
+ }
104
+ return issues;
105
+ }
106
+ const CAUSE_RULES = [
107
+ {
108
+ pattern: /not set|null|undefined|reference/i,
109
+ category: "null_reference",
110
+ description: "Object reference is null — likely a BusComp or Service not properly initialized",
111
+ probability: 0.85,
112
+ suggestion: "Check if GetBusComp/GetService is called before accessing the object. Ensure the BC/Service name is correct.",
113
+ codeExample: `var bc = TheApplication().GetBusComp("Account");\nif (bc != null) {\n // safe to use\n}`,
114
+ },
115
+ {
116
+ pattern: /no records|empty|not found|query/i,
117
+ category: "query_issue",
118
+ description: "Query returns no records — possible SearchSpec, ViewMode, or ActivateField issue",
119
+ probability: 0.8,
120
+ suggestion: "Verify SearchSpec syntax, check SetViewMode is correct, ensure ActivateField called before SetSearchSpec.",
121
+ codeExample: `bc.ActivateField("Status");\nbc.SetViewMode(AllView);\nbc.ClearToQuery();\nbc.SetSearchSpec("Status", "Active");\nbc.ExecuteQuery(ForwardOnly);`,
122
+ },
123
+ {
124
+ pattern: /display|render|show|visible|applet/i,
125
+ category: "ui_display",
126
+ description: "UI display issue — check Applet Web Template, control mappings, and visibility rules",
127
+ probability: 0.7,
128
+ suggestion: "Verify Applet's Web Template exists, controls are mapped to fields, and ShowControl/HideControl logic is correct.",
129
+ },
130
+ {
131
+ pattern: /script|escript|function|invoke/i,
132
+ category: "script_error",
133
+ description: "eScript runtime error — check error handling, variable scope, and method signatures",
134
+ probability: 0.75,
135
+ suggestion: "Add try/catch/finally. Check that all variables are declared. Verify method name in PreInvokeMethod matches.",
136
+ codeExample: `function WebApplet_PreInvokeMethod(MethodName) {\n try {\n if (MethodName == "MyMethod") {\n // logic\n return CancelOperation;\n }\n } catch(e) {\n TheApplication().RaiseErrorText(e.toString());\n } finally {\n // cleanup\n }\n return ContinueOperation;\n}`,
137
+ },
138
+ {
139
+ pattern: /permission|access|denied|security/i,
140
+ category: "security",
141
+ description: "Access denied — check responsibility, view/position access, and data-level security",
142
+ probability: 0.7,
143
+ suggestion: "Verify user's responsibility includes the View. Check Position-based access on the BC.",
144
+ },
145
+ {
146
+ pattern: /timeout|slow|performance|hang/i,
147
+ category: "performance",
148
+ description: "Performance issue — check SearchSpec efficiency, unbounded queries, and missing indexes",
149
+ probability: 0.65,
150
+ suggestion: "Add ForwardOnly to ExecuteQuery. Limit result set with SearchSpec. Check for loops with GetFieldValue inside.",
151
+ },
152
+ ];
153
+ const GENERIC_CAUSES = [
154
+ {
155
+ description: "Configuration mismatch between objects — check that all referenced objects exist and are compiled",
156
+ probability: 0.5,
157
+ category: "configuration",
158
+ suggestion: "Recompile the project. Verify all dependent objects are imported and active.",
159
+ },
160
+ {
161
+ description: "Stale cache — Siebel server may be serving cached object definitions",
162
+ probability: 0.3,
163
+ category: "cache",
164
+ suggestion: "Clear server cache and restart the Siebel component. On Composer, do a Clean Build.",
165
+ },
166
+ ];
167
+ function analyzeCauses(errorMessage, scripts, configIssues) {
168
+ const causes = [];
169
+ // Match error against known patterns
170
+ for (const rule of CAUSE_RULES) {
171
+ if (rule.pattern.test(errorMessage)) {
172
+ causes.push({
173
+ description: rule.description,
174
+ probability: rule.probability,
175
+ category: rule.category,
176
+ suggestion: rule.suggestion,
177
+ codeExample: rule.codeExample,
178
+ });
179
+ }
180
+ }
181
+ // Check scripts for anti-patterns
182
+ for (const script of scripts) {
183
+ if (!/try\s*\{/.test(script.snippet)) {
184
+ causes.push({
185
+ description: `Script "${script.methodName}" in ${script.parentObject} has no error handling`,
186
+ probability: 0.6,
187
+ category: "script_error",
188
+ suggestion: "Wrap function body in try/catch/finally",
189
+ });
190
+ break; // One is enough
191
+ }
192
+ }
193
+ // Add config-based causes
194
+ for (const issue of configIssues) {
195
+ causes.push({
196
+ description: `Config issue: ${issue.detail} in ${issue.objectName}`,
197
+ probability: 0.55,
198
+ category: "configuration",
199
+ suggestion: `Fix ${issue.issueType} in ${issue.objectName}`,
200
+ });
201
+ }
202
+ // If no specific causes found, add generic ones
203
+ if (causes.length === 0) {
204
+ causes.push(...GENERIC_CAUSES);
205
+ }
206
+ // Sort by probability desc, limit to 5
207
+ causes.sort((a, b) => b.probability - a.probability);
208
+ return causes.slice(0, 5);
209
+ }
210
+ // --- Main function ---
211
+ export function troubleshootSiebel(request) {
212
+ const { errorMessage, objects, dependencies } = request;
213
+ logger.debug("troubleshoot: analyzing", { errorLength: errorMessage.length, objectCount: objects.length });
214
+ // AC1: Parse error to find related objects
215
+ const relatedObjects = extractObjectNames(errorMessage, objects);
216
+ const relatedNames = new Set(relatedObjects.map((o) => o.name));
217
+ // If no objects found by name, try to relate by type keywords
218
+ if (relatedNames.size === 0) {
219
+ for (const obj of objects) {
220
+ if (errorMessage.toLowerCase().includes(obj.type.replace("_", " "))) {
221
+ relatedNames.add(obj.name);
222
+ relatedObjects.push({ name: obj.name, type: obj.type });
223
+ break;
224
+ }
225
+ }
226
+ }
227
+ // AC2: Find related scripts
228
+ const relatedScripts = findRelatedScripts(relatedNames, objects);
229
+ // AC3: Dependency chain
230
+ const dependencyChain = buildDependencyChain(relatedObjects, dependencies);
231
+ // AC4: Config issues
232
+ const configIssues = checkConfigIssues(relatedNames, objects);
233
+ // AC5 + AC6: Causes with suggestions
234
+ const causes = analyzeCauses(errorMessage, relatedScripts, configIssues);
235
+ logger.info("troubleshoot: complete", {
236
+ relatedObjects: relatedObjects.length,
237
+ scripts: relatedScripts.length,
238
+ causes: causes.length,
239
+ });
240
+ return {
241
+ errorMessage,
242
+ relatedObjects,
243
+ relatedScripts,
244
+ dependencyChain,
245
+ configIssues,
246
+ causes,
247
+ };
248
+ }
249
+ //# sourceMappingURL=troubleshoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"troubleshoot.js","sourceRoot":"","sources":["../../../src/core/siebel/troubleshoot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * WSDL Correlation — matches WSDL services/operations with Integration Objects from the SIF repository.
3
+ */
4
+ import type { WsdlParseResult } from "./wsdl-parser.js";
5
+ import type { SiebelObject } from "../../schemas/siebel.schema.js";
6
+ export interface WsdlCorrelationMatch {
7
+ serviceName: string;
8
+ operationName: string;
9
+ ioName: string;
10
+ confidence: number;
11
+ }
12
+ export interface WsdlCorrelationResult {
13
+ matches: WsdlCorrelationMatch[];
14
+ unmatchedOperations: string[];
15
+ unmatchedIOs: string[];
16
+ coverageScore: number;
17
+ }
18
+ /**
19
+ * Correlate WSDL operations with Integration Objects by name similarity.
20
+ */
21
+ export declare function correlateWsdlWithObjects(wsdlResult: WsdlParseResult, objects: SiebelObject[]): WsdlCorrelationResult;
22
+ //# sourceMappingURL=wsdl-correlation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsdl-correlation.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/wsdl-correlation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,YAAY,EAAE,GACtB,qBAAqB,CAqDvB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * WSDL Correlation — matches WSDL services/operations with Integration Objects from the SIF repository.
3
+ */
4
+ /**
5
+ * Correlate WSDL operations with Integration Objects by name similarity.
6
+ */
7
+ export function correlateWsdlWithObjects(wsdlResult, objects) {
8
+ const ios = objects.filter((o) => o.type === "integration_object");
9
+ const serviceName = wsdlResult.services[0]?.name ?? "";
10
+ if (wsdlResult.operations.length === 0) {
11
+ return { matches: [], unmatchedOperations: [], unmatchedIOs: ios.map((io) => io.name), coverageScore: 100 };
12
+ }
13
+ const matches = [];
14
+ const matchedOperations = new Set();
15
+ const matchedIOs = new Set();
16
+ // Try to match each operation to an IO
17
+ for (const op of wsdlResult.operations) {
18
+ const opTokens = tokenize(op.name);
19
+ const serviceTokens = tokenize(serviceName);
20
+ const allTokens = new Set([...opTokens, ...serviceTokens]);
21
+ let bestMatch = null;
22
+ for (const io of ios) {
23
+ const ioTokens = tokenize(io.name);
24
+ const score = jaccardSimilarity(allTokens, new Set(ioTokens));
25
+ if (score > 0.1 && (!bestMatch || score > bestMatch.score)) {
26
+ bestMatch = { io, score };
27
+ }
28
+ }
29
+ if (bestMatch) {
30
+ matches.push({
31
+ serviceName,
32
+ operationName: op.name,
33
+ ioName: bestMatch.io.name,
34
+ confidence: Math.round(bestMatch.score * 100),
35
+ });
36
+ matchedOperations.add(op.name);
37
+ matchedIOs.add(bestMatch.io.name);
38
+ }
39
+ }
40
+ const unmatchedOperations = wsdlResult.operations
41
+ .filter((op) => !matchedOperations.has(op.name))
42
+ .map((op) => op.name);
43
+ const unmatchedIOs = ios
44
+ .filter((io) => !matchedIOs.has(io.name))
45
+ .map((io) => io.name);
46
+ const totalItems = wsdlResult.operations.length + ios.length;
47
+ const matchedItems = matchedOperations.size + matchedIOs.size;
48
+ const coverageScore = totalItems > 0 ? Math.round((matchedItems / totalItems) * 100) : 100;
49
+ return { matches, unmatchedOperations, unmatchedIOs, coverageScore };
50
+ }
51
+ function tokenize(name) {
52
+ return name
53
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
54
+ .replace(/[_\-]/g, " ")
55
+ .toLowerCase()
56
+ .split(/\s+/)
57
+ .filter((t) => t.length > 1);
58
+ }
59
+ function jaccardSimilarity(a, b) {
60
+ const intersection = new Set([...a].filter((x) => b.has(x)));
61
+ const union = new Set([...a, ...b]);
62
+ return union.size > 0 ? intersection.size / union.size : 0;
63
+ }
64
+ //# sourceMappingURL=wsdl-correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsdl-correlation.js","sourceRoot":"","sources":["../../../src/core/siebel/wsdl-correlation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * WSDL Parser — extracts services, operations, types, and messages from WSDL files.
3
+ * Uses fast-xml-parser (ADR-001: no new dependencies).
4
+ */
5
+ export interface WsdlField {
6
+ name: string;
7
+ type: string;
8
+ optional?: boolean;
9
+ isArray?: boolean;
10
+ }
11
+ export interface WsdlComplexType {
12
+ name: string;
13
+ fields: WsdlField[];
14
+ }
15
+ export interface WsdlMessagePart {
16
+ name: string;
17
+ type: string;
18
+ }
19
+ export interface WsdlMessage {
20
+ name: string;
21
+ parts: WsdlMessagePart[];
22
+ }
23
+ export interface WsdlOperation {
24
+ name: string;
25
+ inputMessage: string;
26
+ outputMessage: string;
27
+ soapAction?: string;
28
+ }
29
+ export interface WsdlPort {
30
+ name: string;
31
+ binding: string;
32
+ address: string;
33
+ }
34
+ export interface WsdlService {
35
+ name: string;
36
+ ports: WsdlPort[];
37
+ }
38
+ export interface WsdlMetadata {
39
+ fileName: string;
40
+ targetNamespace: string;
41
+ operationCount: number;
42
+ typeCount: number;
43
+ messageCount: number;
44
+ parsedAt: string;
45
+ }
46
+ export interface WsdlParseResult {
47
+ services: WsdlService[];
48
+ operations: WsdlOperation[];
49
+ types: WsdlComplexType[];
50
+ messages: WsdlMessage[];
51
+ metadata: WsdlMetadata;
52
+ }
53
+ /**
54
+ * Parse WSDL XML content into structured result.
55
+ */
56
+ export declare function parseWsdlContent(content: string, fileName: string): WsdlParseResult;
57
+ //# sourceMappingURL=wsdl-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsdl-parser.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/wsdl-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAUD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAgEnF"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * WSDL Parser — extracts services, operations, types, and messages from WSDL files.
3
+ * Uses fast-xml-parser (ADR-001: no new dependencies).
4
+ */
5
+ import { XMLParser } from "fast-xml-parser";
6
+ import { logger } from "../utils/logger.js";
7
+ import { ValidationError } from "../utils/errors.js";
8
+ // ---- Parser ----
9
+ const WSDL_DEFINITIONS_KEYS = ["definitions", "wsdl:definitions"];
10
+ const WSDL_TYPES_KEYS = ["types", "wsdl:types"];
11
+ const WSDL_MESSAGE_KEYS = ["message", "wsdl:message"];
12
+ const WSDL_PORT_TYPE_KEYS = ["portType", "wsdl:portType"];
13
+ const WSDL_SERVICE_KEYS = ["service", "wsdl:service"];
14
+ /**
15
+ * Parse WSDL XML content into structured result.
16
+ */
17
+ export function parseWsdlContent(content, fileName) {
18
+ if (!content || content.trim().length === 0) {
19
+ throw new ValidationError("WSDL content is empty", [{ field: "content", message: "empty" }]);
20
+ }
21
+ const parser = new XMLParser({
22
+ ignoreAttributes: false,
23
+ attributeNamePrefix: "@_",
24
+ removeNSPrefix: false,
25
+ isArray: (name) => {
26
+ const arrayTags = new Set([
27
+ "operation", "wsdl:operation",
28
+ "message", "wsdl:message",
29
+ "part", "wsdl:part",
30
+ "port", "wsdl:port",
31
+ "service", "wsdl:service",
32
+ "portType", "wsdl:portType",
33
+ "xsd:element", "element",
34
+ "xsd:complexType", "complexType",
35
+ ]);
36
+ return arrayTags.has(name);
37
+ },
38
+ });
39
+ let parsed;
40
+ try {
41
+ parsed = parser.parse(content);
42
+ }
43
+ catch (err) {
44
+ throw new ValidationError("Invalid WSDL XML", [
45
+ { field: "xml", message: err instanceof Error ? err.message : String(err) },
46
+ ]);
47
+ }
48
+ const definitions = findKey(parsed, WSDL_DEFINITIONS_KEYS);
49
+ if (!definitions) {
50
+ throw new ValidationError("WSDL missing definitions root element", [
51
+ { field: "structure", message: "no definitions found" },
52
+ ]);
53
+ }
54
+ const targetNamespace = getAttr(definitions, "targetNamespace") ?? "";
55
+ const types = extractTypes(definitions);
56
+ const messages = extractMessages(definitions);
57
+ const operations = extractOperations(definitions);
58
+ const services = extractServices(definitions);
59
+ const metadata = {
60
+ fileName,
61
+ targetNamespace,
62
+ operationCount: operations.length,
63
+ typeCount: types.length,
64
+ messageCount: messages.length,
65
+ parsedAt: new Date().toISOString(),
66
+ };
67
+ logger.info("WSDL parsed", {
68
+ fileName,
69
+ operations: String(operations.length),
70
+ types: String(types.length),
71
+ services: String(services.length),
72
+ });
73
+ return { services, operations, types, messages, metadata };
74
+ }
75
+ // ---- Extraction helpers ----
76
+ function extractTypes(definitions) {
77
+ const types = [];
78
+ const typesNode = findKey(definitions, WSDL_TYPES_KEYS);
79
+ if (!typesNode)
80
+ return types;
81
+ const schema = findKey(typesNode, ["xsd:schema", "schema", "xs:schema"]);
82
+ if (!schema)
83
+ return types;
84
+ const complexTypes = getArray(schema, "xsd:complexType") ?? getArray(schema, "complexType") ?? getArray(schema, "xs:complexType");
85
+ for (const ct of complexTypes) {
86
+ const ctObj = ct;
87
+ const name = getAttr(ctObj, "name");
88
+ if (!name)
89
+ continue;
90
+ const fields = extractFields(ctObj);
91
+ types.push({ name, fields });
92
+ }
93
+ return types;
94
+ }
95
+ function extractFields(complexType) {
96
+ const fields = [];
97
+ const sequence = findKey(complexType, ["xsd:sequence", "sequence", "xs:sequence"]);
98
+ if (!sequence)
99
+ return fields;
100
+ const elements = getArray(sequence, "xsd:element") ?? getArray(sequence, "element") ?? getArray(sequence, "xs:element");
101
+ for (const elem of elements) {
102
+ const el = elem;
103
+ const name = getAttr(el, "name");
104
+ if (!name)
105
+ continue;
106
+ const type = getAttr(el, "type") ?? "xsd:string";
107
+ const minOccurs = getAttr(el, "minOccurs");
108
+ const maxOccurs = getAttr(el, "maxOccurs");
109
+ fields.push({
110
+ name,
111
+ type,
112
+ optional: minOccurs === "0" || undefined,
113
+ isArray: maxOccurs === "unbounded" || undefined,
114
+ });
115
+ }
116
+ return fields;
117
+ }
118
+ function extractMessages(definitions) {
119
+ const messages = [];
120
+ const msgElements = getArray(definitions, "message") ?? getArray(definitions, "wsdl:message");
121
+ for (const msg of msgElements) {
122
+ const msgObj = msg;
123
+ const name = getAttr(msgObj, "name");
124
+ if (!name)
125
+ continue;
126
+ const partElements = getArray(msgObj, "part") ?? getArray(msgObj, "wsdl:part");
127
+ const parts = [];
128
+ for (const p of partElements) {
129
+ const pObj = p;
130
+ const partName = getAttr(pObj, "name") ?? "parameters";
131
+ const partType = getAttr(pObj, "type") ?? getAttr(pObj, "element") ?? "";
132
+ parts.push({ name: partName, type: partType });
133
+ }
134
+ messages.push({ name, parts });
135
+ }
136
+ return messages;
137
+ }
138
+ function extractOperations(definitions) {
139
+ const operations = [];
140
+ const portTypes = getArray(definitions, "portType") ?? getArray(definitions, "wsdl:portType");
141
+ for (const pt of portTypes) {
142
+ const ptObj = pt;
143
+ const ops = getArray(ptObj, "operation") ?? getArray(ptObj, "wsdl:operation");
144
+ for (const op of ops) {
145
+ const opObj = op;
146
+ const name = getAttr(opObj, "name");
147
+ if (!name)
148
+ continue;
149
+ const input = (findKey(opObj, ["input", "wsdl:input"]) ?? {});
150
+ const output = (findKey(opObj, ["output", "wsdl:output"]) ?? {});
151
+ const inputMsg = stripNamespace(getAttr(input, "message") ?? "");
152
+ const outputMsg = stripNamespace(getAttr(output, "message") ?? "");
153
+ operations.push({
154
+ name,
155
+ inputMessage: inputMsg,
156
+ outputMessage: outputMsg,
157
+ });
158
+ }
159
+ }
160
+ // Enrich with soapAction from binding
161
+ const bindings = getArray(definitions, "binding") ?? getArray(definitions, "wsdl:binding");
162
+ for (const b of bindings) {
163
+ const bObj = b;
164
+ const bindOps = getArray(bObj, "operation") ?? getArray(bObj, "wsdl:operation");
165
+ for (const bo of bindOps) {
166
+ const boObj = bo;
167
+ const opName = getAttr(boObj, "name");
168
+ const soapOp = findKey(boObj, ["soap:operation", "soap12:operation"]);
169
+ if (opName && soapOp) {
170
+ const action = getAttr(soapOp, "soapAction");
171
+ const matchOp = operations.find((o) => o.name === opName);
172
+ if (matchOp && action) {
173
+ matchOp.soapAction = action;
174
+ }
175
+ }
176
+ }
177
+ }
178
+ return operations;
179
+ }
180
+ function extractServices(definitions) {
181
+ const services = [];
182
+ const svcElements = getArray(definitions, "service") ?? getArray(definitions, "wsdl:service");
183
+ for (const svc of svcElements) {
184
+ const svcObj = svc;
185
+ const name = getAttr(svcObj, "name");
186
+ if (!name)
187
+ continue;
188
+ const portElements = getArray(svcObj, "port") ?? getArray(svcObj, "wsdl:port");
189
+ const ports = [];
190
+ for (const p of portElements) {
191
+ const pObj = p;
192
+ const portName = getAttr(pObj, "name") ?? "";
193
+ const binding = stripNamespace(getAttr(pObj, "binding") ?? "");
194
+ const soapAddr = findKey(pObj, ["soap:address", "soap12:address"]);
195
+ const address = soapAddr ? (getAttr(soapAddr, "location") ?? "") : "";
196
+ ports.push({ name: portName, binding, address });
197
+ }
198
+ services.push({ name, ports });
199
+ }
200
+ return services;
201
+ }
202
+ // ---- Utility helpers ----
203
+ function getAttr(obj, name) {
204
+ const val = obj[`@_${name}`];
205
+ return val != null ? String(val) : undefined;
206
+ }
207
+ function getArray(obj, key) {
208
+ const val = obj[key];
209
+ if (Array.isArray(val))
210
+ return val;
211
+ if (val != null)
212
+ return [val];
213
+ return [];
214
+ }
215
+ function findKey(obj, keys) {
216
+ for (const key of keys) {
217
+ if (obj[key] != null)
218
+ return obj[key];
219
+ }
220
+ return undefined;
221
+ }
222
+ function stripNamespace(qname) {
223
+ const idx = qname.indexOf(":");
224
+ return idx >= 0 ? qname.slice(idx + 1) : qname;
225
+ }
226
+ //# sourceMappingURL=wsdl-parser.js.map