@mcp-graph-workflow/mcp-graph 5.10.0 → 5.11.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 (180) hide show
  1. package/dist/api/routes/siebel.d.ts.map +1 -1
  2. package/dist/api/routes/siebel.js +170 -0
  3. package/dist/api/routes/siebel.js.map +1 -1
  4. package/dist/core/rag/siebel-indexer.d.ts.map +1 -1
  5. package/dist/core/rag/siebel-indexer.js +57 -1
  6. package/dist/core/rag/siebel-indexer.js.map +1 -1
  7. package/dist/core/rag/wsdl-indexer.d.ts +16 -0
  8. package/dist/core/rag/wsdl-indexer.d.ts.map +1 -0
  9. package/dist/core/rag/wsdl-indexer.js +115 -0
  10. package/dist/core/rag/wsdl-indexer.js.map +1 -0
  11. package/dist/core/siebel/auto-wiring.d.ts +29 -0
  12. package/dist/core/siebel/auto-wiring.d.ts.map +1 -0
  13. package/dist/core/siebel/auto-wiring.js +211 -0
  14. package/dist/core/siebel/auto-wiring.js.map +1 -0
  15. package/dist/core/siebel/best-practices.d.ts +16 -0
  16. package/dist/core/siebel/best-practices.d.ts.map +1 -0
  17. package/dist/core/siebel/best-practices.js +92 -0
  18. package/dist/core/siebel/best-practices.js.map +1 -0
  19. package/dist/core/siebel/change-simulator.d.ts +32 -0
  20. package/dist/core/siebel/change-simulator.d.ts.map +1 -0
  21. package/dist/core/siebel/change-simulator.js +138 -0
  22. package/dist/core/siebel/change-simulator.js.map +1 -0
  23. package/dist/core/siebel/clone-adapt.d.ts +21 -0
  24. package/dist/core/siebel/clone-adapt.d.ts.map +1 -0
  25. package/dist/core/siebel/clone-adapt.js +157 -0
  26. package/dist/core/siebel/clone-adapt.js.map +1 -0
  27. package/dist/core/siebel/code-review.d.ts +36 -0
  28. package/dist/core/siebel/code-review.d.ts.map +1 -0
  29. package/dist/core/siebel/code-review.js +239 -0
  30. package/dist/core/siebel/code-review.js.map +1 -0
  31. package/dist/core/siebel/complexity-metrics.d.ts +24 -0
  32. package/dist/core/siebel/complexity-metrics.d.ts.map +1 -0
  33. package/dist/core/siebel/complexity-metrics.js +41 -0
  34. package/dist/core/siebel/complexity-metrics.js.map +1 -0
  35. package/dist/core/siebel/context-enrichment.d.ts +18 -0
  36. package/dist/core/siebel/context-enrichment.d.ts.map +1 -0
  37. package/dist/core/siebel/context-enrichment.js +91 -0
  38. package/dist/core/siebel/context-enrichment.js.map +1 -0
  39. package/dist/core/siebel/cross-project-analyzer.d.ts +30 -0
  40. package/dist/core/siebel/cross-project-analyzer.d.ts.map +1 -0
  41. package/dist/core/siebel/cross-project-analyzer.js +108 -0
  42. package/dist/core/siebel/cross-project-analyzer.js.map +1 -0
  43. package/dist/core/siebel/definition-of-ready.d.ts +25 -0
  44. package/dist/core/siebel/definition-of-ready.d.ts.map +1 -0
  45. package/dist/core/siebel/definition-of-ready.js +164 -0
  46. package/dist/core/siebel/definition-of-ready.js.map +1 -0
  47. package/dist/core/siebel/escript-crossref.d.ts +18 -0
  48. package/dist/core/siebel/escript-crossref.d.ts.map +1 -0
  49. package/dist/core/siebel/escript-crossref.js +50 -0
  50. package/dist/core/siebel/escript-crossref.js.map +1 -0
  51. package/dist/core/siebel/escript-generator.d.ts +33 -0
  52. package/dist/core/siebel/escript-generator.d.ts.map +1 -0
  53. package/dist/core/siebel/escript-generator.js +200 -0
  54. package/dist/core/siebel/escript-generator.js.map +1 -0
  55. package/dist/core/siebel/escript-patterns.d.ts +20 -0
  56. package/dist/core/siebel/escript-patterns.d.ts.map +1 -0
  57. package/dist/core/siebel/escript-patterns.js +69 -0
  58. package/dist/core/siebel/escript-patterns.js.map +1 -0
  59. package/dist/core/siebel/escript-refactor.d.ts +23 -0
  60. package/dist/core/siebel/escript-refactor.d.ts.map +1 -0
  61. package/dist/core/siebel/escript-refactor.js +270 -0
  62. package/dist/core/siebel/escript-refactor.js.map +1 -0
  63. package/dist/core/siebel/field-suggestion.d.ts +29 -0
  64. package/dist/core/siebel/field-suggestion.d.ts.map +1 -0
  65. package/dist/core/siebel/field-suggestion.js +105 -0
  66. package/dist/core/siebel/field-suggestion.js.map +1 -0
  67. package/dist/core/siebel/health-check.d.ts +21 -0
  68. package/dist/core/siebel/health-check.d.ts.map +1 -0
  69. package/dist/core/siebel/health-check.js +51 -0
  70. package/dist/core/siebel/health-check.js.map +1 -0
  71. package/dist/core/siebel/integration-test-gen.d.ts +26 -0
  72. package/dist/core/siebel/integration-test-gen.d.ts.map +1 -0
  73. package/dist/core/siebel/integration-test-gen.js +131 -0
  74. package/dist/core/siebel/integration-test-gen.js.map +1 -0
  75. package/dist/core/siebel/lov-mapper.d.ts +23 -0
  76. package/dist/core/siebel/lov-mapper.d.ts.map +1 -0
  77. package/dist/core/siebel/lov-mapper.js +42 -0
  78. package/dist/core/siebel/lov-mapper.js.map +1 -0
  79. package/dist/core/siebel/migration-package.d.ts +38 -0
  80. package/dist/core/siebel/migration-package.d.ts.map +1 -0
  81. package/dist/core/siebel/migration-package.js +276 -0
  82. package/dist/core/siebel/migration-package.js.map +1 -0
  83. package/dist/core/siebel/naming-convention-validator.d.ts +38 -0
  84. package/dist/core/siebel/naming-convention-validator.d.ts.map +1 -0
  85. package/dist/core/siebel/naming-convention-validator.js +165 -0
  86. package/dist/core/siebel/naming-convention-validator.js.map +1 -0
  87. package/dist/core/siebel/object-erd.d.ts +28 -0
  88. package/dist/core/siebel/object-erd.d.ts.map +1 -0
  89. package/dist/core/siebel/object-erd.js +82 -0
  90. package/dist/core/siebel/object-erd.js.map +1 -0
  91. package/dist/core/siebel/orphan-detector.d.ts +21 -0
  92. package/dist/core/siebel/orphan-detector.d.ts.map +1 -0
  93. package/dist/core/siebel/orphan-detector.js +64 -0
  94. package/dist/core/siebel/orphan-detector.js.map +1 -0
  95. package/dist/core/siebel/pattern-analyzer.d.ts +32 -0
  96. package/dist/core/siebel/pattern-analyzer.d.ts.map +1 -0
  97. package/dist/core/siebel/pattern-analyzer.js +155 -0
  98. package/dist/core/siebel/pattern-analyzer.js.map +1 -0
  99. package/dist/core/siebel/profileattr-flow.d.ts +26 -0
  100. package/dist/core/siebel/profileattr-flow.d.ts.map +1 -0
  101. package/dist/core/siebel/profileattr-flow.js +50 -0
  102. package/dist/core/siebel/profileattr-flow.js.map +1 -0
  103. package/dist/core/siebel/runtime-dep-builder.d.ts +9 -0
  104. package/dist/core/siebel/runtime-dep-builder.d.ts.map +1 -0
  105. package/dist/core/siebel/runtime-dep-builder.js +47 -0
  106. package/dist/core/siebel/runtime-dep-builder.js.map +1 -0
  107. package/dist/core/siebel/scaffold-generator.d.ts +25 -0
  108. package/dist/core/siebel/scaffold-generator.d.ts.map +1 -0
  109. package/dist/core/siebel/scaffold-generator.js +278 -0
  110. package/dist/core/siebel/scaffold-generator.js.map +1 -0
  111. package/dist/core/siebel/siebel-context-builder.d.ts +10 -0
  112. package/dist/core/siebel/siebel-context-builder.d.ts.map +1 -0
  113. package/dist/core/siebel/siebel-context-builder.js +75 -0
  114. package/dist/core/siebel/siebel-context-builder.js.map +1 -0
  115. package/dist/core/siebel/siebel-rag-booster.d.ts +19 -0
  116. package/dist/core/siebel/siebel-rag-booster.d.ts.map +1 -0
  117. package/dist/core/siebel/siebel-rag-booster.js +41 -0
  118. package/dist/core/siebel/siebel-rag-booster.js.map +1 -0
  119. package/dist/core/siebel/siebel-validators.d.ts +73 -0
  120. package/dist/core/siebel/siebel-validators.d.ts.map +1 -0
  121. package/dist/core/siebel/siebel-validators.js +269 -0
  122. package/dist/core/siebel/siebel-validators.js.map +1 -0
  123. package/dist/core/siebel/sif-batch-importer.d.ts +27 -0
  124. package/dist/core/siebel/sif-batch-importer.d.ts.map +1 -0
  125. package/dist/core/siebel/sif-batch-importer.js +68 -0
  126. package/dist/core/siebel/sif-batch-importer.js.map +1 -0
  127. package/dist/core/siebel/sif-diff.d.ts +57 -0
  128. package/dist/core/siebel/sif-diff.d.ts.map +1 -0
  129. package/dist/core/siebel/sif-diff.js +198 -0
  130. package/dist/core/siebel/sif-diff.js.map +1 -0
  131. package/dist/core/siebel/sif-parser.d.ts.map +1 -1
  132. package/dist/core/siebel/sif-parser.js +86 -0
  133. package/dist/core/siebel/sif-parser.js.map +1 -1
  134. package/dist/core/siebel/similarity-detector.d.ts +20 -0
  135. package/dist/core/siebel/similarity-detector.d.ts.map +1 -0
  136. package/dist/core/siebel/similarity-detector.js +83 -0
  137. package/dist/core/siebel/similarity-detector.js.map +1 -0
  138. package/dist/core/siebel/template-learner.d.ts +25 -0
  139. package/dist/core/siebel/template-learner.d.ts.map +1 -0
  140. package/dist/core/siebel/template-learner.js +129 -0
  141. package/dist/core/siebel/template-learner.js.map +1 -0
  142. package/dist/core/siebel/troubleshoot.d.ts +37 -0
  143. package/dist/core/siebel/troubleshoot.d.ts.map +1 -0
  144. package/dist/core/siebel/troubleshoot.js +249 -0
  145. package/dist/core/siebel/troubleshoot.js.map +1 -0
  146. package/dist/core/siebel/wsdl-correlation.d.ts +22 -0
  147. package/dist/core/siebel/wsdl-correlation.d.ts.map +1 -0
  148. package/dist/core/siebel/wsdl-correlation.js +64 -0
  149. package/dist/core/siebel/wsdl-correlation.js.map +1 -0
  150. package/dist/core/siebel/wsdl-parser.d.ts +57 -0
  151. package/dist/core/siebel/wsdl-parser.d.ts.map +1 -0
  152. package/dist/core/siebel/wsdl-parser.js +226 -0
  153. package/dist/core/siebel/wsdl-parser.js.map +1 -0
  154. package/dist/core/siebel/wsdl-to-sif.d.ts +22 -0
  155. package/dist/core/siebel/wsdl-to-sif.d.ts.map +1 -0
  156. package/dist/core/siebel/wsdl-to-sif.js +184 -0
  157. package/dist/core/siebel/wsdl-to-sif.js.map +1 -0
  158. package/dist/mcp/tools/siebel-analyze.d.ts.map +1 -1
  159. package/dist/mcp/tools/siebel-analyze.js +89 -6
  160. package/dist/mcp/tools/siebel-analyze.js.map +1 -1
  161. package/dist/mcp/tools/siebel-composer.d.ts.map +1 -1
  162. package/dist/mcp/tools/siebel-composer.js +40 -3
  163. package/dist/mcp/tools/siebel-composer.js.map +1 -1
  164. package/dist/mcp/tools/siebel-generate-sif.d.ts.map +1 -1
  165. package/dist/mcp/tools/siebel-generate-sif.js +188 -3
  166. package/dist/mcp/tools/siebel-generate-sif.js.map +1 -1
  167. package/dist/mcp/tools/siebel-search.js +1 -1
  168. package/dist/mcp/tools/siebel-search.js.map +1 -1
  169. package/dist/mcp/tools/siebel-validate.d.ts.map +1 -1
  170. package/dist/mcp/tools/siebel-validate.js +94 -5
  171. package/dist/mcp/tools/siebel-validate.js.map +1 -1
  172. package/dist/schemas/knowledge.schema.d.ts +4 -0
  173. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  174. package/dist/schemas/knowledge.schema.js +1 -0
  175. package/dist/schemas/knowledge.schema.js.map +1 -1
  176. package/dist/schemas/siebel.schema.d.ts +42 -0
  177. package/dist/schemas/siebel.schema.d.ts.map +1 -1
  178. package/dist/schemas/siebel.schema.js +4 -0
  179. package/dist/schemas/siebel.schema.js.map +1 -1
  180. package/package.json +2 -2
@@ -0,0 +1,200 @@
1
+ /**
2
+ * eScript Generator — generates Siebel eScript code for event handlers
3
+ * using patterns learned from the repository.
4
+ *
5
+ * Follows real-world Siebel patterns:
6
+ * - try/catch/finally structure
7
+ * - TheApplication().RaiseErrorText for error handling
8
+ * - Memory cleanup (null assignments) in finally block
9
+ * - Standard event handler signatures
10
+ */
11
+ import { logger } from "../utils/logger.js";
12
+ const APPLET_EVENTS = {
13
+ PreInvokeMethod: {
14
+ functionPrefix: "WebApplet",
15
+ params: "MethodName",
16
+ defaultReturn: "return (ContinueOperation);",
17
+ objectVar: "oBC",
18
+ objectAccessor: "this.BusComp()",
19
+ },
20
+ SetFieldValue: {
21
+ functionPrefix: "WebApplet",
22
+ params: "FieldName, FieldValue",
23
+ defaultReturn: "return (ContinueOperation);",
24
+ objectVar: "oBC",
25
+ objectAccessor: "this.BusComp()",
26
+ },
27
+ PreQuery: {
28
+ functionPrefix: "WebApplet",
29
+ params: "",
30
+ defaultReturn: "return (ContinueOperation);",
31
+ objectVar: "oBC",
32
+ objectAccessor: "this.BusComp()",
33
+ },
34
+ WriteRecord: {
35
+ functionPrefix: "WebApplet",
36
+ params: "",
37
+ defaultReturn: "return (ContinueOperation);",
38
+ objectVar: "oBC",
39
+ objectAccessor: "this.BusComp()",
40
+ },
41
+ };
42
+ const BC_EVENTS = {
43
+ PreSetFieldValue: {
44
+ functionPrefix: "BusComp",
45
+ params: "FieldName, FieldValue",
46
+ defaultReturn: "return (ContinueOperation);",
47
+ objectVar: "oBC",
48
+ objectAccessor: "this",
49
+ },
50
+ PreInvokeMethod: {
51
+ functionPrefix: "BusComp",
52
+ params: "MethodName",
53
+ defaultReturn: "return (ContinueOperation);",
54
+ objectVar: "oBC",
55
+ objectAccessor: "this",
56
+ },
57
+ SetFieldValue: {
58
+ functionPrefix: "BusComp",
59
+ params: "FieldName, FieldValue",
60
+ defaultReturn: "return (ContinueOperation);",
61
+ objectVar: "oBC",
62
+ objectAccessor: "this",
63
+ },
64
+ PreQuery: {
65
+ functionPrefix: "BusComp",
66
+ params: "",
67
+ defaultReturn: "return (ContinueOperation);",
68
+ objectVar: "oBC",
69
+ objectAccessor: "this",
70
+ },
71
+ WriteRecord: {
72
+ functionPrefix: "BusComp",
73
+ params: "",
74
+ defaultReturn: "return (ContinueOperation);",
75
+ objectVar: "oBC",
76
+ objectAccessor: "this",
77
+ },
78
+ };
79
+ const BS_EVENTS = {
80
+ PreInvokeMethod: {
81
+ functionPrefix: "Service",
82
+ params: "MethodName, Inputs, Outputs",
83
+ defaultReturn: "return (ContinueOperation);",
84
+ objectVar: "oBS",
85
+ objectAccessor: "this",
86
+ },
87
+ };
88
+ function getEventDef(parentType, eventName) {
89
+ if (parentType === "business_component") {
90
+ return BC_EVENTS[eventName] ?? BC_EVENTS["PreInvokeMethod"];
91
+ }
92
+ if (parentType === "business_service") {
93
+ return BS_EVENTS[eventName] ?? BS_EVENTS["PreInvokeMethod"];
94
+ }
95
+ return APPLET_EVENTS[eventName] ?? APPLET_EVENTS["PreInvokeMethod"];
96
+ }
97
+ // --- SIF XML tag mapping ---
98
+ function getSifScriptTag(parentType) {
99
+ switch (parentType) {
100
+ case "business_component":
101
+ return "BUSCOMP_SERVER_SCRIPT";
102
+ case "business_service":
103
+ return "BUSINESS_SERVICE_SERVER_SCRIPT";
104
+ default:
105
+ return "APPLET_SERVER_SCRIPT";
106
+ }
107
+ }
108
+ // --- Reference analysis ---
109
+ function extractReferencedEntities(description, knownBcNames, knownFieldNames) {
110
+ const entities = [];
111
+ const lower = description.toLowerCase();
112
+ if (knownBcNames) {
113
+ for (const bc of knownBcNames) {
114
+ if (lower.includes(bc.toLowerCase())) {
115
+ entities.push({ name: bc, type: "bc" });
116
+ }
117
+ }
118
+ }
119
+ if (knownFieldNames) {
120
+ for (const field of knownFieldNames) {
121
+ if (lower.includes(field.toLowerCase())) {
122
+ entities.push({ name: field, type: "field" });
123
+ }
124
+ }
125
+ }
126
+ return entities;
127
+ }
128
+ // --- Main function ---
129
+ export function generateEScript(request) {
130
+ const { parentObjectName, parentObjectType, eventName, behaviorDescription, knownBcNames, knownFieldNames, } = request;
131
+ logger.info("escript-generator", {
132
+ parent: parentObjectName,
133
+ event: eventName,
134
+ description: behaviorDescription.slice(0, 80),
135
+ });
136
+ const eventDef = getEventDef(parentObjectType, eventName);
137
+ const functionName = `${eventDef.functionPrefix}_${eventName}`;
138
+ const paramStr = eventDef.params ? `(${eventDef.params})` : "()";
139
+ // Build the script body
140
+ const todoComment = `// TODO: ${behaviorDescription}`;
141
+ const lines = [];
142
+ lines.push(`function ${functionName}${paramStr}`);
143
+ lines.push("{");
144
+ lines.push(` var ${eventDef.objectVar} = ${eventDef.objectAccessor};`);
145
+ lines.push(" try");
146
+ lines.push(" {");
147
+ lines.push(` ${todoComment}`);
148
+ // Add event-specific boilerplate
149
+ if (eventName === "PreInvokeMethod") {
150
+ lines.push(` if (${eventDef.params.split(",")[0].trim()} === "")`);
151
+ lines.push(" {");
152
+ lines.push(" // Handle method");
153
+ lines.push(" return (CancelOperation);");
154
+ lines.push(" }");
155
+ }
156
+ else if (eventName === "SetFieldValue" || eventName === "PreSetFieldValue") {
157
+ lines.push(` switch (${eventDef.params.split(",")[0].trim()})`);
158
+ lines.push(" {");
159
+ lines.push(' case "":');
160
+ lines.push(" // Handle field change");
161
+ lines.push(" break;");
162
+ lines.push(" }");
163
+ }
164
+ lines.push(" }");
165
+ lines.push(" catch (e)");
166
+ lines.push(" {");
167
+ lines.push(" TheApplication().RaiseErrorText(e.toString());");
168
+ lines.push(" }");
169
+ lines.push(" finally");
170
+ lines.push(" {");
171
+ lines.push(` ${eventDef.objectVar} = null;`);
172
+ lines.push(" }");
173
+ lines.push(` ${eventDef.defaultReturn}`);
174
+ lines.push("}");
175
+ const script = lines.join("\n");
176
+ // Build SIF XML block
177
+ const xmlTag = getSifScriptTag(parentObjectType);
178
+ const sifXmlBlock = [
179
+ `<${xmlTag}>`,
180
+ ` <SCRIPT LANGUAGE="JS" EVENT="${eventName}">`,
181
+ ` <![CDATA[${script}]]>`,
182
+ ` </SCRIPT>`,
183
+ `</${xmlTag}>`,
184
+ ].join("\n");
185
+ // Referenced entities
186
+ const referencedEntities = extractReferencedEntities(behaviorDescription, knownBcNames, knownFieldNames);
187
+ logger.debug("escript-generator:complete", {
188
+ functionName,
189
+ scriptLength: String(script.length),
190
+ referencedEntities: String(referencedEntities.length),
191
+ });
192
+ return {
193
+ script,
194
+ eventName,
195
+ functionName,
196
+ sifXmlBlock,
197
+ referencedEntities,
198
+ };
199
+ }
200
+ //# sourceMappingURL=escript-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escript-generator.js","sourceRoot":"","sources":["../../../src/core/siebel/escript-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * eScript Pattern Detection — detects patterns and anti-patterns in Siebel eScript code.
3
+ */
4
+ export interface ScriptPattern {
5
+ name: string;
6
+ isAntiPattern: boolean;
7
+ description: string;
8
+ line?: number;
9
+ }
10
+ export interface PatternDetectionResult {
11
+ sourceObject: string;
12
+ sourceMethod: string;
13
+ patterns: ScriptPattern[];
14
+ qualityScore: number;
15
+ }
16
+ /**
17
+ * Detect patterns and anti-patterns in eScript source code.
18
+ */
19
+ export declare function detectEscriptPatterns(sourceCode: string, sourceObject: string, sourceMethod: string): PatternDetectionResult;
20
+ //# sourceMappingURL=escript-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escript-patterns.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/escript-patterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAqDD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,sBAAsB,CAsBxB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * eScript Pattern Detection — detects patterns and anti-patterns in Siebel eScript code.
3
+ */
4
+ const CHECKS = [
5
+ {
6
+ name: "proper_error_handling",
7
+ isAntiPattern: false,
8
+ description: "Uses TheApplication().RaiseErrorText() for error reporting",
9
+ detect: (code) => /RaiseErrorText\s*\(/.test(code),
10
+ scoreImpact: 15,
11
+ },
12
+ {
13
+ name: "finally_cleanup",
14
+ isAntiPattern: false,
15
+ description: "Uses finally block for memory cleanup (null assignments)",
16
+ detect: (code) => /finally\s*\{[\s\S]*?=\s*null/.test(code),
17
+ scoreImpact: 15,
18
+ },
19
+ {
20
+ name: "empty_catch",
21
+ isAntiPattern: true,
22
+ description: "Empty catch block swallows errors silently",
23
+ detect: (code) => /catch\s*\([^)]*\)\s*\{\s*\}/.test(code),
24
+ scoreImpact: -25,
25
+ },
26
+ {
27
+ name: "hardcoded_value",
28
+ isAntiPattern: true,
29
+ description: "Hardcoded URL, IP, or server name in script",
30
+ detect: (code) => /https?:\/\/[^\s"']+/.test(code) || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/.test(code),
31
+ scoreImpact: -20,
32
+ },
33
+ {
34
+ name: "missing_try_catch",
35
+ isAntiPattern: true,
36
+ description: "Function body has no try/catch error handling",
37
+ detect: (code) => {
38
+ if (code.trim().length === 0)
39
+ return false;
40
+ const hasFunction = /function\s+\w+/.test(code);
41
+ const hasTry = /try\s*\{/.test(code);
42
+ return hasFunction && !hasTry;
43
+ },
44
+ scoreImpact: -20,
45
+ },
46
+ ];
47
+ /**
48
+ * Detect patterns and anti-patterns in eScript source code.
49
+ */
50
+ export function detectEscriptPatterns(sourceCode, sourceObject, sourceMethod) {
51
+ if (!sourceCode || sourceCode.trim().length === 0) {
52
+ return { sourceObject, sourceMethod, patterns: [], qualityScore: 0 };
53
+ }
54
+ const patterns = [];
55
+ let score = 50; // baseline
56
+ for (const check of CHECKS) {
57
+ if (check.detect(sourceCode)) {
58
+ patterns.push({
59
+ name: check.name,
60
+ isAntiPattern: check.isAntiPattern,
61
+ description: check.description,
62
+ });
63
+ score += check.scoreImpact;
64
+ }
65
+ }
66
+ const qualityScore = Math.max(0, Math.min(100, score));
67
+ return { sourceObject, sourceMethod, patterns, qualityScore };
68
+ }
69
+ //# sourceMappingURL=escript-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escript-patterns.js","sourceRoot":"","sources":["../../../src/core/siebel/escript-patterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH,MAAM,MAAM,GAAmB;IAC7B;QACE,IAAI,EAAE,uBAAuB;QAC7B,aAAa,EAAE,KAAK;QACpB,WAAW,EAAE,4DAA4D;QACzE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClD,WAAW,EAAE,EAAE;KAChB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,aAAa,EAAE,KAAK;QACpB,WAAW,EAAE,0DAA0D;QACvE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3D,WAAW,EAAE,EAAE;KAChB;IACD;QACE,IAAI,EAAE,aAAa;QACnB,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,4CAA4C;QACzD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1D,WAAW,EAAE,CAAC,EAAE;KACjB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,6CAA6C;QAC1D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrG,WAAW,EAAE,CAAC,EAAE;KACjB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,+CAA+C;QAC5D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC3C,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,WAAW,IAAI,CAAC,MAAM,CAAC;QAChC,CAAC;QACD,WAAW,EAAE,CAAC,EAAE;KACjB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,YAAoB,EACpB,YAAoB;IAEpB,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,WAAW;IAE3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC,CAAC;YACH,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAEvD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * eScript Refactoring Engine — analyzes Siebel eScript code and applies
3
+ * automatic refactorings: dead code removal, try/catch/finally injection,
4
+ * memory cleanup, duplicate lookup detection, unused variables.
5
+ */
6
+ export interface RefactorIssue {
7
+ readonly type: "dead_code" | "unused_variable" | "duplicate_lookup" | "missing_try_catch" | "missing_cleanup" | "missing_activate_field";
8
+ readonly detail: string;
9
+ readonly suggestion: string;
10
+ readonly line?: number;
11
+ }
12
+ export interface DiffLine {
13
+ readonly type: "added" | "removed" | "unchanged";
14
+ readonly content: string;
15
+ }
16
+ export interface RefactorResult {
17
+ readonly original: string;
18
+ readonly refactored: string;
19
+ readonly issues: readonly RefactorIssue[];
20
+ readonly diff: readonly DiffLine[];
21
+ }
22
+ export declare function refactorEscript(code: string): RefactorResult;
23
+ //# sourceMappingURL=escript-refactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escript-refactor.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/escript-refactor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EACT,WAAW,GACX,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,GACjB,wBAAwB,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CACpC;AA6QD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAmD5D"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * eScript Refactoring Engine — analyzes Siebel eScript code and applies
3
+ * automatic refactorings: dead code removal, try/catch/finally injection,
4
+ * memory cleanup, duplicate lookup detection, unused variables.
5
+ */
6
+ import { logger } from "../utils/logger.js";
7
+ // --- Detection helpers ---
8
+ /** AC1: Find dead code blocks marked with comments */
9
+ function detectDeadCode(code) {
10
+ const issues = [];
11
+ let cleaned = code;
12
+ // Pattern: /* ... Dead Code ... */ ... /* End Dead Code */
13
+ const blockPattern = /\/\*[^*]*(?:Dead\s*Code|DEAD\s*CODE)[^*]*\*\/[\s\S]*?\/\*[^*]*End\s*Dead\s*Code[^*]*\*\//gi;
14
+ const blockMatches = code.match(blockPattern);
15
+ if (blockMatches) {
16
+ for (const match of blockMatches) {
17
+ issues.push({
18
+ type: "dead_code",
19
+ detail: `Block dead code: ${match.substring(0, 60)}...`,
20
+ suggestion: "Remove dead code block",
21
+ });
22
+ cleaned = cleaned.replace(match, "");
23
+ }
24
+ }
25
+ // Pattern: // Dead Code ... // End Dead Code (line-based)
26
+ const linePattern = /\/\/\s*Dead\s*Code[^\n]*\n[\s\S]*?\/\/\s*End\s*Dead\s*Code[^\n]*/gi;
27
+ const lineMatches = code.match(linePattern);
28
+ if (lineMatches) {
29
+ for (const match of lineMatches) {
30
+ if (!blockMatches?.some((b) => b.includes(match))) {
31
+ issues.push({
32
+ type: "dead_code",
33
+ detail: `Line dead code: ${match.substring(0, 60)}...`,
34
+ suggestion: "Remove dead code block",
35
+ });
36
+ cleaned = cleaned.replace(match, "");
37
+ }
38
+ }
39
+ }
40
+ // Clean up multiple blank lines left by removal
41
+ cleaned = cleaned.replace(/\n{3,}/g, "\n\n");
42
+ return { issues, cleaned };
43
+ }
44
+ /** AC2: Detect unused variables */
45
+ function detectUnusedVariables(code) {
46
+ const issues = [];
47
+ // Find var declarations
48
+ const varPattern = /\bvar\s+(\w+)\s*(?:=|;)/g;
49
+ let match;
50
+ while ((match = varPattern.exec(code)) !== null) {
51
+ const varName = match[1];
52
+ // Count occurrences after declaration (excluding the declaration itself)
53
+ const afterDecl = code.substring(match.index + match[0].length);
54
+ const usagePattern = new RegExp(`\\b${escapeRegex(varName)}\\b`, "g");
55
+ const usages = afterDecl.match(usagePattern);
56
+ if (!usages || usages.length === 0) {
57
+ issues.push({
58
+ type: "unused_variable",
59
+ detail: `Variable "${varName}" is declared but never used`,
60
+ suggestion: `Remove unused variable "${varName}"`,
61
+ });
62
+ }
63
+ }
64
+ return issues;
65
+ }
66
+ /** AC3: Detect duplicate LOV lookups */
67
+ function detectDuplicateLookups(code) {
68
+ const issues = [];
69
+ const lookupPattern = /InvokeMethod\s*\(\s*"LookupValue"\s*,\s*"([^"]+)"\s*,\s*"([^"]+)"\s*\)/g;
70
+ const lookups = new Map();
71
+ let match;
72
+ while ((match = lookupPattern.exec(code)) !== null) {
73
+ const key = `${match[1]}:${match[2]}`;
74
+ lookups.set(key, (lookups.get(key) ?? 0) + 1);
75
+ }
76
+ for (const [key, count] of lookups) {
77
+ if (count > 1) {
78
+ const [lov, value] = key.split(":");
79
+ issues.push({
80
+ type: "duplicate_lookup",
81
+ detail: `LookupValue("${lov}", "${value}") called ${count} times`,
82
+ suggestion: `Cache LookupValue result in a variable: var cached_${lov}_${value.replace(/\s+/g, "_")} = ...`,
83
+ });
84
+ }
85
+ }
86
+ return issues;
87
+ }
88
+ /** AC4: Detect missing try/catch/finally */
89
+ function detectMissingTryCatch(code) {
90
+ const hasFunction = /function\s+\w+/.test(code);
91
+ const hasTry = /\btry\s*\{/.test(code);
92
+ return hasFunction && !hasTry;
93
+ }
94
+ /** AC4: Wrap function body in try/catch/finally */
95
+ function addTryCatchFinally(code, siebelVars) {
96
+ // Find function body
97
+ const funcMatch = code.match(/(function\s+\w+\s*\([^)]*\)\s*\{)([\s\S]*?)(\})\s*$/);
98
+ if (!funcMatch)
99
+ return code;
100
+ const funcHeader = funcMatch[1];
101
+ const body = funcMatch[2];
102
+ const indent = " ";
103
+ // Indent body
104
+ const indentedBody = body
105
+ .split("\n")
106
+ .map((line) => (line.trim() ? `${indent}${indent}${line.trimStart()}` : ""))
107
+ .join("\n");
108
+ const cleanup = siebelVars.length > 0
109
+ ? siebelVars.map((v) => `${indent}${indent}${v} = null;`).join("\n")
110
+ : "";
111
+ return `${funcHeader}
112
+ ${indent}try {
113
+ ${indentedBody}
114
+ ${indent}} catch(e) {
115
+ ${indent}${indent}TheApplication().RaiseErrorText(e.toString());
116
+ ${indent}} finally {
117
+ ${cleanup}
118
+ ${indent}}
119
+ }`;
120
+ }
121
+ /** AC5: Detect Siebel objects that need cleanup */
122
+ function detectSiebelObjects(code) {
123
+ const patterns = [
124
+ /\bvar\s+(\w+)\s*=\s*TheApplication\(\)\s*\.\s*(?:GetBusComp|GetService|GetBusObject|ActiveBusComp)\s*\(/g,
125
+ /\bvar\s+(\w+)\s*=\s*\w+\s*\.\s*(?:GetBusComp|GetService|GetMVGBusComp|GetPicklistBusComp)\s*\(/g,
126
+ ];
127
+ const vars = new Set();
128
+ for (const pattern of patterns) {
129
+ let match;
130
+ while ((match = pattern.exec(code)) !== null) {
131
+ vars.add(match[1]);
132
+ }
133
+ }
134
+ return [...vars];
135
+ }
136
+ /** AC5: Detect missing cleanup in finally */
137
+ function detectMissingCleanup(code) {
138
+ const issues = [];
139
+ const siebelVars = detectSiebelObjects(code);
140
+ // Check if finally block exists and has null assignments
141
+ const finallyMatch = code.match(/finally\s*\{([\s\S]*?)\}/);
142
+ const finallyBody = finallyMatch ? finallyMatch[1] : "";
143
+ const uncleaned = [];
144
+ for (const varName of siebelVars) {
145
+ const hasCleanup = new RegExp(`\\b${escapeRegex(varName)}\\s*=\\s*null`, "g").test(finallyBody);
146
+ if (!hasCleanup) {
147
+ uncleaned.push(varName);
148
+ }
149
+ }
150
+ if (uncleaned.length > 0) {
151
+ issues.push({
152
+ type: "missing_cleanup",
153
+ detail: `Siebel objects not cleaned up: ${uncleaned.join(", ")}`,
154
+ suggestion: `Add null assignments in finally block: ${uncleaned.map((v) => `${v} = null;`).join(" ")}`,
155
+ });
156
+ }
157
+ return { issues, vars: uncleaned };
158
+ }
159
+ /** AC5: Inject cleanup into finally block */
160
+ function injectCleanup(code, vars) {
161
+ if (vars.length === 0)
162
+ return code;
163
+ const finallyMatch = code.match(/(finally\s*\{)([\s\S]*?)(\})\s*$/);
164
+ if (!finallyMatch)
165
+ return code;
166
+ const indent = " ";
167
+ const assignments = vars.map((v) => `${indent}${v} = null;`).join("\n");
168
+ const existingBody = finallyMatch[2].trim();
169
+ const newBody = existingBody
170
+ ? `\n${assignments}\n${indent}${existingBody}\n `
171
+ : `\n${assignments}\n `;
172
+ return code.replace(/(finally\s*\{)([\s\S]*?)(\})\s*$/, `$1${newBody}$3`);
173
+ }
174
+ /** AC6: Detect GetFieldValue without ActivateField */
175
+ function detectMissingActivateField(code) {
176
+ const issues = [];
177
+ // Find all GetFieldValue calls
178
+ const getFieldPattern = /GetFieldValue\s*\(\s*"([^"]+)"\s*\)/g;
179
+ const fields = new Set();
180
+ let match;
181
+ while ((match = getFieldPattern.exec(code)) !== null) {
182
+ fields.add(match[1]);
183
+ }
184
+ // Find all ActivateField calls
185
+ const activatePattern = /ActivateField\s*\(\s*"([^"]+)"\s*\)/g;
186
+ const activatedFields = new Set();
187
+ while ((match = activatePattern.exec(code)) !== null) {
188
+ activatedFields.add(match[1]);
189
+ }
190
+ for (const field of fields) {
191
+ if (!activatedFields.has(field)) {
192
+ issues.push({
193
+ type: "missing_activate_field",
194
+ detail: `GetFieldValue("${field}") without prior ActivateField("${field}")`,
195
+ suggestion: `Add bc.ActivateField("${field}") before query execution`,
196
+ });
197
+ }
198
+ }
199
+ return issues;
200
+ }
201
+ /** AC7: Generate simple diff */
202
+ function generateDiff(original, refactored) {
203
+ if (original === refactored)
204
+ return [];
205
+ const origLines = original.split("\n");
206
+ const refLines = refactored.split("\n");
207
+ const diff = [];
208
+ // Simple line-by-line diff (not a full diff algorithm, but sufficient for refactoring output)
209
+ const origSet = new Set(origLines.map((l) => l.trim()));
210
+ const refSet = new Set(refLines.map((l) => l.trim()));
211
+ for (const line of origLines) {
212
+ if (!refSet.has(line.trim()) && line.trim()) {
213
+ diff.push({ type: "removed", content: line });
214
+ }
215
+ }
216
+ for (const line of refLines) {
217
+ if (!origSet.has(line.trim()) && line.trim()) {
218
+ diff.push({ type: "added", content: line });
219
+ }
220
+ }
221
+ return diff;
222
+ }
223
+ function escapeRegex(str) {
224
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
225
+ }
226
+ // --- Main function ---
227
+ export function refactorEscript(code) {
228
+ if (!code || code.trim().length === 0) {
229
+ return { original: code, refactored: code, issues: [], diff: [] };
230
+ }
231
+ logger.debug("escript-refactor: analyzing script", { length: code.length });
232
+ const allIssues = [];
233
+ let refactored = code;
234
+ // AC1: Dead code removal
235
+ const deadCode = detectDeadCode(refactored);
236
+ allIssues.push(...deadCode.issues);
237
+ refactored = deadCode.cleaned;
238
+ // AC2: Unused variables (detection only, no auto-removal)
239
+ allIssues.push(...detectUnusedVariables(refactored));
240
+ // AC3: Duplicate lookups (detection only)
241
+ allIssues.push(...detectDuplicateLookups(refactored));
242
+ // AC6: Missing ActivateField (detection only)
243
+ allIssues.push(...detectMissingActivateField(refactored));
244
+ // AC4: Missing try/catch/finally (auto-fix)
245
+ if (detectMissingTryCatch(refactored)) {
246
+ const siebelVars = detectSiebelObjects(refactored);
247
+ allIssues.push({
248
+ type: "missing_try_catch",
249
+ detail: "Function has no try/catch error handling",
250
+ suggestion: "Wrap function body in try/catch/finally with error handling",
251
+ });
252
+ refactored = addTryCatchFinally(refactored, siebelVars);
253
+ }
254
+ else {
255
+ // AC5: Missing cleanup in existing finally (auto-fix)
256
+ const cleanup = detectMissingCleanup(refactored);
257
+ allIssues.push(...cleanup.issues);
258
+ if (cleanup.vars.length > 0) {
259
+ refactored = injectCleanup(refactored, cleanup.vars);
260
+ }
261
+ }
262
+ // AC7: Diff
263
+ const diff = generateDiff(code, refactored);
264
+ logger.info("escript-refactor: complete", {
265
+ issues: allIssues.length,
266
+ hasChanges: diff.length > 0,
267
+ });
268
+ return { original: code, refactored, issues: allIssues, diff };
269
+ }
270
+ //# sourceMappingURL=escript-refactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escript-refactor.js","sourceRoot":"","sources":["../../../src/core/siebel/escript-refactor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Smart Field Suggestion — suggests fields for new applets based on
3
+ * frequency analysis of existing applets that use the same BC.
4
+ *
5
+ * Fields are ranked by how many existing applets include them, and
6
+ * classified as required (high frequency), optional (medium), or
7
+ * available (unused but present in BC).
8
+ */
9
+ import type { SiebelObject } from "../../schemas/siebel.schema.js";
10
+ export interface FieldSuggestionRequest {
11
+ readonly targetBcName: string;
12
+ readonly repository: readonly SiebelObject[];
13
+ readonly requiredThreshold?: number;
14
+ }
15
+ export interface FieldSuggestion {
16
+ readonly fieldName: string;
17
+ readonly frequency: number;
18
+ readonly frequencyRatio: number;
19
+ readonly classification: "required" | "optional" | "available";
20
+ }
21
+ export interface FieldSuggestionResult {
22
+ readonly targetBcName: string;
23
+ readonly suggestions: readonly FieldSuggestion[];
24
+ readonly appletCount: number;
25
+ readonly bcFieldCount: number;
26
+ readonly requiredThreshold: number;
27
+ }
28
+ export declare function suggestFields(request: FieldSuggestionRequest): FieldSuggestionResult;
29
+ //# sourceMappingURL=field-suggestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-suggestion.d.ts","sourceRoot":"","sources":["../../../src/core/siebel/field-suggestion.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAKnE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;CAChE;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,eAAe,EAAE,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CA+GpF"}