@machina.ai/openapi-contract-tester 2.1.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 (431) hide show
  1. package/.env.example +91 -0
  2. package/README.md +472 -0
  3. package/dist/ai-engine/assertion-generator.d.ts +48 -0
  4. package/dist/ai-engine/assertion-generator.d.ts.map +1 -0
  5. package/dist/ai-engine/assertion-generator.js +166 -0
  6. package/dist/ai-engine/assertion-generator.js.map +1 -0
  7. package/dist/ai-engine/context-data-generator.d.ts +38 -0
  8. package/dist/ai-engine/context-data-generator.d.ts.map +1 -0
  9. package/dist/ai-engine/context-data-generator.js +146 -0
  10. package/dist/ai-engine/context-data-generator.js.map +1 -0
  11. package/dist/ai-engine/dataflow-detector.d.ts +53 -0
  12. package/dist/ai-engine/dataflow-detector.d.ts.map +1 -0
  13. package/dist/ai-engine/dataflow-detector.js +217 -0
  14. package/dist/ai-engine/dataflow-detector.js.map +1 -0
  15. package/dist/ai-engine/dependency-detector.d.ts +52 -0
  16. package/dist/ai-engine/dependency-detector.d.ts.map +1 -0
  17. package/dist/ai-engine/dependency-detector.js +241 -0
  18. package/dist/ai-engine/dependency-detector.js.map +1 -0
  19. package/dist/ai-engine/edge-case-suggester.d.ts +63 -0
  20. package/dist/ai-engine/edge-case-suggester.d.ts.map +1 -0
  21. package/dist/ai-engine/edge-case-suggester.js +177 -0
  22. package/dist/ai-engine/edge-case-suggester.js.map +1 -0
  23. package/dist/ai-engine/index.d.ts +13 -0
  24. package/dist/ai-engine/index.d.ts.map +1 -0
  25. package/dist/ai-engine/index.js +13 -0
  26. package/dist/ai-engine/index.js.map +1 -0
  27. package/dist/analyzers/ai-failure-analyzer.d.ts +41 -0
  28. package/dist/analyzers/ai-failure-analyzer.d.ts.map +1 -0
  29. package/dist/analyzers/ai-failure-analyzer.js +220 -0
  30. package/dist/analyzers/ai-failure-analyzer.js.map +1 -0
  31. package/dist/analyzers/comparison-utils.d.ts +31 -0
  32. package/dist/analyzers/comparison-utils.d.ts.map +1 -0
  33. package/dist/analyzers/comparison-utils.js +85 -0
  34. package/dist/analyzers/comparison-utils.js.map +1 -0
  35. package/dist/analyzers/context-analyzer.d.ts +49 -0
  36. package/dist/analyzers/context-analyzer.d.ts.map +1 -0
  37. package/dist/analyzers/context-analyzer.js +292 -0
  38. package/dist/analyzers/context-analyzer.js.map +1 -0
  39. package/dist/analyzers/dependency-analyzer.d.ts +44 -0
  40. package/dist/analyzers/dependency-analyzer.d.ts.map +1 -0
  41. package/dist/analyzers/dependency-analyzer.js +313 -0
  42. package/dist/analyzers/dependency-analyzer.js.map +1 -0
  43. package/dist/analyzers/failure-analyzer.d.ts +122 -0
  44. package/dist/analyzers/failure-analyzer.d.ts.map +1 -0
  45. package/dist/analyzers/failure-analyzer.js +140 -0
  46. package/dist/analyzers/failure-analyzer.js.map +1 -0
  47. package/dist/analyzers/failure-detectors/index.d.ts +33 -0
  48. package/dist/analyzers/failure-detectors/index.d.ts.map +1 -0
  49. package/dist/analyzers/failure-detectors/index.js +164 -0
  50. package/dist/analyzers/failure-detectors/index.js.map +1 -0
  51. package/dist/analyzers/failure-discrepancy-correlator.d.ts +111 -0
  52. package/dist/analyzers/failure-discrepancy-correlator.d.ts.map +1 -0
  53. package/dist/analyzers/failure-discrepancy-correlator.js +202 -0
  54. package/dist/analyzers/failure-discrepancy-correlator.js.map +1 -0
  55. package/dist/analyzers/index.d.ts +10 -0
  56. package/dist/analyzers/index.d.ts.map +1 -0
  57. package/dist/analyzers/index.js +10 -0
  58. package/dist/analyzers/index.js.map +1 -0
  59. package/dist/analyzers/semantic-matcher.d.ts +123 -0
  60. package/dist/analyzers/semantic-matcher.d.ts.map +1 -0
  61. package/dist/analyzers/semantic-matcher.js +297 -0
  62. package/dist/analyzers/semantic-matcher.js.map +1 -0
  63. package/dist/analyzers/source-comparator.d.ts +177 -0
  64. package/dist/analyzers/source-comparator.d.ts.map +1 -0
  65. package/dist/analyzers/source-comparator.js +225 -0
  66. package/dist/analyzers/source-comparator.js.map +1 -0
  67. package/dist/business-rules/business-rules-analyzer.d.ts +44 -0
  68. package/dist/business-rules/business-rules-analyzer.d.ts.map +1 -0
  69. package/dist/business-rules/business-rules-analyzer.js +363 -0
  70. package/dist/business-rules/business-rules-analyzer.js.map +1 -0
  71. package/dist/business-rules/business-rules-generator.d.ts +78 -0
  72. package/dist/business-rules/business-rules-generator.d.ts.map +1 -0
  73. package/dist/business-rules/business-rules-generator.js +357 -0
  74. package/dist/business-rules/business-rules-generator.js.map +1 -0
  75. package/dist/business-rules/extractors/rule-extractors.d.ts +50 -0
  76. package/dist/business-rules/extractors/rule-extractors.d.ts.map +1 -0
  77. package/dist/business-rules/extractors/rule-extractors.js +189 -0
  78. package/dist/business-rules/extractors/rule-extractors.js.map +1 -0
  79. package/dist/business-rules/value-generators.d.ts +70 -0
  80. package/dist/business-rules/value-generators.d.ts.map +1 -0
  81. package/dist/business-rules/value-generators.js +142 -0
  82. package/dist/business-rules/value-generators.js.map +1 -0
  83. package/dist/executor/auth-providers/auth-header-builder.d.ts +16 -0
  84. package/dist/executor/auth-providers/auth-header-builder.d.ts.map +1 -0
  85. package/dist/executor/auth-providers/auth-header-builder.js +47 -0
  86. package/dist/executor/auth-providers/auth-header-builder.js.map +1 -0
  87. package/dist/executor/auth-providers/oauth2-provider.d.ts +19 -0
  88. package/dist/executor/auth-providers/oauth2-provider.d.ts.map +1 -0
  89. package/dist/executor/auth-providers/oauth2-provider.js +114 -0
  90. package/dist/executor/auth-providers/oauth2-provider.js.map +1 -0
  91. package/dist/executor/http-client.d.ts +133 -0
  92. package/dist/executor/http-client.d.ts.map +1 -0
  93. package/dist/executor/http-client.js +172 -0
  94. package/dist/executor/http-client.js.map +1 -0
  95. package/dist/executor/http-request-builder.d.ts +69 -0
  96. package/dist/executor/http-request-builder.d.ts.map +1 -0
  97. package/dist/executor/http-request-builder.js +140 -0
  98. package/dist/executor/http-request-builder.js.map +1 -0
  99. package/dist/executor/http-response-parser.d.ts +28 -0
  100. package/dist/executor/http-response-parser.d.ts.map +1 -0
  101. package/dist/executor/http-response-parser.js +74 -0
  102. package/dist/executor/http-response-parser.js.map +1 -0
  103. package/dist/executor/response-handler.d.ts +66 -0
  104. package/dist/executor/response-handler.d.ts.map +1 -0
  105. package/dist/executor/response-handler.js +135 -0
  106. package/dist/executor/response-handler.js.map +1 -0
  107. package/dist/executor/result-processor.d.ts +27 -0
  108. package/dist/executor/result-processor.d.ts.map +1 -0
  109. package/dist/executor/result-processor.js +140 -0
  110. package/dist/executor/result-processor.js.map +1 -0
  111. package/dist/executor/result-utils.d.ts +21 -0
  112. package/dist/executor/result-utils.d.ts.map +1 -0
  113. package/dist/executor/result-utils.js +29 -0
  114. package/dist/executor/result-utils.js.map +1 -0
  115. package/dist/executor/test-executor.d.ts +49 -0
  116. package/dist/executor/test-executor.d.ts.map +1 -0
  117. package/dist/executor/test-executor.js +226 -0
  118. package/dist/executor/test-executor.js.map +1 -0
  119. package/dist/executor/test-runner.d.ts +85 -0
  120. package/dist/executor/test-runner.d.ts.map +1 -0
  121. package/dist/executor/test-runner.js +177 -0
  122. package/dist/executor/test-runner.js.map +1 -0
  123. package/dist/executor/token-detector/index.d.ts +7 -0
  124. package/dist/executor/token-detector/index.d.ts.map +1 -0
  125. package/dist/executor/token-detector/index.js +7 -0
  126. package/dist/executor/token-detector/index.js.map +1 -0
  127. package/dist/executor/token-detector/token-detector.d.ts +64 -0
  128. package/dist/executor/token-detector/token-detector.d.ts.map +1 -0
  129. package/dist/executor/token-detector/token-detector.js +140 -0
  130. package/dist/executor/token-detector/token-detector.js.map +1 -0
  131. package/dist/generators/business-rule-from-stories-generator.d.ts +30 -0
  132. package/dist/generators/business-rule-from-stories-generator.d.ts.map +1 -0
  133. package/dist/generators/business-rule-from-stories-generator.js +227 -0
  134. package/dist/generators/business-rule-from-stories-generator.js.map +1 -0
  135. package/dist/generators/data/ai-data-generator.d.ts +23 -0
  136. package/dist/generators/data/ai-data-generator.d.ts.map +1 -0
  137. package/dist/generators/data/ai-data-generator.js +41 -0
  138. package/dist/generators/data/ai-data-generator.js.map +1 -0
  139. package/dist/generators/data/base-generator.d.ts +121 -0
  140. package/dist/generators/data/base-generator.d.ts.map +1 -0
  141. package/dist/generators/data/base-generator.js +200 -0
  142. package/dist/generators/data/base-generator.js.map +1 -0
  143. package/dist/generators/data/heuristic-data-generator.d.ts +28 -0
  144. package/dist/generators/data/heuristic-data-generator.d.ts.map +1 -0
  145. package/dist/generators/data/heuristic-data-generator.js +49 -0
  146. package/dist/generators/data/heuristic-data-generator.js.map +1 -0
  147. package/dist/generators/data/index.d.ts +48 -0
  148. package/dist/generators/data/index.d.ts.map +1 -0
  149. package/dist/generators/data/index.js +201 -0
  150. package/dist/generators/data/index.js.map +1 -0
  151. package/dist/generators/data/schema-walker.d.ts +45 -0
  152. package/dist/generators/data/schema-walker.d.ts.map +1 -0
  153. package/dist/generators/data/schema-walker.js +103 -0
  154. package/dist/generators/data/schema-walker.js.map +1 -0
  155. package/dist/generators/data/type-strategies.d.ts +79 -0
  156. package/dist/generators/data/type-strategies.d.ts.map +1 -0
  157. package/dist/generators/data/type-strategies.js +394 -0
  158. package/dist/generators/data/type-strategies.js.map +1 -0
  159. package/dist/generators/data-generator.d.ts +11 -0
  160. package/dist/generators/data-generator.d.ts.map +1 -0
  161. package/dist/generators/data-generator.js +11 -0
  162. package/dist/generators/data-generator.js.map +1 -0
  163. package/dist/generators/edge-case-generator.d.ts +55 -0
  164. package/dist/generators/edge-case-generator.d.ts.map +1 -0
  165. package/dist/generators/edge-case-generator.js +327 -0
  166. package/dist/generators/edge-case-generator.js.map +1 -0
  167. package/dist/generators/edge-cases/boundary-analyzer.d.ts +26 -0
  168. package/dist/generators/edge-cases/boundary-analyzer.d.ts.map +1 -0
  169. package/dist/generators/edge-cases/boundary-analyzer.js +95 -0
  170. package/dist/generators/edge-cases/boundary-analyzer.js.map +1 -0
  171. package/dist/generators/error-case-generator.d.ts +11 -0
  172. package/dist/generators/error-case-generator.d.ts.map +1 -0
  173. package/dist/generators/error-case-generator.js +11 -0
  174. package/dist/generators/error-case-generator.js.map +1 -0
  175. package/dist/generators/errors/auth-error-strategy.d.ts +36 -0
  176. package/dist/generators/errors/auth-error-strategy.d.ts.map +1 -0
  177. package/dist/generators/errors/auth-error-strategy.js +118 -0
  178. package/dist/generators/errors/auth-error-strategy.js.map +1 -0
  179. package/dist/generators/errors/business-error-strategy.d.ts +44 -0
  180. package/dist/generators/errors/business-error-strategy.d.ts.map +1 -0
  181. package/dist/generators/errors/business-error-strategy.js +152 -0
  182. package/dist/generators/errors/business-error-strategy.js.map +1 -0
  183. package/dist/generators/errors/error-strategy-factory.d.ts +27 -0
  184. package/dist/generators/errors/error-strategy-factory.d.ts.map +1 -0
  185. package/dist/generators/errors/error-strategy-factory.js +47 -0
  186. package/dist/generators/errors/error-strategy-factory.js.map +1 -0
  187. package/dist/generators/errors/error-strategy.d.ts +62 -0
  188. package/dist/generators/errors/error-strategy.d.ts.map +1 -0
  189. package/dist/generators/errors/error-strategy.js +69 -0
  190. package/dist/generators/errors/error-strategy.js.map +1 -0
  191. package/dist/generators/errors/index.d.ts +23 -0
  192. package/dist/generators/errors/index.d.ts.map +1 -0
  193. package/dist/generators/errors/index.js +73 -0
  194. package/dist/generators/errors/index.js.map +1 -0
  195. package/dist/generators/errors/validation-error-strategy.d.ts +25 -0
  196. package/dist/generators/errors/validation-error-strategy.d.ts.map +1 -0
  197. package/dist/generators/errors/validation-error-strategy.js +214 -0
  198. package/dist/generators/errors/validation-error-strategy.js.map +1 -0
  199. package/dist/generators/happy-path-generator.d.ts +93 -0
  200. package/dist/generators/happy-path-generator.d.ts.map +1 -0
  201. package/dist/generators/happy-path-generator.js +275 -0
  202. package/dist/generators/happy-path-generator.js.map +1 -0
  203. package/dist/generators/test-enricher.d.ts +44 -0
  204. package/dist/generators/test-enricher.d.ts.map +1 -0
  205. package/dist/generators/test-enricher.js +109 -0
  206. package/dist/generators/test-enricher.js.map +1 -0
  207. package/dist/index.d.ts +9 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +14 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/llm/ai-cache.d.ts +123 -0
  212. package/dist/llm/ai-cache.d.ts.map +1 -0
  213. package/dist/llm/ai-cache.js +220 -0
  214. package/dist/llm/ai-cache.js.map +1 -0
  215. package/dist/llm/ai-client.d.ts +92 -0
  216. package/dist/llm/ai-client.d.ts.map +1 -0
  217. package/dist/llm/ai-client.js +386 -0
  218. package/dist/llm/ai-client.js.map +1 -0
  219. package/dist/llm/data-generator-ai.d.ts +84 -0
  220. package/dist/llm/data-generator-ai.d.ts.map +1 -0
  221. package/dist/llm/data-generator-ai.js +284 -0
  222. package/dist/llm/data-generator-ai.js.map +1 -0
  223. package/dist/llm/index.d.ts +7 -0
  224. package/dist/llm/index.d.ts.map +1 -0
  225. package/dist/llm/index.js +7 -0
  226. package/dist/llm/index.js.map +1 -0
  227. package/dist/mcp/handlers/base-handler.d.ts +72 -0
  228. package/dist/mcp/handlers/base-handler.d.ts.map +1 -0
  229. package/dist/mcp/handlers/base-handler.js +86 -0
  230. package/dist/mcp/handlers/base-handler.js.map +1 -0
  231. package/dist/mcp/handlers/compare-sources.d.ts +91 -0
  232. package/dist/mcp/handlers/compare-sources.d.ts.map +1 -0
  233. package/dist/mcp/handlers/compare-sources.js +182 -0
  234. package/dist/mcp/handlers/compare-sources.js.map +1 -0
  235. package/dist/mcp/handlers/export-results.d.ts +53 -0
  236. package/dist/mcp/handlers/export-results.d.ts.map +1 -0
  237. package/dist/mcp/handlers/export-results.js +132 -0
  238. package/dist/mcp/handlers/export-results.js.map +1 -0
  239. package/dist/mcp/handlers/export-to-postman.d.ts +65 -0
  240. package/dist/mcp/handlers/export-to-postman.d.ts.map +1 -0
  241. package/dist/mcp/handlers/export-to-postman.js +128 -0
  242. package/dist/mcp/handlers/export-to-postman.js.map +1 -0
  243. package/dist/mcp/handlers/generate-tests.d.ts +74 -0
  244. package/dist/mcp/handlers/generate-tests.d.ts.map +1 -0
  245. package/dist/mcp/handlers/generate-tests.js +519 -0
  246. package/dist/mcp/handlers/generate-tests.js.map +1 -0
  247. package/dist/mcp/handlers/index.d.ts +13 -0
  248. package/dist/mcp/handlers/index.d.ts.map +1 -0
  249. package/dist/mcp/handlers/index.js +12 -0
  250. package/dist/mcp/handlers/index.js.map +1 -0
  251. package/dist/mcp/handlers/run-tests.d.ts +89 -0
  252. package/dist/mcp/handlers/run-tests.d.ts.map +1 -0
  253. package/dist/mcp/handlers/run-tests.js +233 -0
  254. package/dist/mcp/handlers/run-tests.js.map +1 -0
  255. package/dist/mcp/handlers/types.d.ts +61 -0
  256. package/dist/mcp/handlers/types.d.ts.map +1 -0
  257. package/dist/mcp/handlers/types.js +9 -0
  258. package/dist/mcp/handlers/types.js.map +1 -0
  259. package/dist/mcp/server.d.ts +64 -0
  260. package/dist/mcp/server.d.ts.map +1 -0
  261. package/dist/mcp/server.js +200 -0
  262. package/dist/mcp/server.js.map +1 -0
  263. package/dist/mcp/services/file-service.d.ts +66 -0
  264. package/dist/mcp/services/file-service.d.ts.map +1 -0
  265. package/dist/mcp/services/file-service.js +143 -0
  266. package/dist/mcp/services/file-service.js.map +1 -0
  267. package/dist/mcp/services/llm-service.d.ts +70 -0
  268. package/dist/mcp/services/llm-service.d.ts.map +1 -0
  269. package/dist/mcp/services/llm-service.js +189 -0
  270. package/dist/mcp/services/llm-service.js.map +1 -0
  271. package/dist/mcp/services/postman-service.d.ts +128 -0
  272. package/dist/mcp/services/postman-service.d.ts.map +1 -0
  273. package/dist/mcp/services/postman-service.js +266 -0
  274. package/dist/mcp/services/postman-service.js.map +1 -0
  275. package/dist/mcp/services/report-service.d.ts +81 -0
  276. package/dist/mcp/services/report-service.d.ts.map +1 -0
  277. package/dist/mcp/services/report-service.js +210 -0
  278. package/dist/mcp/services/report-service.js.map +1 -0
  279. package/dist/mcp/services/spec-service.d.ts +58 -0
  280. package/dist/mcp/services/spec-service.d.ts.map +1 -0
  281. package/dist/mcp/services/spec-service.js +140 -0
  282. package/dist/mcp/services/spec-service.js.map +1 -0
  283. package/dist/parsers/endpoint-extractor.d.ts +32 -0
  284. package/dist/parsers/endpoint-extractor.d.ts.map +1 -0
  285. package/dist/parsers/endpoint-extractor.js +160 -0
  286. package/dist/parsers/endpoint-extractor.js.map +1 -0
  287. package/dist/parsers/openapi-parser.d.ts +120 -0
  288. package/dist/parsers/openapi-parser.d.ts.map +1 -0
  289. package/dist/parsers/openapi-parser.js +257 -0
  290. package/dist/parsers/openapi-parser.js.map +1 -0
  291. package/dist/parsers/visitors/auth-visitor.d.ts +28 -0
  292. package/dist/parsers/visitors/auth-visitor.d.ts.map +1 -0
  293. package/dist/parsers/visitors/auth-visitor.js +116 -0
  294. package/dist/parsers/visitors/auth-visitor.js.map +1 -0
  295. package/dist/prd/index.d.ts +10 -0
  296. package/dist/prd/index.d.ts.map +1 -0
  297. package/dist/prd/index.js +10 -0
  298. package/dist/prd/index.js.map +1 -0
  299. package/dist/prd/prd-reader.d.ts +124 -0
  300. package/dist/prd/prd-reader.d.ts.map +1 -0
  301. package/dist/prd/prd-reader.js +308 -0
  302. package/dist/prd/prd-reader.js.map +1 -0
  303. package/dist/prd/prd-storage.d.ts +232 -0
  304. package/dist/prd/prd-storage.d.ts.map +1 -0
  305. package/dist/prd/prd-storage.js +129 -0
  306. package/dist/prd/prd-storage.js.map +1 -0
  307. package/dist/repairers/test-auto-repairer.d.ts +61 -0
  308. package/dist/repairers/test-auto-repairer.d.ts.map +1 -0
  309. package/dist/repairers/test-auto-repairer.js +213 -0
  310. package/dist/repairers/test-auto-repairer.js.map +1 -0
  311. package/dist/reporters/comparison-report-generator.d.ts +58 -0
  312. package/dist/reporters/comparison-report-generator.d.ts.map +1 -0
  313. package/dist/reporters/comparison-report-generator.js +369 -0
  314. package/dist/reporters/comparison-report-generator.js.map +1 -0
  315. package/dist/reporters/gherkin-formatter.d.ts +34 -0
  316. package/dist/reporters/gherkin-formatter.d.ts.map +1 -0
  317. package/dist/reporters/gherkin-formatter.js +231 -0
  318. package/dist/reporters/gherkin-formatter.js.map +1 -0
  319. package/dist/reporters/html-report-generator.d.ts +174 -0
  320. package/dist/reporters/html-report-generator.d.ts.map +1 -0
  321. package/dist/reporters/html-report-generator.js +194 -0
  322. package/dist/reporters/html-report-generator.js.map +1 -0
  323. package/dist/reporters/report-charts.d.ts +23 -0
  324. package/dist/reporters/report-charts.d.ts.map +1 -0
  325. package/dist/reporters/report-charts.js +182 -0
  326. package/dist/reporters/report-charts.js.map +1 -0
  327. package/dist/reporters/report-sections.d.ts +34 -0
  328. package/dist/reporters/report-sections.d.ts.map +1 -0
  329. package/dist/reporters/report-sections.js +481 -0
  330. package/dist/reporters/report-sections.js.map +1 -0
  331. package/dist/reporters/report-styles.d.ts +12 -0
  332. package/dist/reporters/report-styles.d.ts.map +1 -0
  333. package/dist/reporters/report-styles.js +412 -0
  334. package/dist/reporters/report-styles.js.map +1 -0
  335. package/dist/reporters/report-test-details.d.ts +56 -0
  336. package/dist/reporters/report-test-details.d.ts.map +1 -0
  337. package/dist/reporters/report-test-details.js +328 -0
  338. package/dist/reporters/report-test-details.js.map +1 -0
  339. package/dist/reporters/report-utils.d.ts +40 -0
  340. package/dist/reporters/report-utils.d.ts.map +1 -0
  341. package/dist/reporters/report-utils.js +163 -0
  342. package/dist/reporters/report-utils.js.map +1 -0
  343. package/dist/types/ai-config.d.ts +63 -0
  344. package/dist/types/ai-config.d.ts.map +1 -0
  345. package/dist/types/ai-config.js +79 -0
  346. package/dist/types/ai-config.js.map +1 -0
  347. package/dist/types/business-rules.d.ts +235 -0
  348. package/dist/types/business-rules.d.ts.map +1 -0
  349. package/dist/types/business-rules.js +6 -0
  350. package/dist/types/business-rules.js.map +1 -0
  351. package/dist/types/config.d.ts +106 -0
  352. package/dist/types/config.d.ts.map +1 -0
  353. package/dist/types/config.js +6 -0
  354. package/dist/types/config.js.map +1 -0
  355. package/dist/types/core.d.ts +72 -0
  356. package/dist/types/core.d.ts.map +1 -0
  357. package/dist/types/core.js +6 -0
  358. package/dist/types/core.js.map +1 -0
  359. package/dist/types/index.d.ts +17 -0
  360. package/dist/types/index.d.ts.map +1 -0
  361. package/dist/types/index.js +10 -0
  362. package/dist/types/index.js.map +1 -0
  363. package/dist/types/openapi.d.ts +139 -0
  364. package/dist/types/openapi.d.ts.map +1 -0
  365. package/dist/types/openapi.js +6 -0
  366. package/dist/types/openapi.js.map +1 -0
  367. package/dist/types/pact.d.ts +101 -0
  368. package/dist/types/pact.d.ts.map +1 -0
  369. package/dist/types/pact.js +6 -0
  370. package/dist/types/pact.js.map +1 -0
  371. package/dist/types/reporting.d.ts +93 -0
  372. package/dist/types/reporting.d.ts.map +1 -0
  373. package/dist/types/reporting.js +6 -0
  374. package/dist/types/reporting.js.map +1 -0
  375. package/dist/types/test-case.d.ts +233 -0
  376. package/dist/types/test-case.d.ts.map +1 -0
  377. package/dist/types/test-case.js +6 -0
  378. package/dist/types/test-case.js.map +1 -0
  379. package/dist/types/test-execution.d.ts +80 -0
  380. package/dist/types/test-execution.d.ts.map +1 -0
  381. package/dist/types/test-execution.js +6 -0
  382. package/dist/types/test-execution.js.map +1 -0
  383. package/dist/utils/auth-generator.d.ts +30 -0
  384. package/dist/utils/auth-generator.d.ts.map +1 -0
  385. package/dist/utils/auth-generator.js +68 -0
  386. package/dist/utils/auth-generator.js.map +1 -0
  387. package/dist/utils/config.d.ts +181 -0
  388. package/dist/utils/config.d.ts.map +1 -0
  389. package/dist/utils/config.js +141 -0
  390. package/dist/utils/config.js.map +1 -0
  391. package/dist/utils/coverage-calculator.d.ts +81 -0
  392. package/dist/utils/coverage-calculator.d.ts.map +1 -0
  393. package/dist/utils/coverage-calculator.js +134 -0
  394. package/dist/utils/coverage-calculator.js.map +1 -0
  395. package/dist/utils/data-loader.d.ts +52 -0
  396. package/dist/utils/data-loader.d.ts.map +1 -0
  397. package/dist/utils/data-loader.js +192 -0
  398. package/dist/utils/data-loader.js.map +1 -0
  399. package/dist/utils/errors.d.ts +167 -0
  400. package/dist/utils/errors.d.ts.map +1 -0
  401. package/dist/utils/errors.js +257 -0
  402. package/dist/utils/errors.js.map +1 -0
  403. package/dist/utils/logger.d.ts +220 -0
  404. package/dist/utils/logger.d.ts.map +1 -0
  405. package/dist/utils/logger.js +325 -0
  406. package/dist/utils/logger.js.map +1 -0
  407. package/dist/utils/openapi-discovery.d.ts +31 -0
  408. package/dist/utils/openapi-discovery.d.ts.map +1 -0
  409. package/dist/utils/openapi-discovery.js +322 -0
  410. package/dist/utils/openapi-discovery.js.map +1 -0
  411. package/dist/utils/path-resolver.d.ts +101 -0
  412. package/dist/utils/path-resolver.d.ts.map +1 -0
  413. package/dist/utils/path-resolver.js +167 -0
  414. package/dist/utils/path-resolver.js.map +1 -0
  415. package/dist/utils/resilience.d.ts +181 -0
  416. package/dist/utils/resilience.d.ts.map +1 -0
  417. package/dist/utils/resilience.js +269 -0
  418. package/dist/utils/resilience.js.map +1 -0
  419. package/dist/validators/openapi-validator.d.ts +198 -0
  420. package/dist/validators/openapi-validator.d.ts.map +1 -0
  421. package/dist/validators/openapi-validator.js +349 -0
  422. package/dist/validators/openapi-validator.js.map +1 -0
  423. package/dist/validators/response-matcher.d.ts +84 -0
  424. package/dist/validators/response-matcher.d.ts.map +1 -0
  425. package/dist/validators/response-matcher.js +234 -0
  426. package/dist/validators/response-matcher.js.map +1 -0
  427. package/dist/validators/schema-validator.d.ts +174 -0
  428. package/dist/validators/schema-validator.d.ts.map +1 -0
  429. package/dist/validators/schema-validator.js +340 -0
  430. package/dist/validators/schema-validator.js.map +1 -0
  431. package/package.json +76 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Assertion Generator - Smart business logic assertions
3
+ *
4
+ * Generates intelligent assertions beyond schema validation.
5
+ * Validates business rules like date consistency, logical constraints, state transitions.
6
+ *
7
+ * @module ai-engine/assertion-generator
8
+ */
9
+ import { createLogger } from '../utils/logger.js';
10
+ import { callLLM } from '../llm/ai-client.js';
11
+ const log = createLogger('assertion-generator');
12
+ /**
13
+ * Generates smart assertions for a test
14
+ *
15
+ * @param method - HTTP method
16
+ * @param path - Endpoint path
17
+ * @param responseSchema - Response schema
18
+ * @param apiContext - API context
19
+ * @param aiConfig - AI configuration
20
+ * @returns Array of assertions
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const assertions = await generateAssertions('GET', '/users/{id}', schema, context, config);
25
+ * // Returns:
26
+ * // [
27
+ * // { description: 'createdAt before updatedAt', path: 'createdAt', type: 'lessThan', expected: 'updatedAt' },
28
+ * // { description: 'email format valid', path: 'email', type: 'matches', expected: /^.+@.+$/ }
29
+ * // ]
30
+ * ```
31
+ */
32
+ export async function generateAssertions(method, path, responseSchema, apiContext, aiConfig) {
33
+ if (!aiConfig.capabilities.smartAssertions || !responseSchema) {
34
+ return [];
35
+ }
36
+ // Heuristic assertions (always include)
37
+ const heuristicAssertions = generateHeuristicAssertions(responseSchema);
38
+ // AI-powered assertions (if enabled)
39
+ if (aiConfig.level === 'smart' || aiConfig.level === 'advanced') {
40
+ try {
41
+ const aiAssertions = await generateAIAssertions(method, path, responseSchema, apiContext, aiConfig);
42
+ return [...heuristicAssertions, ...aiAssertions];
43
+ }
44
+ catch (error) {
45
+ log.warn('AI assertion generation failed', {
46
+ error: error instanceof Error ? error.message : String(error)
47
+ });
48
+ }
49
+ }
50
+ return heuristicAssertions;
51
+ }
52
+ /**
53
+ * Generates heuristic assertions based on schema
54
+ */
55
+ function generateHeuristicAssertions(schema) {
56
+ const assertions = [];
57
+ const properties = schema.properties || {};
58
+ // Date consistency assertions
59
+ if ('createdAt' in properties && 'updatedAt' in properties) {
60
+ assertions.push({
61
+ description: 'createdAt should be before or equal to updatedAt',
62
+ path: 'createdAt',
63
+ type: 'custom',
64
+ expression: 'new Date(value.createdAt) <= new Date(value.updatedAt)'
65
+ });
66
+ }
67
+ // Status enum validation
68
+ for (const [key, prop] of Object.entries(properties)) {
69
+ const propSchema = prop;
70
+ if (propSchema.enum && propSchema.enum.length > 0) {
71
+ assertions.push({
72
+ description: `${key} should be one of valid values`,
73
+ path: key,
74
+ type: 'custom',
75
+ expression: `[${propSchema.enum.map(v => JSON.stringify(v)).join(',')}].includes(value.${key})`
76
+ });
77
+ }
78
+ }
79
+ // Email format
80
+ for (const [key, prop] of Object.entries(properties)) {
81
+ const propSchema = prop;
82
+ if (propSchema.format === 'email' || key.toLowerCase().includes('email')) {
83
+ assertions.push({
84
+ description: `${key} should be valid email format`,
85
+ path: key,
86
+ type: 'matches',
87
+ expected: '^[^@]+@[^@]+\\.[^@]+$'
88
+ });
89
+ }
90
+ }
91
+ // Positive numbers for amounts, prices, etc.
92
+ for (const [key, prop] of Object.entries(properties)) {
93
+ const propSchema = prop;
94
+ if ((propSchema.type === 'number' || propSchema.type === 'integer') &&
95
+ (key.toLowerCase().includes('price') ||
96
+ key.toLowerCase().includes('amount') ||
97
+ key.toLowerCase().includes('cost'))) {
98
+ assertions.push({
99
+ description: `${key} should be positive`,
100
+ path: key,
101
+ type: 'greaterThan',
102
+ expected: 0
103
+ });
104
+ }
105
+ }
106
+ return assertions;
107
+ }
108
+ /**
109
+ * Generates AI-powered assertions
110
+ */
111
+ async function generateAIAssertions(method, path, responseSchema, apiContext, aiConfig) {
112
+ const fields = Object.entries(responseSchema.properties || {}).map(([name, prop]) => {
113
+ const propSchema = prop;
114
+ return {
115
+ name,
116
+ type: propSchema.type,
117
+ format: propSchema.format,
118
+ description: propSchema.description
119
+ };
120
+ });
121
+ const prompt = `Generate smart business logic assertions for this API response.
122
+
123
+ ENDPOINT: ${method} ${path}
124
+ DOMAIN: ${apiContext.domain || 'unknown'}
125
+ RESPONSE FIELDS: ${JSON.stringify(fields, null, 2)}
126
+
127
+ GENERATE ASSERTIONS FOR:
128
+ 1. Business logic constraints (e.g., startDate < endDate)
129
+ 2. State validity (e.g., status transitions make sense)
130
+ 3. Data consistency (e.g., totals match sums)
131
+ 4. Referential integrity (e.g., IDs exist)
132
+
133
+ Return JSON array:
134
+ [
135
+ {
136
+ "description": "assertion description",
137
+ "path": "field.path",
138
+ "type": "lessThan",
139
+ "expected": "otherField"
140
+ }
141
+ ]
142
+
143
+ Types: equals, notEquals, greaterThan, lessThan, contains, matches, custom
144
+ For custom, provide "expression" instead of "expected".
145
+
146
+ Respond with JSON array only.`;
147
+ const result = await callLLM(prompt, aiConfig.llm);
148
+ if (!result.success || !result.text) {
149
+ return [];
150
+ }
151
+ try {
152
+ const text = result.text.trim();
153
+ const jsonMatch = text.match(/\[[\s\S]*?\]/);
154
+ if (!jsonMatch)
155
+ return [];
156
+ const assertions = JSON.parse(jsonMatch[0]);
157
+ return assertions.filter((a) => a.description && a.path && a.type);
158
+ }
159
+ catch (error) {
160
+ log.warn('Failed to parse AI assertions', {
161
+ error: error instanceof Error ? error.message : String(error)
162
+ });
163
+ return [];
164
+ }
165
+ }
166
+ //# sourceMappingURL=assertion-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion-generator.js","sourceRoot":"","sources":["../../src/ai-engine/assertion-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Context Data Generator - AI-powered contextual test data generation
3
+ *
4
+ * Generates realistic test data based on API domain context instead of random faker data.
5
+ * For example: banking APIs get realistic account numbers, healthcare APIs get medical codes.
6
+ *
7
+ * @module ai-engine/context-data-generator
8
+ */
9
+ import type { OpenAPIV3 } from 'openapi-types';
10
+ import type { AIConfig } from '../types/ai-config.js';
11
+ import type { APIContext } from '../analyzers/context-analyzer.js';
12
+ /**
13
+ * Generates contextual test data using AI
14
+ *
15
+ * @param schema - OpenAPI schema object
16
+ * @param apiContext - Detected API context (domain, industry, etc.)
17
+ * @param aiConfig - AI configuration
18
+ * @param realData - Optional real data to merge
19
+ * @returns Generated data object
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const data = await generateContextualData(schema, { domain: 'banking' }, aiConfig);
24
+ * // Returns: { accountNumber: "1234567890", amount: 1000.50, currency: "USD" }
25
+ * // Instead of: { accountNumber: "xyz123", amount: 42, currency: "abc" }
26
+ * ```
27
+ */
28
+ export declare function generateContextualData(schema: OpenAPIV3.SchemaObject, apiContext: APIContext, aiConfig: AIConfig, realData?: Record<string, unknown>): Promise<any>;
29
+ /**
30
+ * Generates contextual data for multiple schemas (batch)
31
+ *
32
+ * More efficient when generating data for many endpoints
33
+ */
34
+ export declare function generateContextualDataBatch(schemas: Array<{
35
+ id: string;
36
+ schema: OpenAPIV3.SchemaObject;
37
+ }>, apiContext: APIContext, aiConfig: AIConfig): Promise<Record<string, any>>;
38
+ //# sourceMappingURL=context-data-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-data-generator.d.ts","sourceRoot":"","sources":["../../src/ai-engine/context-data-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAOnE;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,CAAC,YAAY,EAC9B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,GAAG,CAAC,CA8Bd;AA+ED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAA;CAAE,CAAC,EAC9D,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAmB9B"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Context Data Generator - AI-powered contextual test data generation
3
+ *
4
+ * Generates realistic test data based on API domain context instead of random faker data.
5
+ * For example: banking APIs get realistic account numbers, healthcare APIs get medical codes.
6
+ *
7
+ * @module ai-engine/context-data-generator
8
+ */
9
+ import { createLogger } from '../utils/logger.js';
10
+ import { callLLM } from '../llm/ai-client.js';
11
+ import { generateDataFromSchemaSync } from '../generators/data-generator.js';
12
+ const log = createLogger('context-data-generator');
13
+ /**
14
+ * Generates contextual test data using AI
15
+ *
16
+ * @param schema - OpenAPI schema object
17
+ * @param apiContext - Detected API context (domain, industry, etc.)
18
+ * @param aiConfig - AI configuration
19
+ * @param realData - Optional real data to merge
20
+ * @returns Generated data object
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const data = await generateContextualData(schema, { domain: 'banking' }, aiConfig);
25
+ * // Returns: { accountNumber: "1234567890", amount: 1000.50, currency: "USD" }
26
+ * // Instead of: { accountNumber: "xyz123", amount: 42, currency: "abc" }
27
+ * ```
28
+ */
29
+ export async function generateContextualData(schema, apiContext, aiConfig, realData) {
30
+ // If AI disabled, use standard faker
31
+ if (!aiConfig.capabilities.contextualData || aiConfig.level === 'off') {
32
+ return generateDataFromSchemaSync(schema, { realData });
33
+ }
34
+ // Merge real data first
35
+ if (realData && Object.keys(realData).length > 0) {
36
+ const fakerData = generateDataFromSchemaSync(schema, { realData });
37
+ return fakerData; // Real data takes precedence
38
+ }
39
+ try {
40
+ // Use AI for contextual generation
41
+ const aiData = await generateWithAI(schema, apiContext, aiConfig);
42
+ if (aiData) {
43
+ log.debug('Generated contextual data with AI', {
44
+ domain: apiContext.domain,
45
+ fields: Object.keys(aiData)
46
+ });
47
+ return aiData;
48
+ }
49
+ }
50
+ catch (error) {
51
+ log.warn('AI data generation failed, falling back to faker', {
52
+ error: error instanceof Error ? error.message : String(error)
53
+ });
54
+ }
55
+ // Fallback to faker
56
+ return generateDataFromSchemaSync(schema, { realData });
57
+ }
58
+ /**
59
+ * Generates data using AI based on context
60
+ */
61
+ async function generateWithAI(schema, apiContext, aiConfig) {
62
+ // Extract field information
63
+ const fields = Object.entries(schema.properties || {}).map(([name, prop]) => {
64
+ const propSchema = prop;
65
+ return {
66
+ name,
67
+ type: propSchema.type,
68
+ format: propSchema.format,
69
+ example: propSchema.example,
70
+ description: propSchema.description
71
+ };
72
+ });
73
+ const required = schema.required || [];
74
+ const prompt = `Generate realistic test data for a ${apiContext.domain || 'general'} API.
75
+
76
+ CONTEXT:
77
+ - Domain: ${apiContext.domain || 'unknown'}
78
+ - Industry: ${apiContext.industry || 'unknown'}
79
+ - Entity Types: ${apiContext.entityTypes?.join(', ') || 'unknown'}
80
+
81
+ FIELDS TO GENERATE:
82
+ ${JSON.stringify(fields, null, 2)}
83
+
84
+ REQUIRED FIELDS: ${required.join(', ')}
85
+
86
+ INSTRUCTIONS:
87
+ 1. Generate data that makes sense for ${apiContext.domain} domain
88
+ 2. Use realistic values (e.g., for banking: real account number formats)
89
+ 3. Respect field types and formats
90
+ 4. Include all required fields
91
+ 5. Make values consistent (e.g., email domain matches company context)
92
+
93
+ Return ONLY valid JSON object with field values, no markdown:
94
+ { "field1": "value1", "field2": "value2" }`;
95
+ const result = await callLLM(prompt, {
96
+ ...aiConfig.llm,
97
+ maxTokens: 1024,
98
+ temperature: 0.5 // Higher temp for more varied data
99
+ });
100
+ if (!result.success || !result.text) {
101
+ return null;
102
+ }
103
+ try {
104
+ const text = result.text.trim();
105
+ const jsonMatch = text.match(/\{[\s\S]*?\}/);
106
+ if (!jsonMatch)
107
+ return null;
108
+ const data = JSON.parse(jsonMatch[0]);
109
+ // Validate generated data has required fields
110
+ const missingRequired = required.filter(f => !(f in data));
111
+ if (missingRequired.length > 0) {
112
+ log.warn('AI generated data missing required fields', { missingRequired });
113
+ return null;
114
+ }
115
+ return data;
116
+ }
117
+ catch (error) {
118
+ log.warn('Failed to parse AI generated data', {
119
+ error: error instanceof Error ? error.message : String(error)
120
+ });
121
+ return null;
122
+ }
123
+ }
124
+ /**
125
+ * Generates contextual data for multiple schemas (batch)
126
+ *
127
+ * More efficient when generating data for many endpoints
128
+ */
129
+ export async function generateContextualDataBatch(schemas, apiContext, aiConfig) {
130
+ const results = {};
131
+ // Generate in parallel (with rate limiting)
132
+ const batchSize = 3;
133
+ for (let i = 0; i < schemas.length; i += batchSize) {
134
+ const batch = schemas.slice(i, i + batchSize);
135
+ const promises = batch.map(async ({ id, schema }) => {
136
+ const data = await generateContextualData(schema, apiContext, aiConfig);
137
+ return { id, data };
138
+ });
139
+ const batchResults = await Promise.all(promises);
140
+ for (const { id, data } of batchResults) {
141
+ results[id] = data;
142
+ }
143
+ }
144
+ return results;
145
+ }
146
+ //# sourceMappingURL=context-data-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-data-generator.js","sourceRoot":"","sources":["../../src/ai-engine/context-data-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * DataFlow Detector - Automatic data flow detection
3
+ *
4
+ * Automatically detects data flows between tests (extract from responses, inject into requests).
5
+ * Identifies patterns like token extraction from login and injection into protected endpoints.
6
+ *
7
+ * @module ai-engine/dataflow-detector
8
+ */
9
+ import type { TestCase } from '../types/index.js';
10
+ import type { AIConfig } from '../types/ai-config.js';
11
+ /**
12
+ * Data flow configuration for a test
13
+ */
14
+ export interface DataFlowConfig {
15
+ /** Variables to extract from response */
16
+ extract?: Record<string, string>;
17
+ /** Variables to inject into request */
18
+ inject?: Record<string, string>;
19
+ }
20
+ /**
21
+ * Detects data flows between tests automatically
22
+ *
23
+ * @param tests - Array of test cases
24
+ * @param dependencies - Test dependencies
25
+ * @param aiConfig - AI configuration
26
+ * @returns Data flow map (testId -> flow config)
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const flows = await detectDataFlows(tests, deps, aiConfig);
31
+ * // Returns:
32
+ * // {
33
+ * // "login": { extract: { "token": "body.access_token" } },
34
+ * // "get-profile": { inject: { "token": "header.Authorization:Bearer {value}" } }
35
+ * // }
36
+ * ```
37
+ */
38
+ export declare function detectDataFlows(tests: TestCase[], dependencies: Record<string, string[]>, aiConfig: AIConfig): Promise<Record<string, DataFlowConfig>>;
39
+ /**
40
+ * Detects data flows using heuristic rules
41
+ *
42
+ * Rules:
43
+ * 1. Auth endpoints extract tokens
44
+ * 2. Protected endpoints inject tokens from auth
45
+ * 3. POST endpoints extract IDs
46
+ * 4. GET/PUT/DELETE endpoints inject IDs from POST
47
+ *
48
+ * @param tests - Array of test cases
49
+ * @param dependencies - Test dependencies
50
+ * @returns Data flow map
51
+ */
52
+ export declare function detectHeuristicDataFlows(tests: TestCase[], dependencies: Record<string, string[]>): Record<string, DataFlowConfig>;
53
+ //# sourceMappingURL=dataflow-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataflow-detector.d.ts","sourceRoot":"","sources":["../../src/ai-engine/dataflow-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMtD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EAAE,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACtC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CA+BzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,EAAE,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAuEhC"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * DataFlow Detector - Automatic data flow detection
3
+ *
4
+ * Automatically detects data flows between tests (extract from responses, inject into requests).
5
+ * Identifies patterns like token extraction from login and injection into protected endpoints.
6
+ *
7
+ * @module ai-engine/dataflow-detector
8
+ */
9
+ import { createLogger } from '../utils/logger.js';
10
+ import { callLLM } from '../llm/ai-client.js';
11
+ const log = createLogger('dataflow-detector');
12
+ /**
13
+ * Detects data flows between tests automatically
14
+ *
15
+ * @param tests - Array of test cases
16
+ * @param dependencies - Test dependencies
17
+ * @param aiConfig - AI configuration
18
+ * @returns Data flow map (testId -> flow config)
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const flows = await detectDataFlows(tests, deps, aiConfig);
23
+ * // Returns:
24
+ * // {
25
+ * // "login": { extract: { "token": "body.access_token" } },
26
+ * // "get-profile": { inject: { "token": "header.Authorization:Bearer {value}" } }
27
+ * // }
28
+ * ```
29
+ */
30
+ export async function detectDataFlows(tests, dependencies, aiConfig) {
31
+ log.info('Detecting data flows', {
32
+ testCount: tests.length,
33
+ aiLevel: aiConfig.level
34
+ });
35
+ // Always use heuristic detection (free, fast, reliable)
36
+ const heuristicFlows = detectHeuristicDataFlows(tests, dependencies);
37
+ log.info('Heuristic data flows detected', {
38
+ count: Object.keys(heuristicFlows).length
39
+ });
40
+ // If AI capabilities enabled, enhance with AI detection
41
+ if (aiConfig.capabilities.autoDataFlow && aiConfig.level !== 'off') {
42
+ try {
43
+ const aiFlows = await detectAIDataFlows(tests, dependencies, aiConfig);
44
+ log.info('AI data flows detected', {
45
+ count: Object.keys(aiFlows).length
46
+ });
47
+ // Merge: heuristic takes precedence
48
+ return { ...aiFlows, ...heuristicFlows };
49
+ }
50
+ catch (error) {
51
+ log.warn('AI data flow detection failed, using heuristics only', {
52
+ error: error instanceof Error ? error.message : String(error)
53
+ });
54
+ }
55
+ }
56
+ return heuristicFlows;
57
+ }
58
+ /**
59
+ * Detects data flows using heuristic rules
60
+ *
61
+ * Rules:
62
+ * 1. Auth endpoints extract tokens
63
+ * 2. Protected endpoints inject tokens from auth
64
+ * 3. POST endpoints extract IDs
65
+ * 4. GET/PUT/DELETE endpoints inject IDs from POST
66
+ *
67
+ * @param tests - Array of test cases
68
+ * @param dependencies - Test dependencies
69
+ * @returns Data flow map
70
+ */
71
+ export function detectHeuristicDataFlows(tests, dependencies) {
72
+ const flows = {};
73
+ // Find auth/login test
74
+ const authTest = tests.find(t => t.method === 'POST' &&
75
+ t.category === 'happy-path' &&
76
+ (t.path.includes('login') ||
77
+ t.path.includes('auth') ||
78
+ t.path.includes('token') ||
79
+ t.path.includes('oauth')));
80
+ // Rule 1: Auth test extracts token
81
+ if (authTest) {
82
+ flows[authTest.id] = {
83
+ extract: {
84
+ token: 'body.access_token',
85
+ // Also try common token field names
86
+ ...(detectTokenFieldFromPath(authTest.path))
87
+ }
88
+ };
89
+ }
90
+ // Rule 2: Protected tests inject token
91
+ for (const test of tests) {
92
+ if (test.requiresAuth && authTest && test.id !== authTest.id) {
93
+ flows[test.id] = flows[test.id] || {};
94
+ flows[test.id].inject = {
95
+ token: 'header.Authorization:Bearer {value}',
96
+ ...(flows[test.id].inject || {})
97
+ };
98
+ }
99
+ }
100
+ // Rules 3-4: Resource ID flows
101
+ for (const test of tests) {
102
+ if (test.category !== 'happy-path')
103
+ continue;
104
+ // Rule 3: POST extracts resource ID
105
+ if (test.method === 'POST' && !test.path.includes('{')) {
106
+ const resourceName = extractResourceName(test.path);
107
+ if (resourceName) {
108
+ flows[test.id] = flows[test.id] || {};
109
+ flows[test.id].extract = {
110
+ [`${resourceName}Id`]: `body.id`,
111
+ ...(flows[test.id].extract || {})
112
+ };
113
+ }
114
+ }
115
+ // Rule 4: GET/PUT/DELETE inject ID
116
+ if ((test.method === 'GET' || test.method === 'PUT' || test.method === 'DELETE') &&
117
+ test.path.includes('{')) {
118
+ const deps = dependencies[test.id] || [];
119
+ const createTest = tests.find(t => deps.includes(t.id) && t.method === 'POST');
120
+ if (createTest) {
121
+ const resourceName = extractResourceName(createTest.path);
122
+ if (resourceName) {
123
+ flows[test.id] = flows[test.id] || {};
124
+ flows[test.id].inject = {
125
+ [`${resourceName}Id`]: `path:${test.path}`,
126
+ ...(flows[test.id].inject || {})
127
+ };
128
+ }
129
+ }
130
+ }
131
+ }
132
+ return flows;
133
+ }
134
+ /**
135
+ * Detects data flows using AI
136
+ *
137
+ * @param tests - Array of test cases
138
+ * @param dependencies - Test dependencies
139
+ * @param aiConfig - AI configuration
140
+ * @returns Data flow map
141
+ */
142
+ async function detectAIDataFlows(tests, dependencies, aiConfig) {
143
+ const testSummary = tests.map(t => ({
144
+ id: t.id,
145
+ method: t.method,
146
+ path: t.path,
147
+ requiresAuth: t.requiresAuth,
148
+ dependencies: dependencies[t.id] || []
149
+ }));
150
+ const prompt = `Analyze these API tests and identify data flows (extract/inject patterns).
151
+
152
+ TESTS:
153
+ ${JSON.stringify(testSummary, null, 2)}
154
+
155
+ PATTERNS TO DETECT:
156
+ 1. Login/Auth: extract token, inject into protected endpoints
157
+ 2. Resource creation: extract ID, inject into read/update/delete
158
+ 3. Nested resources: extract parent ID, inject into child operations
159
+
160
+ Return ONLY JSON:
161
+ {
162
+ "dataFlows": {
163
+ "test-id": {
164
+ "extract": { "varName": "body.path.to.value" },
165
+ "inject": { "varName": "header.Name:format" }
166
+ }
167
+ }
168
+ }
169
+
170
+ Respond with JSON only.`;
171
+ const result = await callLLM(prompt, aiConfig.llm);
172
+ if (!result.success || !result.text) {
173
+ return {};
174
+ }
175
+ try {
176
+ const text = result.text.trim();
177
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
178
+ if (!jsonMatch)
179
+ return {};
180
+ const parsed = JSON.parse(jsonMatch[0]);
181
+ return parsed.dataFlows || {};
182
+ }
183
+ catch (error) {
184
+ log.warn('Failed to parse AI data flows response', {
185
+ error: error instanceof Error ? error.message : String(error)
186
+ });
187
+ return {};
188
+ }
189
+ }
190
+ /**
191
+ * Detects token field name from auth endpoint path
192
+ */
193
+ function detectTokenFieldFromPath(path) {
194
+ if (path.includes('oauth')) {
195
+ return {
196
+ refreshToken: 'body.refresh_token',
197
+ expiresIn: 'body.expires_in'
198
+ };
199
+ }
200
+ return {};
201
+ }
202
+ /**
203
+ * Extracts resource name from path
204
+ *
205
+ * @example
206
+ * extractResourceName('/users') // 'user'
207
+ * extractResourceName('/api/products') // 'product'
208
+ */
209
+ function extractResourceName(path) {
210
+ const parts = path.split('/').filter(p => p && !p.startsWith('{'));
211
+ if (parts.length === 0)
212
+ return undefined;
213
+ // Get last part and singularize (simple heuristic)
214
+ const lastPart = parts[parts.length - 1];
215
+ return lastPart.endsWith('s') ? lastPart.slice(0, -1) : lastPart;
216
+ }
217
+ //# sourceMappingURL=dataflow-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataflow-detector.js","sourceRoot":"","sources":["../../src/ai-engine/dataflow-detector.ts"],"names":[],"mappings":"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"}