@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,524 @@
1
+ /**
2
+ * External Dependency Detection
3
+ *
4
+ * Detects and categorizes errors from known external services (Plaid, Stripe, AWS, etc.)
5
+ * to distinguish between:
6
+ * - Environment misconfiguration (missing credentials)
7
+ * - External API failures (service down, rate limited)
8
+ * - Actual code bugs
9
+ *
10
+ * This helps users understand whether test failures are due to their MCP server code
11
+ * or external factors beyond their control.
12
+ */
13
+ import { EXTERNAL_DEPENDENCIES } from '../constants.js';
14
+ // ==================== Detection Functions ====================
15
+ /**
16
+ * Detect if an error message indicates an external dependency.
17
+ *
18
+ * @param errorMessage - The error message to analyze
19
+ * @param toolName - Optional tool name for context
20
+ * @param toolDescription - Optional tool description for context
21
+ * @returns External dependency info if detected, null otherwise
22
+ */
23
+ export function detectExternalDependency(errorMessage, toolName, toolDescription) {
24
+ const matchedServices = [];
25
+ // Check each known service
26
+ for (const [serviceName, service] of Object.entries(EXTERNAL_DEPENDENCIES.SERVICES)) {
27
+ let confidence = 0;
28
+ const matchedPatterns = [];
29
+ let fromErrorMessage = false;
30
+ let fromToolName = false;
31
+ let fromDescription = false;
32
+ // Check error message patterns (highest weight - this is "confirmed" evidence)
33
+ for (const pattern of service.errorPatterns) {
34
+ if (pattern.test(errorMessage)) {
35
+ confidence += 0.5;
36
+ matchedPatterns.push(`error: ${pattern.source}`);
37
+ fromErrorMessage = true;
38
+ }
39
+ }
40
+ // Check tool name patterns (medium weight - this is "likely" evidence)
41
+ if (toolName) {
42
+ for (const pattern of service.toolPatterns) {
43
+ if (pattern.test(toolName)) {
44
+ confidence += 0.3;
45
+ matchedPatterns.push(`tool: ${pattern.source}`);
46
+ fromToolName = true;
47
+ }
48
+ }
49
+ }
50
+ // Check tool description patterns (lower weight - this is "possible" evidence)
51
+ if (toolDescription) {
52
+ for (const pattern of service.toolPatterns) {
53
+ if (pattern.test(toolDescription)) {
54
+ confidence += 0.2;
55
+ matchedPatterns.push(`desc: ${pattern.source}`);
56
+ fromDescription = true;
57
+ }
58
+ }
59
+ }
60
+ // Check for HTTP status codes in error message
61
+ const statusMatch = errorMessage.match(/status\s*(?:code)?\s*[:\s]?\s*(\d{3})/i);
62
+ if (statusMatch) {
63
+ const status = parseInt(statusMatch[1], 10);
64
+ if (service.statusCodes.includes(status)) {
65
+ confidence += 0.2;
66
+ matchedPatterns.push(`status: ${status}`);
67
+ fromErrorMessage = true; // Status code in error message is confirmed
68
+ }
69
+ }
70
+ if (confidence > 0) {
71
+ matchedServices.push({
72
+ serviceName: serviceName,
73
+ confidence: Math.min(confidence, 1),
74
+ matchedPatterns,
75
+ fromErrorMessage,
76
+ fromToolName,
77
+ fromDescription,
78
+ });
79
+ }
80
+ }
81
+ // Return the highest confidence match
82
+ if (matchedServices.length > 0) {
83
+ const best = matchedServices.sort((a, b) => b.confidence - a.confidence)[0];
84
+ const service = EXTERNAL_DEPENDENCIES.SERVICES[best.serviceName];
85
+ // Check if this is a transient error
86
+ const isTransient = isTransientError(errorMessage);
87
+ // Determine confidence level based on evidence sources
88
+ let confidenceLevel;
89
+ if (best.fromErrorMessage) {
90
+ // Error message matched - this is confirmed evidence
91
+ confidenceLevel = 'confirmed';
92
+ }
93
+ else if (best.fromToolName) {
94
+ // Only tool name/description matched - likely but not confirmed
95
+ confidenceLevel = 'likely';
96
+ }
97
+ else {
98
+ // Only weak evidence (description only)
99
+ confidenceLevel = 'possible';
100
+ }
101
+ return {
102
+ serviceName: best.serviceName,
103
+ displayName: service.name,
104
+ confidence: best.confidence,
105
+ confidenceLevel,
106
+ isTransient,
107
+ remediation: service.remediation,
108
+ matchedPatterns: best.matchedPatterns,
109
+ evidence: {
110
+ fromErrorMessage: best.fromErrorMessage,
111
+ fromToolName: best.fromToolName,
112
+ fromDescription: best.fromDescription,
113
+ actualErrorCount: best.fromErrorMessage ? 1 : 0, // Will be updated by caller
114
+ },
115
+ };
116
+ }
117
+ return null;
118
+ }
119
+ /**
120
+ * Detect external service dependencies based on tool name/description alone.
121
+ */
122
+ export function detectExternalServiceFromTool(toolName, toolDescription) {
123
+ const matchedServices = [];
124
+ for (const [serviceName, service] of Object.entries(EXTERNAL_DEPENDENCIES.SERVICES)) {
125
+ let confidence = 0;
126
+ const matchedPatterns = [];
127
+ let fromToolName = false;
128
+ let fromDescription = false;
129
+ for (const pattern of service.toolPatterns) {
130
+ if (pattern.test(toolName)) {
131
+ confidence += 0.6;
132
+ matchedPatterns.push(`tool: ${pattern.source}`);
133
+ fromToolName = true;
134
+ }
135
+ }
136
+ if (toolDescription) {
137
+ for (const pattern of service.toolPatterns) {
138
+ if (pattern.test(toolDescription)) {
139
+ confidence += 0.3;
140
+ matchedPatterns.push(`desc: ${pattern.source}`);
141
+ fromDescription = true;
142
+ }
143
+ }
144
+ }
145
+ if (confidence > 0) {
146
+ matchedServices.push({
147
+ serviceName: serviceName,
148
+ confidence: Math.min(confidence, 1),
149
+ matchedPatterns,
150
+ fromToolName,
151
+ fromDescription,
152
+ });
153
+ }
154
+ }
155
+ if (matchedServices.length === 0) {
156
+ return null;
157
+ }
158
+ const best = matchedServices.sort((a, b) => b.confidence - a.confidence)[0];
159
+ const service = EXTERNAL_DEPENDENCIES.SERVICES[best.serviceName];
160
+ const confidenceLevel = best.fromToolName ? 'likely' : 'possible';
161
+ return {
162
+ serviceName: best.serviceName,
163
+ displayName: service.name,
164
+ confidence: best.confidence,
165
+ confidenceLevel,
166
+ isTransient: false,
167
+ remediation: service.remediation,
168
+ matchedPatterns: best.matchedPatterns,
169
+ evidence: {
170
+ fromErrorMessage: false,
171
+ fromToolName: best.fromToolName,
172
+ fromDescription: best.fromDescription,
173
+ actualErrorCount: 0,
174
+ },
175
+ };
176
+ }
177
+ /**
178
+ * Determine whether an external service is configured.
179
+ */
180
+ export function getExternalServiceStatus(serviceName, config) {
181
+ const service = EXTERNAL_DEPENDENCIES.SERVICES[serviceName];
182
+ const credentials = service.credentials;
183
+ const configService = config?.services?.[serviceName];
184
+ const enabled = configService?.enabled;
185
+ const missing = [];
186
+ const hasConfigValue = (key) => {
187
+ const value = configService?.sandboxCredentials?.[key];
188
+ if (!value)
189
+ return false;
190
+ return !/\$\{[^}]+\}/.test(value);
191
+ };
192
+ const hasEnvValue = (key) => {
193
+ const value = process.env[key];
194
+ return value !== undefined && value !== '';
195
+ };
196
+ const requiredEnv = credentials.requiredEnv ?? [];
197
+ const requiredKeys = credentials.requiredConfigKeys ?? [];
198
+ const hasSandboxConfig = !!(configService?.sandboxCredentials && Object.keys(configService.sandboxCredentials).length > 0);
199
+ const envRequirements = hasSandboxConfig ? [] : requiredEnv;
200
+ const configRequirements = hasSandboxConfig ? requiredKeys : [];
201
+ for (const envKey of envRequirements) {
202
+ if (!hasEnvValue(envKey)) {
203
+ missing.push(envKey);
204
+ }
205
+ }
206
+ for (const configKey of configRequirements) {
207
+ if (!hasConfigValue(configKey)) {
208
+ missing.push(configKey);
209
+ }
210
+ }
211
+ const configured = enabled === false ? false : missing.length === 0;
212
+ return {
213
+ service: serviceName,
214
+ configured,
215
+ missingCredentials: missing,
216
+ sandboxAvailable: credentials.sandboxAvailable,
217
+ mockAvailable: credentials.mockAvailable,
218
+ };
219
+ }
220
+ /**
221
+ * Categorize the source of an error.
222
+ *
223
+ * @param errorMessage - The error message to analyze
224
+ * @param toolName - Optional tool name for context
225
+ * @param toolDescription - Optional tool description for context
226
+ * @returns Analysis of the error source
227
+ */
228
+ export function categorizeErrorSource(errorMessage, toolName, toolDescription) {
229
+ // First check for external dependency
230
+ const dependency = detectExternalDependency(errorMessage, toolName, toolDescription);
231
+ if (dependency && dependency.confidence >= 0.4) {
232
+ return {
233
+ source: 'external_dependency',
234
+ dependency,
235
+ isTransient: dependency.isTransient,
236
+ explanation: `Error from external service: ${dependency.displayName}`,
237
+ remediation: dependency.remediation,
238
+ };
239
+ }
240
+ // Check for environment/configuration issues
241
+ for (const pattern of EXTERNAL_DEPENDENCIES.ENVIRONMENT_PATTERNS) {
242
+ if (pattern.test(errorMessage)) {
243
+ return {
244
+ source: 'environment',
245
+ isTransient: false,
246
+ explanation: 'Error appears to be an environment or configuration issue',
247
+ remediation: 'Check environment variables and configuration files',
248
+ };
249
+ }
250
+ }
251
+ // Check for transient errors (could be external but unidentified service)
252
+ if (isTransientError(errorMessage)) {
253
+ return {
254
+ source: dependency ? 'external_dependency' : 'unknown',
255
+ dependency: dependency ?? undefined,
256
+ isTransient: true,
257
+ explanation: 'Error appears to be transient (timeout, connection issue)',
258
+ remediation: 'Consider retrying the operation or checking network connectivity',
259
+ };
260
+ }
261
+ // If we have a low-confidence dependency match, mention it
262
+ if (dependency) {
263
+ return {
264
+ source: 'external_dependency',
265
+ dependency,
266
+ isTransient: false,
267
+ explanation: `Possibly related to external service: ${dependency.displayName}`,
268
+ remediation: dependency.remediation,
269
+ };
270
+ }
271
+ // Check for patterns that suggest a code bug
272
+ const codeBugPatterns = [
273
+ /TypeError/i,
274
+ /ReferenceError/i,
275
+ /SyntaxError/i,
276
+ /undefined is not/i,
277
+ /null is not/i,
278
+ /cannot read propert/i,
279
+ /is not a function/i,
280
+ /is not defined/i,
281
+ ];
282
+ for (const pattern of codeBugPatterns) {
283
+ if (pattern.test(errorMessage)) {
284
+ return {
285
+ source: 'code_bug',
286
+ isTransient: false,
287
+ explanation: 'Error appears to be a code bug',
288
+ remediation: 'Review the MCP server implementation',
289
+ };
290
+ }
291
+ }
292
+ // Unknown source
293
+ return {
294
+ source: 'unknown',
295
+ isTransient: false,
296
+ explanation: 'Could not determine error source',
297
+ remediation: 'Review the error message and MCP server logs',
298
+ };
299
+ }
300
+ /**
301
+ * Check if an error appears to be transient (temporary).
302
+ *
303
+ * @param errorMessage - The error message to check
304
+ * @returns True if the error appears transient
305
+ */
306
+ export function isTransientError(errorMessage) {
307
+ for (const pattern of EXTERNAL_DEPENDENCIES.TRANSIENT_PATTERNS) {
308
+ if (pattern.test(errorMessage)) {
309
+ return true;
310
+ }
311
+ }
312
+ return false;
313
+ }
314
+ /**
315
+ * Helper to compare confidence levels for priority.
316
+ */
317
+ function confidenceLevelPriority(level) {
318
+ switch (level) {
319
+ case 'confirmed': return 3;
320
+ case 'likely': return 2;
321
+ case 'possible': return 1;
322
+ }
323
+ }
324
+ /**
325
+ * Analyze multiple error patterns and generate a summary.
326
+ *
327
+ * @param errors - Array of tool names and their error patterns
328
+ * @returns Summary of external dependencies
329
+ */
330
+ export function analyzeExternalDependencies(errors) {
331
+ const services = new Map();
332
+ const affectedTools = new Map();
333
+ let totalExternalErrors = 0;
334
+ let totalEnvironmentErrors = 0;
335
+ let totalCodeBugErrors = 0;
336
+ let totalUnknownErrors = 0;
337
+ for (const { toolName, toolDescription, patterns } of errors) {
338
+ const toolServices = [];
339
+ for (const pattern of patterns) {
340
+ const analysis = categorizeErrorSource(pattern.example, toolName, toolDescription);
341
+ switch (analysis.source) {
342
+ case 'external_dependency':
343
+ totalExternalErrors += pattern.count;
344
+ if (analysis.dependency) {
345
+ const { serviceName, displayName, isTransient, remediation, confidenceLevel } = analysis.dependency;
346
+ toolServices.push(serviceName);
347
+ const isConfirmed = confidenceLevel === 'confirmed';
348
+ const existing = services.get(serviceName);
349
+ if (existing) {
350
+ existing.errorCount += pattern.count;
351
+ if (isConfirmed) {
352
+ existing.confirmedErrorCount += pattern.count;
353
+ }
354
+ if (!existing.tools.includes(toolName)) {
355
+ existing.tools.push(toolName);
356
+ }
357
+ // Track confirmed vs detected tools separately
358
+ if (isConfirmed && !existing.confirmedTools.includes(toolName)) {
359
+ existing.confirmedTools.push(toolName);
360
+ }
361
+ else if (!isConfirmed && !existing.detectedTools.includes(toolName) && !existing.confirmedTools.includes(toolName)) {
362
+ existing.detectedTools.push(toolName);
363
+ }
364
+ existing.hasTransientErrors = existing.hasTransientErrors || isTransient;
365
+ // Update highest confidence level
366
+ if (confidenceLevelPriority(confidenceLevel) > confidenceLevelPriority(existing.highestConfidenceLevel)) {
367
+ existing.highestConfidenceLevel = confidenceLevel;
368
+ }
369
+ }
370
+ else {
371
+ services.set(serviceName, {
372
+ displayName,
373
+ errorCount: pattern.count,
374
+ confirmedErrorCount: isConfirmed ? pattern.count : 0,
375
+ confirmedTools: isConfirmed ? [toolName] : [],
376
+ detectedTools: isConfirmed ? [] : [toolName],
377
+ tools: [toolName],
378
+ hasTransientErrors: isTransient,
379
+ remediation,
380
+ highestConfidenceLevel: confidenceLevel,
381
+ });
382
+ }
383
+ }
384
+ break;
385
+ case 'environment':
386
+ totalEnvironmentErrors += pattern.count;
387
+ break;
388
+ case 'code_bug':
389
+ totalCodeBugErrors += pattern.count;
390
+ break;
391
+ default:
392
+ totalUnknownErrors += pattern.count;
393
+ }
394
+ }
395
+ if (toolServices.length > 0) {
396
+ // Deduplicate services for this tool
397
+ const uniqueServices = [...new Set(toolServices)];
398
+ affectedTools.set(toolName, uniqueServices);
399
+ }
400
+ }
401
+ return {
402
+ services,
403
+ totalExternalErrors,
404
+ totalEnvironmentErrors,
405
+ totalCodeBugErrors,
406
+ totalUnknownErrors,
407
+ affectedTools,
408
+ };
409
+ }
410
+ // ==================== Formatting Functions ====================
411
+ /**
412
+ * Format external dependency summary for display.
413
+ *
414
+ * @param summary - The summary to format
415
+ * @param useColors - Whether to use ANSI colors
416
+ * @returns Formatted string
417
+ */
418
+ export function formatExternalDependencySummary(summary, useColors = false) {
419
+ const lines = [];
420
+ const { cyan, yellow, dim } = useColors ? getColors() : getNoColors();
421
+ if (summary.services.size === 0) {
422
+ return dim('No external dependencies detected');
423
+ }
424
+ lines.push(cyan('External Dependencies Detected'));
425
+ lines.push('');
426
+ for (const [, service] of summary.services) {
427
+ const transientNote = service.hasTransientErrors ? ' (some errors may be transient)' : '';
428
+ lines.push(` ${service.displayName}${transientNote}`);
429
+ lines.push(` ${dim('Errors:')} ${service.errorCount}`);
430
+ lines.push(` ${dim('Tools:')} ${service.tools.join(', ')}`);
431
+ lines.push(` ${yellow('Fix:')} ${service.remediation}`);
432
+ lines.push('');
433
+ }
434
+ // Summary counts
435
+ const totalErrors = summary.totalExternalErrors +
436
+ summary.totalEnvironmentErrors +
437
+ summary.totalCodeBugErrors +
438
+ summary.totalUnknownErrors;
439
+ lines.push(dim('Error Classification:'));
440
+ lines.push(` External Services: ${summary.totalExternalErrors}/${totalErrors}`);
441
+ lines.push(` Environment Issues: ${summary.totalEnvironmentErrors}/${totalErrors}`);
442
+ lines.push(` Code Bugs: ${summary.totalCodeBugErrors}/${totalErrors}`);
443
+ lines.push(` Unknown: ${summary.totalUnknownErrors}/${totalErrors}`);
444
+ return lines.join('\n');
445
+ }
446
+ /**
447
+ * Generate markdown table for external dependencies.
448
+ *
449
+ * @param summary - The summary to format
450
+ * @returns Markdown string
451
+ */
452
+ export function formatExternalDependenciesMarkdown(summary) {
453
+ if (summary.services.size === 0) {
454
+ return '';
455
+ }
456
+ const lines = [];
457
+ lines.push('### External Dependencies Detected');
458
+ lines.push('');
459
+ lines.push('| Service | Confidence | Errors | Confirmed Tools | Detected Tools | Recommendation |');
460
+ lines.push('|---------|------------|--------|-----------------|----------------|----------------|');
461
+ for (const [, service] of summary.services) {
462
+ // Show confidence level with visual indicator
463
+ const confidenceIcon = service.highestConfidenceLevel === 'confirmed' ? '✓' :
464
+ service.highestConfidenceLevel === 'likely' ? '~' : '?';
465
+ const confidenceLabel = `${confidenceIcon} ${service.highestConfidenceLevel}`;
466
+ // Format confirmed tools (from actual errors)
467
+ const confirmedTools = service.confirmedTools.length > 0
468
+ ? service.confirmedTools.map((t) => `\`${t}\``).join(', ')
469
+ : '-';
470
+ // Format detected tools (from name/description only - not confirmed by errors)
471
+ const detectedTools = service.detectedTools.length > 0
472
+ ? service.detectedTools.map((t) => `\`${t}\``).join(', ')
473
+ : '-';
474
+ // Show confirmed errors vs total
475
+ const errorDisplay = service.confirmedErrorCount > 0
476
+ ? `${service.confirmedErrorCount} confirmed`
477
+ : `${service.errorCount} (unconfirmed)`;
478
+ lines.push(`| ${service.displayName} | ${confidenceLabel} | ${errorDisplay} | ${confirmedTools} | ${detectedTools} | ${service.remediation} |`);
479
+ }
480
+ lines.push('');
481
+ // Add error classification summary
482
+ const totalErrors = summary.totalExternalErrors +
483
+ summary.totalEnvironmentErrors +
484
+ summary.totalCodeBugErrors +
485
+ summary.totalUnknownErrors;
486
+ if (totalErrors > 0) {
487
+ lines.push('**Error Classification:**');
488
+ lines.push('');
489
+ if (summary.totalExternalErrors > 0) {
490
+ const pct = Math.round((summary.totalExternalErrors / totalErrors) * 100);
491
+ lines.push(`- External Services: ${summary.totalExternalErrors} (${pct}%)`);
492
+ }
493
+ if (summary.totalEnvironmentErrors > 0) {
494
+ const pct = Math.round((summary.totalEnvironmentErrors / totalErrors) * 100);
495
+ lines.push(`- Environment Issues: ${summary.totalEnvironmentErrors} (${pct}%)`);
496
+ }
497
+ if (summary.totalCodeBugErrors > 0) {
498
+ const pct = Math.round((summary.totalCodeBugErrors / totalErrors) * 100);
499
+ lines.push(`- Code Bugs: ${summary.totalCodeBugErrors} (${pct}%)`);
500
+ }
501
+ if (summary.totalUnknownErrors > 0) {
502
+ const pct = Math.round((summary.totalUnknownErrors / totalErrors) * 100);
503
+ lines.push(`- Unclassified: ${summary.totalUnknownErrors} (${pct}%)`);
504
+ }
505
+ lines.push('');
506
+ }
507
+ return lines.join('\n');
508
+ }
509
+ function getColors() {
510
+ return {
511
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
512
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
513
+ dim: (s) => `\x1b[2m${s}\x1b[0m`,
514
+ };
515
+ }
516
+ function getNoColors() {
517
+ const identity = (s) => s;
518
+ return {
519
+ cyan: identity,
520
+ yellow: identity,
521
+ dim: identity,
522
+ };
523
+ }
524
+ //# sourceMappingURL=external-dependency-detector.js.map
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Golden Output Testing - Capture and compare expected tool outputs.
3
+ *
4
+ * Golden outputs provide a reference for expected tool behavior,
5
+ * enabling detection of semantic changes that schema validation
6
+ * might miss (e.g., different category names, changed formats).
7
+ */
8
+ import type { MCPToolCallResult } from '../transport/types.js';
9
+ /**
10
+ * Comparison modes for golden output validation.
11
+ */
12
+ export type GoldenComparisonMode = 'exact' | 'structural' | 'semantic';
13
+ /**
14
+ * Content type of the golden output.
15
+ */
16
+ export type GoldenContentType = 'json' | 'markdown' | 'text';
17
+ /**
18
+ * Severity of golden output drift.
19
+ */
20
+ export type GoldenDriftSeverity = 'none' | 'info' | 'warning' | 'breaking';
21
+ /**
22
+ * A captured golden output for a tool.
23
+ */
24
+ export interface GoldenOutput {
25
+ /** Tool name this golden output is for */
26
+ toolName: string;
27
+ /** When the golden output was captured */
28
+ capturedAt: string;
29
+ /** Input arguments used to generate this output */
30
+ inputArgs: Record<string, unknown>;
31
+ /** The captured output */
32
+ output: {
33
+ /** Raw output string */
34
+ raw: string;
35
+ /** Detected content type */
36
+ contentType: GoldenContentType;
37
+ /** Hash of the raw content for quick comparison */
38
+ contentHash: string;
39
+ /** Inferred JSON structure (if JSON content) */
40
+ structure?: Record<string, unknown>;
41
+ /** Extracted key-value pairs for semantic comparison */
42
+ keyValues?: Record<string, unknown>;
43
+ };
44
+ /** Tolerance configuration for comparisons */
45
+ tolerance: {
46
+ /** Comparison mode to use */
47
+ mode: GoldenComparisonMode;
48
+ /** JSONPath patterns for values that are allowed to change */
49
+ allowedDrift: string[];
50
+ /** Whether to normalize timestamps before comparison */
51
+ normalizeTimestamps?: boolean;
52
+ /** Whether to normalize UUIDs before comparison */
53
+ normalizeUuids?: boolean;
54
+ };
55
+ /** Optional description of what this golden output represents */
56
+ description?: string;
57
+ /** Schema version for future compatibility */
58
+ version: number;
59
+ }
60
+ /**
61
+ * Result of comparing current output against golden.
62
+ */
63
+ export interface GoldenComparisonResult {
64
+ /** Tool name */
65
+ toolName: string;
66
+ /** Whether the comparison passed */
67
+ passed: boolean;
68
+ /** Drift severity (if any) */
69
+ severity: GoldenDriftSeverity;
70
+ /** Comparison mode used */
71
+ mode: GoldenComparisonMode;
72
+ /** When the golden was captured */
73
+ goldenCapturedAt: string;
74
+ /** Detected differences */
75
+ differences: GoldenDifference[];
76
+ /** Summary of the comparison */
77
+ summary: string;
78
+ }
79
+ /**
80
+ * A single difference between golden and current output.
81
+ */
82
+ export interface GoldenDifference {
83
+ /** Type of difference */
84
+ type: 'added' | 'removed' | 'changed' | 'type_changed' | 'value_changed';
85
+ /** JSONPath or location of the difference */
86
+ path: string;
87
+ /** Expected value (from golden) */
88
+ expected?: unknown;
89
+ /** Actual value (from current) */
90
+ actual?: unknown;
91
+ /** Whether this difference is allowed by tolerance config */
92
+ allowed: boolean;
93
+ /** Description of the change */
94
+ description: string;
95
+ }
96
+ /**
97
+ * Options for saving a golden output.
98
+ */
99
+ export interface GoldenSaveOptions {
100
+ /** Comparison mode to use for this golden */
101
+ mode?: GoldenComparisonMode;
102
+ /** JSONPath patterns for allowed drift */
103
+ allowedDrift?: string[];
104
+ /** Whether to normalize timestamps */
105
+ normalizeTimestamps?: boolean;
106
+ /** Whether to normalize UUIDs */
107
+ normalizeUuids?: boolean;
108
+ /** Description of the golden output */
109
+ description?: string;
110
+ }
111
+ /**
112
+ * Golden output storage/file structure.
113
+ */
114
+ export interface GoldenOutputStore {
115
+ /** Schema version */
116
+ version: number;
117
+ /** All stored golden outputs */
118
+ outputs: GoldenOutput[];
119
+ /** When the store was last updated */
120
+ lastUpdated: string;
121
+ }
122
+ /**
123
+ * Get the path to the golden output store file.
124
+ */
125
+ export declare function getGoldenStorePath(outputDir?: string): string;
126
+ /**
127
+ * Load the golden output store from disk.
128
+ */
129
+ export declare function loadGoldenStore(storePath: string): GoldenOutputStore;
130
+ /**
131
+ * Save the golden output store to disk.
132
+ */
133
+ export declare function saveGoldenStore(store: GoldenOutputStore, storePath: string): void;
134
+ /**
135
+ * Create a golden output from a tool response.
136
+ */
137
+ export declare function createGoldenOutput(toolName: string, inputArgs: Record<string, unknown>, response: MCPToolCallResult, options?: GoldenSaveOptions): GoldenOutput;
138
+ /**
139
+ * Save a golden output to the store.
140
+ */
141
+ export declare function saveGoldenOutput(golden: GoldenOutput, storePath: string): void;
142
+ /**
143
+ * Get a golden output for a specific tool.
144
+ */
145
+ export declare function getGoldenOutput(toolName: string, storePath: string, inputArgs?: Record<string, unknown>): GoldenOutput | undefined;
146
+ /**
147
+ * List all golden outputs in the store.
148
+ */
149
+ export declare function listGoldenOutputs(storePath: string): GoldenOutput[];
150
+ /**
151
+ * Delete a golden output from the store.
152
+ */
153
+ export declare function deleteGoldenOutput(toolName: string, storePath: string, inputArgs?: Record<string, unknown>): boolean;
154
+ /**
155
+ * Compare current output against a golden output.
156
+ */
157
+ export declare function compareWithGolden(golden: GoldenOutput, currentResponse: MCPToolCallResult): GoldenComparisonResult;
158
+ /**
159
+ * Compare all golden outputs against current tool responses.
160
+ */
161
+ export declare function compareAllGoldens(storePath: string, getToolResponse: (toolName: string, args: Record<string, unknown>) => Promise<MCPToolCallResult>): Promise<GoldenComparisonResult[]>;
162
+ //# sourceMappingURL=golden-output.d.ts.map