@avi770/testteam 1.2.0 → 2.0.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 (300) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/README.md +53 -6
  3. package/agents/24-signup-onboarding-tester.ts +429 -0
  4. package/agents/25-crud-flow-tester.ts +302 -0
  5. package/agents/26-form-validator.ts +297 -0
  6. package/agents/27-search-filter-tester.ts +326 -0
  7. package/agents/28-navigation-routing-tester.ts +425 -0
  8. package/agents/29-responsive-interaction-tester.ts +350 -0
  9. package/agents/30-multi-user-scenario-tester.ts +319 -0
  10. package/agents/31-load-tester.ts +134 -0
  11. package/agents/32-memory-leak-detector.ts +194 -0
  12. package/agents/33-bundle-analyzer.ts +132 -0
  13. package/agents/34-xss-scanner.ts +191 -0
  14. package/agents/35-csrf-tester.ts +82 -0
  15. package/agents/36-auth-fuzzer.ts +194 -0
  16. package/agents/37-dependency-scanner.ts +176 -0
  17. package/agents/38-secrets-scanner.ts +137 -0
  18. package/agents/39-api-contract-tester.ts +199 -0
  19. package/agents/40-rate-limit-tester.ts +94 -0
  20. package/agents/41-api-pagination-tester.ts +97 -0
  21. package/agents/42-graphql-tester.ts +222 -0
  22. package/agents/43-data-consistency-checker.ts +205 -0
  23. package/agents/44-backup-recovery-tester.ts +152 -0
  24. package/agents/45-data-privacy-scanner.ts +125 -0
  25. package/agents/46-seo-auditor.ts +294 -0
  26. package/agents/47-social-preview-tester.ts +232 -0
  27. package/agents/48-lighthouse-auditor.ts +213 -0
  28. package/agents/49-i18n-tester.ts +198 -0
  29. package/agents/50-timezone-tester.ts +173 -0
  30. package/agents/51-error-recovery-tester.ts +155 -0
  31. package/agents/52-offline-mode-tester.ts +180 -0
  32. package/agents/53-graceful-degradation-tester.ts +156 -0
  33. package/agents/54-websocket-tester.ts +151 -0
  34. package/agents/55-realtime-sync-tester.ts +194 -0
  35. package/agents/56-file-upload-tester.ts +194 -0
  36. package/agents/57-export-tester.ts +174 -0
  37. package/agents/58-payment-flow-tester.ts +183 -0
  38. package/agents/59-ssl-tls-auditor.ts +141 -0
  39. package/agents/60-dns-cdn-tester.ts +117 -0
  40. package/agents/61-docker-health-checker.ts +111 -0
  41. package/agents/62-env-config-validator.ts +152 -0
  42. package/agents/63-log-quality-auditor.ts +136 -0
  43. package/agents/64-analytics-tracker-tester.ts +165 -0
  44. package/agents/65-gdpr-compliance-tester.ts +215 -0
  45. package/agents/66-soc2-control-validator.ts +210 -0
  46. package/agents/67-wcag-aaa-tester.ts +241 -0
  47. package/agents/68-dead-code-detector.ts +135 -0
  48. package/agents/69-type-safety-auditor.ts +164 -0
  49. package/agents/70-complexity-analyzer.ts +179 -0
  50. package/agents/__tests__/24-signup-onboarding-tester.test.ts +274 -0
  51. package/agents/__tests__/25-crud-flow-tester.test.ts +322 -0
  52. package/agents/__tests__/26-form-validator.test.ts +345 -0
  53. package/agents/__tests__/27-search-filter-tester.test.ts +311 -0
  54. package/agents/__tests__/28-navigation-routing-tester.test.ts +328 -0
  55. package/agents/__tests__/29-responsive-interaction-tester.test.ts +297 -0
  56. package/agents/__tests__/30-multi-user-scenario-tester.test.ts +328 -0
  57. package/agents/__tests__/31-load-tester.test.ts +189 -0
  58. package/agents/__tests__/32-memory-leak-detector.test.ts +251 -0
  59. package/agents/__tests__/33-bundle-analyzer.test.ts +237 -0
  60. package/agents/__tests__/34-xss-scanner.test.ts +258 -0
  61. package/agents/__tests__/35-csrf-tester.test.ts +200 -0
  62. package/agents/__tests__/36-auth-fuzzer.test.ts +214 -0
  63. package/agents/__tests__/37-dependency-scanner.test.ts +266 -0
  64. package/agents/__tests__/38-secrets-scanner.test.ts +224 -0
  65. package/agents/__tests__/39-api-contract-tester.test.ts +312 -0
  66. package/agents/__tests__/40-rate-limit-tester.test.ts +192 -0
  67. package/agents/__tests__/41-api-pagination-tester.test.ts +198 -0
  68. package/agents/__tests__/42-graphql-tester.test.ts +252 -0
  69. package/agents/__tests__/43-data-consistency-checker.test.ts +232 -0
  70. package/agents/__tests__/44-backup-recovery-tester.test.ts +222 -0
  71. package/agents/__tests__/45-data-privacy-scanner.test.ts +223 -0
  72. package/agents/__tests__/46-seo-auditor.test.ts +261 -0
  73. package/agents/__tests__/47-social-preview-tester.test.ts +245 -0
  74. package/agents/__tests__/48-lighthouse-auditor.test.ts +276 -0
  75. package/agents/__tests__/49-i18n-tester.test.ts +201 -0
  76. package/agents/__tests__/50-timezone-tester.test.ts +172 -0
  77. package/agents/__tests__/51-error-recovery-tester.test.ts +162 -0
  78. package/agents/__tests__/52-offline-mode-tester.test.ts +164 -0
  79. package/agents/__tests__/53-graceful-degradation-tester.test.ts +168 -0
  80. package/agents/__tests__/54-websocket-tester.test.ts +157 -0
  81. package/agents/__tests__/55-realtime-sync-tester.test.ts +181 -0
  82. package/agents/__tests__/56-file-upload-tester.test.ts +172 -0
  83. package/agents/__tests__/57-export-tester.test.ts +169 -0
  84. package/agents/__tests__/58-payment-flow-tester.test.ts +182 -0
  85. package/agents/__tests__/59-ssl-tls-auditor.test.ts +179 -0
  86. package/agents/__tests__/60-dns-cdn-tester.test.ts +176 -0
  87. package/agents/__tests__/61-docker-health-checker.test.ts +150 -0
  88. package/agents/__tests__/62-env-config-validator.test.ts +166 -0
  89. package/agents/__tests__/63-log-quality-auditor.test.ts +175 -0
  90. package/agents/__tests__/64-analytics-tracker-tester.test.ts +158 -0
  91. package/agents/__tests__/65-gdpr-compliance-tester.test.ts +174 -0
  92. package/agents/__tests__/66-soc2-control-validator.test.ts +183 -0
  93. package/agents/__tests__/67-wcag-aaa-tester.test.ts +190 -0
  94. package/agents/__tests__/68-dead-code-detector.test.ts +174 -0
  95. package/agents/__tests__/69-type-safety-auditor.test.ts +173 -0
  96. package/agents/__tests__/70-complexity-analyzer.test.ts +177 -0
  97. package/agents/__tests__/registry.test.ts +13 -13
  98. package/agents/registry.ts +146 -5
  99. package/core/__tests__/integration.test.ts +4 -4
  100. package/core/__tests__/orchestrator.test.ts +17 -16
  101. package/core/license.ts +208 -211
  102. package/core/orchestrator.ts +6 -4
  103. package/dist/agents/24-signup-onboarding-tester.d.ts +35 -0
  104. package/dist/agents/24-signup-onboarding-tester.d.ts.map +1 -0
  105. package/dist/agents/24-signup-onboarding-tester.js +357 -0
  106. package/dist/agents/24-signup-onboarding-tester.js.map +1 -0
  107. package/dist/agents/25-crud-flow-tester.d.ts +11 -0
  108. package/dist/agents/25-crud-flow-tester.d.ts.map +1 -0
  109. package/dist/agents/25-crud-flow-tester.js +253 -0
  110. package/dist/agents/25-crud-flow-tester.js.map +1 -0
  111. package/dist/agents/26-form-validator.d.ts +12 -0
  112. package/dist/agents/26-form-validator.d.ts.map +1 -0
  113. package/dist/agents/26-form-validator.js +257 -0
  114. package/dist/agents/26-form-validator.js.map +1 -0
  115. package/dist/agents/27-search-filter-tester.d.ts +20 -0
  116. package/dist/agents/27-search-filter-tester.d.ts.map +1 -0
  117. package/dist/agents/27-search-filter-tester.js +267 -0
  118. package/dist/agents/27-search-filter-tester.js.map +1 -0
  119. package/dist/agents/28-navigation-routing-tester.d.ts +32 -0
  120. package/dist/agents/28-navigation-routing-tester.d.ts.map +1 -0
  121. package/dist/agents/28-navigation-routing-tester.js +363 -0
  122. package/dist/agents/28-navigation-routing-tester.js.map +1 -0
  123. package/dist/agents/29-responsive-interaction-tester.d.ts +26 -0
  124. package/dist/agents/29-responsive-interaction-tester.d.ts.map +1 -0
  125. package/dist/agents/29-responsive-interaction-tester.js +272 -0
  126. package/dist/agents/29-responsive-interaction-tester.js.map +1 -0
  127. package/dist/agents/30-multi-user-scenario-tester.d.ts +24 -0
  128. package/dist/agents/30-multi-user-scenario-tester.d.ts.map +1 -0
  129. package/dist/agents/30-multi-user-scenario-tester.js +254 -0
  130. package/dist/agents/30-multi-user-scenario-tester.js.map +1 -0
  131. package/dist/agents/31-load-tester.d.ts +12 -0
  132. package/dist/agents/31-load-tester.d.ts.map +1 -0
  133. package/dist/agents/31-load-tester.js +110 -0
  134. package/dist/agents/31-load-tester.js.map +1 -0
  135. package/dist/agents/32-memory-leak-detector.d.ts +12 -0
  136. package/dist/agents/32-memory-leak-detector.d.ts.map +1 -0
  137. package/dist/agents/32-memory-leak-detector.js +167 -0
  138. package/dist/agents/32-memory-leak-detector.js.map +1 -0
  139. package/dist/agents/33-bundle-analyzer.d.ts +10 -0
  140. package/dist/agents/33-bundle-analyzer.d.ts.map +1 -0
  141. package/dist/agents/33-bundle-analyzer.js +111 -0
  142. package/dist/agents/33-bundle-analyzer.js.map +1 -0
  143. package/dist/agents/34-xss-scanner.d.ts +11 -0
  144. package/dist/agents/34-xss-scanner.d.ts.map +1 -0
  145. package/dist/agents/34-xss-scanner.js +164 -0
  146. package/dist/agents/34-xss-scanner.js.map +1 -0
  147. package/dist/agents/35-csrf-tester.d.ts +11 -0
  148. package/dist/agents/35-csrf-tester.d.ts.map +1 -0
  149. package/dist/agents/35-csrf-tester.js +70 -0
  150. package/dist/agents/35-csrf-tester.js.map +1 -0
  151. package/dist/agents/36-auth-fuzzer.d.ts +13 -0
  152. package/dist/agents/36-auth-fuzzer.d.ts.map +1 -0
  153. package/dist/agents/36-auth-fuzzer.js +163 -0
  154. package/dist/agents/36-auth-fuzzer.js.map +1 -0
  155. package/dist/agents/37-dependency-scanner.d.ts +11 -0
  156. package/dist/agents/37-dependency-scanner.d.ts.map +1 -0
  157. package/dist/agents/37-dependency-scanner.js +139 -0
  158. package/dist/agents/37-dependency-scanner.js.map +1 -0
  159. package/dist/agents/38-secrets-scanner.d.ts +11 -0
  160. package/dist/agents/38-secrets-scanner.d.ts.map +1 -0
  161. package/dist/agents/38-secrets-scanner.js +116 -0
  162. package/dist/agents/38-secrets-scanner.js.map +1 -0
  163. package/dist/agents/39-api-contract-tester.d.ts +12 -0
  164. package/dist/agents/39-api-contract-tester.d.ts.map +1 -0
  165. package/dist/agents/39-api-contract-tester.js +142 -0
  166. package/dist/agents/39-api-contract-tester.js.map +1 -0
  167. package/dist/agents/40-rate-limit-tester.d.ts +12 -0
  168. package/dist/agents/40-rate-limit-tester.d.ts.map +1 -0
  169. package/dist/agents/40-rate-limit-tester.js +79 -0
  170. package/dist/agents/40-rate-limit-tester.js.map +1 -0
  171. package/dist/agents/41-api-pagination-tester.d.ts +12 -0
  172. package/dist/agents/41-api-pagination-tester.d.ts.map +1 -0
  173. package/dist/agents/41-api-pagination-tester.js +79 -0
  174. package/dist/agents/41-api-pagination-tester.js.map +1 -0
  175. package/dist/agents/42-graphql-tester.d.ts +13 -0
  176. package/dist/agents/42-graphql-tester.d.ts.map +1 -0
  177. package/dist/agents/42-graphql-tester.js +187 -0
  178. package/dist/agents/42-graphql-tester.js.map +1 -0
  179. package/dist/agents/43-data-consistency-checker.d.ts +11 -0
  180. package/dist/agents/43-data-consistency-checker.d.ts.map +1 -0
  181. package/dist/agents/43-data-consistency-checker.js +176 -0
  182. package/dist/agents/43-data-consistency-checker.js.map +1 -0
  183. package/dist/agents/44-backup-recovery-tester.d.ts +11 -0
  184. package/dist/agents/44-backup-recovery-tester.d.ts.map +1 -0
  185. package/dist/agents/44-backup-recovery-tester.js +128 -0
  186. package/dist/agents/44-backup-recovery-tester.js.map +1 -0
  187. package/dist/agents/45-data-privacy-scanner.d.ts +11 -0
  188. package/dist/agents/45-data-privacy-scanner.d.ts.map +1 -0
  189. package/dist/agents/45-data-privacy-scanner.js +100 -0
  190. package/dist/agents/45-data-privacy-scanner.js.map +1 -0
  191. package/dist/agents/46-seo-auditor.d.ts +12 -0
  192. package/dist/agents/46-seo-auditor.d.ts.map +1 -0
  193. package/dist/agents/46-seo-auditor.js +275 -0
  194. package/dist/agents/46-seo-auditor.js.map +1 -0
  195. package/dist/agents/47-social-preview-tester.d.ts +11 -0
  196. package/dist/agents/47-social-preview-tester.d.ts.map +1 -0
  197. package/dist/agents/47-social-preview-tester.js +219 -0
  198. package/dist/agents/47-social-preview-tester.js.map +1 -0
  199. package/dist/agents/48-lighthouse-auditor.d.ts +11 -0
  200. package/dist/agents/48-lighthouse-auditor.d.ts.map +1 -0
  201. package/dist/agents/48-lighthouse-auditor.js +192 -0
  202. package/dist/agents/48-lighthouse-auditor.js.map +1 -0
  203. package/dist/agents/49-i18n-tester.d.ts +13 -0
  204. package/dist/agents/49-i18n-tester.d.ts.map +1 -0
  205. package/dist/agents/49-i18n-tester.js +172 -0
  206. package/dist/agents/49-i18n-tester.js.map +1 -0
  207. package/dist/agents/50-timezone-tester.d.ts +11 -0
  208. package/dist/agents/50-timezone-tester.d.ts.map +1 -0
  209. package/dist/agents/50-timezone-tester.js +152 -0
  210. package/dist/agents/50-timezone-tester.js.map +1 -0
  211. package/dist/agents/51-error-recovery-tester.d.ts +11 -0
  212. package/dist/agents/51-error-recovery-tester.d.ts.map +1 -0
  213. package/dist/agents/51-error-recovery-tester.js +134 -0
  214. package/dist/agents/51-error-recovery-tester.js.map +1 -0
  215. package/dist/agents/52-offline-mode-tester.d.ts +12 -0
  216. package/dist/agents/52-offline-mode-tester.d.ts.map +1 -0
  217. package/dist/agents/52-offline-mode-tester.js +161 -0
  218. package/dist/agents/52-offline-mode-tester.js.map +1 -0
  219. package/dist/agents/53-graceful-degradation-tester.d.ts +12 -0
  220. package/dist/agents/53-graceful-degradation-tester.d.ts.map +1 -0
  221. package/dist/agents/53-graceful-degradation-tester.js +130 -0
  222. package/dist/agents/53-graceful-degradation-tester.js.map +1 -0
  223. package/dist/agents/54-websocket-tester.d.ts +10 -0
  224. package/dist/agents/54-websocket-tester.d.ts.map +1 -0
  225. package/dist/agents/54-websocket-tester.js +132 -0
  226. package/dist/agents/54-websocket-tester.js.map +1 -0
  227. package/dist/agents/55-realtime-sync-tester.d.ts +11 -0
  228. package/dist/agents/55-realtime-sync-tester.d.ts.map +1 -0
  229. package/dist/agents/55-realtime-sync-tester.js +175 -0
  230. package/dist/agents/55-realtime-sync-tester.js.map +1 -0
  231. package/dist/agents/56-file-upload-tester.d.ts +12 -0
  232. package/dist/agents/56-file-upload-tester.d.ts.map +1 -0
  233. package/dist/agents/56-file-upload-tester.js +166 -0
  234. package/dist/agents/56-file-upload-tester.js.map +1 -0
  235. package/dist/agents/57-export-tester.d.ts +11 -0
  236. package/dist/agents/57-export-tester.d.ts.map +1 -0
  237. package/dist/agents/57-export-tester.js +155 -0
  238. package/dist/agents/57-export-tester.js.map +1 -0
  239. package/dist/agents/58-payment-flow-tester.d.ts +11 -0
  240. package/dist/agents/58-payment-flow-tester.d.ts.map +1 -0
  241. package/dist/agents/58-payment-flow-tester.js +159 -0
  242. package/dist/agents/58-payment-flow-tester.js.map +1 -0
  243. package/dist/agents/59-ssl-tls-auditor.d.ts +10 -0
  244. package/dist/agents/59-ssl-tls-auditor.d.ts.map +1 -0
  245. package/dist/agents/59-ssl-tls-auditor.js +132 -0
  246. package/dist/agents/59-ssl-tls-auditor.js.map +1 -0
  247. package/dist/agents/60-dns-cdn-tester.d.ts +10 -0
  248. package/dist/agents/60-dns-cdn-tester.d.ts.map +1 -0
  249. package/dist/agents/60-dns-cdn-tester.js +105 -0
  250. package/dist/agents/60-dns-cdn-tester.js.map +1 -0
  251. package/dist/agents/61-docker-health-checker.d.ts +10 -0
  252. package/dist/agents/61-docker-health-checker.d.ts.map +1 -0
  253. package/dist/agents/61-docker-health-checker.js +95 -0
  254. package/dist/agents/61-docker-health-checker.js.map +1 -0
  255. package/dist/agents/62-env-config-validator.d.ts +10 -0
  256. package/dist/agents/62-env-config-validator.d.ts.map +1 -0
  257. package/dist/agents/62-env-config-validator.js +132 -0
  258. package/dist/agents/62-env-config-validator.js.map +1 -0
  259. package/dist/agents/63-log-quality-auditor.d.ts +9 -0
  260. package/dist/agents/63-log-quality-auditor.d.ts.map +1 -0
  261. package/dist/agents/63-log-quality-auditor.js +121 -0
  262. package/dist/agents/63-log-quality-auditor.js.map +1 -0
  263. package/dist/agents/64-analytics-tracker-tester.d.ts +10 -0
  264. package/dist/agents/64-analytics-tracker-tester.d.ts.map +1 -0
  265. package/dist/agents/64-analytics-tracker-tester.js +146 -0
  266. package/dist/agents/64-analytics-tracker-tester.js.map +1 -0
  267. package/dist/agents/65-gdpr-compliance-tester.d.ts +13 -0
  268. package/dist/agents/65-gdpr-compliance-tester.d.ts.map +1 -0
  269. package/dist/agents/65-gdpr-compliance-tester.js +186 -0
  270. package/dist/agents/65-gdpr-compliance-tester.js.map +1 -0
  271. package/dist/agents/66-soc2-control-validator.d.ts +14 -0
  272. package/dist/agents/66-soc2-control-validator.d.ts.map +1 -0
  273. package/dist/agents/66-soc2-control-validator.js +178 -0
  274. package/dist/agents/66-soc2-control-validator.js.map +1 -0
  275. package/dist/agents/67-wcag-aaa-tester.d.ts +13 -0
  276. package/dist/agents/67-wcag-aaa-tester.d.ts.map +1 -0
  277. package/dist/agents/67-wcag-aaa-tester.js +207 -0
  278. package/dist/agents/67-wcag-aaa-tester.js.map +1 -0
  279. package/dist/agents/68-dead-code-detector.d.ts +9 -0
  280. package/dist/agents/68-dead-code-detector.d.ts.map +1 -0
  281. package/dist/agents/68-dead-code-detector.js +116 -0
  282. package/dist/agents/68-dead-code-detector.js.map +1 -0
  283. package/dist/agents/69-type-safety-auditor.d.ts +9 -0
  284. package/dist/agents/69-type-safety-auditor.d.ts.map +1 -0
  285. package/dist/agents/69-type-safety-auditor.js +148 -0
  286. package/dist/agents/69-type-safety-auditor.js.map +1 -0
  287. package/dist/agents/70-complexity-analyzer.d.ts +10 -0
  288. package/dist/agents/70-complexity-analyzer.d.ts.map +1 -0
  289. package/dist/agents/70-complexity-analyzer.js +154 -0
  290. package/dist/agents/70-complexity-analyzer.js.map +1 -0
  291. package/dist/agents/registry.d.ts +3 -3
  292. package/dist/agents/registry.d.ts.map +1 -1
  293. package/dist/agents/registry.js +146 -5
  294. package/dist/agents/registry.js.map +1 -1
  295. package/dist/core/license.js +2 -5
  296. package/dist/core/license.js.map +1 -1
  297. package/dist/core/orchestrator.d.ts.map +1 -1
  298. package/dist/core/orchestrator.js +6 -4
  299. package/dist/core/orchestrator.js.map +1 -1
  300. package/package.json +2 -2
@@ -0,0 +1,12 @@
1
+ import type { Finding } from '../core/types';
2
+ import { BaseAgent } from './base-agent';
3
+ export declare class FormValidatorAgent extends BaseAgent {
4
+ readonly agentId = 26;
5
+ readonly agentName = "Form Validator";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ private testModuleForms;
10
+ private testSingleForm;
11
+ }
12
+ //# sourceMappingURL=26-form-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"26-form-validator.d.ts","sourceRoot":"","sources":["../../agents/26-form-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBzC,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,oBAAoB;IACtC,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAS1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAiE/B,eAAe;YA8Df,cAAc;CAuI7B"}
@@ -0,0 +1,257 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import { resolveEnvironment } from '../helpers/env-resolver';
3
+ import { login } from '../helpers/navigation';
4
+ /** Timeout (ms) for individual form test operations. */
5
+ const OP_TIMEOUT_MS = 5_000;
6
+ /** Selectors that indicate validation error messages. */
7
+ const VALIDATION_ERROR_SELECTORS = [
8
+ '.error',
9
+ '[aria-invalid="true"]',
10
+ '.text-red',
11
+ '[class*="error"]',
12
+ '[role="alert"]',
13
+ '.field-error',
14
+ '.validation-error',
15
+ ];
16
+ export class FormValidatorAgent extends BaseAgent {
17
+ agentId = 26;
18
+ agentName = 'Form Validator';
19
+ baseUrl = '';
20
+ async preFlight() {
21
+ if (!this.config.modules || this.config.modules.length === 0) {
22
+ throw new Error('FormValidatorAgent requires at least one module in config.modules');
23
+ }
24
+ const { env } = await resolveEnvironment(this.config, this.phase);
25
+ this.baseUrl = env.baseUrl;
26
+ }
27
+ async execute() {
28
+ const findings = [];
29
+ const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
30
+ const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
31
+ const credentials = this.config.auth.credentials?.['admin'] ??
32
+ Object.values(this.config.auth.credentials ?? {})[0];
33
+ if (!credentials) {
34
+ findings.push({
35
+ id: `${this.agentId}-no-credentials`,
36
+ type: 'infra-issue',
37
+ severity: 'medium',
38
+ agentId: this.agentId,
39
+ module: 'form-validator',
40
+ description: 'No credentials configured — continuing without authentication',
41
+ });
42
+ }
43
+ const { chromium } = await import('playwright');
44
+ let browser = null;
45
+ try {
46
+ browser = await chromium.launch({ headless: true });
47
+ const page = await browser.newPage();
48
+ if (credentials) {
49
+ try {
50
+ await login(page, credentials, loginUrl);
51
+ }
52
+ catch (loginError) {
53
+ findings.push({
54
+ id: `${this.agentId}-login-failed`,
55
+ type: 'infra-issue',
56
+ severity: 'medium',
57
+ agentId: this.agentId,
58
+ module: 'form-validator',
59
+ description: `Login failed — continuing anonymously: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
60
+ });
61
+ }
62
+ }
63
+ for (const mod of this.config.modules) {
64
+ const moduleFindings = await this.testModuleForms(page, mod.id, mod.route);
65
+ findings.push(...moduleFindings);
66
+ }
67
+ await page.close().catch(() => undefined);
68
+ }
69
+ catch (playwrightError) {
70
+ findings.push({
71
+ id: `${this.agentId}-playwright-failure`,
72
+ type: 'infra-issue',
73
+ severity: 'medium',
74
+ agentId: this.agentId,
75
+ module: 'form-validator',
76
+ description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
77
+ });
78
+ }
79
+ finally {
80
+ if (browser)
81
+ await browser.close().catch(() => undefined);
82
+ }
83
+ return findings;
84
+ }
85
+ async testModuleForms(page, moduleId, moduleRoute) {
86
+ const findings = [];
87
+ const fullUrl = moduleRoute.startsWith('http')
88
+ ? moduleRoute
89
+ : `${this.baseUrl}${moduleRoute}`;
90
+ try {
91
+ await Promise.race([
92
+ page.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
93
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
94
+ ]);
95
+ }
96
+ catch {
97
+ findings.push({
98
+ id: `${this.agentId}-nav-failed-${moduleId}`,
99
+ type: 'test-bug',
100
+ severity: 'medium',
101
+ agentId: this.agentId,
102
+ module: moduleId,
103
+ description: `Failed to navigate to module ${moduleId} at ${moduleRoute}`,
104
+ });
105
+ return findings;
106
+ }
107
+ // Find all forms
108
+ let formCount = 0;
109
+ try {
110
+ formCount = await Promise.race([
111
+ page.locator('form').count(),
112
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
113
+ ]);
114
+ }
115
+ catch {
116
+ // Timeout discovering forms
117
+ }
118
+ if (formCount === 0) {
119
+ findings.push({
120
+ id: `${this.agentId}-no-forms-${moduleId}`,
121
+ type: 'test-bug',
122
+ severity: 'low',
123
+ agentId: this.agentId,
124
+ module: moduleId,
125
+ description: `No forms found in module ${moduleId}`,
126
+ });
127
+ return findings;
128
+ }
129
+ for (let formIdx = 0; formIdx < formCount; formIdx++) {
130
+ const formFindings = await this.testSingleForm(page, moduleId, formIdx);
131
+ findings.push(...formFindings);
132
+ }
133
+ return findings;
134
+ }
135
+ async testSingleForm(page, moduleId, formIndex) {
136
+ const findings = [];
137
+ const form = page.locator('form').nth(formIndex);
138
+ // Count inputs
139
+ let inputCount = 0;
140
+ try {
141
+ inputCount = await Promise.race([
142
+ form.locator('input, textarea, select').count(),
143
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
144
+ ]);
145
+ }
146
+ catch {
147
+ return findings;
148
+ }
149
+ if (inputCount === 0) {
150
+ return findings;
151
+ }
152
+ // Empty submit test: click submit without filling anything
153
+ const submitBtn = form.locator('button[type="submit"], input[type="submit"], button:has-text("Submit"), button:has-text("Save")');
154
+ let hasSubmitButton = false;
155
+ try {
156
+ hasSubmitButton = (await submitBtn.count()) > 0;
157
+ }
158
+ catch {
159
+ return findings;
160
+ }
161
+ if (!hasSubmitButton) {
162
+ return findings;
163
+ }
164
+ try {
165
+ await Promise.race([
166
+ submitBtn.first().click(),
167
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
168
+ ]);
169
+ // Wait briefly for validation errors to appear
170
+ await page.waitForTimeout(500);
171
+ // Check for validation errors
172
+ const errorSelector = VALIDATION_ERROR_SELECTORS.join(', ');
173
+ let errorCount = 0;
174
+ try {
175
+ errorCount = await page.locator(errorSelector).count();
176
+ }
177
+ catch {
178
+ // Error counting validation indicators
179
+ }
180
+ if (errorCount === 0) {
181
+ findings.push({
182
+ id: `${this.agentId}-empty-submit-${moduleId}-form${formIndex}`,
183
+ type: 'test-bug',
184
+ severity: 'high',
185
+ agentId: this.agentId,
186
+ module: moduleId,
187
+ description: `Form ${formIndex} in module ${moduleId} accepts empty submission without validation`,
188
+ });
189
+ }
190
+ }
191
+ catch (submitError) {
192
+ findings.push({
193
+ id: `${this.agentId}-submit-error-${moduleId}-form${formIndex}`,
194
+ type: 'test-bug',
195
+ severity: 'medium',
196
+ agentId: this.agentId,
197
+ module: moduleId,
198
+ description: `Form ${formIndex} submit test failed in module ${moduleId}: ${submitError instanceof Error ? submitError.message.split('\n')[0] : String(submitError)}`,
199
+ });
200
+ }
201
+ // Valid submit test: fill required inputs with test data
202
+ try {
203
+ const inputs = form.locator('input, textarea, select');
204
+ const count = await inputs.count();
205
+ for (let i = 0; i < count; i++) {
206
+ const input = inputs.nth(i);
207
+ const tagName = await input.evaluate((el) => el.tagName.toLowerCase());
208
+ const inputType = await input.getAttribute('type') ?? 'text';
209
+ if (tagName === 'select') {
210
+ // Select second option if available
211
+ const optionCount = await input.locator('option').count();
212
+ if (optionCount > 1) {
213
+ const value = await input.locator('option').nth(1).getAttribute('value');
214
+ if (value) {
215
+ await input.selectOption(value).catch(() => undefined);
216
+ }
217
+ }
218
+ }
219
+ else if (inputType === 'email') {
220
+ await input.fill('test@example.com').catch(() => undefined);
221
+ }
222
+ else if (inputType === 'number') {
223
+ await input.fill('42').catch(() => undefined);
224
+ }
225
+ else if (inputType === 'tel') {
226
+ await input.fill('+1234567890').catch(() => undefined);
227
+ }
228
+ else if (inputType === 'checkbox' || inputType === 'radio') {
229
+ await input.check().catch(() => undefined);
230
+ }
231
+ else if (tagName === 'textarea' || inputType === 'text' || inputType === 'search') {
232
+ await input.fill('Test input data').catch(() => undefined);
233
+ }
234
+ else if (inputType === 'password') {
235
+ await input.fill('TestPassword123!').catch(() => undefined);
236
+ }
237
+ }
238
+ // Submit with filled data
239
+ await Promise.race([
240
+ submitBtn.first().click(),
241
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
242
+ ]);
243
+ }
244
+ catch (validSubmitError) {
245
+ findings.push({
246
+ id: `${this.agentId}-valid-submit-error-${moduleId}-form${formIndex}`,
247
+ type: 'test-bug',
248
+ severity: 'medium',
249
+ agentId: this.agentId,
250
+ module: moduleId,
251
+ description: `Valid submission test failed for form ${formIndex} in module ${moduleId}: ${validSubmitError instanceof Error ? validSubmitError.message.split('\n')[0] : String(validSubmitError)}`,
252
+ });
253
+ }
254
+ return findings;
255
+ }
256
+ }
257
+ //# sourceMappingURL=26-form-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"26-form-validator.js","sourceRoot":"","sources":["../../agents/26-form-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Finding } from '../core/types';
2
+ import { BaseAgent } from './base-agent';
3
+ export declare class SearchFilterTesterAgent extends BaseAgent {
4
+ readonly agentId = 27;
5
+ readonly agentName = "Search & Filter Tester";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ private testModuleSearchFilter;
10
+ /**
11
+ * Test search functionality: type query, check results change,
12
+ * clear, check restore, type gibberish, check empty state.
13
+ */
14
+ private testSearch;
15
+ /**
16
+ * Test filter controls: click/select, verify list updates.
17
+ */
18
+ private testFilter;
19
+ }
20
+ //# sourceMappingURL=27-search-filter-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"27-search-filter-tester.d.ts","sourceRoot":"","sources":["../../agents/27-search-filter-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBzC,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,4BAA4B;IAC9C,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAS1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAiE/B,sBAAsB;IAiFpC;;;OAGG;YACW,UAAU;IA6ExB;;OAEG;YACW,UAAU;CAuDzB"}
@@ -0,0 +1,267 @@
1
+ import { BaseAgent } from './base-agent';
2
+ import { resolveEnvironment } from '../helpers/env-resolver';
3
+ import { login } from '../helpers/navigation';
4
+ /** Timeout (ms) for individual search/filter operations. */
5
+ const OP_TIMEOUT_MS = 5_000;
6
+ /** Selectors for search inputs. */
7
+ const SEARCH_SELECTORS = [
8
+ 'input[type="search"]',
9
+ 'input[placeholder*="search" i]',
10
+ 'input[placeholder*="find" i]',
11
+ '[data-testid*="search"]',
12
+ '[role="searchbox"]',
13
+ ];
14
+ /** Selectors for filter controls. */
15
+ const FILTER_SELECTORS = [
16
+ 'select',
17
+ '[role="combobox"]',
18
+ 'button:has-text("Filter")',
19
+ '[data-testid*="filter"]',
20
+ ];
21
+ export class SearchFilterTesterAgent extends BaseAgent {
22
+ agentId = 27;
23
+ agentName = 'Search & Filter Tester';
24
+ baseUrl = '';
25
+ async preFlight() {
26
+ if (!this.config.modules || this.config.modules.length === 0) {
27
+ throw new Error('SearchFilterTesterAgent requires at least one module in config.modules');
28
+ }
29
+ const { env } = await resolveEnvironment(this.config, this.phase);
30
+ this.baseUrl = env.baseUrl;
31
+ }
32
+ async execute() {
33
+ const findings = [];
34
+ const rawLoginUrl = this.config.auth.loginUrl ?? '/login';
35
+ const loginUrl = rawLoginUrl.startsWith('http') ? rawLoginUrl : `${this.baseUrl}${rawLoginUrl}`;
36
+ const credentials = this.config.auth.credentials?.['admin'] ??
37
+ Object.values(this.config.auth.credentials ?? {})[0];
38
+ if (!credentials) {
39
+ findings.push({
40
+ id: `${this.agentId}-no-credentials`,
41
+ type: 'infra-issue',
42
+ severity: 'medium',
43
+ agentId: this.agentId,
44
+ module: 'search-filter-tester',
45
+ description: 'No credentials configured — continuing without authentication',
46
+ });
47
+ }
48
+ const { chromium } = await import('playwright');
49
+ let browser = null;
50
+ try {
51
+ browser = await chromium.launch({ headless: true });
52
+ const page = await browser.newPage();
53
+ if (credentials) {
54
+ try {
55
+ await login(page, credentials, loginUrl);
56
+ }
57
+ catch (loginError) {
58
+ findings.push({
59
+ id: `${this.agentId}-login-failed`,
60
+ type: 'infra-issue',
61
+ severity: 'medium',
62
+ agentId: this.agentId,
63
+ module: 'search-filter-tester',
64
+ description: `Login failed — continuing anonymously: ${loginError instanceof Error ? loginError.message.split('\n')[0] : String(loginError)}`,
65
+ });
66
+ }
67
+ }
68
+ for (const mod of this.config.modules) {
69
+ const moduleFindings = await this.testModuleSearchFilter(page, mod.id, mod.route);
70
+ findings.push(...moduleFindings);
71
+ }
72
+ await page.close().catch(() => undefined);
73
+ }
74
+ catch (playwrightError) {
75
+ findings.push({
76
+ id: `${this.agentId}-playwright-failure`,
77
+ type: 'infra-issue',
78
+ severity: 'medium',
79
+ agentId: this.agentId,
80
+ module: 'search-filter-tester',
81
+ description: `Playwright execution failed: ${playwrightError instanceof Error ? playwrightError.message.split('\n')[0] : String(playwrightError)}`,
82
+ });
83
+ }
84
+ finally {
85
+ if (browser)
86
+ await browser.close().catch(() => undefined);
87
+ }
88
+ return findings;
89
+ }
90
+ async testModuleSearchFilter(page, moduleId, moduleRoute) {
91
+ const findings = [];
92
+ const fullUrl = moduleRoute.startsWith('http')
93
+ ? moduleRoute
94
+ : `${this.baseUrl}${moduleRoute}`;
95
+ try {
96
+ await Promise.race([
97
+ page.goto(fullUrl, { waitUntil: 'domcontentloaded' }),
98
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Navigation timeout')), OP_TIMEOUT_MS)),
99
+ ]);
100
+ }
101
+ catch {
102
+ findings.push({
103
+ id: `${this.agentId}-nav-failed-${moduleId}`,
104
+ type: 'test-bug',
105
+ severity: 'medium',
106
+ agentId: this.agentId,
107
+ module: moduleId,
108
+ description: `Failed to navigate to module ${moduleId} at ${moduleRoute}`,
109
+ });
110
+ return findings;
111
+ }
112
+ // Find search inputs
113
+ const searchSelector = SEARCH_SELECTORS.join(', ');
114
+ let searchCount = 0;
115
+ try {
116
+ searchCount = await Promise.race([
117
+ page.locator(searchSelector).count(),
118
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
119
+ ]);
120
+ }
121
+ catch {
122
+ // Timeout discovering search inputs
123
+ }
124
+ if (searchCount > 0) {
125
+ const searchFindings = await this.testSearch(page, moduleId);
126
+ findings.push(...searchFindings);
127
+ }
128
+ // Find filters
129
+ const filterSelector = FILTER_SELECTORS.join(', ');
130
+ let filterCount = 0;
131
+ try {
132
+ filterCount = await Promise.race([
133
+ page.locator(filterSelector).count(),
134
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
135
+ ]);
136
+ }
137
+ catch {
138
+ // Timeout discovering filters
139
+ }
140
+ if (filterCount > 0) {
141
+ const filterFindings = await this.testFilter(page, moduleId, filterCount);
142
+ findings.push(...filterFindings);
143
+ }
144
+ if (searchCount === 0 && filterCount === 0) {
145
+ findings.push({
146
+ id: `${this.agentId}-no-search-filter-${moduleId}`,
147
+ type: 'test-bug',
148
+ severity: 'low',
149
+ agentId: this.agentId,
150
+ module: moduleId,
151
+ description: `No search or filter UI found in module ${moduleId}`,
152
+ });
153
+ }
154
+ return findings;
155
+ }
156
+ /**
157
+ * Test search functionality: type query, check results change,
158
+ * clear, check restore, type gibberish, check empty state.
159
+ */
160
+ async testSearch(page, moduleId) {
161
+ const findings = [];
162
+ const searchSelector = SEARCH_SELECTORS.join(', ');
163
+ const searchInput = page.locator(searchSelector).first();
164
+ try {
165
+ // Type "test" and wait for results
166
+ await Promise.race([
167
+ searchInput.fill('test'),
168
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
169
+ ]);
170
+ await page.waitForTimeout(1000);
171
+ // Clear search
172
+ await Promise.race([
173
+ searchInput.fill(''),
174
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
175
+ ]);
176
+ await page.waitForTimeout(1000);
177
+ // Type gibberish
178
+ await Promise.race([
179
+ searchInput.fill('zzz999xxx'),
180
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
181
+ ]);
182
+ await page.waitForTimeout(1000);
183
+ // Check if results area shows content (meaning search may not be filtering)
184
+ const noResultsIndicators = await page
185
+ .locator(':text("no results"), :text("not found"), :text("no matches"), [data-testid*="empty"], .empty-state')
186
+ .count()
187
+ .catch(() => 0);
188
+ // Check if list items still exist
189
+ const listItems = await page
190
+ .locator('tr, [class*="list-item"], [class*="card"], li')
191
+ .count()
192
+ .catch(() => 0);
193
+ if (noResultsIndicators === 0 && listItems > 0) {
194
+ findings.push({
195
+ id: `${this.agentId}-search-not-filtering-${moduleId}`,
196
+ type: 'test-bug',
197
+ severity: 'medium',
198
+ agentId: this.agentId,
199
+ module: moduleId,
200
+ description: 'Search may not be filtering — gibberish query still shows list items',
201
+ });
202
+ }
203
+ // Clear search for next tests
204
+ await searchInput.fill('').catch(() => undefined);
205
+ }
206
+ catch (searchError) {
207
+ findings.push({
208
+ id: `${this.agentId}-search-error-${moduleId}`,
209
+ type: 'test-bug',
210
+ severity: 'medium',
211
+ agentId: this.agentId,
212
+ module: moduleId,
213
+ description: `Search test failed in module ${moduleId}: ${searchError instanceof Error ? searchError.message.split('\n')[0] : String(searchError)}`,
214
+ });
215
+ }
216
+ return findings;
217
+ }
218
+ /**
219
+ * Test filter controls: click/select, verify list updates.
220
+ */
221
+ async testFilter(page, moduleId, filterCount) {
222
+ const findings = [];
223
+ const filterSelector = FILTER_SELECTORS.join(', ');
224
+ try {
225
+ const firstFilter = page.locator(filterSelector).first();
226
+ const tagName = await firstFilter.evaluate((el) => el.tagName.toLowerCase()).catch(() => '');
227
+ if (tagName === 'select') {
228
+ const optionCount = await firstFilter.locator('option').count();
229
+ if (optionCount > 1) {
230
+ const value = await firstFilter.locator('option').nth(1).getAttribute('value');
231
+ if (value) {
232
+ await Promise.race([
233
+ firstFilter.selectOption(value),
234
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
235
+ ]);
236
+ }
237
+ }
238
+ }
239
+ else {
240
+ await Promise.race([
241
+ firstFilter.click(),
242
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), OP_TIMEOUT_MS)),
243
+ ]);
244
+ }
245
+ findings.push({
246
+ id: `${this.agentId}-filter-found-${moduleId}`,
247
+ type: 'infra-issue',
248
+ severity: 'info',
249
+ agentId: this.agentId,
250
+ module: moduleId,
251
+ description: `Found ${filterCount} filter control(s) in module ${moduleId}`,
252
+ });
253
+ }
254
+ catch (filterError) {
255
+ findings.push({
256
+ id: `${this.agentId}-filter-error-${moduleId}`,
257
+ type: 'test-bug',
258
+ severity: 'medium',
259
+ agentId: this.agentId,
260
+ module: moduleId,
261
+ description: `Filter test failed in module ${moduleId}: ${filterError instanceof Error ? filterError.message.split('\n')[0] : String(filterError)}`,
262
+ });
263
+ }
264
+ return findings;
265
+ }
266
+ }
267
+ //# sourceMappingURL=27-search-filter-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"27-search-filter-tester.js","sourceRoot":"","sources":["../../agents/27-search-filter-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Finding } from '../core/types';
2
+ import { BaseAgent } from './base-agent';
3
+ export declare class NavigationRoutingTesterAgent extends BaseAgent {
4
+ readonly agentId = 28;
5
+ readonly agentName = "Navigation & Routing Tester";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ /**
10
+ * Test 1: For each module with sidebarIcon: true, click its sidebar link
11
+ * and verify the URL changes and content loads.
12
+ */
13
+ private testSidebarNavigation;
14
+ /**
15
+ * Test 2: Navigate to a fake route and verify 404 handling.
16
+ */
17
+ private test404Handling;
18
+ /**
19
+ * Test 3: Open a new incognito context (no auth) and navigate to protected routes.
20
+ * Should redirect to login; if the page renders without auth, that is critical.
21
+ */
22
+ private testProtectedRoutes;
23
+ /**
24
+ * Test 4: On each module page, find internal links and verify they load.
25
+ */
26
+ private testLinkIntegrity;
27
+ /**
28
+ * Test 5: Navigate between two modules, test back/forward browser history.
29
+ */
30
+ private testBackForward;
31
+ }
32
+ //# sourceMappingURL=28-navigation-routing-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"28-navigation-routing-tester.d.ts","sourceRoot":"","sources":["../../agents/28-navigation-routing-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,qBAAa,4BAA6B,SAAQ,SAAS;IACzD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,iCAAiC;IACnD,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAW1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAoF7C;;;OAGG;YACW,qBAAqB;IA4CnC;;OAEG;YACW,eAAe;IAyD7B;;;OAGG;YACW,mBAAmB;IAwDjC;;OAEG;YACW,iBAAiB;IAiE/B;;OAEG;YACW,eAAe;CA4E9B"}