@avi770/testteam 1.2.0 → 3.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 (324) hide show
  1. package/CHANGELOG.md +53 -1
  2. package/README.md +72 -7
  3. package/agents/15-regression-sentinel.ts +3 -2
  4. package/agents/24-signup-onboarding-tester.ts +429 -0
  5. package/agents/25-crud-flow-tester.ts +302 -0
  6. package/agents/26-form-validator.ts +297 -0
  7. package/agents/27-search-filter-tester.ts +326 -0
  8. package/agents/28-navigation-routing-tester.ts +425 -0
  9. package/agents/29-responsive-interaction-tester.ts +350 -0
  10. package/agents/30-multi-user-scenario-tester.ts +319 -0
  11. package/agents/31-load-tester.ts +134 -0
  12. package/agents/32-memory-leak-detector.ts +194 -0
  13. package/agents/33-bundle-analyzer.ts +132 -0
  14. package/agents/34-xss-scanner.ts +191 -0
  15. package/agents/35-csrf-tester.ts +82 -0
  16. package/agents/36-auth-fuzzer.ts +194 -0
  17. package/agents/37-dependency-scanner.ts +176 -0
  18. package/agents/38-secrets-scanner.ts +137 -0
  19. package/agents/39-api-contract-tester.ts +199 -0
  20. package/agents/40-rate-limit-tester.ts +94 -0
  21. package/agents/41-api-pagination-tester.ts +97 -0
  22. package/agents/42-graphql-tester.ts +222 -0
  23. package/agents/43-data-consistency-checker.ts +205 -0
  24. package/agents/44-backup-recovery-tester.ts +152 -0
  25. package/agents/45-data-privacy-scanner.ts +125 -0
  26. package/agents/46-seo-auditor.ts +294 -0
  27. package/agents/47-social-preview-tester.ts +232 -0
  28. package/agents/48-lighthouse-auditor.ts +213 -0
  29. package/agents/49-i18n-tester.ts +198 -0
  30. package/agents/50-timezone-tester.ts +173 -0
  31. package/agents/51-error-recovery-tester.ts +155 -0
  32. package/agents/52-offline-mode-tester.ts +180 -0
  33. package/agents/53-graceful-degradation-tester.ts +156 -0
  34. package/agents/54-websocket-tester.ts +151 -0
  35. package/agents/55-realtime-sync-tester.ts +194 -0
  36. package/agents/56-file-upload-tester.ts +194 -0
  37. package/agents/57-export-tester.ts +174 -0
  38. package/agents/58-payment-flow-tester.ts +183 -0
  39. package/agents/59-ssl-tls-auditor.ts +141 -0
  40. package/agents/60-dns-cdn-tester.ts +117 -0
  41. package/agents/61-docker-health-checker.ts +111 -0
  42. package/agents/62-env-config-validator.ts +152 -0
  43. package/agents/63-log-quality-auditor.ts +136 -0
  44. package/agents/64-analytics-tracker-tester.ts +165 -0
  45. package/agents/65-gdpr-compliance-tester.ts +215 -0
  46. package/agents/66-soc2-control-validator.ts +210 -0
  47. package/agents/67-wcag-aaa-tester.ts +241 -0
  48. package/agents/68-dead-code-detector.ts +135 -0
  49. package/agents/69-type-safety-auditor.ts +164 -0
  50. package/agents/70-complexity-analyzer.ts +179 -0
  51. package/agents/__tests__/24-signup-onboarding-tester.test.ts +274 -0
  52. package/agents/__tests__/25-crud-flow-tester.test.ts +322 -0
  53. package/agents/__tests__/26-form-validator.test.ts +345 -0
  54. package/agents/__tests__/27-search-filter-tester.test.ts +311 -0
  55. package/agents/__tests__/28-navigation-routing-tester.test.ts +328 -0
  56. package/agents/__tests__/29-responsive-interaction-tester.test.ts +297 -0
  57. package/agents/__tests__/30-multi-user-scenario-tester.test.ts +328 -0
  58. package/agents/__tests__/31-load-tester.test.ts +189 -0
  59. package/agents/__tests__/32-memory-leak-detector.test.ts +251 -0
  60. package/agents/__tests__/33-bundle-analyzer.test.ts +237 -0
  61. package/agents/__tests__/34-xss-scanner.test.ts +258 -0
  62. package/agents/__tests__/35-csrf-tester.test.ts +200 -0
  63. package/agents/__tests__/36-auth-fuzzer.test.ts +214 -0
  64. package/agents/__tests__/37-dependency-scanner.test.ts +266 -0
  65. package/agents/__tests__/38-secrets-scanner.test.ts +224 -0
  66. package/agents/__tests__/39-api-contract-tester.test.ts +312 -0
  67. package/agents/__tests__/40-rate-limit-tester.test.ts +192 -0
  68. package/agents/__tests__/41-api-pagination-tester.test.ts +198 -0
  69. package/agents/__tests__/42-graphql-tester.test.ts +252 -0
  70. package/agents/__tests__/43-data-consistency-checker.test.ts +232 -0
  71. package/agents/__tests__/44-backup-recovery-tester.test.ts +222 -0
  72. package/agents/__tests__/45-data-privacy-scanner.test.ts +223 -0
  73. package/agents/__tests__/46-seo-auditor.test.ts +261 -0
  74. package/agents/__tests__/47-social-preview-tester.test.ts +245 -0
  75. package/agents/__tests__/48-lighthouse-auditor.test.ts +276 -0
  76. package/agents/__tests__/49-i18n-tester.test.ts +201 -0
  77. package/agents/__tests__/50-timezone-tester.test.ts +172 -0
  78. package/agents/__tests__/51-error-recovery-tester.test.ts +162 -0
  79. package/agents/__tests__/52-offline-mode-tester.test.ts +164 -0
  80. package/agents/__tests__/53-graceful-degradation-tester.test.ts +168 -0
  81. package/agents/__tests__/54-websocket-tester.test.ts +157 -0
  82. package/agents/__tests__/55-realtime-sync-tester.test.ts +181 -0
  83. package/agents/__tests__/56-file-upload-tester.test.ts +172 -0
  84. package/agents/__tests__/57-export-tester.test.ts +169 -0
  85. package/agents/__tests__/58-payment-flow-tester.test.ts +182 -0
  86. package/agents/__tests__/59-ssl-tls-auditor.test.ts +179 -0
  87. package/agents/__tests__/60-dns-cdn-tester.test.ts +176 -0
  88. package/agents/__tests__/61-docker-health-checker.test.ts +150 -0
  89. package/agents/__tests__/62-env-config-validator.test.ts +166 -0
  90. package/agents/__tests__/63-log-quality-auditor.test.ts +175 -0
  91. package/agents/__tests__/64-analytics-tracker-tester.test.ts +158 -0
  92. package/agents/__tests__/65-gdpr-compliance-tester.test.ts +174 -0
  93. package/agents/__tests__/66-soc2-control-validator.test.ts +183 -0
  94. package/agents/__tests__/67-wcag-aaa-tester.test.ts +190 -0
  95. package/agents/__tests__/68-dead-code-detector.test.ts +174 -0
  96. package/agents/__tests__/69-type-safety-auditor.test.ts +173 -0
  97. package/agents/__tests__/70-complexity-analyzer.test.ts +177 -0
  98. package/agents/__tests__/registry.test.ts +13 -13
  99. package/agents/base-agent.ts +8 -0
  100. package/agents/registry.ts +171 -28
  101. package/core/__tests__/integration.test.ts +4 -4
  102. package/core/__tests__/orchestrator.test.ts +17 -16
  103. package/core/cli.ts +128 -6
  104. package/core/license.ts +208 -211
  105. package/core/orchestrator.ts +78 -5
  106. package/dist/agents/15-regression-sentinel.d.ts +2 -1
  107. package/dist/agents/15-regression-sentinel.d.ts.map +1 -1
  108. package/dist/agents/15-regression-sentinel.js +2 -2
  109. package/dist/agents/15-regression-sentinel.js.map +1 -1
  110. package/dist/agents/24-signup-onboarding-tester.d.ts +35 -0
  111. package/dist/agents/24-signup-onboarding-tester.d.ts.map +1 -0
  112. package/dist/agents/24-signup-onboarding-tester.js +357 -0
  113. package/dist/agents/24-signup-onboarding-tester.js.map +1 -0
  114. package/dist/agents/25-crud-flow-tester.d.ts +11 -0
  115. package/dist/agents/25-crud-flow-tester.d.ts.map +1 -0
  116. package/dist/agents/25-crud-flow-tester.js +253 -0
  117. package/dist/agents/25-crud-flow-tester.js.map +1 -0
  118. package/dist/agents/26-form-validator.d.ts +12 -0
  119. package/dist/agents/26-form-validator.d.ts.map +1 -0
  120. package/dist/agents/26-form-validator.js +257 -0
  121. package/dist/agents/26-form-validator.js.map +1 -0
  122. package/dist/agents/27-search-filter-tester.d.ts +20 -0
  123. package/dist/agents/27-search-filter-tester.d.ts.map +1 -0
  124. package/dist/agents/27-search-filter-tester.js +267 -0
  125. package/dist/agents/27-search-filter-tester.js.map +1 -0
  126. package/dist/agents/28-navigation-routing-tester.d.ts +32 -0
  127. package/dist/agents/28-navigation-routing-tester.d.ts.map +1 -0
  128. package/dist/agents/28-navigation-routing-tester.js +363 -0
  129. package/dist/agents/28-navigation-routing-tester.js.map +1 -0
  130. package/dist/agents/29-responsive-interaction-tester.d.ts +26 -0
  131. package/dist/agents/29-responsive-interaction-tester.d.ts.map +1 -0
  132. package/dist/agents/29-responsive-interaction-tester.js +272 -0
  133. package/dist/agents/29-responsive-interaction-tester.js.map +1 -0
  134. package/dist/agents/30-multi-user-scenario-tester.d.ts +24 -0
  135. package/dist/agents/30-multi-user-scenario-tester.d.ts.map +1 -0
  136. package/dist/agents/30-multi-user-scenario-tester.js +254 -0
  137. package/dist/agents/30-multi-user-scenario-tester.js.map +1 -0
  138. package/dist/agents/31-load-tester.d.ts +12 -0
  139. package/dist/agents/31-load-tester.d.ts.map +1 -0
  140. package/dist/agents/31-load-tester.js +110 -0
  141. package/dist/agents/31-load-tester.js.map +1 -0
  142. package/dist/agents/32-memory-leak-detector.d.ts +12 -0
  143. package/dist/agents/32-memory-leak-detector.d.ts.map +1 -0
  144. package/dist/agents/32-memory-leak-detector.js +167 -0
  145. package/dist/agents/32-memory-leak-detector.js.map +1 -0
  146. package/dist/agents/33-bundle-analyzer.d.ts +10 -0
  147. package/dist/agents/33-bundle-analyzer.d.ts.map +1 -0
  148. package/dist/agents/33-bundle-analyzer.js +111 -0
  149. package/dist/agents/33-bundle-analyzer.js.map +1 -0
  150. package/dist/agents/34-xss-scanner.d.ts +11 -0
  151. package/dist/agents/34-xss-scanner.d.ts.map +1 -0
  152. package/dist/agents/34-xss-scanner.js +164 -0
  153. package/dist/agents/34-xss-scanner.js.map +1 -0
  154. package/dist/agents/35-csrf-tester.d.ts +11 -0
  155. package/dist/agents/35-csrf-tester.d.ts.map +1 -0
  156. package/dist/agents/35-csrf-tester.js +70 -0
  157. package/dist/agents/35-csrf-tester.js.map +1 -0
  158. package/dist/agents/36-auth-fuzzer.d.ts +13 -0
  159. package/dist/agents/36-auth-fuzzer.d.ts.map +1 -0
  160. package/dist/agents/36-auth-fuzzer.js +163 -0
  161. package/dist/agents/36-auth-fuzzer.js.map +1 -0
  162. package/dist/agents/37-dependency-scanner.d.ts +11 -0
  163. package/dist/agents/37-dependency-scanner.d.ts.map +1 -0
  164. package/dist/agents/37-dependency-scanner.js +139 -0
  165. package/dist/agents/37-dependency-scanner.js.map +1 -0
  166. package/dist/agents/38-secrets-scanner.d.ts +11 -0
  167. package/dist/agents/38-secrets-scanner.d.ts.map +1 -0
  168. package/dist/agents/38-secrets-scanner.js +116 -0
  169. package/dist/agents/38-secrets-scanner.js.map +1 -0
  170. package/dist/agents/39-api-contract-tester.d.ts +12 -0
  171. package/dist/agents/39-api-contract-tester.d.ts.map +1 -0
  172. package/dist/agents/39-api-contract-tester.js +142 -0
  173. package/dist/agents/39-api-contract-tester.js.map +1 -0
  174. package/dist/agents/40-rate-limit-tester.d.ts +12 -0
  175. package/dist/agents/40-rate-limit-tester.d.ts.map +1 -0
  176. package/dist/agents/40-rate-limit-tester.js +79 -0
  177. package/dist/agents/40-rate-limit-tester.js.map +1 -0
  178. package/dist/agents/41-api-pagination-tester.d.ts +12 -0
  179. package/dist/agents/41-api-pagination-tester.d.ts.map +1 -0
  180. package/dist/agents/41-api-pagination-tester.js +79 -0
  181. package/dist/agents/41-api-pagination-tester.js.map +1 -0
  182. package/dist/agents/42-graphql-tester.d.ts +13 -0
  183. package/dist/agents/42-graphql-tester.d.ts.map +1 -0
  184. package/dist/agents/42-graphql-tester.js +187 -0
  185. package/dist/agents/42-graphql-tester.js.map +1 -0
  186. package/dist/agents/43-data-consistency-checker.d.ts +11 -0
  187. package/dist/agents/43-data-consistency-checker.d.ts.map +1 -0
  188. package/dist/agents/43-data-consistency-checker.js +176 -0
  189. package/dist/agents/43-data-consistency-checker.js.map +1 -0
  190. package/dist/agents/44-backup-recovery-tester.d.ts +11 -0
  191. package/dist/agents/44-backup-recovery-tester.d.ts.map +1 -0
  192. package/dist/agents/44-backup-recovery-tester.js +128 -0
  193. package/dist/agents/44-backup-recovery-tester.js.map +1 -0
  194. package/dist/agents/45-data-privacy-scanner.d.ts +11 -0
  195. package/dist/agents/45-data-privacy-scanner.d.ts.map +1 -0
  196. package/dist/agents/45-data-privacy-scanner.js +100 -0
  197. package/dist/agents/45-data-privacy-scanner.js.map +1 -0
  198. package/dist/agents/46-seo-auditor.d.ts +12 -0
  199. package/dist/agents/46-seo-auditor.d.ts.map +1 -0
  200. package/dist/agents/46-seo-auditor.js +275 -0
  201. package/dist/agents/46-seo-auditor.js.map +1 -0
  202. package/dist/agents/47-social-preview-tester.d.ts +11 -0
  203. package/dist/agents/47-social-preview-tester.d.ts.map +1 -0
  204. package/dist/agents/47-social-preview-tester.js +219 -0
  205. package/dist/agents/47-social-preview-tester.js.map +1 -0
  206. package/dist/agents/48-lighthouse-auditor.d.ts +11 -0
  207. package/dist/agents/48-lighthouse-auditor.d.ts.map +1 -0
  208. package/dist/agents/48-lighthouse-auditor.js +192 -0
  209. package/dist/agents/48-lighthouse-auditor.js.map +1 -0
  210. package/dist/agents/49-i18n-tester.d.ts +13 -0
  211. package/dist/agents/49-i18n-tester.d.ts.map +1 -0
  212. package/dist/agents/49-i18n-tester.js +172 -0
  213. package/dist/agents/49-i18n-tester.js.map +1 -0
  214. package/dist/agents/50-timezone-tester.d.ts +11 -0
  215. package/dist/agents/50-timezone-tester.d.ts.map +1 -0
  216. package/dist/agents/50-timezone-tester.js +152 -0
  217. package/dist/agents/50-timezone-tester.js.map +1 -0
  218. package/dist/agents/51-error-recovery-tester.d.ts +11 -0
  219. package/dist/agents/51-error-recovery-tester.d.ts.map +1 -0
  220. package/dist/agents/51-error-recovery-tester.js +134 -0
  221. package/dist/agents/51-error-recovery-tester.js.map +1 -0
  222. package/dist/agents/52-offline-mode-tester.d.ts +12 -0
  223. package/dist/agents/52-offline-mode-tester.d.ts.map +1 -0
  224. package/dist/agents/52-offline-mode-tester.js +161 -0
  225. package/dist/agents/52-offline-mode-tester.js.map +1 -0
  226. package/dist/agents/53-graceful-degradation-tester.d.ts +12 -0
  227. package/dist/agents/53-graceful-degradation-tester.d.ts.map +1 -0
  228. package/dist/agents/53-graceful-degradation-tester.js +130 -0
  229. package/dist/agents/53-graceful-degradation-tester.js.map +1 -0
  230. package/dist/agents/54-websocket-tester.d.ts +10 -0
  231. package/dist/agents/54-websocket-tester.d.ts.map +1 -0
  232. package/dist/agents/54-websocket-tester.js +132 -0
  233. package/dist/agents/54-websocket-tester.js.map +1 -0
  234. package/dist/agents/55-realtime-sync-tester.d.ts +11 -0
  235. package/dist/agents/55-realtime-sync-tester.d.ts.map +1 -0
  236. package/dist/agents/55-realtime-sync-tester.js +175 -0
  237. package/dist/agents/55-realtime-sync-tester.js.map +1 -0
  238. package/dist/agents/56-file-upload-tester.d.ts +12 -0
  239. package/dist/agents/56-file-upload-tester.d.ts.map +1 -0
  240. package/dist/agents/56-file-upload-tester.js +166 -0
  241. package/dist/agents/56-file-upload-tester.js.map +1 -0
  242. package/dist/agents/57-export-tester.d.ts +11 -0
  243. package/dist/agents/57-export-tester.d.ts.map +1 -0
  244. package/dist/agents/57-export-tester.js +155 -0
  245. package/dist/agents/57-export-tester.js.map +1 -0
  246. package/dist/agents/58-payment-flow-tester.d.ts +11 -0
  247. package/dist/agents/58-payment-flow-tester.d.ts.map +1 -0
  248. package/dist/agents/58-payment-flow-tester.js +159 -0
  249. package/dist/agents/58-payment-flow-tester.js.map +1 -0
  250. package/dist/agents/59-ssl-tls-auditor.d.ts +10 -0
  251. package/dist/agents/59-ssl-tls-auditor.d.ts.map +1 -0
  252. package/dist/agents/59-ssl-tls-auditor.js +132 -0
  253. package/dist/agents/59-ssl-tls-auditor.js.map +1 -0
  254. package/dist/agents/60-dns-cdn-tester.d.ts +10 -0
  255. package/dist/agents/60-dns-cdn-tester.d.ts.map +1 -0
  256. package/dist/agents/60-dns-cdn-tester.js +105 -0
  257. package/dist/agents/60-dns-cdn-tester.js.map +1 -0
  258. package/dist/agents/61-docker-health-checker.d.ts +10 -0
  259. package/dist/agents/61-docker-health-checker.d.ts.map +1 -0
  260. package/dist/agents/61-docker-health-checker.js +95 -0
  261. package/dist/agents/61-docker-health-checker.js.map +1 -0
  262. package/dist/agents/62-env-config-validator.d.ts +10 -0
  263. package/dist/agents/62-env-config-validator.d.ts.map +1 -0
  264. package/dist/agents/62-env-config-validator.js +132 -0
  265. package/dist/agents/62-env-config-validator.js.map +1 -0
  266. package/dist/agents/63-log-quality-auditor.d.ts +9 -0
  267. package/dist/agents/63-log-quality-auditor.d.ts.map +1 -0
  268. package/dist/agents/63-log-quality-auditor.js +121 -0
  269. package/dist/agents/63-log-quality-auditor.js.map +1 -0
  270. package/dist/agents/64-analytics-tracker-tester.d.ts +10 -0
  271. package/dist/agents/64-analytics-tracker-tester.d.ts.map +1 -0
  272. package/dist/agents/64-analytics-tracker-tester.js +146 -0
  273. package/dist/agents/64-analytics-tracker-tester.js.map +1 -0
  274. package/dist/agents/65-gdpr-compliance-tester.d.ts +13 -0
  275. package/dist/agents/65-gdpr-compliance-tester.d.ts.map +1 -0
  276. package/dist/agents/65-gdpr-compliance-tester.js +186 -0
  277. package/dist/agents/65-gdpr-compliance-tester.js.map +1 -0
  278. package/dist/agents/66-soc2-control-validator.d.ts +14 -0
  279. package/dist/agents/66-soc2-control-validator.d.ts.map +1 -0
  280. package/dist/agents/66-soc2-control-validator.js +178 -0
  281. package/dist/agents/66-soc2-control-validator.js.map +1 -0
  282. package/dist/agents/67-wcag-aaa-tester.d.ts +13 -0
  283. package/dist/agents/67-wcag-aaa-tester.d.ts.map +1 -0
  284. package/dist/agents/67-wcag-aaa-tester.js +207 -0
  285. package/dist/agents/67-wcag-aaa-tester.js.map +1 -0
  286. package/dist/agents/68-dead-code-detector.d.ts +9 -0
  287. package/dist/agents/68-dead-code-detector.d.ts.map +1 -0
  288. package/dist/agents/68-dead-code-detector.js +116 -0
  289. package/dist/agents/68-dead-code-detector.js.map +1 -0
  290. package/dist/agents/69-type-safety-auditor.d.ts +9 -0
  291. package/dist/agents/69-type-safety-auditor.d.ts.map +1 -0
  292. package/dist/agents/69-type-safety-auditor.js +148 -0
  293. package/dist/agents/69-type-safety-auditor.js.map +1 -0
  294. package/dist/agents/70-complexity-analyzer.d.ts +10 -0
  295. package/dist/agents/70-complexity-analyzer.d.ts.map +1 -0
  296. package/dist/agents/70-complexity-analyzer.js +154 -0
  297. package/dist/agents/70-complexity-analyzer.js.map +1 -0
  298. package/dist/agents/base-agent.d.ts +3 -1
  299. package/dist/agents/base-agent.d.ts.map +1 -1
  300. package/dist/agents/base-agent.js +7 -1
  301. package/dist/agents/base-agent.js.map +1 -1
  302. package/dist/agents/registry.d.ts +5 -4
  303. package/dist/agents/registry.d.ts.map +1 -1
  304. package/dist/agents/registry.js +170 -29
  305. package/dist/agents/registry.js.map +1 -1
  306. package/dist/clients/agent-mvp.d.ts +66 -0
  307. package/dist/clients/agent-mvp.d.ts.map +1 -0
  308. package/dist/clients/agent-mvp.js +91 -0
  309. package/dist/clients/agent-mvp.js.map +1 -0
  310. package/dist/clients/total-recall.d.ts +37 -0
  311. package/dist/clients/total-recall.d.ts.map +1 -0
  312. package/dist/clients/total-recall.js +224 -0
  313. package/dist/clients/total-recall.js.map +1 -0
  314. package/dist/core/cli.d.ts +3 -0
  315. package/dist/core/cli.d.ts.map +1 -1
  316. package/dist/core/cli.js +122 -6
  317. package/dist/core/cli.js.map +1 -1
  318. package/dist/core/license.js +2 -5
  319. package/dist/core/license.js.map +1 -1
  320. package/dist/core/orchestrator.d.ts +10 -1
  321. package/dist/core/orchestrator.d.ts.map +1 -1
  322. package/dist/core/orchestrator.js +66 -5
  323. package/dist/core/orchestrator.js.map +1 -1
  324. package/package.json +2 -2
package/core/license.ts CHANGED
@@ -1,211 +1,208 @@
1
- import * as crypto from 'node:crypto';
2
- import * as fs from 'node:fs';
3
- import * as path from 'node:path';
4
-
5
- /** License tiers supported by TestTeam. */
6
- export type LicenseTier = 'free' | 'pro' | 'enterprise';
7
-
8
- /** JWT payload embedded in a TestTeam license key. */
9
- export interface LicensePayload {
10
- tier: LicenseTier;
11
- exp: number;
12
- iat: number;
13
- sub: string;
14
- maxProjects: number;
15
- maxRunsPerMonth: number;
16
- features: string[];
17
- }
18
-
19
- /** In-memory cache so we only validate once per process. */
20
- let cachedLicense: LicensePayload | null | undefined;
21
-
22
- const LICENSE_FILENAME = '.testteam-license';
23
-
24
- // ── Base64url helpers ────────────────────────────────────────────────
25
-
26
- function base64urlEncode(data: Buffer): string {
27
- return data.toString('base64url');
28
- }
29
-
30
- function base64urlDecode(str: string): Buffer {
31
- return Buffer.from(str, 'base64url');
32
- }
33
-
34
- // ── JWT helpers (ES256 / ECDSA P-256 with SHA-256) ───────────────────
35
-
36
- /**
37
- * Decode and verify a JWT signed with ES256.
38
- * Returns the payload on success or `null` on any failure
39
- * (bad format, invalid signature, expired, malformed JSON).
40
- */
41
- export function validateLicense(
42
- key: string,
43
- publicKey: string,
44
- ): LicensePayload | null {
45
- try {
46
- const parts = key.trim().split('.');
47
- if (parts.length !== 3) return null;
48
-
49
- const [headerB64, payloadB64, signatureB64] = parts;
50
-
51
- // Verify header declares ES256
52
- const header: unknown = JSON.parse(
53
- base64urlDecode(headerB64).toString('utf8'),
54
- );
55
- if (
56
- typeof header !== 'object' ||
57
- header === null ||
58
- (header as Record<string, unknown>)['alg'] !== 'ES256'
59
- ) {
60
- return null;
61
- }
62
-
63
- // Verify signature
64
- const signedContent = `${headerB64}.${payloadB64}`;
65
- const signature = base64urlDecode(signatureB64);
66
-
67
- // ES256 produces a 64-byte raw (r || s) signature.
68
- // Node.js crypto.verify expects DER encoding, so convert if raw.
69
- const derSignature = rawToDer(signature);
70
-
71
- const verifier = crypto.createVerify('SHA256');
72
- verifier.update(signedContent);
73
- const valid = verifier.verify(
74
- { key: publicKey, dsaEncoding: 'der' },
75
- derSignature,
76
- );
77
- if (!valid) return null;
78
-
79
- // Decode payload
80
- const payloadJson = base64urlDecode(payloadB64).toString('utf8');
81
- const payload: unknown = JSON.parse(payloadJson);
82
-
83
- if (!isLicensePayload(payload)) return null;
84
-
85
- // Check expiry
86
- const nowSec = Math.floor(Date.now() / 1000);
87
- if (payload.exp <= nowSec) return null;
88
-
89
- return payload;
90
- } catch {
91
- return null;
92
- }
93
- }
94
-
95
- /**
96
- * Load a license from the `.testteam-license` file in the given directory.
97
- * The file must contain the JWT on the first non-empty line.
98
- * A second non-empty line, if present, is treated as the PEM public key
99
- * (or the public key can be embedded as `TF_LICENSE_PUBLIC_KEY` env var).
100
- */
101
- export function loadLicense(configDir: string): LicensePayload | null {
102
- // Return cached result if available
103
- if (cachedLicense !== undefined) return cachedLicense;
104
-
105
- try {
106
- const filePath = path.join(configDir, LICENSE_FILENAME);
107
- if (!fs.existsSync(filePath)) {
108
- cachedLicense = null;
109
- return null;
110
- }
111
-
112
- const content = fs.readFileSync(filePath, 'utf8').trim();
113
- if (!content) {
114
- cachedLicense = null;
115
- return null;
116
- }
117
-
118
- // Split into sections separated by blank lines
119
- const sections = content.split(/\n\s*\n/);
120
- const licenseKey = sections[0].trim();
121
-
122
- // Public key: either embedded after the JWT or from env
123
- let publicKey = process.env['TF_LICENSE_PUBLIC_KEY'] ?? '';
124
- if (sections.length > 1) {
125
- publicKey = sections.slice(1).join('\n\n').trim();
126
- }
127
-
128
- if (!publicKey) {
129
- cachedLicense = null;
130
- return null;
131
- }
132
-
133
- const result = validateLicense(licenseKey, publicKey);
134
- cachedLicense = result;
135
- return result;
136
- } catch {
137
- cachedLicense = null;
138
- return null;
139
- }
140
- }
141
-
142
- /**
143
- * Get the license tier for the current project.
144
- * Falls back to `'free'` when no valid license is found.
145
- */
146
- export function getLicenseTier(configDir?: string): LicenseTier {
147
- const dir = configDir ?? process.cwd();
148
- const license = loadLicense(dir);
149
- return license?.tier ?? 'free';
150
- }
151
-
152
- /** Reset the in-memory license cache (useful for testing). */
153
- export function resetLicenseCache(): void {
154
- cachedLicense = undefined;
155
- }
156
-
157
- // ── Internal helpers ─────────────────────────────────────────────────
158
-
159
- /** Type guard for LicensePayload. */
160
- function isLicensePayload(value: unknown): value is LicensePayload {
161
- if (typeof value !== 'object' || value === null) return false;
162
- const obj = value as Record<string, unknown>;
163
-
164
- if (!['free', 'pro', 'enterprise'].includes(obj['tier'] as string)) return false;
165
- if (typeof obj['exp'] !== 'number') return false;
166
- if (typeof obj['iat'] !== 'number') return false;
167
- if (typeof obj['sub'] !== 'string') return false;
168
- if (typeof obj['maxProjects'] !== 'number') return false;
169
- if (typeof obj['maxRunsPerMonth'] !== 'number') return false;
170
- if (!Array.isArray(obj['features'])) return false;
171
- if (!obj['features'].every((f: unknown) => typeof f === 'string')) return false;
172
-
173
- return true;
174
- }
175
-
176
- /**
177
- * Convert a raw ECDSA signature (r || s, 64 bytes for P-256) to DER encoding.
178
- * If the input is already DER-encoded (starts with 0x30), return as-is.
179
- */
180
- function rawToDer(raw: Buffer): Buffer {
181
- // If already DER-encoded, return as-is
182
- if (raw.length > 0 && raw[0] === 0x30) return raw;
183
-
184
- if (raw.length !== 64) return raw; // Not a valid raw P-256 signature
185
-
186
- const r = raw.subarray(0, 32);
187
- const s = raw.subarray(32, 64);
188
-
189
- const encodeInteger = (int: Buffer): Buffer => {
190
- // Strip leading zeros but keep at least one byte
191
- let start = 0;
192
- while (start < int.length - 1 && int[start] === 0) start++;
193
- let trimmed = int.subarray(start);
194
-
195
- // If high bit is set, prepend a 0x00 byte
196
- if (trimmed[0] & 0x80) {
197
- trimmed = Buffer.concat([Buffer.from([0x00]), trimmed]);
198
- }
199
-
200
- return Buffer.concat([
201
- Buffer.from([0x02, trimmed.length]),
202
- trimmed,
203
- ]);
204
- };
205
-
206
- const rDer = encodeInteger(r);
207
- const sDer = encodeInteger(s);
208
- const body = Buffer.concat([rDer, sDer]);
209
-
210
- return Buffer.concat([Buffer.from([0x30, body.length]), body]);
211
- }
1
+ import * as crypto from 'node:crypto';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+
5
+ /** License tiers supported by TestTeam. */
6
+ export type LicenseTier = 'free' | 'pro' | 'enterprise';
7
+
8
+ /** JWT payload embedded in a TestTeam license key. */
9
+ export interface LicensePayload {
10
+ tier: LicenseTier;
11
+ exp: number;
12
+ iat: number;
13
+ sub: string;
14
+ maxProjects: number;
15
+ maxRunsPerMonth: number;
16
+ features: string[];
17
+ }
18
+
19
+ /** In-memory cache so we only validate once per process. */
20
+ let cachedLicense: LicensePayload | null | undefined;
21
+
22
+ const LICENSE_FILENAME = '.testteam-license';
23
+
24
+ // ── Base64url helpers ────────────────────────────────────────────────
25
+
26
+ function base64urlEncode(data: Buffer): string {
27
+ return data.toString('base64url');
28
+ }
29
+
30
+ function base64urlDecode(str: string): Buffer {
31
+ return Buffer.from(str, 'base64url');
32
+ }
33
+
34
+ // ── JWT helpers (ES256 / ECDSA P-256 with SHA-256) ───────────────────
35
+
36
+ /**
37
+ * Decode and verify a JWT signed with ES256.
38
+ * Returns the payload on success or `null` on any failure
39
+ * (bad format, invalid signature, expired, malformed JSON).
40
+ */
41
+ export function validateLicense(
42
+ key: string,
43
+ publicKey: string,
44
+ ): LicensePayload | null {
45
+ try {
46
+ const parts = key.trim().split('.');
47
+ if (parts.length !== 3) return null;
48
+
49
+ const [headerB64, payloadB64, signatureB64] = parts;
50
+
51
+ // Verify header declares ES256
52
+ const header: unknown = JSON.parse(
53
+ base64urlDecode(headerB64).toString('utf8'),
54
+ );
55
+ if (
56
+ typeof header !== 'object' ||
57
+ header === null ||
58
+ (header as Record<string, unknown>)['alg'] !== 'ES256'
59
+ ) {
60
+ return null;
61
+ }
62
+
63
+ // Verify signature
64
+ const signedContent = `${headerB64}.${payloadB64}`;
65
+ const signature = base64urlDecode(signatureB64);
66
+
67
+ // ES256 produces a 64-byte raw (r || s) signature.
68
+ // Node.js crypto.verify expects DER encoding, so convert if raw.
69
+ const derSignature = rawToDer(signature);
70
+
71
+ const verifier = crypto.createVerify('SHA256');
72
+ verifier.update(signedContent);
73
+ const valid = verifier.verify(
74
+ { key: publicKey, dsaEncoding: 'der' },
75
+ derSignature,
76
+ );
77
+ if (!valid) return null;
78
+
79
+ // Decode payload
80
+ const payloadJson = base64urlDecode(payloadB64).toString('utf8');
81
+ const payload: unknown = JSON.parse(payloadJson);
82
+
83
+ if (!isLicensePayload(payload)) return null;
84
+
85
+ // Check expiry
86
+ const nowSec = Math.floor(Date.now() / 1000);
87
+ if (payload.exp <= nowSec) return null;
88
+
89
+ return payload;
90
+ } catch {
91
+ return null;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Load a license from the `.testteam-license` file in the given directory.
97
+ * The file must contain the JWT on the first non-empty line.
98
+ * A second non-empty line, if present, is treated as the PEM public key
99
+ * (or the public key can be embedded as `TF_LICENSE_PUBLIC_KEY` env var).
100
+ */
101
+ export function loadLicense(configDir: string): LicensePayload | null {
102
+ // Return cached result if available
103
+ if (cachedLicense !== undefined) return cachedLicense;
104
+
105
+ try {
106
+ const filePath = path.join(configDir, LICENSE_FILENAME);
107
+ if (!fs.existsSync(filePath)) {
108
+ cachedLicense = null;
109
+ return null;
110
+ }
111
+
112
+ const content = fs.readFileSync(filePath, 'utf8').trim();
113
+ if (!content) {
114
+ cachedLicense = null;
115
+ return null;
116
+ }
117
+
118
+ // Split into sections separated by blank lines
119
+ const sections = content.split(/\n\s*\n/);
120
+ const licenseKey = sections[0].trim();
121
+
122
+ // Public key: either embedded after the JWT or from env
123
+ let publicKey = process.env['TF_LICENSE_PUBLIC_KEY'] ?? '';
124
+ if (sections.length > 1) {
125
+ publicKey = sections.slice(1).join('\n\n').trim();
126
+ }
127
+
128
+ if (!publicKey) {
129
+ cachedLicense = null;
130
+ return null;
131
+ }
132
+
133
+ const result = validateLicense(licenseKey, publicKey);
134
+ cachedLicense = result;
135
+ return result;
136
+ } catch {
137
+ cachedLicense = null;
138
+ return null;
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Get the license tier for the current project.
144
+ * Falls back to `'free'` when no valid license is found.
145
+ */
146
+ export function getLicenseTier(configDir?: string): LicenseTier {
147
+ const dir = configDir ?? process.cwd();
148
+ const license = loadLicense(dir);
149
+ return license?.tier ?? 'free';
150
+ }
151
+
152
+ /** Reset the in-memory license cache (useful for testing). */
153
+ export function resetLicenseCache(): void {
154
+ cachedLicense = undefined;
155
+ }
156
+
157
+ // ── Internal helpers ─────────────────────────────────────────────────
158
+
159
+ /** Type guard for LicensePayload. */
160
+ function isLicensePayload(value: unknown): value is LicensePayload {
161
+ if (typeof value !== 'object' || value === null) return false;
162
+ const obj = value as Record<string, unknown>;
163
+
164
+ if (!['free', 'pro', 'enterprise'].includes(obj['tier'] as string)) return false;
165
+ if (typeof obj['exp'] !== 'number') return false;
166
+ if (typeof obj['iat'] !== 'number') return false;
167
+ if (typeof obj['sub'] !== 'string') return false;
168
+ if (typeof obj['maxProjects'] !== 'number') return false;
169
+ if (typeof obj['maxRunsPerMonth'] !== 'number') return false;
170
+ if (!Array.isArray(obj['features'])) return false;
171
+ if (!obj['features'].every((f: unknown) => typeof f === 'string')) return false;
172
+
173
+ return true;
174
+ }
175
+
176
+ /**
177
+ * Convert a raw ECDSA signature (r || s, 64 bytes for P-256) to DER encoding.
178
+ * If the input is not exactly 64 bytes it is returned as-is (e.g. already DER).
179
+ */
180
+ function rawToDer(raw: Buffer): Buffer {
181
+ if (raw.length !== 64) return raw; // Not a valid raw P-256 signature; may already be DER
182
+
183
+ const r = raw.subarray(0, 32);
184
+ const s = raw.subarray(32, 64);
185
+
186
+ const encodeInteger = (int: Buffer): Buffer => {
187
+ // Strip leading zeros but keep at least one byte
188
+ let start = 0;
189
+ while (start < int.length - 1 && int[start] === 0) start++;
190
+ let trimmed = int.subarray(start);
191
+
192
+ // If high bit is set, prepend a 0x00 byte
193
+ if (trimmed[0] & 0x80) {
194
+ trimmed = Buffer.concat([Buffer.from([0x00]), trimmed]);
195
+ }
196
+
197
+ return Buffer.concat([
198
+ Buffer.from([0x02, trimmed.length]),
199
+ trimmed,
200
+ ]);
201
+ };
202
+
203
+ const rDer = encodeInteger(r);
204
+ const sDer = encodeInteger(s);
205
+ const body = Buffer.concat([rDer, sDer]);
206
+
207
+ return Buffer.concat([Buffer.from([0x30, body.length]), body]);
208
+ }
@@ -11,13 +11,14 @@ import { getLicenseTier } from './license';
11
11
  import type { LicenseTier } from './license';
12
12
  import { isAgentAvailable, getAgentTier } from '../agents/registry';
13
13
  import { agentGatedMessage, phaseGatedMessage, getAgentDisplayName } from './messages';
14
+ import type { AgentMvpClient, AgentScoreEvent } from '../clients/agent-mvp';
14
15
  import * as path from 'path';
15
16
 
16
17
  /** Agent IDs to dispatch per phase, in execution order. */
17
18
  const PHASE_DISPATCH: Record<Phase, readonly number[]> = {
18
- alpha: [1, 2, 23, 3, 4, 5],
19
- beta: [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22],
20
- uat: [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17],
19
+ alpha: [1, 2, 23, 24, 3, 4, 5, 37, 38, 62, 68, 69, 70],
20
+ beta: [5, 6, 7, 8, 12, 13, 14, 15, 16, 18, 19, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70],
21
+ uat: [5, 6, 12, 13, 14, 15, 18, 19, 20, 21, 22, 17, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70],
21
22
  release: [10],
22
23
  };
23
24
 
@@ -26,7 +27,9 @@ const PHASE_DISPATCH: Record<Phase, readonly number[]> = {
26
27
  * Agents that write data (2, 3, 5, 16) must run sequentially.
27
28
  */
28
29
  const PARALLEL_SAFE: ReadonlySet<number> = new Set([
29
- 6, 7, 8, 12, 13, 14, 15, 18, 19, 21, 22,
30
+ 6, 7, 8, 12, 13, 14, 15, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30,
31
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
32
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
30
33
  ]);
31
34
 
32
35
  /** Maximum number of fix-loop iterations per phase to prevent infinite heal/fix loops. */
@@ -64,6 +67,7 @@ export class Orchestrator {
64
67
  private readonly agents: Map<number, BaseAgent> = new Map();
65
68
  private readonly healthChecks: HealthCheck[] = [];
66
69
  private runDir: string;
70
+ private readonly agentMvpClient: AgentMvpClient | null;
67
71
 
68
72
  /**
69
73
  * License tier resolver — injectable for testing.
@@ -71,9 +75,10 @@ export class Orchestrator {
71
75
  */
72
76
  _getLicenseTier: () => LicenseTier = () => getLicenseTier();
73
77
 
74
- constructor(config: ValidatedConfig, runDir?: string) {
78
+ constructor(config: ValidatedConfig, runDir?: string, agentMvpClient?: AgentMvpClient) {
75
79
  this.config = config;
76
80
  this.runDir = runDir ?? path.join(process.cwd(), '.run', `run-${Date.now()}`);
81
+ this.agentMvpClient = agentMvpClient ?? null;
77
82
  }
78
83
 
79
84
  /** Register an agent instance for a given agent ID. */
@@ -280,6 +285,9 @@ export class Orchestrator {
280
285
  scheduledForPhase,
281
286
  );
282
287
 
288
+ // Step 7: Score agents in Agent-MVP (if connected)
289
+ await this.scoreAgentsInMvp(phase, agentResults);
290
+
283
291
  return { gate, agentResults, skippedAgents, costTracker };
284
292
  }
285
293
 
@@ -347,6 +355,71 @@ export class Orchestrator {
347
355
  }
348
356
  }
349
357
 
358
+ /**
359
+ * After a phase completes, send scoring events to Agent-MVP for each agent
360
+ * that produced results. Passed agents receive +1.0, failed agents receive -0.5.
361
+ */
362
+ private async scoreAgentsInMvp(
363
+ phase: Phase,
364
+ agentResults: Record<number, AgentResult>,
365
+ ): Promise<void> {
366
+ if (!this.agentMvpClient) return;
367
+
368
+ const events: AgentScoreEvent[] = [];
369
+
370
+ for (const [agentId, result] of Object.entries(agentResults)) {
371
+ if (result.status === 'skipped') continue;
372
+
373
+ const isPassed = result.status === 'passed';
374
+ const findingsCount = result.findings.length;
375
+ const worstSeverity = this.pickWorstSeverity(result.findings);
376
+
377
+ events.push({
378
+ agent_id: `agent-${agentId}`,
379
+ task_type: result.agentName,
380
+ outcome: isPassed ? 'success' : 'failure',
381
+ score_delta: isPassed ? 1.0 : -0.5,
382
+ phase,
383
+ findings_count: findingsCount > 0 ? findingsCount : undefined,
384
+ finding_severity: worstSeverity ?? undefined,
385
+ });
386
+ }
387
+
388
+ if (events.length > 0) {
389
+ try {
390
+ await this.agentMvpClient.scoreAgents(events);
391
+ } catch {
392
+ // Graceful -- Agent-MVP scoring is non-critical
393
+ }
394
+ }
395
+ }
396
+
397
+ /** Determine the worst (most severe) finding severity from a list. */
398
+ private pickWorstSeverity(findings: Finding[]): string | null {
399
+ if (findings.length === 0) return null;
400
+
401
+ const rank: Record<string, number> = {
402
+ critical: 5,
403
+ high: 4,
404
+ medium: 3,
405
+ low: 2,
406
+ info: 1,
407
+ };
408
+
409
+ let worst: string | null = null;
410
+ let worstRank = 0;
411
+
412
+ for (const finding of findings) {
413
+ const currentRank = rank[finding.severity] ?? 0;
414
+ if (currentRank > worstRank) {
415
+ worstRank = currentRank;
416
+ worst = finding.severity;
417
+ }
418
+ }
419
+
420
+ return worst;
421
+ }
422
+
350
423
  /** Get the run directory path. */
351
424
  getRunDir(): string {
352
425
  return this.runDir;
@@ -1,12 +1,13 @@
1
1
  import type { Finding, Phase } from '../core/types';
2
2
  import type { ValidatedConfig } from '../core/config';
3
+ import type { TotalRecallClient } from '../clients/total-recall';
3
4
  import { BaseAgent } from './base-agent';
4
5
  export declare class RegressionSentinelAgent extends BaseAgent {
5
6
  readonly agentId = 15;
6
7
  readonly agentName = "Regression Sentinel";
7
8
  /** Absolute path to the baselines directory (sibling of runDir). */
8
9
  private readonly baselinesDir;
9
- constructor(config: ValidatedConfig, phase: Phase, runDir: string);
10
+ constructor(config: ValidatedConfig, phase: Phase, runDir: string, totalRecall?: TotalRecallClient);
10
11
  protected preFlight(): Promise<void>;
11
12
  protected execute(): Promise<Finding[]>;
12
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"15-regression-sentinel.d.ts","sourceRoot":"","sources":["../../agents/15-regression-sentinel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBzC,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,yBAAyB;IAE3C,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;cAOjD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAa1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAuI7C;;;;;;;OAOG;YACW,UAAU;IAiBxB,iFAAiF;IACjF,OAAO,CAAC,WAAW;YAOL,iBAAiB;CAyFhC"}
1
+ {"version":3,"file":"15-regression-sentinel.d.ts","sourceRoot":"","sources":["../../agents/15-regression-sentinel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBzC,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,yBAAyB;IAE3C,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,iBAAiB;cAOlF,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAa1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAuI7C;;;;;;;OAOG;YACW,UAAU;IAiBxB,iFAAiF;IACjF,OAAO,CAAC,WAAW;YAOL,iBAAiB;CAyFhC"}
@@ -20,8 +20,8 @@ export class RegressionSentinelAgent extends BaseAgent {
20
20
  agentName = 'Regression Sentinel';
21
21
  /** Absolute path to the baselines directory (sibling of runDir). */
22
22
  baselinesDir;
23
- constructor(config, phase, runDir) {
24
- super(config, phase, runDir);
23
+ constructor(config, phase, runDir, totalRecall) {
24
+ super(config, phase, runDir, totalRecall);
25
25
  // Place baselines as a sibling directory to runDir
26
26
  const parentDir = join(runDir, '..');
27
27
  this.baselinesDir = join(parentDir, BASELINES_DIR_NAME);
@@ -1 +1 @@
1
- {"version":3,"file":"15-regression-sentinel.js","sourceRoot":"","sources":["../../agents/15-regression-sentinel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"15-regression-sentinel.js","sourceRoot":"","sources":["../../agents/15-regression-sentinel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Finding } from '../core/types';
2
+ import { BaseAgent } from './base-agent';
3
+ export declare class SignupOnboardingTesterAgent extends BaseAgent {
4
+ readonly agentId = 24;
5
+ readonly agentName = "Signup & Onboarding Tester";
6
+ private baseUrl;
7
+ protected preFlight(): Promise<void>;
8
+ protected execute(): Promise<Finding[]>;
9
+ /**
10
+ * Test 1: Check if a registration page exists.
11
+ * Tries config.auth.registerUrl first, then common paths.
12
+ */
13
+ private testRegistrationPage;
14
+ /**
15
+ * Test 2: Submit empty registration form and expect validation errors.
16
+ */
17
+ private testRegistrationValidation;
18
+ /**
19
+ * Test 3: Verify the login page has expected elements.
20
+ */
21
+ private testLoginPage;
22
+ /**
23
+ * Test 4: Fill credentials and submit login form.
24
+ */
25
+ private testLoginFlow;
26
+ /**
27
+ * Test 5: After login, look for onboarding/welcome/tour modals.
28
+ */
29
+ private testOnboardingDetection;
30
+ /**
31
+ * Test 6: Check if forgot-password page exists with expected elements.
32
+ */
33
+ private testForgotPassword;
34
+ }
35
+ //# sourceMappingURL=24-signup-onboarding-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"24-signup-onboarding-tester.d.ts","sourceRoot":"","sources":["../../agents/24-signup-onboarding-tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAqBzC,qBAAa,2BAA4B,SAAQ,SAAS;IACxD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,SAAS,gCAAgC;IAClD,OAAO,CAAC,OAAO,CAAM;cAEL,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;cAK1B,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAqE7C;;;OAGG;YACW,oBAAoB;IAkElC;;OAEG;YACW,0BAA0B;IAqDxC;;OAEG;YACW,aAAa;IAwD3B;;OAEG;YACW,aAAa;IA+C3B;;OAEG;YACW,uBAAuB;IAuCrC;;OAEG;YACW,kBAAkB;CA8CjC"}