@dotsetlabs/bellwether 0.10.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 (403) hide show
  1. package/CHANGELOG.md +291 -0
  2. package/LICENSE +21 -0
  3. package/README.md +739 -0
  4. package/dist/auth/credentials.d.ts +64 -0
  5. package/dist/auth/credentials.js +218 -0
  6. package/dist/auth/index.d.ts +6 -0
  7. package/dist/auth/index.js +6 -0
  8. package/dist/auth/keychain.d.ts +64 -0
  9. package/dist/auth/keychain.js +268 -0
  10. package/dist/baseline/ab-testing.d.ts +80 -0
  11. package/dist/baseline/ab-testing.js +236 -0
  12. package/dist/baseline/ai-compatibility-scorer.d.ts +95 -0
  13. package/dist/baseline/ai-compatibility-scorer.js +606 -0
  14. package/dist/baseline/calibration.d.ts +77 -0
  15. package/dist/baseline/calibration.js +136 -0
  16. package/dist/baseline/category-matching.d.ts +85 -0
  17. package/dist/baseline/category-matching.js +289 -0
  18. package/dist/baseline/change-impact-analyzer.d.ts +98 -0
  19. package/dist/baseline/change-impact-analyzer.js +592 -0
  20. package/dist/baseline/comparator.d.ts +64 -0
  21. package/dist/baseline/comparator.js +916 -0
  22. package/dist/baseline/confidence.d.ts +55 -0
  23. package/dist/baseline/confidence.js +122 -0
  24. package/dist/baseline/converter.d.ts +61 -0
  25. package/dist/baseline/converter.js +585 -0
  26. package/dist/baseline/dependency-analyzer.d.ts +89 -0
  27. package/dist/baseline/dependency-analyzer.js +567 -0
  28. package/dist/baseline/deprecation-tracker.d.ts +133 -0
  29. package/dist/baseline/deprecation-tracker.js +322 -0
  30. package/dist/baseline/diff.d.ts +55 -0
  31. package/dist/baseline/diff.js +1584 -0
  32. package/dist/baseline/documentation-scorer.d.ts +205 -0
  33. package/dist/baseline/documentation-scorer.js +466 -0
  34. package/dist/baseline/embeddings.d.ts +118 -0
  35. package/dist/baseline/embeddings.js +251 -0
  36. package/dist/baseline/error-analyzer.d.ts +198 -0
  37. package/dist/baseline/error-analyzer.js +721 -0
  38. package/dist/baseline/evaluation/evaluator.d.ts +42 -0
  39. package/dist/baseline/evaluation/evaluator.js +323 -0
  40. package/dist/baseline/evaluation/expanded-dataset.d.ts +45 -0
  41. package/dist/baseline/evaluation/expanded-dataset.js +1164 -0
  42. package/dist/baseline/evaluation/golden-dataset.d.ts +58 -0
  43. package/dist/baseline/evaluation/golden-dataset.js +717 -0
  44. package/dist/baseline/evaluation/index.d.ts +15 -0
  45. package/dist/baseline/evaluation/index.js +15 -0
  46. package/dist/baseline/evaluation/types.d.ts +186 -0
  47. package/dist/baseline/evaluation/types.js +8 -0
  48. package/dist/baseline/external-dependency-detector.d.ts +181 -0
  49. package/dist/baseline/external-dependency-detector.js +524 -0
  50. package/dist/baseline/golden-output.d.ts +162 -0
  51. package/dist/baseline/golden-output.js +636 -0
  52. package/dist/baseline/health-scorer.d.ts +174 -0
  53. package/dist/baseline/health-scorer.js +451 -0
  54. package/dist/baseline/incremental-checker.d.ts +97 -0
  55. package/dist/baseline/incremental-checker.js +174 -0
  56. package/dist/baseline/index.d.ts +31 -0
  57. package/dist/baseline/index.js +42 -0
  58. package/dist/baseline/migration-generator.d.ts +137 -0
  59. package/dist/baseline/migration-generator.js +554 -0
  60. package/dist/baseline/migrations.d.ts +60 -0
  61. package/dist/baseline/migrations.js +197 -0
  62. package/dist/baseline/performance-tracker.d.ts +214 -0
  63. package/dist/baseline/performance-tracker.js +577 -0
  64. package/dist/baseline/pr-comment-generator.d.ts +117 -0
  65. package/dist/baseline/pr-comment-generator.js +546 -0
  66. package/dist/baseline/response-fingerprint.d.ts +127 -0
  67. package/dist/baseline/response-fingerprint.js +728 -0
  68. package/dist/baseline/response-schema-tracker.d.ts +129 -0
  69. package/dist/baseline/response-schema-tracker.js +420 -0
  70. package/dist/baseline/risk-scorer.d.ts +54 -0
  71. package/dist/baseline/risk-scorer.js +434 -0
  72. package/dist/baseline/saver.d.ts +89 -0
  73. package/dist/baseline/saver.js +554 -0
  74. package/dist/baseline/scenario-generator.d.ts +151 -0
  75. package/dist/baseline/scenario-generator.js +905 -0
  76. package/dist/baseline/schema-compare.d.ts +86 -0
  77. package/dist/baseline/schema-compare.js +557 -0
  78. package/dist/baseline/schema-evolution.d.ts +189 -0
  79. package/dist/baseline/schema-evolution.js +467 -0
  80. package/dist/baseline/semantic.d.ts +203 -0
  81. package/dist/baseline/semantic.js +908 -0
  82. package/dist/baseline/synonyms.d.ts +60 -0
  83. package/dist/baseline/synonyms.js +386 -0
  84. package/dist/baseline/telemetry.d.ts +165 -0
  85. package/dist/baseline/telemetry.js +294 -0
  86. package/dist/baseline/test-pruner.d.ts +120 -0
  87. package/dist/baseline/test-pruner.js +387 -0
  88. package/dist/baseline/types.d.ts +449 -0
  89. package/dist/baseline/types.js +5 -0
  90. package/dist/baseline/version.d.ts +138 -0
  91. package/dist/baseline/version.js +206 -0
  92. package/dist/cache/index.d.ts +5 -0
  93. package/dist/cache/index.js +5 -0
  94. package/dist/cache/response-cache.d.ts +151 -0
  95. package/dist/cache/response-cache.js +287 -0
  96. package/dist/ci/index.d.ts +60 -0
  97. package/dist/ci/index.js +342 -0
  98. package/dist/cli/commands/auth.d.ts +12 -0
  99. package/dist/cli/commands/auth.js +352 -0
  100. package/dist/cli/commands/badge.d.ts +3 -0
  101. package/dist/cli/commands/badge.js +74 -0
  102. package/dist/cli/commands/baseline-accept.d.ts +15 -0
  103. package/dist/cli/commands/baseline-accept.js +178 -0
  104. package/dist/cli/commands/baseline-migrate.d.ts +12 -0
  105. package/dist/cli/commands/baseline-migrate.js +164 -0
  106. package/dist/cli/commands/baseline.d.ts +14 -0
  107. package/dist/cli/commands/baseline.js +449 -0
  108. package/dist/cli/commands/beta.d.ts +10 -0
  109. package/dist/cli/commands/beta.js +231 -0
  110. package/dist/cli/commands/check.d.ts +11 -0
  111. package/dist/cli/commands/check.js +820 -0
  112. package/dist/cli/commands/cloud/badge.d.ts +3 -0
  113. package/dist/cli/commands/cloud/badge.js +74 -0
  114. package/dist/cli/commands/cloud/diff.d.ts +6 -0
  115. package/dist/cli/commands/cloud/diff.js +79 -0
  116. package/dist/cli/commands/cloud/history.d.ts +6 -0
  117. package/dist/cli/commands/cloud/history.js +102 -0
  118. package/dist/cli/commands/cloud/link.d.ts +9 -0
  119. package/dist/cli/commands/cloud/link.js +119 -0
  120. package/dist/cli/commands/cloud/login.d.ts +7 -0
  121. package/dist/cli/commands/cloud/login.js +499 -0
  122. package/dist/cli/commands/cloud/projects.d.ts +6 -0
  123. package/dist/cli/commands/cloud/projects.js +44 -0
  124. package/dist/cli/commands/cloud/shared.d.ts +7 -0
  125. package/dist/cli/commands/cloud/shared.js +42 -0
  126. package/dist/cli/commands/cloud/teams.d.ts +8 -0
  127. package/dist/cli/commands/cloud/teams.js +169 -0
  128. package/dist/cli/commands/cloud/upload.d.ts +8 -0
  129. package/dist/cli/commands/cloud/upload.js +181 -0
  130. package/dist/cli/commands/contract.d.ts +11 -0
  131. package/dist/cli/commands/contract.js +280 -0
  132. package/dist/cli/commands/discover.d.ts +3 -0
  133. package/dist/cli/commands/discover.js +82 -0
  134. package/dist/cli/commands/eval.d.ts +9 -0
  135. package/dist/cli/commands/eval.js +187 -0
  136. package/dist/cli/commands/explore.d.ts +11 -0
  137. package/dist/cli/commands/explore.js +437 -0
  138. package/dist/cli/commands/feedback.d.ts +9 -0
  139. package/dist/cli/commands/feedback.js +174 -0
  140. package/dist/cli/commands/golden.d.ts +12 -0
  141. package/dist/cli/commands/golden.js +407 -0
  142. package/dist/cli/commands/history.d.ts +10 -0
  143. package/dist/cli/commands/history.js +202 -0
  144. package/dist/cli/commands/init.d.ts +9 -0
  145. package/dist/cli/commands/init.js +219 -0
  146. package/dist/cli/commands/interview.d.ts +3 -0
  147. package/dist/cli/commands/interview.js +903 -0
  148. package/dist/cli/commands/link.d.ts +10 -0
  149. package/dist/cli/commands/link.js +169 -0
  150. package/dist/cli/commands/login.d.ts +7 -0
  151. package/dist/cli/commands/login.js +499 -0
  152. package/dist/cli/commands/preset.d.ts +33 -0
  153. package/dist/cli/commands/preset.js +297 -0
  154. package/dist/cli/commands/profile.d.ts +33 -0
  155. package/dist/cli/commands/profile.js +286 -0
  156. package/dist/cli/commands/registry.d.ts +11 -0
  157. package/dist/cli/commands/registry.js +146 -0
  158. package/dist/cli/commands/shared.d.ts +79 -0
  159. package/dist/cli/commands/shared.js +196 -0
  160. package/dist/cli/commands/teams.d.ts +8 -0
  161. package/dist/cli/commands/teams.js +169 -0
  162. package/dist/cli/commands/test.d.ts +9 -0
  163. package/dist/cli/commands/test.js +500 -0
  164. package/dist/cli/commands/upload.d.ts +8 -0
  165. package/dist/cli/commands/upload.js +223 -0
  166. package/dist/cli/commands/validate-config.d.ts +6 -0
  167. package/dist/cli/commands/validate-config.js +35 -0
  168. package/dist/cli/commands/verify.d.ts +11 -0
  169. package/dist/cli/commands/verify.js +283 -0
  170. package/dist/cli/commands/watch.d.ts +12 -0
  171. package/dist/cli/commands/watch.js +253 -0
  172. package/dist/cli/index.d.ts +3 -0
  173. package/dist/cli/index.js +178 -0
  174. package/dist/cli/interactive.d.ts +47 -0
  175. package/dist/cli/interactive.js +216 -0
  176. package/dist/cli/output/terminal-reporter.d.ts +19 -0
  177. package/dist/cli/output/terminal-reporter.js +104 -0
  178. package/dist/cli/output.d.ts +226 -0
  179. package/dist/cli/output.js +438 -0
  180. package/dist/cli/utils/env.d.ts +5 -0
  181. package/dist/cli/utils/env.js +14 -0
  182. package/dist/cli/utils/progress.d.ts +59 -0
  183. package/dist/cli/utils/progress.js +206 -0
  184. package/dist/cli/utils/server-context.d.ts +10 -0
  185. package/dist/cli/utils/server-context.js +36 -0
  186. package/dist/cloud/auth.d.ts +144 -0
  187. package/dist/cloud/auth.js +374 -0
  188. package/dist/cloud/client.d.ts +24 -0
  189. package/dist/cloud/client.js +65 -0
  190. package/dist/cloud/http-client.d.ts +38 -0
  191. package/dist/cloud/http-client.js +215 -0
  192. package/dist/cloud/index.d.ts +23 -0
  193. package/dist/cloud/index.js +25 -0
  194. package/dist/cloud/mock-client.d.ts +107 -0
  195. package/dist/cloud/mock-client.js +545 -0
  196. package/dist/cloud/types.d.ts +515 -0
  197. package/dist/cloud/types.js +15 -0
  198. package/dist/config/defaults.d.ts +160 -0
  199. package/dist/config/defaults.js +169 -0
  200. package/dist/config/loader.d.ts +24 -0
  201. package/dist/config/loader.js +122 -0
  202. package/dist/config/template.d.ts +42 -0
  203. package/dist/config/template.js +647 -0
  204. package/dist/config/validator.d.ts +2112 -0
  205. package/dist/config/validator.js +658 -0
  206. package/dist/constants/cloud.d.ts +107 -0
  207. package/dist/constants/cloud.js +110 -0
  208. package/dist/constants/core.d.ts +521 -0
  209. package/dist/constants/core.js +556 -0
  210. package/dist/constants/testing.d.ts +1283 -0
  211. package/dist/constants/testing.js +1568 -0
  212. package/dist/constants.d.ts +10 -0
  213. package/dist/constants.js +10 -0
  214. package/dist/contract/index.d.ts +6 -0
  215. package/dist/contract/index.js +5 -0
  216. package/dist/contract/validator.d.ts +177 -0
  217. package/dist/contract/validator.js +574 -0
  218. package/dist/cost/index.d.ts +6 -0
  219. package/dist/cost/index.js +5 -0
  220. package/dist/cost/tracker.d.ts +134 -0
  221. package/dist/cost/tracker.js +313 -0
  222. package/dist/discovery/discovery.d.ts +16 -0
  223. package/dist/discovery/discovery.js +173 -0
  224. package/dist/discovery/types.d.ts +51 -0
  225. package/dist/discovery/types.js +2 -0
  226. package/dist/docs/agents.d.ts +3 -0
  227. package/dist/docs/agents.js +995 -0
  228. package/dist/docs/contract.d.ts +51 -0
  229. package/dist/docs/contract.js +1681 -0
  230. package/dist/docs/generator.d.ts +4 -0
  231. package/dist/docs/generator.js +4 -0
  232. package/dist/docs/html-reporter.d.ts +9 -0
  233. package/dist/docs/html-reporter.js +757 -0
  234. package/dist/docs/index.d.ts +10 -0
  235. package/dist/docs/index.js +11 -0
  236. package/dist/docs/junit-reporter.d.ts +18 -0
  237. package/dist/docs/junit-reporter.js +210 -0
  238. package/dist/docs/report.d.ts +14 -0
  239. package/dist/docs/report.js +44 -0
  240. package/dist/docs/sarif-reporter.d.ts +19 -0
  241. package/dist/docs/sarif-reporter.js +335 -0
  242. package/dist/docs/shared.d.ts +35 -0
  243. package/dist/docs/shared.js +162 -0
  244. package/dist/docs/templates.d.ts +12 -0
  245. package/dist/docs/templates.js +76 -0
  246. package/dist/errors/index.d.ts +6 -0
  247. package/dist/errors/index.js +6 -0
  248. package/dist/errors/retry.d.ts +92 -0
  249. package/dist/errors/retry.js +323 -0
  250. package/dist/errors/types.d.ts +321 -0
  251. package/dist/errors/types.js +584 -0
  252. package/dist/index.d.ts +32 -0
  253. package/dist/index.js +32 -0
  254. package/dist/interview/dependency-resolver.d.ts +11 -0
  255. package/dist/interview/dependency-resolver.js +32 -0
  256. package/dist/interview/interviewer.d.ts +232 -0
  257. package/dist/interview/interviewer.js +1939 -0
  258. package/dist/interview/mock-response-generator.d.ts +7 -0
  259. package/dist/interview/mock-response-generator.js +102 -0
  260. package/dist/interview/orchestrator.d.ts +237 -0
  261. package/dist/interview/orchestrator.js +1296 -0
  262. package/dist/interview/rate-limiter.d.ts +15 -0
  263. package/dist/interview/rate-limiter.js +55 -0
  264. package/dist/interview/response-validator.d.ts +10 -0
  265. package/dist/interview/response-validator.js +132 -0
  266. package/dist/interview/schema-inferrer.d.ts +8 -0
  267. package/dist/interview/schema-inferrer.js +71 -0
  268. package/dist/interview/schema-test-generator.d.ts +71 -0
  269. package/dist/interview/schema-test-generator.js +834 -0
  270. package/dist/interview/smart-value-generator.d.ts +155 -0
  271. package/dist/interview/smart-value-generator.js +554 -0
  272. package/dist/interview/stateful-test-runner.d.ts +19 -0
  273. package/dist/interview/stateful-test-runner.js +106 -0
  274. package/dist/interview/types.d.ts +561 -0
  275. package/dist/interview/types.js +2 -0
  276. package/dist/llm/anthropic.d.ts +41 -0
  277. package/dist/llm/anthropic.js +355 -0
  278. package/dist/llm/client.d.ts +123 -0
  279. package/dist/llm/client.js +42 -0
  280. package/dist/llm/factory.d.ts +38 -0
  281. package/dist/llm/factory.js +145 -0
  282. package/dist/llm/fallback.d.ts +140 -0
  283. package/dist/llm/fallback.js +379 -0
  284. package/dist/llm/index.d.ts +18 -0
  285. package/dist/llm/index.js +15 -0
  286. package/dist/llm/ollama.d.ts +37 -0
  287. package/dist/llm/ollama.js +330 -0
  288. package/dist/llm/openai.d.ts +25 -0
  289. package/dist/llm/openai.js +320 -0
  290. package/dist/llm/token-budget.d.ts +161 -0
  291. package/dist/llm/token-budget.js +395 -0
  292. package/dist/logging/logger.d.ts +70 -0
  293. package/dist/logging/logger.js +130 -0
  294. package/dist/metrics/collector.d.ts +106 -0
  295. package/dist/metrics/collector.js +547 -0
  296. package/dist/metrics/index.d.ts +7 -0
  297. package/dist/metrics/index.js +7 -0
  298. package/dist/metrics/prometheus.d.ts +20 -0
  299. package/dist/metrics/prometheus.js +241 -0
  300. package/dist/metrics/types.d.ts +209 -0
  301. package/dist/metrics/types.js +5 -0
  302. package/dist/persona/builtins.d.ts +54 -0
  303. package/dist/persona/builtins.js +219 -0
  304. package/dist/persona/index.d.ts +8 -0
  305. package/dist/persona/index.js +8 -0
  306. package/dist/persona/loader.d.ts +30 -0
  307. package/dist/persona/loader.js +190 -0
  308. package/dist/persona/types.d.ts +144 -0
  309. package/dist/persona/types.js +5 -0
  310. package/dist/persona/validation.d.ts +94 -0
  311. package/dist/persona/validation.js +332 -0
  312. package/dist/prompts/index.d.ts +5 -0
  313. package/dist/prompts/index.js +5 -0
  314. package/dist/prompts/templates.d.ts +180 -0
  315. package/dist/prompts/templates.js +431 -0
  316. package/dist/registry/client.d.ts +49 -0
  317. package/dist/registry/client.js +191 -0
  318. package/dist/registry/index.d.ts +7 -0
  319. package/dist/registry/index.js +6 -0
  320. package/dist/registry/types.d.ts +140 -0
  321. package/dist/registry/types.js +6 -0
  322. package/dist/scenarios/evaluator.d.ts +43 -0
  323. package/dist/scenarios/evaluator.js +206 -0
  324. package/dist/scenarios/index.d.ts +10 -0
  325. package/dist/scenarios/index.js +9 -0
  326. package/dist/scenarios/loader.d.ts +20 -0
  327. package/dist/scenarios/loader.js +285 -0
  328. package/dist/scenarios/types.d.ts +153 -0
  329. package/dist/scenarios/types.js +8 -0
  330. package/dist/security/index.d.ts +17 -0
  331. package/dist/security/index.js +18 -0
  332. package/dist/security/payloads.d.ts +61 -0
  333. package/dist/security/payloads.js +268 -0
  334. package/dist/security/security-tester.d.ts +42 -0
  335. package/dist/security/security-tester.js +582 -0
  336. package/dist/security/types.d.ts +166 -0
  337. package/dist/security/types.js +8 -0
  338. package/dist/transport/base-transport.d.ts +59 -0
  339. package/dist/transport/base-transport.js +38 -0
  340. package/dist/transport/http-transport.d.ts +67 -0
  341. package/dist/transport/http-transport.js +238 -0
  342. package/dist/transport/mcp-client.d.ts +141 -0
  343. package/dist/transport/mcp-client.js +496 -0
  344. package/dist/transport/sse-transport.d.ts +88 -0
  345. package/dist/transport/sse-transport.js +316 -0
  346. package/dist/transport/stdio-transport.d.ts +43 -0
  347. package/dist/transport/stdio-transport.js +238 -0
  348. package/dist/transport/types.d.ts +125 -0
  349. package/dist/transport/types.js +16 -0
  350. package/dist/utils/concurrency.d.ts +123 -0
  351. package/dist/utils/concurrency.js +213 -0
  352. package/dist/utils/formatters.d.ts +16 -0
  353. package/dist/utils/formatters.js +37 -0
  354. package/dist/utils/index.d.ts +8 -0
  355. package/dist/utils/index.js +8 -0
  356. package/dist/utils/jsonpath.d.ts +87 -0
  357. package/dist/utils/jsonpath.js +326 -0
  358. package/dist/utils/markdown.d.ts +113 -0
  359. package/dist/utils/markdown.js +265 -0
  360. package/dist/utils/network.d.ts +14 -0
  361. package/dist/utils/network.js +17 -0
  362. package/dist/utils/sanitize.d.ts +92 -0
  363. package/dist/utils/sanitize.js +191 -0
  364. package/dist/utils/semantic.d.ts +194 -0
  365. package/dist/utils/semantic.js +1051 -0
  366. package/dist/utils/smart-truncate.d.ts +94 -0
  367. package/dist/utils/smart-truncate.js +361 -0
  368. package/dist/utils/timeout.d.ts +153 -0
  369. package/dist/utils/timeout.js +205 -0
  370. package/dist/utils/yaml-parser.d.ts +58 -0
  371. package/dist/utils/yaml-parser.js +86 -0
  372. package/dist/validation/index.d.ts +32 -0
  373. package/dist/validation/index.js +32 -0
  374. package/dist/validation/semantic-test-generator.d.ts +50 -0
  375. package/dist/validation/semantic-test-generator.js +176 -0
  376. package/dist/validation/semantic-types.d.ts +66 -0
  377. package/dist/validation/semantic-types.js +94 -0
  378. package/dist/validation/semantic-validator.d.ts +38 -0
  379. package/dist/validation/semantic-validator.js +340 -0
  380. package/dist/verification/index.d.ts +6 -0
  381. package/dist/verification/index.js +5 -0
  382. package/dist/verification/types.d.ts +133 -0
  383. package/dist/verification/types.js +5 -0
  384. package/dist/verification/verifier.d.ts +30 -0
  385. package/dist/verification/verifier.js +309 -0
  386. package/dist/version.d.ts +19 -0
  387. package/dist/version.js +48 -0
  388. package/dist/workflow/auto-generator.d.ts +27 -0
  389. package/dist/workflow/auto-generator.js +513 -0
  390. package/dist/workflow/discovery.d.ts +40 -0
  391. package/dist/workflow/discovery.js +195 -0
  392. package/dist/workflow/executor.d.ts +82 -0
  393. package/dist/workflow/executor.js +611 -0
  394. package/dist/workflow/index.d.ts +10 -0
  395. package/dist/workflow/index.js +10 -0
  396. package/dist/workflow/loader.d.ts +24 -0
  397. package/dist/workflow/loader.js +194 -0
  398. package/dist/workflow/state-tracker.d.ts +98 -0
  399. package/dist/workflow/state-tracker.js +424 -0
  400. package/dist/workflow/types.d.ts +337 -0
  401. package/dist/workflow/types.js +5 -0
  402. package/package.json +94 -0
  403. package/schemas/bellwether-check.schema.json +651 -0
@@ -0,0 +1,15 @@
1
+ import type { RateLimitConfig } from './types.js';
2
+ /**
3
+ * Token bucket rate limiter with async acquisition.
4
+ */
5
+ export declare class RateLimiter {
6
+ private config;
7
+ private tokens;
8
+ private lastRefill;
9
+ constructor(config: RateLimitConfig);
10
+ acquire(): Promise<void>;
11
+ private refill;
12
+ }
13
+ export declare function isRateLimitError(message: string | null): boolean;
14
+ export declare function calculateBackoffMs(attempt: number, strategy: RateLimitConfig['backoffStrategy']): number;
15
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1,55 @@
1
+ import { RATE_LIMITING } from '../constants.js';
2
+ /**
3
+ * Token bucket rate limiter with async acquisition.
4
+ */
5
+ export class RateLimiter {
6
+ config;
7
+ tokens;
8
+ lastRefill;
9
+ constructor(config) {
10
+ this.config = config;
11
+ this.tokens = config.burstLimit;
12
+ this.lastRefill = Date.now();
13
+ }
14
+ async acquire() {
15
+ // Token bucket algorithm - loop until a token is available
16
+ // eslint-disable-next-line no-constant-condition
17
+ while (true) {
18
+ this.refill();
19
+ if (this.tokens >= 1) {
20
+ this.tokens -= 1;
21
+ return;
22
+ }
23
+ const waitMs = Math.max(1, Math.ceil(((1 - this.tokens) / this.config.requestsPerSecond) * 1000));
24
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
25
+ }
26
+ }
27
+ refill() {
28
+ const now = Date.now();
29
+ const elapsedSeconds = (now - this.lastRefill) / 1000;
30
+ if (elapsedSeconds <= 0)
31
+ return;
32
+ const refillTokens = elapsedSeconds * this.config.requestsPerSecond;
33
+ if (refillTokens >= 1) {
34
+ this.tokens = Math.min(this.config.burstLimit, this.tokens + refillTokens);
35
+ this.lastRefill = now;
36
+ }
37
+ }
38
+ }
39
+ export function isRateLimitError(message) {
40
+ if (!message)
41
+ return false;
42
+ return RATE_LIMITING.ERROR_PATTERNS.some((pattern) => pattern.test(message));
43
+ }
44
+ export function calculateBackoffMs(attempt, strategy) {
45
+ const baseDelay = RATE_LIMITING.BASE_DELAY_MS;
46
+ const maxDelay = RATE_LIMITING.MAX_DELAY_MS;
47
+ const jitter = RATE_LIMITING.JITTER_RATIO;
48
+ const rawDelay = strategy === 'linear'
49
+ ? baseDelay * (attempt + 1)
50
+ : baseDelay * Math.pow(2, attempt);
51
+ const capped = Math.min(rawDelay, maxDelay);
52
+ const jitterDelta = capped * jitter * (Math.random() - 0.5) * 2;
53
+ return Math.max(0, Math.round(capped + jitterDelta));
54
+ }
55
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1,10 @@
1
+ import type { MCPToolCallResult } from '../transport/types.js';
2
+ import type { ResponseAssertionResult, ResponseSchema } from './types.js';
3
+ export interface ResponseAssertionOptions {
4
+ expectedText?: string;
5
+ }
6
+ /**
7
+ * Validate a response against an inferred schema and basic semantic assertions.
8
+ */
9
+ export declare function validateResponseAssertions(response: MCPToolCallResult, expectedSchema?: ResponseSchema, options?: ResponseAssertionOptions): ResponseAssertionResult[];
10
+ //# sourceMappingURL=response-validator.d.ts.map
@@ -0,0 +1,132 @@
1
+ import { inferSchemaFromValue, computeInferredSchemaHash } from '../baseline/response-fingerprint.js';
2
+ import { extractTextContent } from './schema-inferrer.js';
3
+ /**
4
+ * Validate a response against an inferred schema and basic semantic assertions.
5
+ */
6
+ export function validateResponseAssertions(response, expectedSchema, options = {}) {
7
+ const results = [];
8
+ const textContent = extractTextContent(response);
9
+ const jsonContent = textContent ? tryParseJson(textContent) : null;
10
+ const hasBinary = response.content?.some((c) => c.type !== 'text') ?? false;
11
+ results.push(assertNotEmpty(textContent, jsonContent?.value, hasBinary));
12
+ if (expectedSchema?.inferredType === 'json') {
13
+ results.push(assertIsJson(jsonContent));
14
+ if (expectedSchema.jsonSchema) {
15
+ results.push(assertMatchesSchema(jsonContent, expectedSchema.jsonSchema));
16
+ results.push(assertContainsFields(jsonContent, expectedSchema.jsonSchema));
17
+ }
18
+ }
19
+ if (expectedSchema?.inferredType === 'markdown' && expectedSchema.markdownStructure) {
20
+ results.push(assertMarkdownStructure(textContent, expectedSchema.markdownStructure));
21
+ }
22
+ if (options.expectedText) {
23
+ results.push(assertContainsText(textContent, options.expectedText));
24
+ }
25
+ return results.filter(Boolean);
26
+ }
27
+ function assertNotEmpty(textContent, jsonValue, hasBinary) {
28
+ const isEmptyText = !textContent || textContent.trim().length === 0;
29
+ const isEmptyJson = jsonValue === undefined || jsonValue === null ||
30
+ (Array.isArray(jsonValue) && jsonValue.length === 0) ||
31
+ (typeof jsonValue === 'object' && !Array.isArray(jsonValue) && Object.keys(jsonValue).length === 0);
32
+ const passed = hasBinary || !(isEmptyText && isEmptyJson);
33
+ return {
34
+ type: 'not_empty',
35
+ passed,
36
+ message: passed ? undefined : 'Response was empty',
37
+ };
38
+ }
39
+ function assertIsJson(parsed) {
40
+ const passed = !!parsed?.success;
41
+ return {
42
+ type: 'is_json',
43
+ passed,
44
+ message: passed ? undefined : 'Response is not valid JSON',
45
+ };
46
+ }
47
+ function assertMatchesSchema(parsed, expectedSchema) {
48
+ if (!parsed?.success) {
49
+ return {
50
+ type: 'matches_schema',
51
+ passed: false,
52
+ message: 'Response is not valid JSON',
53
+ };
54
+ }
55
+ const actualSchema = inferSchemaFromValue(parsed.value);
56
+ const expectedHash = computeInferredSchemaHash(expectedSchema);
57
+ const actualHash = computeInferredSchemaHash(actualSchema);
58
+ const passed = expectedHash === actualHash;
59
+ return {
60
+ type: 'matches_schema',
61
+ passed,
62
+ message: passed ? undefined : 'Response schema does not match expected structure',
63
+ expected: expectedHash,
64
+ actual: actualHash,
65
+ };
66
+ }
67
+ function assertContainsFields(parsed, expectedSchema) {
68
+ if (!parsed?.success || parsed.value === null || typeof parsed.value !== 'object' || Array.isArray(parsed.value)) {
69
+ return {
70
+ type: 'contains_fields',
71
+ passed: false,
72
+ message: 'Response JSON is not an object',
73
+ };
74
+ }
75
+ const expectedProps = expectedSchema.properties ?? {};
76
+ const requiredFields = Object.keys(expectedProps);
77
+ if (requiredFields.length === 0) {
78
+ return {
79
+ type: 'contains_fields',
80
+ passed: true,
81
+ };
82
+ }
83
+ const actualFields = Object.keys(parsed.value);
84
+ const missing = requiredFields.filter((field) => !actualFields.includes(field));
85
+ return {
86
+ type: 'contains_fields',
87
+ passed: missing.length === 0,
88
+ message: missing.length === 0 ? undefined : `Missing fields: ${missing.join(', ')}`,
89
+ expected: requiredFields,
90
+ actual: actualFields,
91
+ };
92
+ }
93
+ function assertMarkdownStructure(textContent, expected) {
94
+ if (!textContent) {
95
+ return {
96
+ type: 'contains_text',
97
+ passed: false,
98
+ message: 'Response text is empty',
99
+ };
100
+ }
101
+ const hasHeaders = /^#{1,6}\s+/m.test(textContent);
102
+ const hasTables = /^\|.+\|\s*$/m.test(textContent);
103
+ const hasCodeBlocks = /```[\s\S]*?```/m.test(textContent);
104
+ const passed = (!expected.hasHeaders || hasHeaders) &&
105
+ (!expected.hasTables || hasTables) &&
106
+ (!expected.hasCodeBlocks || hasCodeBlocks);
107
+ return {
108
+ type: 'contains_text',
109
+ passed,
110
+ message: passed ? undefined : 'Markdown structure is missing expected sections',
111
+ expected,
112
+ actual: { hasHeaders, hasTables, hasCodeBlocks },
113
+ };
114
+ }
115
+ function assertContainsText(textContent, expected) {
116
+ const passed = !!textContent && textContent.includes(expected);
117
+ return {
118
+ type: 'contains_text',
119
+ passed,
120
+ message: passed ? undefined : `Response missing expected text: "${expected}"`,
121
+ expected,
122
+ };
123
+ }
124
+ function tryParseJson(text) {
125
+ try {
126
+ return { success: true, value: JSON.parse(text) };
127
+ }
128
+ catch {
129
+ return { success: false };
130
+ }
131
+ }
132
+ //# sourceMappingURL=response-validator.js.map
@@ -0,0 +1,8 @@
1
+ import type { MCPToolCallResult } from '../transport/types.js';
2
+ import type { ResponseSchema } from './types.js';
3
+ /**
4
+ * Infer a response schema from an MCP tool response.
5
+ */
6
+ export declare function inferResponseSchema(response: MCPToolCallResult): ResponseSchema | null;
7
+ export declare function extractTextContent(response: MCPToolCallResult): string | null;
8
+ //# sourceMappingURL=schema-inferrer.d.ts.map
@@ -0,0 +1,71 @@
1
+ import { createHash } from 'crypto';
2
+ import { inferSchemaFromValue, computeInferredSchemaHash } from '../baseline/response-fingerprint.js';
3
+ /**
4
+ * Infer a response schema from an MCP tool response.
5
+ */
6
+ export function inferResponseSchema(response) {
7
+ const textContent = extractTextContent(response);
8
+ if (!textContent) {
9
+ const hasBinary = response.content?.some((c) => c.type !== 'text');
10
+ if (hasBinary) {
11
+ return {
12
+ inferredType: 'binary',
13
+ sampleFingerprints: [],
14
+ };
15
+ }
16
+ return null;
17
+ }
18
+ const parsedJson = tryParseJson(textContent);
19
+ if (parsedJson.success) {
20
+ const jsonSchema = inferSchemaFromValue(parsedJson.value);
21
+ const hash = computeInferredSchemaHash(jsonSchema);
22
+ return {
23
+ inferredType: 'json',
24
+ jsonSchema,
25
+ sampleFingerprints: [hash],
26
+ };
27
+ }
28
+ const markdownStructure = detectMarkdownStructure(textContent);
29
+ if (markdownStructure.hasHeaders || markdownStructure.hasTables || markdownStructure.hasCodeBlocks) {
30
+ return {
31
+ inferredType: 'markdown',
32
+ markdownStructure,
33
+ sampleFingerprints: [hashString(textContent)],
34
+ };
35
+ }
36
+ return {
37
+ inferredType: 'text',
38
+ sampleFingerprints: [hashString(textContent)],
39
+ };
40
+ }
41
+ export function extractTextContent(response) {
42
+ if (!response.content || response.content.length === 0) {
43
+ return null;
44
+ }
45
+ const textBlocks = response.content
46
+ .filter((c) => c.type === 'text' && typeof c.text === 'string')
47
+ .map((c) => c.text);
48
+ if (textBlocks.length === 0) {
49
+ return null;
50
+ }
51
+ return textBlocks.join('\n');
52
+ }
53
+ function tryParseJson(text) {
54
+ try {
55
+ return { success: true, value: JSON.parse(text) };
56
+ }
57
+ catch {
58
+ return { success: false };
59
+ }
60
+ }
61
+ function detectMarkdownStructure(text) {
62
+ return {
63
+ hasHeaders: /^#{1,6}\s+/m.test(text),
64
+ hasTables: /^\|.+\|\s*$/m.test(text),
65
+ hasCodeBlocks: /```[\s\S]*?```/m.test(text),
66
+ };
67
+ }
68
+ function hashString(value) {
69
+ return createHash('sha256').update(value).digest('hex');
70
+ }
71
+ //# sourceMappingURL=schema-inferrer.js.map
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Schema-based test generator for deterministic testing in check mode.
3
+ *
4
+ * Generates comprehensive test cases from JSON Schema without requiring LLM.
5
+ * This module is the core of the enhanced testing capability, producing
6
+ * 8-12 tests per tool covering boundaries, types, enums, and error handling.
7
+ */
8
+ import type { MCPTool } from '../transport/types.js';
9
+ import type { InterviewQuestion, ExpectedOutcome } from './types.js';
10
+ import type { QuestionCategory } from '../persona/types.js';
11
+ import type { SemanticInference } from '../validation/semantic-types.js';
12
+ /**
13
+ * Options for test generation.
14
+ */
15
+ export interface SchemaTestGeneratorOptions {
16
+ /** Skip error handling tests (e.g., missing required params) */
17
+ skipErrorTests?: boolean;
18
+ /** Maximum tests per tool (overrides default) */
19
+ maxTestsPerTool?: number;
20
+ /** Skip semantic validation tests (default: false) */
21
+ skipSemanticTests?: boolean;
22
+ }
23
+ /**
24
+ * Result of schema test generation including semantic inferences.
25
+ */
26
+ export interface SchemaTestGeneratorResult {
27
+ /** Generated test questions */
28
+ questions: InterviewQuestion[];
29
+ /** Semantic type inferences for parameters */
30
+ semanticInferences: SemanticInference[];
31
+ }
32
+ /**
33
+ * Determine expected outcome for a test based on its category and description.
34
+ * Uses OUTCOME_ASSESSMENT constants to classify tests.
35
+ *
36
+ * @param category - Test category
37
+ * @param description - Test description
38
+ * @returns Expected outcome: 'success', 'error', or 'either'
39
+ */
40
+ export declare function determineExpectedOutcome(category: QuestionCategory, description: string): ExpectedOutcome;
41
+ /**
42
+ * Generate comprehensive schema-based test cases for a tool.
43
+ *
44
+ * This function analyzes the tool's JSON Schema and generates deterministic
45
+ * test cases covering:
46
+ * - Happy path (valid inputs)
47
+ * - Boundary values (empty strings, zero, large numbers)
48
+ * - Type coercion (wrong types)
49
+ * - Enum validation (invalid enum values)
50
+ * - Array handling (empty, single, many items)
51
+ * - Null/undefined handling
52
+ * - Error handling (missing required params)
53
+ * - Semantic validation (date formats, emails, URLs, etc.)
54
+ *
55
+ * @param tool - The MCP tool to generate tests for
56
+ * @param options - Configuration options
57
+ * @returns Array of interview questions (test cases)
58
+ */
59
+ export declare function generateSchemaTests(tool: MCPTool, options?: SchemaTestGeneratorOptions): InterviewQuestion[];
60
+ /**
61
+ * Generate schema-based tests with semantic inference information.
62
+ *
63
+ * This variant returns both the test questions and semantic type inferences,
64
+ * useful when you need to track inferred types for documentation.
65
+ *
66
+ * @param tool - The MCP tool to generate tests for
67
+ * @param options - Configuration options
68
+ * @returns Test questions and semantic inferences
69
+ */
70
+ export declare function generateSchemaTestsWithInferences(tool: MCPTool, options?: SchemaTestGeneratorOptions): SchemaTestGeneratorResult;
71
+ //# sourceMappingURL=schema-test-generator.d.ts.map