@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,166 @@
1
+ /**
2
+ * Security testing types for deterministic vulnerability detection.
3
+ *
4
+ * This module defines types for the security baseline feature, which runs
5
+ * deterministic security tests in check mode without requiring LLM.
6
+ */
7
+ /**
8
+ * Categories of security vulnerabilities tested.
9
+ * Each category maps to a specific class of attack vectors.
10
+ */
11
+ export type SecurityCategory = 'sql_injection' | 'xss' | 'path_traversal' | 'command_injection' | 'ssrf' | 'error_disclosure';
12
+ /**
13
+ * Risk level classification for security findings.
14
+ * Based on potential impact and exploitability.
15
+ */
16
+ export type RiskLevel = 'critical' | 'high' | 'medium' | 'low' | 'info';
17
+ /**
18
+ * A security test payload used to probe for vulnerabilities.
19
+ */
20
+ export interface SecurityPayload {
21
+ /** Category of vulnerability being tested */
22
+ category: SecurityCategory;
23
+ /** The actual payload string */
24
+ payload: string;
25
+ /** Human-readable description of the test */
26
+ description: string;
27
+ /** Expected tool behavior when receiving this payload */
28
+ expectedBehavior: 'reject' | 'sanitize' | 'accept';
29
+ }
30
+ /**
31
+ * Result of a single security test execution.
32
+ */
33
+ export interface SecurityTestResult {
34
+ /** Category of vulnerability tested */
35
+ category: SecurityCategory;
36
+ /** Payload that was tested */
37
+ payload: string;
38
+ /** Parameter that was tested */
39
+ parameter: string;
40
+ /** Whether the test passed (tool behaved safely) */
41
+ passed: boolean;
42
+ /** Risk level if a finding was discovered */
43
+ riskLevel: RiskLevel;
44
+ /** Finding details if a vulnerability was detected */
45
+ finding?: SecurityFinding;
46
+ /** Response behavior observed */
47
+ behavior: 'rejected' | 'sanitized' | 'accepted' | 'error';
48
+ }
49
+ /**
50
+ * A security finding discovered during testing.
51
+ */
52
+ export interface SecurityFinding {
53
+ /** Category of vulnerability */
54
+ category: SecurityCategory;
55
+ /** Risk level assessment */
56
+ riskLevel: RiskLevel;
57
+ /** Short title for the finding */
58
+ title: string;
59
+ /** Detailed description of the issue */
60
+ description: string;
61
+ /** Evidence supporting the finding */
62
+ evidence: string;
63
+ /** Suggested remediation steps */
64
+ remediation: string;
65
+ /** Common Weakness Enumeration ID (e.g., "CWE-89") */
66
+ cweId: string;
67
+ /** Parameter where the vulnerability was found */
68
+ parameter: string;
69
+ /** Tool where the vulnerability was found */
70
+ tool: string;
71
+ }
72
+ /**
73
+ * Security fingerprint for a tool, stored in the baseline.
74
+ * Captures the security testing state and findings for comparison.
75
+ */
76
+ export interface SecurityFingerprint {
77
+ /** Whether security testing was performed */
78
+ tested: boolean;
79
+ /** Categories that were tested */
80
+ categoriesTested: SecurityCategory[];
81
+ /** Findings discovered during testing */
82
+ findings: SecurityFinding[];
83
+ /** Overall risk score (0-100, higher = more risk) */
84
+ riskScore: number;
85
+ /** When security testing was last run */
86
+ testedAt: string;
87
+ /** Hash of findings for quick comparison */
88
+ findingsHash: string;
89
+ }
90
+ /**
91
+ * Security baseline comparison result.
92
+ * Shows how security posture changed between baselines.
93
+ */
94
+ export interface SecurityDiff {
95
+ /** New findings that didn't exist in the previous baseline */
96
+ newFindings: SecurityFinding[];
97
+ /** Findings that were resolved (existed before, not now) */
98
+ resolvedFindings: SecurityFinding[];
99
+ /** Previous risk score */
100
+ previousRiskScore: number;
101
+ /** Current risk score */
102
+ currentRiskScore: number;
103
+ /** Risk score change (positive = worse, negative = better) */
104
+ riskScoreChange: number;
105
+ /** Whether security posture degraded */
106
+ degraded: boolean;
107
+ /** Summary of security changes */
108
+ summary: string;
109
+ }
110
+ /**
111
+ * Options for running security tests.
112
+ */
113
+ export interface SecurityTestOptions {
114
+ /** Categories to test (default: all) */
115
+ categories?: SecurityCategory[];
116
+ /** Maximum payloads per category (default from constants) */
117
+ maxPayloadsPerCategory?: number;
118
+ /** Timeout per test in ms (default from constants) */
119
+ timeout?: number;
120
+ /** Whether to test for error disclosure */
121
+ testErrorDisclosure?: boolean;
122
+ }
123
+ /**
124
+ * Context required to run security tests on a tool.
125
+ */
126
+ export interface SecurityTestContext {
127
+ /** The tool being tested */
128
+ toolName: string;
129
+ /** Tool description */
130
+ toolDescription: string;
131
+ /** Tool input schema */
132
+ inputSchema?: Record<string, unknown>;
133
+ /** Function to call the tool with arguments */
134
+ callTool: (args: Record<string, unknown>) => Promise<SecurityToolCallResult>;
135
+ }
136
+ /**
137
+ * Result from calling a tool during security testing.
138
+ */
139
+ export interface SecurityToolCallResult {
140
+ /** Whether the call resulted in an error */
141
+ isError: boolean;
142
+ /** Text content of the response */
143
+ content: string;
144
+ /** Raw error message if isError is true */
145
+ errorMessage?: string;
146
+ }
147
+ /**
148
+ * Aggregate security results for an entire server.
149
+ */
150
+ export interface SecurityReport {
151
+ /** When the security test was run */
152
+ testedAt: string;
153
+ /** Total tools tested */
154
+ toolsTested: number;
155
+ /** Total findings across all tools */
156
+ totalFindings: number;
157
+ /** Findings by risk level */
158
+ findingsByRiskLevel: Record<RiskLevel, number>;
159
+ /** Findings by category */
160
+ findingsByCategory: Record<SecurityCategory, number>;
161
+ /** Overall server risk score (0-100) */
162
+ overallRiskScore: number;
163
+ /** Per-tool security fingerprints */
164
+ toolFingerprints: Map<string, SecurityFingerprint>;
165
+ }
166
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Security testing types for deterministic vulnerability detection.
3
+ *
4
+ * This module defines types for the security baseline feature, which runs
5
+ * deterministic security tests in check mode without requiring LLM.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,59 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { JSONRPCMessage } from './types.js';
3
+ import { type Logger } from '../logging/logger.js';
4
+ /**
5
+ * Base configuration for all transports.
6
+ */
7
+ export interface BaseTransportConfig {
8
+ /** Enable debug logging */
9
+ debug?: boolean;
10
+ /** Request timeout in milliseconds */
11
+ timeout?: number;
12
+ }
13
+ /**
14
+ * Events emitted by transports.
15
+ */
16
+ export interface TransportEvents {
17
+ message: (msg: JSONRPCMessage) => void;
18
+ error: (error: Error) => void;
19
+ close: () => void;
20
+ }
21
+ /**
22
+ * Abstract base class for MCP transports.
23
+ *
24
+ * Transports handle the low-level communication with MCP servers,
25
+ * including message framing and connection management.
26
+ *
27
+ * All transports emit:
28
+ * - 'message': When a JSON-RPC message is received
29
+ * - 'error': When an error occurs
30
+ * - 'close': When the connection is closed
31
+ */
32
+ export declare abstract class BaseTransport extends EventEmitter {
33
+ protected debug: boolean;
34
+ protected logger: Logger;
35
+ constructor(config?: BaseTransportConfig);
36
+ /**
37
+ * Send a JSON-RPC message to the server.
38
+ */
39
+ abstract send(message: JSONRPCMessage): void;
40
+ /**
41
+ * Close the transport connection.
42
+ */
43
+ abstract close(): void;
44
+ /**
45
+ * Check if the transport is connected.
46
+ */
47
+ abstract isConnected(): boolean;
48
+ /**
49
+ * Log a debug message if debug mode is enabled.
50
+ */
51
+ protected log(message: string, data?: Record<string, unknown>): void;
52
+ on<K extends keyof TransportEvents>(event: K, listener: TransportEvents[K]): this;
53
+ emit<K extends keyof TransportEvents>(event: K, ...args: Parameters<TransportEvents[K]>): boolean;
54
+ }
55
+ /**
56
+ * Transport type identifier.
57
+ */
58
+ export type TransportType = 'stdio' | 'sse' | 'streamable-http';
59
+ //# sourceMappingURL=base-transport.d.ts.map
@@ -0,0 +1,38 @@
1
+ import { EventEmitter } from 'events';
2
+ import { getLogger } from '../logging/logger.js';
3
+ /**
4
+ * Abstract base class for MCP transports.
5
+ *
6
+ * Transports handle the low-level communication with MCP servers,
7
+ * including message framing and connection management.
8
+ *
9
+ * All transports emit:
10
+ * - 'message': When a JSON-RPC message is received
11
+ * - 'error': When an error occurs
12
+ * - 'close': When the connection is closed
13
+ */
14
+ export class BaseTransport extends EventEmitter {
15
+ debug;
16
+ logger;
17
+ constructor(config) {
18
+ super();
19
+ this.debug = config?.debug ?? false;
20
+ this.logger = getLogger('transport');
21
+ }
22
+ /**
23
+ * Log a debug message if debug mode is enabled.
24
+ */
25
+ log(message, data) {
26
+ if (this.debug) {
27
+ this.logger.debug(data ?? {}, message);
28
+ }
29
+ }
30
+ // Type-safe event methods
31
+ on(event, listener) {
32
+ return super.on(event, listener);
33
+ }
34
+ emit(event, ...args) {
35
+ return super.emit(event, ...args);
36
+ }
37
+ }
38
+ //# sourceMappingURL=base-transport.js.map
@@ -0,0 +1,67 @@
1
+ import type { JSONRPCMessage, JSONRPCResponse } from './types.js';
2
+ import { BaseTransport, type BaseTransportConfig } from './base-transport.js';
3
+ /**
4
+ * Configuration for HTTP Transport.
5
+ */
6
+ export interface HTTPTransportConfig extends BaseTransportConfig {
7
+ /** Base URL of the MCP server (e.g., https://api.example.com/mcp) */
8
+ baseUrl: string;
9
+ /** Optional session ID for authenticated connections */
10
+ sessionId?: string;
11
+ /** Custom headers to include in requests */
12
+ headers?: Record<string, string>;
13
+ /** Request timeout in milliseconds (default: 30000) */
14
+ timeout?: number;
15
+ }
16
+ /**
17
+ * HTTPTransport connects to MCP servers over HTTP using POST requests.
18
+ *
19
+ * This transport is used for remote MCP servers that expose a simple
20
+ * HTTP endpoint. Each request is sent as a POST and the response is
21
+ * returned directly.
22
+ *
23
+ * This is a request-response pattern, unlike SSE which supports
24
+ * server-initiated messages.
25
+ *
26
+ * Expected server endpoint:
27
+ * - POST {baseUrl} - JSON-RPC endpoint
28
+ */
29
+ export declare class HTTPTransport extends BaseTransport {
30
+ private connected;
31
+ private abortController;
32
+ private readonly baseUrl;
33
+ private readonly sessionId?;
34
+ private readonly headers;
35
+ private readonly timeout;
36
+ constructor(config: HTTPTransportConfig);
37
+ /**
38
+ * Initialize the HTTP transport.
39
+ * For HTTP, there's no persistent connection, so this just validates the URL.
40
+ */
41
+ connect(): Promise<void>;
42
+ /**
43
+ * Send a JSON-RPC message to the server via HTTP POST.
44
+ *
45
+ * Unlike SSE transport, this method handles the response synchronously
46
+ * and emits a 'message' event with the response.
47
+ */
48
+ send(message: JSONRPCMessage): void;
49
+ /**
50
+ * Send a JSON-RPC message and wait for the response.
51
+ */
52
+ sendAsync(message: JSONRPCMessage): Promise<JSONRPCResponse | null>;
53
+ /**
54
+ * Handle a streaming HTTP response (text/event-stream).
55
+ * Includes timeout handling to prevent indefinite hangs.
56
+ */
57
+ private handleStreamingResponse;
58
+ /**
59
+ * Close the HTTP transport.
60
+ */
61
+ close(): void;
62
+ /**
63
+ * Check if the transport is connected.
64
+ */
65
+ isConnected(): boolean;
66
+ }
67
+ //# sourceMappingURL=http-transport.d.ts.map
@@ -0,0 +1,238 @@
1
+ import { BaseTransport } from './base-transport.js';
2
+ import { TIMEOUTS, DISPLAY_LIMITS } from '../constants.js';
3
+ /**
4
+ * HTTPTransport connects to MCP servers over HTTP using POST requests.
5
+ *
6
+ * This transport is used for remote MCP servers that expose a simple
7
+ * HTTP endpoint. Each request is sent as a POST and the response is
8
+ * returned directly.
9
+ *
10
+ * This is a request-response pattern, unlike SSE which supports
11
+ * server-initiated messages.
12
+ *
13
+ * Expected server endpoint:
14
+ * - POST {baseUrl} - JSON-RPC endpoint
15
+ */
16
+ export class HTTPTransport extends BaseTransport {
17
+ connected = false;
18
+ abortController = null;
19
+ baseUrl;
20
+ sessionId;
21
+ headers;
22
+ timeout;
23
+ constructor(config) {
24
+ super(config);
25
+ this.baseUrl = config.baseUrl.replace(/\/$/, ''); // Remove trailing slash
26
+ this.sessionId = config.sessionId;
27
+ this.headers = config.headers ?? {};
28
+ this.timeout = config.timeout ?? TIMEOUTS.DEFAULT;
29
+ // Add session ID to headers if provided
30
+ if (this.sessionId) {
31
+ this.headers['X-Session-Id'] = this.sessionId;
32
+ }
33
+ }
34
+ /**
35
+ * Initialize the HTTP transport.
36
+ * For HTTP, there's no persistent connection, so this just validates the URL.
37
+ */
38
+ async connect() {
39
+ this.log('Initializing HTTP transport', { baseUrl: this.baseUrl });
40
+ // Optionally, we could do a health check here
41
+ // For now, just mark as connected
42
+ this.connected = true;
43
+ }
44
+ /**
45
+ * Send a JSON-RPC message to the server via HTTP POST.
46
+ *
47
+ * Unlike SSE transport, this method handles the response synchronously
48
+ * and emits a 'message' event with the response.
49
+ */
50
+ send(message) {
51
+ if (!this.connected) {
52
+ this.emit('error', new Error('Transport not connected'));
53
+ return;
54
+ }
55
+ this.sendAsync(message).catch((error) => {
56
+ this.emit('error', error);
57
+ });
58
+ }
59
+ /**
60
+ * Send a JSON-RPC message and wait for the response.
61
+ */
62
+ async sendAsync(message) {
63
+ this.log('Sending message', { message });
64
+ this.abortController = new AbortController();
65
+ const timeoutId = setTimeout(() => {
66
+ this.abortController?.abort();
67
+ }, this.timeout);
68
+ try {
69
+ const response = await fetch(this.baseUrl, {
70
+ method: 'POST',
71
+ headers: {
72
+ 'Content-Type': 'application/json',
73
+ Accept: 'application/json',
74
+ ...this.headers,
75
+ },
76
+ body: JSON.stringify(message),
77
+ signal: this.abortController.signal,
78
+ });
79
+ clearTimeout(timeoutId);
80
+ if (!response.ok) {
81
+ const errorText = await response.text().catch(() => 'Unknown error');
82
+ throw new Error(`HTTP ${response.status}: ${errorText}`);
83
+ }
84
+ const contentType = response.headers.get('content-type');
85
+ // Handle streaming response (for streamable HTTP)
86
+ if (contentType?.includes('text/event-stream')) {
87
+ await this.handleStreamingResponse(response);
88
+ return null;
89
+ }
90
+ // Handle JSON response
91
+ if (contentType?.includes('application/json')) {
92
+ const responseData = (await response.json());
93
+ this.emit('message', responseData);
94
+ return responseData;
95
+ }
96
+ // No content or unexpected content type
97
+ return null;
98
+ }
99
+ catch (error) {
100
+ clearTimeout(timeoutId);
101
+ if (error.name === 'AbortError') {
102
+ throw new Error('Request timeout');
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+ /**
108
+ * Handle a streaming HTTP response (text/event-stream).
109
+ * Includes timeout handling to prevent indefinite hangs.
110
+ */
111
+ async handleStreamingResponse(response) {
112
+ const reader = response.body?.getReader();
113
+ if (!reader) {
114
+ return;
115
+ }
116
+ const decoder = new TextDecoder();
117
+ let buffer = '';
118
+ let readerLocked = true;
119
+ /**
120
+ * Read with timeout to prevent indefinite hangs.
121
+ * Returns the read result or throws on timeout.
122
+ */
123
+ const readWithTimeout = async () => {
124
+ return new Promise((resolve, reject) => {
125
+ const timeoutId = setTimeout(() => {
126
+ reject(new Error('Streaming read timeout'));
127
+ }, this.timeout);
128
+ reader.read().then((result) => {
129
+ clearTimeout(timeoutId);
130
+ resolve(result);
131
+ }, (error) => {
132
+ clearTimeout(timeoutId);
133
+ reject(error);
134
+ });
135
+ });
136
+ };
137
+ try {
138
+ let done = false;
139
+ while (!done) {
140
+ // Use timeout-wrapped read to prevent indefinite blocking
141
+ const result = await readWithTimeout();
142
+ done = result.done;
143
+ if (done) {
144
+ break;
145
+ }
146
+ const value = result.value;
147
+ buffer += decoder.decode(value, { stream: true });
148
+ // Process complete lines
149
+ const lines = buffer.split('\n');
150
+ buffer = lines.pop() || ''; // Keep incomplete line in buffer
151
+ for (const line of lines) {
152
+ const trimmedLine = line.trim();
153
+ // Skip empty lines and comments
154
+ if (!trimmedLine || trimmedLine.startsWith(':')) {
155
+ continue;
156
+ }
157
+ // Parse SSE format: "data: {...}"
158
+ if (trimmedLine.startsWith('data:')) {
159
+ const data = trimmedLine.substring(5).trim();
160
+ try {
161
+ const message = JSON.parse(data);
162
+ this.emit('message', message);
163
+ }
164
+ catch (error) {
165
+ // Log streaming parse errors for visibility
166
+ const preview = data.length > DISPLAY_LIMITS.TRANSPORT_DATA_PREVIEW ? data.substring(0, DISPLAY_LIMITS.TRANSPORT_DATA_PREVIEW) + '...' : data;
167
+ this.logger.warn({ preview, error: error instanceof Error ? error.message : String(error) }, 'Failed to parse SSE message');
168
+ }
169
+ }
170
+ else {
171
+ // Try to parse as direct JSON
172
+ try {
173
+ const message = JSON.parse(trimmedLine);
174
+ this.emit('message', message);
175
+ }
176
+ catch {
177
+ // Not JSON - this is common for non-JSON lines in streams, log only in debug
178
+ this.log('Skipping non-JSON line', { preview: trimmedLine.substring(0, DISPLAY_LIMITS.RESPONSE_DATA_PREVIEW) });
179
+ }
180
+ }
181
+ }
182
+ }
183
+ // Process any remaining data in buffer
184
+ if (buffer.trim()) {
185
+ try {
186
+ const message = JSON.parse(buffer.trim());
187
+ this.emit('message', message);
188
+ }
189
+ catch {
190
+ // Ignore incomplete data
191
+ }
192
+ }
193
+ }
194
+ catch (error) {
195
+ // On timeout or other errors, cancel the reader to release the lock
196
+ if (readerLocked) {
197
+ try {
198
+ await reader.cancel();
199
+ }
200
+ catch {
201
+ // Ignore cancel errors - reader may already be closed
202
+ }
203
+ }
204
+ throw error;
205
+ }
206
+ finally {
207
+ // Release the lock if still held
208
+ if (readerLocked) {
209
+ try {
210
+ reader.releaseLock();
211
+ readerLocked = false;
212
+ }
213
+ catch {
214
+ // Ignore releaseLock errors - lock may already be released by cancel
215
+ }
216
+ }
217
+ }
218
+ }
219
+ /**
220
+ * Close the HTTP transport.
221
+ */
222
+ close() {
223
+ this.log('Closing HTTP transport');
224
+ this.connected = false;
225
+ if (this.abortController) {
226
+ this.abortController.abort();
227
+ this.abortController = null;
228
+ }
229
+ this.emit('close');
230
+ }
231
+ /**
232
+ * Check if the transport is connected.
233
+ */
234
+ isConnected() {
235
+ return this.connected;
236
+ }
237
+ }
238
+ //# sourceMappingURL=http-transport.js.map