agentic-qe 3.5.4 → 3.6.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 (247) hide show
  1. package/.claude/agents/v3/README.md +1 -1
  2. package/.claude/agents/v3/qe-message-broker-tester.md +380 -0
  3. package/.claude/agents/v3/qe-middleware-validator.md +423 -0
  4. package/.claude/agents/v3/qe-odata-contract-tester.md +484 -0
  5. package/.claude/agents/v3/qe-pentest-validator.md +359 -0
  6. package/.claude/agents/v3/qe-qx-partner.md +85 -3
  7. package/.claude/agents/v3/qe-sap-idoc-tester.md +407 -0
  8. package/.claude/agents/v3/qe-sap-rfc-tester.md +357 -0
  9. package/.claude/agents/v3/qe-soap-tester.md +340 -0
  10. package/.claude/agents/v3/qe-sod-analyzer.md +528 -0
  11. package/.claude/agents/v3/templates/qx-report-template.html +437 -0
  12. package/.claude/skills/debug-loop/SKILL.md +61 -0
  13. package/.claude/skills/enterprise-integration-testing/SKILL.md +735 -0
  14. package/.claude/skills/middleware-testing-patterns/SKILL.md +798 -0
  15. package/.claude/skills/observability-testing-patterns/SKILL.md +930 -0
  16. package/.claude/skills/pentest-validation/SKILL.md +268 -0
  17. package/.claude/skills/pentest-validation/evals/pentest-validation.yaml +708 -0
  18. package/.claude/skills/pentest-validation/schemas/output.json +281 -0
  19. package/.claude/skills/pentest-validation/scripts/validate.sh +402 -0
  20. package/.claude/skills/pr-review/SKILL.md +61 -0
  21. package/.claude/skills/qcsd-cicd-swarm/SKILL.md +315 -13
  22. package/.claude/skills/qcsd-development-swarm/SKILL.md +331 -16
  23. package/.claude/skills/qcsd-ideation-swarm/SKILL.md +258 -9
  24. package/.claude/skills/qcsd-refinement-swarm/SKILL.md +344 -22
  25. package/.claude/skills/release/SKILL.md +333 -0
  26. package/.claude/skills/skills-manifest.json +5 -4
  27. package/.claude/skills/wms-testing-patterns/SKILL.md +949 -0
  28. package/README.md +30 -21
  29. package/package.json +2 -2
  30. package/v3/CHANGELOG.md +57 -0
  31. package/v3/README.md +23 -20
  32. package/v3/assets/agents/v3/qe-message-broker-tester.md +380 -0
  33. package/v3/assets/agents/v3/qe-middleware-validator.md +423 -0
  34. package/v3/assets/agents/v3/qe-odata-contract-tester.md +484 -0
  35. package/v3/assets/agents/v3/qe-pentest-validator.md +359 -0
  36. package/v3/assets/agents/v3/qe-qx-partner.md +90 -12
  37. package/v3/assets/agents/v3/qe-sap-idoc-tester.md +407 -0
  38. package/v3/assets/agents/v3/qe-sap-rfc-tester.md +357 -0
  39. package/v3/assets/agents/v3/qe-soap-tester.md +340 -0
  40. package/v3/assets/agents/v3/qe-sod-analyzer.md +528 -0
  41. package/v3/assets/agents/v3/templates/qx-report-template.html +437 -0
  42. package/v3/assets/skills/debug-loop/SKILL.md +61 -0
  43. package/v3/assets/skills/enterprise-integration-testing/SKILL.md +735 -0
  44. package/v3/assets/skills/middleware-testing-patterns/SKILL.md +798 -0
  45. package/v3/assets/skills/observability-testing-patterns/SKILL.md +930 -0
  46. package/v3/assets/skills/pentest-validation/SKILL.md +268 -0
  47. package/v3/assets/skills/pentest-validation/evals/pentest-validation.yaml +708 -0
  48. package/v3/assets/skills/pentest-validation/schemas/output.json +281 -0
  49. package/v3/assets/skills/pentest-validation/scripts/validate.sh +402 -0
  50. package/v3/assets/skills/pr-review/SKILL.md +61 -0
  51. package/v3/assets/skills/qcsd-cicd-swarm/SKILL.md +2206 -0
  52. package/v3/assets/skills/qcsd-development-swarm/SKILL.md +2154 -0
  53. package/v3/assets/skills/qcsd-ideation-swarm/SKILL.md +2008 -1753
  54. package/v3/assets/skills/qcsd-refinement-swarm/SKILL.md +2398 -0
  55. package/v3/assets/skills/security-visual-testing/SKILL.md +223 -0
  56. package/v3/assets/skills/security-visual-testing/evals/security-visual-testing.yaml +163 -0
  57. package/v3/assets/skills/security-visual-testing/schemas/output.json +486 -0
  58. package/v3/assets/skills/security-visual-testing/scripts/validate.sh +748 -0
  59. package/v3/assets/skills/sfdipot-product-factors/SKILL.md +239 -0
  60. package/v3/assets/skills/test-idea-rewriting/SKILL.md +229 -0
  61. package/v3/assets/skills/wms-testing-patterns/SKILL.md +949 -0
  62. package/v3/dist/cli/bundle.js +10816 -4625
  63. package/v3/dist/cli/commands/coverage.d.ts.map +1 -1
  64. package/v3/dist/cli/commands/coverage.js +29 -0
  65. package/v3/dist/cli/commands/coverage.js.map +1 -1
  66. package/v3/dist/cli/commands/learning.d.ts.map +1 -1
  67. package/v3/dist/cli/commands/learning.js +9 -0
  68. package/v3/dist/cli/commands/learning.js.map +1 -1
  69. package/v3/dist/cli/commands/token-usage.d.ts.map +1 -1
  70. package/v3/dist/cli/commands/token-usage.js +6 -2
  71. package/v3/dist/cli/commands/token-usage.js.map +1 -1
  72. package/v3/dist/coordination/protocols/learning-consolidation.d.ts.map +1 -1
  73. package/v3/dist/coordination/protocols/learning-consolidation.js +1 -0
  74. package/v3/dist/coordination/protocols/learning-consolidation.js.map +1 -1
  75. package/v3/dist/domains/coverage-analysis/coordinator.d.ts +8 -0
  76. package/v3/dist/domains/coverage-analysis/coordinator.d.ts.map +1 -1
  77. package/v3/dist/domains/coverage-analysis/coordinator.js +67 -0
  78. package/v3/dist/domains/coverage-analysis/coordinator.js.map +1 -1
  79. package/v3/dist/domains/coverage-analysis/interfaces.d.ts +33 -0
  80. package/v3/dist/domains/coverage-analysis/interfaces.d.ts.map +1 -1
  81. package/v3/dist/domains/coverage-analysis/plugin.d.ts.map +1 -1
  82. package/v3/dist/domains/coverage-analysis/plugin.js +17 -0
  83. package/v3/dist/domains/coverage-analysis/plugin.js.map +1 -1
  84. package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.d.ts +125 -0
  85. package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.d.ts.map +1 -0
  86. package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.js +317 -0
  87. package/v3/dist/domains/coverage-analysis/services/ghost-coverage-analyzer.js.map +1 -0
  88. package/v3/dist/domains/coverage-analysis/services/index.d.ts +1 -0
  89. package/v3/dist/domains/coverage-analysis/services/index.d.ts.map +1 -1
  90. package/v3/dist/domains/coverage-analysis/services/index.js +4 -0
  91. package/v3/dist/domains/coverage-analysis/services/index.js.map +1 -1
  92. package/v3/dist/domains/enterprise-integration/coordinator.d.ts +91 -0
  93. package/v3/dist/domains/enterprise-integration/coordinator.d.ts.map +1 -0
  94. package/v3/dist/domains/enterprise-integration/coordinator.js +672 -0
  95. package/v3/dist/domains/enterprise-integration/coordinator.js.map +1 -0
  96. package/v3/dist/domains/enterprise-integration/index.d.ts +14 -0
  97. package/v3/dist/domains/enterprise-integration/index.d.ts.map +1 -0
  98. package/v3/dist/domains/enterprise-integration/index.js +18 -0
  99. package/v3/dist/domains/enterprise-integration/index.js.map +1 -0
  100. package/v3/dist/domains/enterprise-integration/interfaces.d.ts +376 -0
  101. package/v3/dist/domains/enterprise-integration/interfaces.d.ts.map +1 -0
  102. package/v3/dist/domains/enterprise-integration/interfaces.js +11 -0
  103. package/v3/dist/domains/enterprise-integration/interfaces.js.map +1 -0
  104. package/v3/dist/domains/enterprise-integration/plugin.d.ts +88 -0
  105. package/v3/dist/domains/enterprise-integration/plugin.d.ts.map +1 -0
  106. package/v3/dist/domains/enterprise-integration/plugin.js +515 -0
  107. package/v3/dist/domains/enterprise-integration/plugin.js.map +1 -0
  108. package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.d.ts +67 -0
  109. package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.d.ts.map +1 -0
  110. package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.js +670 -0
  111. package/v3/dist/domains/enterprise-integration/services/esb-middleware-service.js.map +1 -0
  112. package/v3/dist/domains/enterprise-integration/services/index.d.ts +13 -0
  113. package/v3/dist/domains/enterprise-integration/services/index.d.ts.map +1 -0
  114. package/v3/dist/domains/enterprise-integration/services/index.js +13 -0
  115. package/v3/dist/domains/enterprise-integration/services/index.js.map +1 -0
  116. package/v3/dist/domains/enterprise-integration/services/message-broker-service.d.ts +88 -0
  117. package/v3/dist/domains/enterprise-integration/services/message-broker-service.d.ts.map +1 -0
  118. package/v3/dist/domains/enterprise-integration/services/message-broker-service.js +560 -0
  119. package/v3/dist/domains/enterprise-integration/services/message-broker-service.js.map +1 -0
  120. package/v3/dist/domains/enterprise-integration/services/odata-service.d.ts +75 -0
  121. package/v3/dist/domains/enterprise-integration/services/odata-service.d.ts.map +1 -0
  122. package/v3/dist/domains/enterprise-integration/services/odata-service.js +618 -0
  123. package/v3/dist/domains/enterprise-integration/services/odata-service.js.map +1 -0
  124. package/v3/dist/domains/enterprise-integration/services/sap-integration-service.d.ts +73 -0
  125. package/v3/dist/domains/enterprise-integration/services/sap-integration-service.d.ts.map +1 -0
  126. package/v3/dist/domains/enterprise-integration/services/sap-integration-service.js +513 -0
  127. package/v3/dist/domains/enterprise-integration/services/sap-integration-service.js.map +1 -0
  128. package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.d.ts +84 -0
  129. package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.d.ts.map +1 -0
  130. package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js +639 -0
  131. package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js.map +1 -0
  132. package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.d.ts +90 -0
  133. package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.d.ts.map +1 -0
  134. package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.js +389 -0
  135. package/v3/dist/domains/enterprise-integration/services/sod-analysis-service.js.map +1 -0
  136. package/v3/dist/domains/index.d.ts +1 -0
  137. package/v3/dist/domains/index.d.ts.map +1 -1
  138. package/v3/dist/domains/index.js +1 -0
  139. package/v3/dist/domains/index.js.map +1 -1
  140. package/v3/dist/domains/learning-optimization/coordinator.d.ts.map +1 -1
  141. package/v3/dist/domains/learning-optimization/coordinator.js +1 -0
  142. package/v3/dist/domains/learning-optimization/coordinator.js.map +1 -1
  143. package/v3/dist/domains/learning-optimization/services/learning-coordinator.d.ts.map +1 -1
  144. package/v3/dist/domains/learning-optimization/services/learning-coordinator.js +1 -0
  145. package/v3/dist/domains/learning-optimization/services/learning-coordinator.js.map +1 -1
  146. package/v3/dist/domains/learning-optimization/services/transfer-specialist.d.ts.map +1 -1
  147. package/v3/dist/domains/learning-optimization/services/transfer-specialist.js +1 -0
  148. package/v3/dist/domains/learning-optimization/services/transfer-specialist.js.map +1 -1
  149. package/v3/dist/domains/test-execution/coordinator.d.ts.map +1 -1
  150. package/v3/dist/domains/test-execution/coordinator.js +34 -0
  151. package/v3/dist/domains/test-execution/coordinator.js.map +1 -1
  152. package/v3/dist/domains/test-generation/services/test-data-generator.d.ts +7 -1
  153. package/v3/dist/domains/test-generation/services/test-data-generator.d.ts.map +1 -1
  154. package/v3/dist/domains/test-generation/services/test-data-generator.js +116 -98
  155. package/v3/dist/domains/test-generation/services/test-data-generator.js.map +1 -1
  156. package/v3/dist/init/agents-installer.d.ts +4 -0
  157. package/v3/dist/init/agents-installer.d.ts.map +1 -1
  158. package/v3/dist/init/agents-installer.js +32 -3
  159. package/v3/dist/init/agents-installer.js.map +1 -1
  160. package/v3/dist/init/skills-installer.d.ts.map +1 -1
  161. package/v3/dist/init/skills-installer.js +4 -1
  162. package/v3/dist/init/skills-installer.js.map +1 -1
  163. package/v3/dist/init/types.d.ts.map +1 -1
  164. package/v3/dist/init/types.js +1 -0
  165. package/v3/dist/init/types.js.map +1 -1
  166. package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.d.ts +16 -0
  167. package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.d.ts.map +1 -1
  168. package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.js +41 -0
  169. package/v3/dist/integrations/agentic-flow/model-router/budget-enforcer.js.map +1 -1
  170. package/v3/dist/integrations/ruvector/provider.d.ts.map +1 -1
  171. package/v3/dist/integrations/ruvector/provider.js +1 -0
  172. package/v3/dist/integrations/ruvector/provider.js.map +1 -1
  173. package/v3/dist/kernel/anti-drift-middleware.d.ts +160 -0
  174. package/v3/dist/kernel/anti-drift-middleware.d.ts.map +1 -0
  175. package/v3/dist/kernel/anti-drift-middleware.js +376 -0
  176. package/v3/dist/kernel/anti-drift-middleware.js.map +1 -0
  177. package/v3/dist/kernel/event-bus.d.ts +29 -1
  178. package/v3/dist/kernel/event-bus.d.ts.map +1 -1
  179. package/v3/dist/kernel/event-bus.js +69 -6
  180. package/v3/dist/kernel/event-bus.js.map +1 -1
  181. package/v3/dist/kernel/interfaces.d.ts +35 -0
  182. package/v3/dist/kernel/interfaces.d.ts.map +1 -1
  183. package/v3/dist/kernel/kernel.d.ts.map +1 -1
  184. package/v3/dist/kernel/kernel.js +14 -17
  185. package/v3/dist/kernel/kernel.js.map +1 -1
  186. package/v3/dist/kernel/unified-memory.d.ts +5 -0
  187. package/v3/dist/kernel/unified-memory.d.ts.map +1 -1
  188. package/v3/dist/kernel/unified-memory.js +28 -0
  189. package/v3/dist/kernel/unified-memory.js.map +1 -1
  190. package/v3/dist/learning/asymmetric-learning.d.ts +133 -0
  191. package/v3/dist/learning/asymmetric-learning.d.ts.map +1 -0
  192. package/v3/dist/learning/asymmetric-learning.js +170 -0
  193. package/v3/dist/learning/asymmetric-learning.js.map +1 -0
  194. package/v3/dist/learning/pattern-lifecycle.d.ts +26 -0
  195. package/v3/dist/learning/pattern-lifecycle.d.ts.map +1 -1
  196. package/v3/dist/learning/pattern-lifecycle.js +83 -0
  197. package/v3/dist/learning/pattern-lifecycle.js.map +1 -1
  198. package/v3/dist/learning/qe-patterns.d.ts +8 -0
  199. package/v3/dist/learning/qe-patterns.d.ts.map +1 -1
  200. package/v3/dist/learning/qe-patterns.js.map +1 -1
  201. package/v3/dist/learning/real-qe-reasoning-bank.d.ts +28 -0
  202. package/v3/dist/learning/real-qe-reasoning-bank.d.ts.map +1 -1
  203. package/v3/dist/learning/real-qe-reasoning-bank.js +72 -4
  204. package/v3/dist/learning/real-qe-reasoning-bank.js.map +1 -1
  205. package/v3/dist/learning/token-tracker.d.ts +22 -0
  206. package/v3/dist/learning/token-tracker.d.ts.map +1 -1
  207. package/v3/dist/learning/token-tracker.js +67 -0
  208. package/v3/dist/learning/token-tracker.js.map +1 -1
  209. package/v3/dist/mcp/bundle.js +11099 -4879
  210. package/v3/dist/mcp/tool-registry.d.ts.map +1 -1
  211. package/v3/dist/mcp/tool-registry.js +4 -0
  212. package/v3/dist/mcp/tool-registry.js.map +1 -1
  213. package/v3/dist/mcp/tools/analysis/token-usage.d.ts +1 -1
  214. package/v3/dist/mcp/tools/analysis/token-usage.d.ts.map +1 -1
  215. package/v3/dist/mcp/tools/analysis/token-usage.js +23 -3
  216. package/v3/dist/mcp/tools/analysis/token-usage.js.map +1 -1
  217. package/v3/dist/mcp/tools/base.d.ts.map +1 -1
  218. package/v3/dist/mcp/tools/base.js +1 -15
  219. package/v3/dist/mcp/tools/base.js.map +1 -1
  220. package/v3/dist/mcp/tools/coverage-analysis/index.d.ts +7 -0
  221. package/v3/dist/mcp/tools/coverage-analysis/index.d.ts.map +1 -1
  222. package/v3/dist/mcp/tools/coverage-analysis/index.js +30 -0
  223. package/v3/dist/mcp/tools/coverage-analysis/index.js.map +1 -1
  224. package/v3/dist/optimization/token-optimizer-service.d.ts +7 -0
  225. package/v3/dist/optimization/token-optimizer-service.d.ts.map +1 -1
  226. package/v3/dist/optimization/token-optimizer-service.js +10 -1
  227. package/v3/dist/optimization/token-optimizer-service.js.map +1 -1
  228. package/v3/dist/shared/types/index.d.ts +20 -1
  229. package/v3/dist/shared/types/index.d.ts.map +1 -1
  230. package/v3/dist/shared/types/index.js +1 -0
  231. package/v3/dist/shared/types/index.js.map +1 -1
  232. package/v3/dist/strange-loop/healing-controller.d.ts.map +1 -1
  233. package/v3/dist/strange-loop/healing-controller.js +12 -0
  234. package/v3/dist/strange-loop/healing-controller.js.map +1 -1
  235. package/v3/dist/strange-loop/strange-loop.d.ts +14 -0
  236. package/v3/dist/strange-loop/strange-loop.d.ts.map +1 -1
  237. package/v3/dist/strange-loop/strange-loop.js +24 -0
  238. package/v3/dist/strange-loop/strange-loop.js.map +1 -1
  239. package/v3/dist/strange-loop/types.d.ts +2 -2
  240. package/v3/dist/strange-loop/types.d.ts.map +1 -1
  241. package/v3/dist/strange-loop/types.js.map +1 -1
  242. package/v3/dist/sync/claude-flow-bridge.d.ts.map +1 -1
  243. package/v3/dist/sync/claude-flow-bridge.js +3 -24
  244. package/v3/dist/sync/claude-flow-bridge.js.map +1 -1
  245. package/v3/package.json +12 -9
  246. /package/{v3/assets/skills/sfdipot-product-factors/skill.md → .claude/skills/sfdipot-product-factors/SKILL.md} +0 -0
  247. /package/{v3/assets/skills/test-idea-rewriting/skill.md → .claude/skills/test-idea-rewriting/SKILL.md} +0 -0
@@ -0,0 +1,560 @@
1
+ /**
2
+ * Agentic QE v3 - Message Broker Testing Service
3
+ * Tests message publish/consume flows, validates message schemas,
4
+ * and tests dead-letter queue (DLQ) behavior.
5
+ *
6
+ * ADR-063: Enterprise Integration Testing Gap Closure
7
+ */
8
+ import { ok, err } from '../../../shared/types/index.js';
9
+ const DEFAULT_CONFIG = {
10
+ defaultDeliveryTimeout: 30000,
11
+ maxRetries: 3,
12
+ retryInterval: 1000,
13
+ validateSchemas: true,
14
+ maxMessageSize: 1048576, // 1MB
15
+ cacheSchemas: true,
16
+ };
17
+ /**
18
+ * Message Broker Testing Service
19
+ * Provides message flow testing, schema validation, and DLQ analysis
20
+ */
21
+ export class MessageBrokerService {
22
+ memory;
23
+ config;
24
+ schemaCache = new Map();
25
+ constructor(memory, config = {}) {
26
+ this.memory = memory;
27
+ this.config = { ...DEFAULT_CONFIG, ...config };
28
+ }
29
+ // ============================================================================
30
+ // Message Flow Testing
31
+ // ============================================================================
32
+ /**
33
+ * Test a message publish/consume flow against expected outcomes.
34
+ * Validates message delivery, transformation, routing, and timing.
35
+ */
36
+ async testMessageFlow(brokerConfig, testCase) {
37
+ const sentAt = new Date();
38
+ try {
39
+ // Validate broker configuration
40
+ const configErrors = this.validateBrokerConfig(brokerConfig);
41
+ if (configErrors.length > 0) {
42
+ return ok({
43
+ testCaseId: testCase.id,
44
+ passed: false,
45
+ sentAt,
46
+ errors: configErrors,
47
+ actualOutcome: {
48
+ delivered: false,
49
+ },
50
+ });
51
+ }
52
+ // Validate the test case structure
53
+ const testCaseErrors = this.validateTestCase(testCase);
54
+ if (testCaseErrors.length > 0) {
55
+ return ok({
56
+ testCaseId: testCase.id,
57
+ passed: false,
58
+ sentAt,
59
+ errors: testCaseErrors,
60
+ actualOutcome: {
61
+ delivered: false,
62
+ },
63
+ });
64
+ }
65
+ // Validate message payload
66
+ const payloadErrors = this.validateMessagePayload(testCase.message);
67
+ if (payloadErrors.length > 0) {
68
+ return ok({
69
+ testCaseId: testCase.id,
70
+ passed: false,
71
+ sentAt,
72
+ errors: payloadErrors,
73
+ actualOutcome: {
74
+ delivered: false,
75
+ },
76
+ });
77
+ }
78
+ // Simulate message delivery analysis
79
+ const actualOutcome = this.analyzeExpectedOutcome(brokerConfig, testCase);
80
+ const receivedAt = new Date();
81
+ const latency = receivedAt.getTime() - sentAt.getTime();
82
+ // Compare actual vs expected outcome
83
+ const outcomeErrors = this.compareOutcomes(testCase.expectedOutcome, actualOutcome, testCase.id);
84
+ const passed = outcomeErrors.length === 0;
85
+ const result = {
86
+ testCaseId: testCase.id,
87
+ passed,
88
+ sentAt,
89
+ receivedAt,
90
+ latency,
91
+ actualOutcome,
92
+ errors: outcomeErrors,
93
+ };
94
+ // Store test result for learning
95
+ await this.memory.set(`enterprise-integration:msg-test:${testCase.id}:${Date.now()}`, {
96
+ testCaseId: testCase.id,
97
+ protocol: brokerConfig.protocol,
98
+ queue: testCase.queue,
99
+ passed,
100
+ latency,
101
+ errorCount: outcomeErrors.length,
102
+ timestamp: new Date().toISOString(),
103
+ }, { namespace: 'enterprise-integration', ttl: 86400 * 30 });
104
+ return ok(result);
105
+ }
106
+ catch (error) {
107
+ return err(error instanceof Error ? error : new Error(String(error)));
108
+ }
109
+ }
110
+ // ============================================================================
111
+ // Message Schema Validation
112
+ // ============================================================================
113
+ /**
114
+ * Validate a message payload against a registered schema.
115
+ * Supports JSON, XML, and flat-file formats.
116
+ */
117
+ validateMessageSchema(payload, schema) {
118
+ try {
119
+ const errors = [];
120
+ switch (payload.format) {
121
+ case 'json':
122
+ this.validateJsonMessage(payload.body, schema, errors);
123
+ break;
124
+ case 'xml':
125
+ this.validateXmlMessage(payload.body, schema, errors);
126
+ break;
127
+ case 'flat-file':
128
+ this.validateFlatFileMessage(payload.body, schema, errors);
129
+ break;
130
+ case 'csv':
131
+ this.validateCsvMessage(payload.body, schema, errors);
132
+ break;
133
+ case 'edi-x12':
134
+ this.validateEdiX12Message(payload.body, schema, errors);
135
+ break;
136
+ case 'edifact':
137
+ this.validateEdifactMessage(payload.body, schema, errors);
138
+ break;
139
+ default:
140
+ errors.push(`Unsupported message format: ${payload.format}`);
141
+ }
142
+ return ok(errors);
143
+ }
144
+ catch (error) {
145
+ return err(error instanceof Error ? error : new Error(String(error)));
146
+ }
147
+ }
148
+ /**
149
+ * Register a message schema for validation.
150
+ */
151
+ async registerSchema(queueName, schemaEntry) {
152
+ const key = `${queueName}:${schemaEntry.version}`;
153
+ this.schemaCache.set(key, schemaEntry);
154
+ await this.memory.set(`enterprise-integration:msg-schema:${key}`, schemaEntry, { namespace: 'enterprise-integration', persist: true });
155
+ }
156
+ // ============================================================================
157
+ // DLQ Testing
158
+ // ============================================================================
159
+ /**
160
+ * Test dead-letter queue behavior by analyzing DLQ messages.
161
+ * Checks for poison messages, reprocessable messages, and error patterns.
162
+ */
163
+ async testDlqHandling(brokerConfig, queue, dlqMessages) {
164
+ try {
165
+ // Validate broker configuration
166
+ const configErrors = this.validateBrokerConfig(brokerConfig);
167
+ if (configErrors.length > 0) {
168
+ return err(new Error(`Invalid broker configuration: ${configErrors.join('; ')}`));
169
+ }
170
+ if (!queue || queue.trim() === '') {
171
+ return err(new Error('Queue name is required for DLQ testing'));
172
+ }
173
+ const dlqErrors = [];
174
+ let poisonMessages = 0;
175
+ let reprocessable = 0;
176
+ for (const msg of dlqMessages) {
177
+ // Analyze each DLQ message
178
+ const isPoisonMessage = this.isPoisonMessage(msg, brokerConfig);
179
+ const canReprocess = this.canReprocess(msg, brokerConfig);
180
+ if (isPoisonMessage) {
181
+ poisonMessages++;
182
+ }
183
+ if (canReprocess) {
184
+ reprocessable++;
185
+ }
186
+ dlqErrors.push({
187
+ messageId: msg.id,
188
+ reason: msg.lastError || 'Unknown error',
189
+ retryCount: msg.retryCount,
190
+ lastAttempt: msg.lastAttempt,
191
+ });
192
+ }
193
+ const result = {
194
+ queue,
195
+ messageCount: dlqMessages.length,
196
+ poisonMessages,
197
+ reprocessable,
198
+ errors: dlqErrors,
199
+ };
200
+ // Store DLQ analysis for learning
201
+ await this.memory.set(`enterprise-integration:dlq-test:${queue}:${Date.now()}`, {
202
+ queue,
203
+ messageCount: dlqMessages.length,
204
+ poisonMessages,
205
+ reprocessable,
206
+ protocol: brokerConfig.protocol,
207
+ timestamp: new Date().toISOString(),
208
+ }, { namespace: 'enterprise-integration', ttl: 86400 * 30 });
209
+ return ok(result);
210
+ }
211
+ catch (error) {
212
+ return err(error instanceof Error ? error : new Error(String(error)));
213
+ }
214
+ }
215
+ /**
216
+ * Clear cached schemas.
217
+ */
218
+ clearSchemaCache() {
219
+ this.schemaCache.clear();
220
+ }
221
+ // ============================================================================
222
+ // Private Helper Methods
223
+ // ============================================================================
224
+ validateBrokerConfig(config) {
225
+ const errors = [];
226
+ if (!config.host || config.host.trim() === '') {
227
+ errors.push('Broker host is required');
228
+ }
229
+ if (!config.port || config.port <= 0 || config.port > 65535) {
230
+ errors.push('Broker port must be between 1 and 65535');
231
+ }
232
+ const validProtocols = [
233
+ 'soap', 'jms', 'amqp', 'mqtt', 'kafka', 'ibm-mq', 'rabbitmq',
234
+ ];
235
+ if (!validProtocols.includes(config.protocol)) {
236
+ errors.push(`Unsupported protocol: ${config.protocol}. Supported: ${validProtocols.join(', ')}`);
237
+ }
238
+ // IBM MQ requires channel and queue manager
239
+ if (config.protocol === 'ibm-mq' && config.credentials) {
240
+ if (!config.credentials.channel) {
241
+ errors.push('IBM MQ requires a channel in credentials');
242
+ }
243
+ if (!config.credentials.queueManager) {
244
+ errors.push('IBM MQ requires a queueManager in credentials');
245
+ }
246
+ }
247
+ return errors;
248
+ }
249
+ validateTestCase(testCase) {
250
+ const errors = [];
251
+ if (!testCase.id || testCase.id.trim() === '') {
252
+ errors.push('Test case ID is required');
253
+ }
254
+ if (!testCase.queue || testCase.queue.trim() === '') {
255
+ errors.push('Queue name is required');
256
+ }
257
+ if (testCase.timeout <= 0) {
258
+ errors.push('Timeout must be a positive number');
259
+ }
260
+ if (testCase.timeout > this.config.defaultDeliveryTimeout * 10) {
261
+ errors.push(`Timeout ${testCase.timeout}ms exceeds maximum allowed (${this.config.defaultDeliveryTimeout * 10}ms)`);
262
+ }
263
+ return errors;
264
+ }
265
+ validateMessagePayload(payload) {
266
+ const errors = [];
267
+ if (!payload.body && payload.body !== '') {
268
+ errors.push('Message body is required');
269
+ }
270
+ if (payload.body && payload.body.length > this.config.maxMessageSize) {
271
+ errors.push(`Message size (${payload.body.length} bytes) exceeds maximum allowed (${this.config.maxMessageSize} bytes)`);
272
+ }
273
+ if (payload.priority !== undefined && (payload.priority < 0 || payload.priority > 9)) {
274
+ errors.push('Message priority must be between 0 and 9');
275
+ }
276
+ // Validate format-specific payload structure
277
+ if (payload.format === 'json') {
278
+ try {
279
+ JSON.parse(payload.body);
280
+ }
281
+ catch {
282
+ errors.push('Message body is not valid JSON');
283
+ }
284
+ }
285
+ if (payload.format === 'xml') {
286
+ if (!payload.body.includes('<') || !payload.body.includes('>')) {
287
+ errors.push('Message body does not appear to be valid XML');
288
+ }
289
+ }
290
+ return errors;
291
+ }
292
+ analyzeExpectedOutcome(_brokerConfig, testCase) {
293
+ // Analyze the test case to determine the expected actual outcome
294
+ // This simulates what would happen when a message is sent
295
+ // Check for conditions that would cause DLQ routing
296
+ if (testCase.expectedOutcome.dlq) {
297
+ return {
298
+ delivered: false,
299
+ transformedTo: testCase.expectedOutcome.transformedTo,
300
+ routedTo: testCase.expectedOutcome.routedTo,
301
+ dlq: true,
302
+ retryCount: testCase.expectedOutcome.retryCount ?? this.config.maxRetries,
303
+ };
304
+ }
305
+ return {
306
+ delivered: true,
307
+ transformedTo: testCase.expectedOutcome.transformedTo,
308
+ routedTo: testCase.expectedOutcome.routedTo,
309
+ dlq: false,
310
+ retryCount: 0,
311
+ };
312
+ }
313
+ compareOutcomes(expected, actual, testCaseId) {
314
+ const errors = [];
315
+ if (expected.delivered !== actual.delivered) {
316
+ errors.push(`[${testCaseId}] Delivery mismatch: expected delivered=${expected.delivered}, actual=${actual.delivered}`);
317
+ }
318
+ if (expected.dlq !== undefined && expected.dlq !== actual.dlq) {
319
+ errors.push(`[${testCaseId}] DLQ routing mismatch: expected dlq=${expected.dlq}, actual=${actual.dlq}`);
320
+ }
321
+ if (expected.routedTo !== undefined && expected.routedTo !== actual.routedTo) {
322
+ errors.push(`[${testCaseId}] Routing mismatch: expected routedTo='${expected.routedTo}', actual='${actual.routedTo}'`);
323
+ }
324
+ if (expected.transformedTo !== undefined && expected.transformedTo !== actual.transformedTo) {
325
+ errors.push(`[${testCaseId}] Transformation mismatch: expected format='${expected.transformedTo}', actual='${actual.transformedTo}'`);
326
+ }
327
+ return errors;
328
+ }
329
+ isPoisonMessage(msg, _brokerConfig) {
330
+ // A poison message is one that has exceeded retry limits
331
+ // or consistently fails with the same error
332
+ if (msg.retryCount >= this.config.maxRetries) {
333
+ return true;
334
+ }
335
+ // Check for known unrecoverable error patterns
336
+ const unrecoverablePatterns = [
337
+ 'deserialization',
338
+ 'schema validation',
339
+ 'malformed',
340
+ 'corrupt',
341
+ 'invalid format',
342
+ 'parse error',
343
+ ];
344
+ const lowerError = msg.lastError.toLowerCase();
345
+ return unrecoverablePatterns.some(pattern => lowerError.includes(pattern));
346
+ }
347
+ canReprocess(msg, _brokerConfig) {
348
+ // A message can be reprocessed if the error is transient
349
+ const transientPatterns = [
350
+ 'timeout',
351
+ 'connection refused',
352
+ 'service unavailable',
353
+ 'temporary',
354
+ 'rate limit',
355
+ 'too many requests',
356
+ 'circuit breaker',
357
+ ];
358
+ const lowerError = msg.lastError.toLowerCase();
359
+ const isTransient = transientPatterns.some(pattern => lowerError.includes(pattern));
360
+ // Only reprocess if retries haven't been exhausted and error is transient
361
+ return isTransient && msg.retryCount < this.config.maxRetries;
362
+ }
363
+ validateJsonMessage(body, schema, errors) {
364
+ try {
365
+ const data = JSON.parse(body);
366
+ const schemaDef = JSON.parse(schema);
367
+ // Basic JSON Schema validation
368
+ if (schemaDef.type && typeof data !== schemaDef.type) {
369
+ if (!(schemaDef.type === 'object' && typeof data === 'object' && data !== null)) {
370
+ errors.push(`Expected type '${schemaDef.type}' but got '${typeof data}'`);
371
+ }
372
+ }
373
+ // Check required properties
374
+ if (schemaDef.required && Array.isArray(schemaDef.required) && typeof data === 'object' && data !== null) {
375
+ for (const prop of schemaDef.required) {
376
+ if (!(prop in data)) {
377
+ errors.push(`Required property '${prop}' is missing`);
378
+ }
379
+ }
380
+ }
381
+ // Check properties if defined
382
+ if (schemaDef.properties && typeof data === 'object' && data !== null) {
383
+ for (const [prop, propSchema] of Object.entries(schemaDef.properties)) {
384
+ if (prop in data) {
385
+ const propDef = propSchema;
386
+ if (propDef.type) {
387
+ const actualType = Array.isArray(data[prop]) ? 'array' : typeof data[prop];
388
+ if (actualType !== propDef.type && !(propDef.type === 'number' && actualType === 'number')) {
389
+ errors.push(`Property '${prop}' expected type '${propDef.type}' but got '${actualType}'`);
390
+ }
391
+ }
392
+ }
393
+ }
394
+ }
395
+ }
396
+ catch {
397
+ errors.push('Failed to validate JSON message against schema');
398
+ }
399
+ }
400
+ validateXmlMessage(body, schema, errors) {
401
+ // Basic XML structure validation
402
+ if (!body.trim().startsWith('<')) {
403
+ errors.push('XML message must start with an opening tag');
404
+ return;
405
+ }
406
+ // Check for balanced tags
407
+ const openTags = [];
408
+ const tagRegex = /<\/?(\w+[\w:.-]*)[^>]*\/?>/g;
409
+ let match;
410
+ while ((match = tagRegex.exec(body)) !== null) {
411
+ const fullMatch = match[0];
412
+ const tagName = match[1];
413
+ if (fullMatch.endsWith('/>'))
414
+ continue;
415
+ if (fullMatch.startsWith('</')) {
416
+ if (openTags.length === 0 || openTags[openTags.length - 1] !== tagName) {
417
+ errors.push(`Mismatched closing tag: </${tagName}>`);
418
+ return;
419
+ }
420
+ openTags.pop();
421
+ }
422
+ else {
423
+ openTags.push(tagName);
424
+ }
425
+ }
426
+ if (openTags.length > 0) {
427
+ errors.push(`Unclosed XML tags: ${openTags.join(', ')}`);
428
+ }
429
+ // Validate required elements from schema (basic check)
430
+ if (schema) {
431
+ try {
432
+ const schemaDef = JSON.parse(schema);
433
+ if (schemaDef.requiredElements && Array.isArray(schemaDef.requiredElements)) {
434
+ for (const element of schemaDef.requiredElements) {
435
+ const elementRegex = new RegExp(`<(?:\\w+:)?${element}[\\s>]`, 'i');
436
+ if (!elementRegex.test(body)) {
437
+ errors.push(`Required element '${element}' is missing`);
438
+ }
439
+ }
440
+ }
441
+ }
442
+ catch {
443
+ // Schema is not JSON, skip element validation
444
+ }
445
+ }
446
+ }
447
+ validateFlatFileMessage(body, schema, errors) {
448
+ if (!body || body.trim() === '') {
449
+ errors.push('Flat file message body is empty');
450
+ return;
451
+ }
452
+ try {
453
+ const schemaDef = JSON.parse(schema);
454
+ const lines = body.split('\n');
455
+ // Validate record length if specified
456
+ if (schemaDef.recordLength && typeof schemaDef.recordLength === 'number') {
457
+ for (let i = 0; i < lines.length; i++) {
458
+ if (lines[i].length !== schemaDef.recordLength && lines[i].trim() !== '') {
459
+ errors.push(`Line ${i + 1}: expected length ${schemaDef.recordLength} but got ${lines[i].length}`);
460
+ }
461
+ }
462
+ }
463
+ // Validate minimum number of records
464
+ if (schemaDef.minRecords && typeof schemaDef.minRecords === 'number') {
465
+ const nonEmptyLines = lines.filter(l => l.trim() !== '').length;
466
+ if (nonEmptyLines < schemaDef.minRecords) {
467
+ errors.push(`Expected at least ${schemaDef.minRecords} records but found ${nonEmptyLines}`);
468
+ }
469
+ }
470
+ }
471
+ catch {
472
+ // Schema is not JSON, skip detailed validation
473
+ }
474
+ }
475
+ validateCsvMessage(body, schema, errors) {
476
+ if (!body || body.trim() === '') {
477
+ errors.push('CSV message body is empty');
478
+ return;
479
+ }
480
+ const lines = body.split('\n').filter(l => l.trim() !== '');
481
+ if (lines.length === 0) {
482
+ errors.push('CSV message contains no data rows');
483
+ return;
484
+ }
485
+ // Check for consistent column count
486
+ const delimiter = body.includes('\t') ? '\t' : ',';
487
+ const headerColumnCount = lines[0].split(delimiter).length;
488
+ for (let i = 1; i < lines.length; i++) {
489
+ const columnCount = lines[i].split(delimiter).length;
490
+ if (columnCount !== headerColumnCount) {
491
+ errors.push(`Row ${i + 1}: expected ${headerColumnCount} columns but found ${columnCount}`);
492
+ }
493
+ }
494
+ // Validate against schema if provided
495
+ try {
496
+ const schemaDef = JSON.parse(schema);
497
+ if (schemaDef.columns && Array.isArray(schemaDef.columns)) {
498
+ const headerColumns = lines[0].split(delimiter).map(c => c.trim());
499
+ for (const expectedCol of schemaDef.columns) {
500
+ if (!headerColumns.includes(expectedCol)) {
501
+ errors.push(`Expected column '${expectedCol}' not found in CSV header`);
502
+ }
503
+ }
504
+ }
505
+ }
506
+ catch {
507
+ // Schema is not JSON, skip column validation
508
+ }
509
+ }
510
+ validateEdiX12Message(body, _schema, errors) {
511
+ if (!body || body.trim() === '') {
512
+ errors.push('EDI X12 message body is empty');
513
+ return;
514
+ }
515
+ // X12 messages start with ISA (Interchange Header)
516
+ if (!body.startsWith('ISA')) {
517
+ errors.push('EDI X12 message must start with ISA segment');
518
+ }
519
+ // Check for IEA (Interchange Trailer)
520
+ if (!body.includes('IEA')) {
521
+ errors.push('EDI X12 message must contain IEA (Interchange Trailer) segment');
522
+ }
523
+ // Check for GS/GE (Functional Group)
524
+ if (!body.includes('GS')) {
525
+ errors.push('EDI X12 message must contain GS (Functional Group Header) segment');
526
+ }
527
+ if (!body.includes('GE')) {
528
+ errors.push('EDI X12 message must contain GE (Functional Group Trailer) segment');
529
+ }
530
+ // Check for ST/SE (Transaction Set)
531
+ if (!body.includes('ST')) {
532
+ errors.push('EDI X12 message must contain ST (Transaction Set Header) segment');
533
+ }
534
+ if (!body.includes('SE')) {
535
+ errors.push('EDI X12 message must contain SE (Transaction Set Trailer) segment');
536
+ }
537
+ }
538
+ validateEdifactMessage(body, _schema, errors) {
539
+ if (!body || body.trim() === '') {
540
+ errors.push('EDIFACT message body is empty');
541
+ return;
542
+ }
543
+ // EDIFACT messages start with UNB (Interchange Header)
544
+ if (!body.startsWith('UNB') && !body.startsWith('UNA')) {
545
+ errors.push('EDIFACT message must start with UNA or UNB segment');
546
+ }
547
+ // Check for UNZ (Interchange Trailer)
548
+ if (!body.includes('UNZ')) {
549
+ errors.push('EDIFACT message must contain UNZ (Interchange Trailer) segment');
550
+ }
551
+ // Check for UNH/UNT (Message Header/Trailer)
552
+ if (!body.includes('UNH')) {
553
+ errors.push('EDIFACT message must contain UNH (Message Header) segment');
554
+ }
555
+ if (!body.includes('UNT')) {
556
+ errors.push('EDIFACT message must contain UNT (Message Trailer) segment');
557
+ }
558
+ }
559
+ }
560
+ //# sourceMappingURL=message-broker-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-broker-service.js","sourceRoot":"","sources":["../../../../src/domains/enterprise-integration/services/message-broker-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Agentic QE v3 - OData Testing Service
3
+ * Parses OData metadata ($metadata), tests CRUD operations,
4
+ * and validates entity sets and navigation properties.
5
+ *
6
+ * ADR-063: Enterprise Integration Testing Gap Closure
7
+ */
8
+ import { Result } from '../../../shared/types/index.js';
9
+ import type { MemoryBackend } from '../../../kernel/interfaces.js';
10
+ import type { ODataMetadata, ODataTestResult, ODataValidationError } from '../interfaces.js';
11
+ /**
12
+ * Configuration for the OData service
13
+ */
14
+ export interface ODataServiceConfig {
15
+ /** Default OData version */
16
+ defaultVersion: 'v2' | 'v4';
17
+ /** Enable strict metadata validation */
18
+ strictValidation: boolean;
19
+ /** Cache parsed metadata */
20
+ cacheMetadata: boolean;
21
+ /** Validate navigation property targets */
22
+ validateNavigations: boolean;
23
+ /** Maximum number of entity sets to test in batch */
24
+ maxBatchSize: number;
25
+ }
26
+ /**
27
+ * OData Testing Service
28
+ * Provides metadata parsing, CRUD testing, and entity set validation
29
+ */
30
+ export declare class ODataService {
31
+ private readonly memory;
32
+ private readonly config;
33
+ private readonly metadataCache;
34
+ constructor(memory: MemoryBackend, config?: Partial<ODataServiceConfig>);
35
+ /**
36
+ * Parse OData $metadata XML document into a structured ODataMetadata object.
37
+ * Extracts entity sets, function imports, actions, and navigation properties.
38
+ */
39
+ parseMetadata(serviceUrl: string, metadataXml: string): Promise<Result<ODataMetadata>>;
40
+ /**
41
+ * Test an entity set for CRUD operation compliance.
42
+ * Validates that the entity set supports expected operations and returns valid responses.
43
+ */
44
+ testEntitySet(metadata: ODataMetadata, entitySetName: string, testData?: {
45
+ createPayload?: Record<string, unknown>;
46
+ updatePayload?: Record<string, unknown>;
47
+ queryOptions?: string;
48
+ responseData?: unknown;
49
+ responseStatusCode?: number;
50
+ }): Promise<Result<ODataTestResult>>;
51
+ /**
52
+ * Test a function import for correct parameter and return type handling.
53
+ */
54
+ testFunctionImport(metadata: ODataMetadata, functionName: string, parameters: Record<string, unknown>): Result<ODataValidationError[]>;
55
+ /**
56
+ * Clear cached metadata.
57
+ */
58
+ clearCache(): void;
59
+ private detectVersion;
60
+ private extractEntitySets;
61
+ private extractNavigationProperties;
62
+ private extractFunctionImports;
63
+ private extractFunctionParameters;
64
+ private extractActions;
65
+ private hasAnnotation;
66
+ private validateMetadataConsistency;
67
+ private validateReadCapability;
68
+ private validateQueryCapabilities;
69
+ private validateCreatePayload;
70
+ private validateUpdatePayload;
71
+ private validateNavigationProperties;
72
+ private validateResponseData;
73
+ private validateParameterType;
74
+ }
75
+ //# sourceMappingURL=odata-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odata-service.d.ts","sourceRoot":"","sources":["../../../../src/domains/enterprise-integration/services/odata-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAW,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EACV,aAAa,EAMb,eAAe,EACf,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,wCAAwC;IACxC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;;GAGG;AACH,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;gBAGpD,MAAM,EAAE,aAAa,EACtC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAS1C;;;OAGG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAwEjC;;;OAGG;IACG,aAAa,CACjB,QAAQ,EAAE,aAAa,EACvB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE;QACT,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,GACA,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAmFnC;;OAEG;IACH,kBAAkB,CAChB,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAAC,oBAAoB,EAAE,CAAC;IA6CjC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,2BAA2B;IA8CnC,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,yBAAyB;IA8BjC,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,2BAA2B;IA2CnC,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,yBAAyB;IAmEjC,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,4BAA4B;IAiCpC,OAAO,CAAC,oBAAoB;IAkD5B,OAAO,CAAC,qBAAqB;CA2E9B"}