@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,241 @@
1
+ /**
2
+ * Prometheus metrics exporter.
3
+ *
4
+ * Exports metrics in Prometheus text format for scraping.
5
+ */
6
+ /**
7
+ * Default histogram buckets for latency metrics (in ms).
8
+ */
9
+ const DEFAULT_LATENCY_BUCKETS = [10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000];
10
+ /**
11
+ * Metric definitions for Prometheus export.
12
+ */
13
+ const METRIC_DEFINITIONS = [
14
+ // Token usage metrics
15
+ {
16
+ name: 'bellwether_llm_tokens_total',
17
+ type: 'counter',
18
+ help: 'Total number of tokens used',
19
+ labels: ['provider', 'model', 'direction'],
20
+ },
21
+ {
22
+ name: 'bellwether_llm_calls_total',
23
+ type: 'counter',
24
+ help: 'Total number of LLM API calls',
25
+ labels: ['provider', 'model'],
26
+ },
27
+ // Cost metrics
28
+ {
29
+ name: 'bellwether_cost_usd_total',
30
+ type: 'counter',
31
+ help: 'Total cost in USD',
32
+ labels: ['provider'],
33
+ },
34
+ // Operation timing metrics
35
+ {
36
+ name: 'bellwether_operation_duration_seconds',
37
+ type: 'histogram',
38
+ help: 'Duration of operations in seconds',
39
+ labels: ['operation', 'status'],
40
+ },
41
+ {
42
+ name: 'bellwether_operation_total',
43
+ type: 'counter',
44
+ help: 'Total number of operations',
45
+ labels: ['operation', 'status'],
46
+ },
47
+ // Error metrics
48
+ {
49
+ name: 'bellwether_errors_total',
50
+ type: 'counter',
51
+ help: 'Total number of errors',
52
+ labels: ['category', 'retryable'],
53
+ },
54
+ // Interview metrics
55
+ {
56
+ name: 'bellwether_interview_tools_discovered',
57
+ type: 'gauge',
58
+ help: 'Number of tools discovered in current interview',
59
+ },
60
+ {
61
+ name: 'bellwether_interview_questions_generated',
62
+ type: 'gauge',
63
+ help: 'Number of questions generated in current interview',
64
+ },
65
+ {
66
+ name: 'bellwether_interview_tool_calls_total',
67
+ type: 'counter',
68
+ help: 'Total tool calls in current interview',
69
+ labels: ['status'],
70
+ },
71
+ {
72
+ name: 'bellwether_interview_duration_seconds',
73
+ type: 'gauge',
74
+ help: 'Duration of current/last interview in seconds',
75
+ },
76
+ {
77
+ name: 'bellwether_interview_progress_ratio',
78
+ type: 'gauge',
79
+ help: 'Progress of current interview (0-1)',
80
+ },
81
+ ];
82
+ /**
83
+ * Export metrics in Prometheus text format.
84
+ */
85
+ export function exportPrometheusMetrics(collector) {
86
+ const lines = [];
87
+ const aggregated = collector.getAggregatedMetrics();
88
+ const interview = collector.getInterviewMetrics();
89
+ // Helper to add metric header
90
+ const addHeader = (metric) => {
91
+ lines.push(`# HELP ${metric.name} ${metric.help}`);
92
+ lines.push(`# TYPE ${metric.name} ${metric.type}`);
93
+ };
94
+ // Helper to format labels
95
+ const formatLabels = (labels) => {
96
+ if (!labels || Object.keys(labels).length === 0)
97
+ return '';
98
+ const pairs = Object.entries(labels).map(([k, v]) => `${k}="${escapeLabel(v)}"`);
99
+ return `{${pairs.join(',')}}`;
100
+ };
101
+ // Helper to add metric value
102
+ const addValue = (name, value, labels) => {
103
+ lines.push(`${name}${formatLabels(labels)} ${value}`);
104
+ };
105
+ // Token usage metrics
106
+ const tokenMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_llm_tokens_total');
107
+ addHeader(tokenMetric);
108
+ for (const usage of aggregated.tokenUsage) {
109
+ addValue(tokenMetric.name, usage.totalInputTokens, {
110
+ provider: usage.provider,
111
+ model: usage.model,
112
+ direction: 'input',
113
+ });
114
+ addValue(tokenMetric.name, usage.totalOutputTokens, {
115
+ provider: usage.provider,
116
+ model: usage.model,
117
+ direction: 'output',
118
+ });
119
+ }
120
+ // LLM calls metric
121
+ const callsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_llm_calls_total');
122
+ addHeader(callsMetric);
123
+ for (const usage of aggregated.tokenUsage) {
124
+ addValue(callsMetric.name, usage.callCount, {
125
+ provider: usage.provider,
126
+ model: usage.model,
127
+ });
128
+ }
129
+ // Cost metrics
130
+ const costMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_cost_usd_total');
131
+ addHeader(costMetric);
132
+ for (const cost of aggregated.costByProvider) {
133
+ addValue(costMetric.name, cost.costUSD, { provider: cost.provider });
134
+ }
135
+ // Operation duration histogram
136
+ const durationMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_operation_duration_seconds');
137
+ addHeader(durationMetric);
138
+ for (const stat of aggregated.operationStats) {
139
+ // Add histogram buckets
140
+ const buckets = calculateHistogramBuckets(collector.getRawRecords().timing
141
+ .filter(r => r.operation === stat.operation)
142
+ .map(r => r.durationMs / 1000), // Convert to seconds
143
+ DEFAULT_LATENCY_BUCKETS.map(b => b / 1000));
144
+ for (let i = 0; i < buckets.le.length; i++) {
145
+ addValue(`${durationMetric.name}_bucket`, buckets.counts[i], {
146
+ operation: stat.operation,
147
+ status: 'all',
148
+ le: buckets.le[i] === Infinity ? '+Inf' : String(buckets.le[i]),
149
+ });
150
+ }
151
+ addValue(`${durationMetric.name}_sum`, buckets.sum, { operation: stat.operation, status: 'all' });
152
+ addValue(`${durationMetric.name}_count`, buckets.count, { operation: stat.operation, status: 'all' });
153
+ }
154
+ // Operation total counter
155
+ const opTotalMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_operation_total');
156
+ addHeader(opTotalMetric);
157
+ for (const stat of aggregated.operationStats) {
158
+ addValue(opTotalMetric.name, stat.successCount, { operation: stat.operation, status: 'success' });
159
+ addValue(opTotalMetric.name, stat.failureCount, { operation: stat.operation, status: 'failure' });
160
+ }
161
+ // Error metrics
162
+ const errorMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_errors_total');
163
+ addHeader(errorMetric);
164
+ for (const stat of aggregated.errorStats) {
165
+ addValue(errorMetric.name, stat.retryableCount, { category: stat.category, retryable: 'true' });
166
+ addValue(errorMetric.name, stat.terminalCount, { category: stat.category, retryable: 'false' });
167
+ }
168
+ // Interview-specific metrics
169
+ if (interview) {
170
+ const toolsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_tools_discovered');
171
+ addHeader(toolsMetric);
172
+ addValue(toolsMetric.name, interview.toolsDiscovered);
173
+ const questionsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_questions_generated');
174
+ addHeader(questionsMetric);
175
+ addValue(questionsMetric.name, interview.questionsGenerated);
176
+ const toolCallsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_tool_calls_total');
177
+ addHeader(toolCallsMetric);
178
+ addValue(toolCallsMetric.name, interview.toolCallsSucceeded, { status: 'success' });
179
+ addValue(toolCallsMetric.name, interview.toolCallsFailed, { status: 'failure' });
180
+ const durationGauge = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_duration_seconds');
181
+ addHeader(durationGauge);
182
+ const durationSec = interview.totalDurationMs
183
+ ? interview.totalDurationMs / 1000
184
+ : (Date.now() - interview.startedAt.getTime()) / 1000;
185
+ addValue(durationGauge.name, durationSec);
186
+ const progressMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_progress_ratio');
187
+ addHeader(progressMetric);
188
+ const expectedCalls = interview.toolsDiscovered * 5;
189
+ const progress = expectedCalls > 0 ? Math.min(1, interview.toolCallsMade / expectedCalls) : 0;
190
+ addValue(progressMetric.name, progress);
191
+ }
192
+ return lines.join('\n');
193
+ }
194
+ /**
195
+ * Calculate histogram buckets from raw values.
196
+ */
197
+ function calculateHistogramBuckets(values, boundaries) {
198
+ const bucketBoundaries = [...boundaries, Infinity];
199
+ const counts = new Array(bucketBoundaries.length).fill(0);
200
+ let sum = 0;
201
+ for (const value of values) {
202
+ sum += value;
203
+ for (let i = 0; i < bucketBoundaries.length; i++) {
204
+ if (value <= bucketBoundaries[i]) {
205
+ counts[i]++;
206
+ }
207
+ }
208
+ }
209
+ // Make counts cumulative
210
+ for (let i = 1; i < counts.length; i++) {
211
+ counts[i] += counts[i - 1];
212
+ }
213
+ return {
214
+ le: bucketBoundaries,
215
+ counts,
216
+ sum,
217
+ count: values.length,
218
+ };
219
+ }
220
+ /**
221
+ * Escape label value for Prometheus format.
222
+ */
223
+ function escapeLabel(value) {
224
+ return value
225
+ .replace(/\\/g, '\\\\')
226
+ .replace(/"/g, '\\"')
227
+ .replace(/\n/g, '\\n');
228
+ }
229
+ /**
230
+ * Export metrics as JSON for dashboard consumption.
231
+ */
232
+ export function exportMetricsJSON(collector) {
233
+ return JSON.stringify(collector.getDashboardMetrics(), null, 2);
234
+ }
235
+ /**
236
+ * Get metric definitions for documentation.
237
+ */
238
+ export function getMetricDefinitions() {
239
+ return [...METRIC_DEFINITIONS];
240
+ }
241
+ //# sourceMappingURL=prometheus.js.map
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Metrics collection types for observability.
3
+ */
4
+ /**
5
+ * Error category for metrics tracking.
6
+ */
7
+ export type ErrorCategory = 'transport' | 'llm_auth' | 'llm_rate_limit' | 'llm_quota' | 'llm_refusal' | 'llm_parse' | 'llm_connection' | 'llm_timeout' | 'interview' | 'workflow' | 'config' | 'unknown';
8
+ /**
9
+ * Operation type for timing metrics.
10
+ */
11
+ export type OperationType = 'llm_call' | 'llm_stream' | 'tool_call' | 'discovery' | 'question_generation' | 'response_analysis' | 'profile_synthesis' | 'summary_generation' | 'interview_total' | 'workflow_execution' | 'assertion_evaluation' | 'baseline_comparison';
12
+ /**
13
+ * Token usage record.
14
+ */
15
+ export interface TokenUsageRecord {
16
+ provider: string;
17
+ model: string;
18
+ inputTokens: number;
19
+ outputTokens: number;
20
+ timestamp: Date;
21
+ operation?: string;
22
+ }
23
+ /**
24
+ * Operation timing record.
25
+ */
26
+ export interface TimingRecord {
27
+ operation: OperationType;
28
+ durationMs: number;
29
+ success: boolean;
30
+ timestamp: Date;
31
+ metadata?: Record<string, unknown>;
32
+ }
33
+ /**
34
+ * Error record for metrics.
35
+ */
36
+ export interface ErrorRecord {
37
+ category: ErrorCategory;
38
+ code: string;
39
+ message: string;
40
+ timestamp: Date;
41
+ retryable: boolean;
42
+ operation?: string;
43
+ }
44
+ /**
45
+ * Cost record.
46
+ */
47
+ export interface CostRecord {
48
+ provider: string;
49
+ model: string;
50
+ inputCost: number;
51
+ outputCost: number;
52
+ totalCost: number;
53
+ timestamp: Date;
54
+ }
55
+ /**
56
+ * Interview metrics summary.
57
+ */
58
+ export interface InterviewMetrics {
59
+ /** Start time */
60
+ startedAt: Date;
61
+ /** End time */
62
+ endedAt?: Date;
63
+ /** Total duration in ms */
64
+ totalDurationMs?: number;
65
+ /** Tools discovered */
66
+ toolsDiscovered: number;
67
+ /** Questions generated */
68
+ questionsGenerated: number;
69
+ /** Tool calls made */
70
+ toolCallsMade: number;
71
+ /** Tool calls succeeded */
72
+ toolCallsSucceeded: number;
73
+ /** Tool calls failed */
74
+ toolCallsFailed: number;
75
+ /** Personas used */
76
+ personasUsed: number;
77
+ /** LLM calls made */
78
+ llmCallsMade: number;
79
+ /** Total input tokens */
80
+ totalInputTokens: number;
81
+ /** Total output tokens */
82
+ totalOutputTokens: number;
83
+ /** Total cost USD */
84
+ totalCostUSD: number;
85
+ /** Errors by category */
86
+ errorsByCategory: Record<ErrorCategory, number>;
87
+ }
88
+ /**
89
+ * Aggregated metrics for a time period.
90
+ */
91
+ export interface AggregatedMetrics {
92
+ /** Time period start */
93
+ periodStart: Date;
94
+ /** Time period end */
95
+ periodEnd: Date;
96
+ /** Token usage by provider/model */
97
+ tokenUsage: {
98
+ provider: string;
99
+ model: string;
100
+ totalInputTokens: number;
101
+ totalOutputTokens: number;
102
+ callCount: number;
103
+ }[];
104
+ /** Operation timing statistics */
105
+ operationStats: {
106
+ operation: OperationType;
107
+ count: number;
108
+ successCount: number;
109
+ failureCount: number;
110
+ avgDurationMs: number;
111
+ minDurationMs: number;
112
+ maxDurationMs: number;
113
+ p50DurationMs: number;
114
+ p95DurationMs: number;
115
+ p99DurationMs: number;
116
+ }[];
117
+ /** Error statistics */
118
+ errorStats: {
119
+ category: ErrorCategory;
120
+ count: number;
121
+ retryableCount: number;
122
+ terminalCount: number;
123
+ }[];
124
+ /** Total cost */
125
+ totalCostUSD: number;
126
+ costByProvider: {
127
+ provider: string;
128
+ costUSD: number;
129
+ }[];
130
+ }
131
+ /**
132
+ * Prometheus metric types.
133
+ */
134
+ export type PrometheusMetricType = 'counter' | 'gauge' | 'histogram' | 'summary';
135
+ /**
136
+ * Prometheus metric definition.
137
+ */
138
+ export interface PrometheusMetric {
139
+ name: string;
140
+ type: PrometheusMetricType;
141
+ help: string;
142
+ labels?: string[];
143
+ }
144
+ /**
145
+ * Prometheus metric value.
146
+ */
147
+ export interface PrometheusMetricValue {
148
+ name: string;
149
+ value: number;
150
+ labels?: Record<string, string>;
151
+ timestamp?: number;
152
+ }
153
+ /**
154
+ * Histogram bucket configuration.
155
+ */
156
+ export interface HistogramBuckets {
157
+ /** Bucket boundaries */
158
+ le: number[];
159
+ /** Count per bucket */
160
+ counts: number[];
161
+ /** Total sum */
162
+ sum: number;
163
+ /** Total count */
164
+ count: number;
165
+ }
166
+ /**
167
+ * Dashboard-compatible metrics output.
168
+ */
169
+ export interface DashboardMetrics {
170
+ /** Timestamp of metrics snapshot */
171
+ timestamp: string;
172
+ /** Interview summary */
173
+ interview: {
174
+ status: 'running' | 'completed' | 'failed';
175
+ progress: number;
176
+ toolsTotal: number;
177
+ toolsCompleted: number;
178
+ questionsTotal: number;
179
+ questionsCompleted: number;
180
+ };
181
+ /** Token usage */
182
+ tokens: {
183
+ input: number;
184
+ output: number;
185
+ total: number;
186
+ };
187
+ /** Cost */
188
+ cost: {
189
+ current: number;
190
+ projected: number;
191
+ currency: string;
192
+ };
193
+ /** Performance */
194
+ performance: {
195
+ avgLLMLatencyMs: number;
196
+ avgToolLatencyMs: number;
197
+ errorsTotal: number;
198
+ successRate: number;
199
+ };
200
+ /** Provider breakdown */
201
+ providers: {
202
+ name: string;
203
+ calls: number;
204
+ tokens: number;
205
+ errors: number;
206
+ avgLatencyMs: number;
207
+ }[];
208
+ }
209
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Metrics collection types for observability.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Built-in persona definitions.
3
+ */
4
+ import type { Persona, BuiltInPersonaId } from './types.js';
5
+ /**
6
+ * Technical Writer persona - balanced documentation focus.
7
+ */
8
+ export declare const technicalWriterPersona: Persona;
9
+ /**
10
+ * Security Tester persona - vulnerability-focused.
11
+ *
12
+ * Note: Prompts are designed to avoid triggering LLM safety filters while still
13
+ * enabling meaningful security testing. We describe test categories rather than
14
+ * including specific payloads, letting the LLM generate appropriate test inputs.
15
+ */
16
+ export declare const securityTesterPersona: Persona;
17
+ /**
18
+ * QA Engineer persona - edge case and error focus.
19
+ */
20
+ export declare const qaEngineerPersona: Persona;
21
+ /**
22
+ * Novice User persona - usability and error message focus.
23
+ */
24
+ export declare const noviceUserPersona: Persona;
25
+ /**
26
+ * Map of built-in persona IDs to definitions.
27
+ */
28
+ export declare const BUILTIN_PERSONAS: Record<BuiltInPersonaId, Persona>;
29
+ /**
30
+ * Get a built-in persona by ID.
31
+ */
32
+ export declare function getBuiltinPersona(id: BuiltInPersonaId): Persona;
33
+ /**
34
+ * Check if a persona ID is a built-in.
35
+ */
36
+ export declare function isBuiltinPersona(id: string): id is BuiltInPersonaId;
37
+ /**
38
+ * Get all built-in persona IDs.
39
+ */
40
+ export declare function getBuiltinPersonaIds(): BuiltInPersonaId[];
41
+ /**
42
+ * Default persona for interviews.
43
+ */
44
+ export declare const DEFAULT_PERSONA: Persona;
45
+ /**
46
+ * Parse persona list from string array of persona IDs.
47
+ * Returns the DEFAULT_PERSONA if the list is empty or contains no valid personas.
48
+ *
49
+ * @param personaList - Array of persona ID strings
50
+ * @param warnOnUnknown - Optional callback for unknown persona warnings
51
+ * @returns Array of resolved Persona objects
52
+ */
53
+ export declare function parsePersonas(personaList: string[], warnOnUnknown?: (unknownName: string, validNames: string[]) => void): Persona[];
54
+ //# sourceMappingURL=builtins.d.ts.map