@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,118 @@
1
+ /**
2
+ * Semantic Embeddings for Drift Detection
3
+ *
4
+ * Provides optional embedding-based similarity for improved paraphrase detection.
5
+ * Uses Ollama for local embeddings (free, no API cost) or can be extended
6
+ * for other providers.
7
+ */
8
+ import type { ConfidenceFactor } from './types.js';
9
+ /**
10
+ * Interface for embedding providers.
11
+ */
12
+ export interface EmbeddingProvider {
13
+ /** Provider name */
14
+ name: string;
15
+ /** Generate embedding vector for text */
16
+ embed(text: string): Promise<number[]>;
17
+ /** Calculate similarity between two embedding vectors */
18
+ similarity(a: number[], b: number[]): number;
19
+ /** Check if the provider is available */
20
+ isAvailable(): Promise<boolean>;
21
+ }
22
+ /**
23
+ * Ollama-based local embeddings using nomic-embed-text model.
24
+ * Free and runs locally without API costs.
25
+ */
26
+ export declare class OllamaEmbeddings implements EmbeddingProvider {
27
+ name: string;
28
+ private baseUrl;
29
+ private model;
30
+ private cache;
31
+ constructor(options?: {
32
+ baseUrl?: string;
33
+ model?: string;
34
+ });
35
+ isAvailable(): Promise<boolean>;
36
+ embed(text: string): Promise<number[]>;
37
+ similarity(a: number[], b: number[]): number;
38
+ clearCache(): void;
39
+ }
40
+ /**
41
+ * Calculate cosine similarity between two vectors.
42
+ * Returns a value between -1 and 1, where 1 is identical.
43
+ */
44
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
45
+ /**
46
+ * Configuration for embedding-enhanced comparison.
47
+ */
48
+ export interface EmbeddingConfig {
49
+ /** Whether to use embeddings (default: false) */
50
+ enabled: boolean;
51
+ /** Embedding provider to use */
52
+ provider: EmbeddingProvider;
53
+ /** Weight for embedding similarity in overall confidence (0-1) */
54
+ weight: number;
55
+ /** Minimum similarity to consider a match (0-1) */
56
+ matchThreshold: number;
57
+ /** Timeout for embedding requests in ms */
58
+ timeout: number;
59
+ }
60
+ /**
61
+ * Default embedding configuration.
62
+ */
63
+ export declare const DEFAULT_EMBEDDING_CONFIG: EmbeddingConfig;
64
+ /**
65
+ * Result of embedding-based comparison.
66
+ */
67
+ export interface EmbeddingComparisonResult {
68
+ /** Whether embeddings were successfully used */
69
+ used: boolean;
70
+ /** Cosine similarity score (0-1) */
71
+ similarity: number;
72
+ /** Similarity as percentage (0-100) */
73
+ similarityPercent: number;
74
+ /** Whether similarity meets match threshold */
75
+ meetsThreshold: boolean;
76
+ /** Error message if embeddings failed */
77
+ error?: string;
78
+ }
79
+ /**
80
+ * Compare two texts using embeddings.
81
+ */
82
+ export declare function compareWithEmbeddings(text1: string, text2: string, config?: Partial<EmbeddingConfig>): Promise<EmbeddingComparisonResult>;
83
+ /**
84
+ * Create a confidence factor from embedding comparison.
85
+ */
86
+ export declare function createEmbeddingFactor(result: EmbeddingComparisonResult): ConfidenceFactor | null;
87
+ /**
88
+ * Enhanced semantic comparator that optionally uses embeddings.
89
+ */
90
+ export declare class EmbeddingEnhancedComparator {
91
+ private config;
92
+ private providerChecked;
93
+ private providerAvailable;
94
+ constructor(config?: Partial<EmbeddingConfig>);
95
+ /**
96
+ * Check provider availability (cached).
97
+ */
98
+ checkAvailability(): Promise<boolean>;
99
+ /**
100
+ * Get embedding similarity as an additional confidence factor.
101
+ * Falls back gracefully if embeddings are unavailable.
102
+ */
103
+ getEmbeddingFactor(text1: string, text2: string): Promise<ConfidenceFactor | null>;
104
+ /**
105
+ * Determine if texts match based on embedding similarity alone.
106
+ */
107
+ matchesByEmbedding(text1: string, text2: string): Promise<boolean>;
108
+ }
109
+ /**
110
+ * Check if Ollama is available and has the embedding model.
111
+ */
112
+ export declare function checkOllamaEmbeddings(): Promise<{
113
+ available: boolean;
114
+ hasModel: boolean;
115
+ modelName: string;
116
+ error?: string;
117
+ }>;
118
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Semantic Embeddings for Drift Detection
3
+ *
4
+ * Provides optional embedding-based similarity for improved paraphrase detection.
5
+ * Uses Ollama for local embeddings (free, no API cost) or can be extended
6
+ * for other providers.
7
+ */
8
+ import { MATH_FACTORS, TIME_CONSTANTS } from '../constants.js';
9
+ /**
10
+ * Ollama-based local embeddings using nomic-embed-text model.
11
+ * Free and runs locally without API costs.
12
+ */
13
+ export class OllamaEmbeddings {
14
+ name = 'ollama';
15
+ baseUrl;
16
+ model;
17
+ cache = new Map();
18
+ constructor(options = {}) {
19
+ this.baseUrl = options.baseUrl ?? process.env.OLLAMA_BASE_URL ?? 'http://localhost:11434';
20
+ this.model = options.model ?? 'nomic-embed-text';
21
+ }
22
+ async isAvailable() {
23
+ try {
24
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
25
+ method: 'GET',
26
+ signal: AbortSignal.timeout(2000),
27
+ });
28
+ return response.ok;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ async embed(text) {
35
+ // Check cache first
36
+ const cacheKey = `${this.model}:${text}`;
37
+ const cached = this.cache.get(cacheKey);
38
+ if (cached)
39
+ return cached;
40
+ const response = await fetch(`${this.baseUrl}/api/embeddings`, {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json' },
43
+ body: JSON.stringify({
44
+ model: this.model,
45
+ prompt: text,
46
+ }),
47
+ });
48
+ if (!response.ok) {
49
+ throw new Error(`Ollama embedding failed: ${response.statusText}`);
50
+ }
51
+ const result = await response.json();
52
+ const embedding = result.embedding;
53
+ // Cache the result
54
+ this.cache.set(cacheKey, embedding);
55
+ return embedding;
56
+ }
57
+ similarity(a, b) {
58
+ return cosineSimilarity(a, b);
59
+ }
60
+ clearCache() {
61
+ this.cache.clear();
62
+ }
63
+ }
64
+ /**
65
+ * Calculate cosine similarity between two vectors.
66
+ * Returns a value between -1 and 1, where 1 is identical.
67
+ */
68
+ export function cosineSimilarity(a, b) {
69
+ if (a.length !== b.length) {
70
+ throw new Error('Vectors must have the same length');
71
+ }
72
+ let dotProduct = 0;
73
+ let magnitudeA = 0;
74
+ let magnitudeB = 0;
75
+ for (let i = 0; i < a.length; i++) {
76
+ dotProduct += a[i] * b[i];
77
+ magnitudeA += a[i] * a[i];
78
+ magnitudeB += b[i] * b[i];
79
+ }
80
+ magnitudeA = Math.sqrt(magnitudeA);
81
+ magnitudeB = Math.sqrt(magnitudeB);
82
+ if (magnitudeA === 0 || magnitudeB === 0) {
83
+ return 0;
84
+ }
85
+ return dotProduct / (magnitudeA * magnitudeB);
86
+ }
87
+ /**
88
+ * Default embedding configuration.
89
+ */
90
+ export const DEFAULT_EMBEDDING_CONFIG = {
91
+ enabled: false,
92
+ provider: new OllamaEmbeddings(),
93
+ weight: MATH_FACTORS.EMBEDDING_WEIGHT,
94
+ matchThreshold: MATH_FACTORS.EMBEDDING_MATCH_THRESHOLD,
95
+ timeout: TIME_CONSTANTS.EMBEDDING_TIMEOUT,
96
+ };
97
+ /**
98
+ * Compare two texts using embeddings.
99
+ */
100
+ export async function compareWithEmbeddings(text1, text2, config = {}) {
101
+ const fullConfig = { ...DEFAULT_EMBEDDING_CONFIG, ...config };
102
+ if (!fullConfig.enabled) {
103
+ return {
104
+ used: false,
105
+ similarity: 0,
106
+ similarityPercent: 0,
107
+ meetsThreshold: false,
108
+ };
109
+ }
110
+ try {
111
+ // Check if provider is available
112
+ const available = await Promise.race([
113
+ fullConfig.provider.isAvailable(),
114
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Availability check timeout')), 2000)),
115
+ ]);
116
+ if (!available) {
117
+ return {
118
+ used: false,
119
+ similarity: 0,
120
+ similarityPercent: 0,
121
+ meetsThreshold: false,
122
+ error: 'Embedding provider not available',
123
+ };
124
+ }
125
+ // Generate embeddings with timeout
126
+ const embedPromise = Promise.all([
127
+ fullConfig.provider.embed(text1),
128
+ fullConfig.provider.embed(text2),
129
+ ]);
130
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Embedding timeout')), fullConfig.timeout));
131
+ const [emb1, emb2] = await Promise.race([embedPromise, timeoutPromise]);
132
+ // Calculate similarity
133
+ const similarity = fullConfig.provider.similarity(emb1, emb2);
134
+ const similarityPercent = Math.round(similarity * 100);
135
+ return {
136
+ used: true,
137
+ similarity,
138
+ similarityPercent,
139
+ meetsThreshold: similarity >= fullConfig.matchThreshold,
140
+ };
141
+ }
142
+ catch (error) {
143
+ return {
144
+ used: false,
145
+ similarity: 0,
146
+ similarityPercent: 0,
147
+ meetsThreshold: false,
148
+ error: error instanceof Error ? error.message : String(error),
149
+ };
150
+ }
151
+ }
152
+ /**
153
+ * Create a confidence factor from embedding comparison.
154
+ */
155
+ export function createEmbeddingFactor(result) {
156
+ if (!result.used) {
157
+ return null;
158
+ }
159
+ return {
160
+ name: 'embedding_similarity',
161
+ weight: DEFAULT_EMBEDDING_CONFIG.weight,
162
+ value: result.similarityPercent,
163
+ description: `${result.similarityPercent}% semantic embedding similarity`,
164
+ };
165
+ }
166
+ /**
167
+ * Enhanced semantic comparator that optionally uses embeddings.
168
+ */
169
+ export class EmbeddingEnhancedComparator {
170
+ config;
171
+ providerChecked = false;
172
+ providerAvailable = false;
173
+ constructor(config = {}) {
174
+ this.config = { ...DEFAULT_EMBEDDING_CONFIG, ...config };
175
+ }
176
+ /**
177
+ * Check provider availability (cached).
178
+ */
179
+ async checkAvailability() {
180
+ if (this.providerChecked) {
181
+ return this.providerAvailable;
182
+ }
183
+ this.providerAvailable = await this.config.provider.isAvailable();
184
+ this.providerChecked = true;
185
+ return this.providerAvailable;
186
+ }
187
+ /**
188
+ * Get embedding similarity as an additional confidence factor.
189
+ * Falls back gracefully if embeddings are unavailable.
190
+ */
191
+ async getEmbeddingFactor(text1, text2) {
192
+ if (!this.config.enabled) {
193
+ return null;
194
+ }
195
+ const result = await compareWithEmbeddings(text1, text2, this.config);
196
+ return createEmbeddingFactor(result);
197
+ }
198
+ /**
199
+ * Determine if texts match based on embedding similarity alone.
200
+ */
201
+ async matchesByEmbedding(text1, text2) {
202
+ if (!this.config.enabled) {
203
+ return false;
204
+ }
205
+ const result = await compareWithEmbeddings(text1, text2, this.config);
206
+ return result.meetsThreshold;
207
+ }
208
+ }
209
+ /**
210
+ * Check if Ollama is available and has the embedding model.
211
+ */
212
+ export async function checkOllamaEmbeddings() {
213
+ const provider = new OllamaEmbeddings();
214
+ try {
215
+ const available = await provider.isAvailable();
216
+ if (!available) {
217
+ return {
218
+ available: false,
219
+ hasModel: false,
220
+ modelName: 'nomic-embed-text',
221
+ error: 'Ollama is not running or not accessible',
222
+ };
223
+ }
224
+ // Try to generate a test embedding
225
+ try {
226
+ await provider.embed('test');
227
+ return {
228
+ available: true,
229
+ hasModel: true,
230
+ modelName: 'nomic-embed-text',
231
+ };
232
+ }
233
+ catch (embedError) {
234
+ return {
235
+ available: true,
236
+ hasModel: false,
237
+ modelName: 'nomic-embed-text',
238
+ error: `Model not found. Run: ollama pull nomic-embed-text`,
239
+ };
240
+ }
241
+ }
242
+ catch (error) {
243
+ return {
244
+ available: false,
245
+ hasModel: false,
246
+ modelName: 'nomic-embed-text',
247
+ error: error instanceof Error ? error.message : String(error),
248
+ };
249
+ }
250
+ }
251
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Rich error analysis with remediation suggestions.
3
+ *
4
+ * This module provides enhanced error analysis capabilities:
5
+ * - HTTP status code parsing and categorization
6
+ * - Root cause inference from error messages
7
+ * - Remediation suggestion generation
8
+ * - Related parameter extraction
9
+ * - Transient error detection
10
+ * - Error trend analysis across baselines
11
+ */
12
+ import type { ErrorPattern } from './response-fingerprint.js';
13
+ import type { ErrorTrend, ErrorTrendReport } from './types.js';
14
+ export type { ErrorTrend, ErrorTrendReport };
15
+ /** HTTP status code categories for error classification */
16
+ export type HttpStatusCategory = 'client_error_validation' | 'client_error_auth' | 'client_error_not_found' | 'client_error_conflict' | 'client_error_rate_limit' | 'server_error' | 'validation_expected' | 'unknown';
17
+ /** Severity level for error analysis */
18
+ export type ErrorSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
19
+ /**
20
+ * Context about the test that generated the error.
21
+ * Used to distinguish expected validation errors from actual bugs.
22
+ */
23
+ export interface ErrorContext {
24
+ /** Whether the error was expected (from a validation test) */
25
+ wasExpected?: boolean;
26
+ /** The expected outcome of the test */
27
+ expectedOutcome?: 'success' | 'error' | 'either';
28
+ /** The test category */
29
+ testCategory?: string;
30
+ }
31
+ /** Enhanced error analysis result */
32
+ export interface EnhancedErrorAnalysis {
33
+ /** Original error pattern */
34
+ pattern: ErrorPattern;
35
+ /** HTTP status code if detected */
36
+ httpStatus?: number;
37
+ /** Status category */
38
+ statusCategory: HttpStatusCategory;
39
+ /** Root cause analysis */
40
+ rootCause: string;
41
+ /** Remediation suggestion */
42
+ remediation: string;
43
+ /** Related parameters (if identifiable) */
44
+ relatedParameters: string[];
45
+ /** Whether this error is likely transient */
46
+ transient: boolean;
47
+ /** Severity assessment */
48
+ severity: ErrorSeverity;
49
+ /**
50
+ * Whether this error was expected (from a validation test).
51
+ * Expected errors are intentional test outcomes, not actual bugs.
52
+ */
53
+ wasExpected?: boolean;
54
+ }
55
+ /** Error analysis summary for a tool */
56
+ export interface ErrorAnalysisSummary {
57
+ /** Tool name */
58
+ tool: string;
59
+ /** Total errors analyzed */
60
+ totalErrors: number;
61
+ /** Enhanced analyses */
62
+ analyses: EnhancedErrorAnalysis[];
63
+ /** Most common error category */
64
+ dominantCategory: HttpStatusCategory;
65
+ /** Count of transient errors */
66
+ transientErrors: number;
67
+ /** Count of actionable errors (with clear remediation) */
68
+ actionableCount: number;
69
+ /** Unique remediations suggested */
70
+ remediations: string[];
71
+ /** Counts by error category */
72
+ categoryCounts: Map<string, number>;
73
+ /** Top root causes (most common) */
74
+ topRootCauses: string[];
75
+ /** Top remediations (most actionable) */
76
+ topRemediations: string[];
77
+ /** Related parameters across all errors */
78
+ relatedParameters: string[];
79
+ }
80
+ /**
81
+ * Analyze an error message for enhanced information.
82
+ *
83
+ * @param errorMessage - The error message to analyze
84
+ * @param context - Optional context about the test that generated the error
85
+ * @returns Enhanced error analysis with root cause and remediation
86
+ */
87
+ export declare function analyzeError(errorMessage: string, context?: ErrorContext): EnhancedErrorAnalysis;
88
+ /**
89
+ * Error pattern with context for analysis.
90
+ */
91
+ export interface ErrorPatternWithContext {
92
+ /** The error pattern */
93
+ pattern: ErrorPattern;
94
+ /** Context about the test that generated the error */
95
+ context?: ErrorContext;
96
+ }
97
+ /**
98
+ * Analyze multiple error patterns and return enhanced analyses.
99
+ *
100
+ * @param patterns - Array of error patterns to analyze
101
+ * @param defaultContext - Default context to apply to all patterns without individual context
102
+ * @returns Array of enhanced error analyses
103
+ */
104
+ export declare function analyzeErrorPatterns(patterns: ErrorPattern[] | ErrorPatternWithContext[], defaultContext?: ErrorContext): EnhancedErrorAnalysis[];
105
+ /**
106
+ * Generate an error analysis summary for a tool.
107
+ *
108
+ * @param toolName - Name of the tool
109
+ * @param patterns - Error patterns for the tool
110
+ * @returns Error analysis summary
111
+ */
112
+ export declare function generateErrorSummary(toolName: string, patterns: ErrorPattern[]): ErrorAnalysisSummary;
113
+ /**
114
+ * Compare error patterns and identify trends.
115
+ *
116
+ * @param previous - Error patterns from previous baseline
117
+ * @param current - Error patterns from current baseline
118
+ * @returns Error trend report
119
+ */
120
+ export declare function analyzeErrorTrends(previous: ErrorPattern[], current: ErrorPattern[]): ErrorTrendReport;
121
+ /**
122
+ * Extract HTTP status code from error message.
123
+ *
124
+ * @param message - Error message to parse
125
+ * @returns HTTP status code if found, undefined otherwise
126
+ */
127
+ export declare function extractHttpStatus(message: string): number | undefined;
128
+ /**
129
+ * Categorize HTTP status code into a category.
130
+ *
131
+ * @param status - HTTP status code
132
+ * @returns HTTP status category
133
+ */
134
+ export declare function categorizeHttpStatus(status: number | undefined): HttpStatusCategory;
135
+ /**
136
+ * Infer root cause from error message and category.
137
+ *
138
+ * @param message - Error message
139
+ * @param category - HTTP status category
140
+ * @returns Root cause description
141
+ */
142
+ export declare function inferRootCause(message: string, category: HttpStatusCategory): string;
143
+ /**
144
+ * Generate remediation suggestion based on category and message.
145
+ *
146
+ * @param category - HTTP status category
147
+ * @param message - Error message
148
+ * @returns Remediation suggestion
149
+ */
150
+ export declare function generateRemediation(category: HttpStatusCategory, message: string): string;
151
+ /**
152
+ * Extract parameter names mentioned in error message.
153
+ *
154
+ * @param message - Error message
155
+ * @returns Array of parameter names
156
+ */
157
+ export declare function extractRelatedParameters(message: string): string[];
158
+ /**
159
+ * Determine if error is likely transient (temporary).
160
+ *
161
+ * @param category - HTTP status category
162
+ * @param message - Error message
163
+ * @returns Whether the error is likely transient
164
+ */
165
+ export declare function isTransientError(category: HttpStatusCategory, message: string): boolean;
166
+ /**
167
+ * Assess error severity based on category and message.
168
+ *
169
+ * @param category - HTTP status category
170
+ * @param message - Error message
171
+ * @returns Error severity level
172
+ */
173
+ export declare function assessErrorSeverity(category: HttpStatusCategory, message: string): ErrorSeverity;
174
+ /**
175
+ * Map HTTP status category to ErrorPattern category.
176
+ */
177
+ export declare function mapStatusToErrorCategory(category: HttpStatusCategory): 'validation' | 'not_found' | 'permission' | 'timeout' | 'internal' | 'unknown';
178
+ /**
179
+ * Format enhanced error analysis for display.
180
+ *
181
+ * @param analysis - Enhanced error analysis
182
+ * @param useColors - Whether to use ANSI colors
183
+ * @returns Formatted string
184
+ */
185
+ export declare function formatEnhancedError(analysis: EnhancedErrorAnalysis, useColors?: boolean): string;
186
+ /**
187
+ * Format error trend report for display.
188
+ *
189
+ * @param report - Error trend report
190
+ * @param useColors - Whether to use ANSI colors
191
+ * @returns Formatted string
192
+ */
193
+ export declare function formatErrorTrendReport(report: ErrorTrendReport, useColors?: boolean): string;
194
+ /**
195
+ * Format category name for display.
196
+ */
197
+ export declare function formatCategoryName(category: HttpStatusCategory): string;
198
+ //# sourceMappingURL=error-analyzer.d.ts.map