@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,94 @@
1
+ /**
2
+ * Persona validation utilities.
3
+ *
4
+ * Validates persona configurations including bias weights and categories
5
+ * to ensure they form valid probability distributions.
6
+ */
7
+ import type { Persona, QuestionBias, QuestionCategory } from './types.js';
8
+ /**
9
+ * Validation error with detailed information.
10
+ */
11
+ export interface ValidationError {
12
+ /** Field or path that failed validation */
13
+ field: string;
14
+ /** Error message */
15
+ message: string;
16
+ /** Actual value that caused the error */
17
+ actual?: unknown;
18
+ /** Expected value or constraint */
19
+ expected?: string;
20
+ }
21
+ /**
22
+ * Result of validating a persona.
23
+ */
24
+ export interface PersonaValidationResult {
25
+ /** Whether the persona is valid */
26
+ valid: boolean;
27
+ /** Validation errors (empty if valid) */
28
+ errors: ValidationError[];
29
+ /** Validation warnings (non-fatal issues) */
30
+ warnings: ValidationError[];
31
+ }
32
+ /**
33
+ * Options for persona validation.
34
+ */
35
+ export interface ValidationOptions {
36
+ /** Tolerance for weight sum validation (default: 0.01) */
37
+ sumTolerance?: number;
38
+ /** Whether to allow security category without security bias (default: false) */
39
+ allowMissingSecurity?: boolean;
40
+ /** Whether to warn about unused biases (default: true) */
41
+ warnUnusedBiases?: boolean;
42
+ /** Minimum bias weight to be considered "active" (default: 0.05) */
43
+ minActiveBias?: number;
44
+ }
45
+ /**
46
+ * Validate a persona's bias weights.
47
+ *
48
+ * @param bias - The question bias configuration
49
+ * @param options - Validation options
50
+ * @returns Validation result with errors and warnings
51
+ */
52
+ export declare function validateBiasWeights(bias: QuestionBias, options?: ValidationOptions): PersonaValidationResult;
53
+ /**
54
+ * Validate that categories have corresponding active bias weights.
55
+ *
56
+ * @param bias - The question bias configuration
57
+ * @param categories - The categories this persona focuses on
58
+ * @param options - Validation options
59
+ * @returns Validation result with errors and warnings
60
+ */
61
+ export declare function validateCategoryBiasAlignment(bias: QuestionBias, categories: QuestionCategory[], options?: ValidationOptions): PersonaValidationResult;
62
+ /**
63
+ * Validate a complete persona configuration.
64
+ *
65
+ * @param persona - The persona to validate
66
+ * @param options - Validation options
67
+ * @returns Validation result with errors and warnings
68
+ */
69
+ export declare function validatePersona(persona: Persona, options?: ValidationOptions): PersonaValidationResult;
70
+ /**
71
+ * Format validation errors for display.
72
+ *
73
+ * @param result - Validation result
74
+ * @param personaSource - Source of the persona (e.g., file path or "built-in")
75
+ * @returns Formatted error message
76
+ */
77
+ export declare function formatValidationErrors(result: PersonaValidationResult, personaSource: string): string;
78
+ /**
79
+ * Assert a persona is valid, throwing if not.
80
+ *
81
+ * @param persona - The persona to validate
82
+ * @param source - Source identifier for error messages
83
+ * @param options - Validation options
84
+ * @throws Error if persona is invalid
85
+ */
86
+ export declare function assertValidPersona(persona: Persona, source: string, options?: ValidationOptions): void;
87
+ /**
88
+ * Normalize bias weights to sum to 1.0.
89
+ *
90
+ * @param bias - The original bias configuration
91
+ * @returns Normalized bias with weights summing to 1.0
92
+ */
93
+ export declare function normalizeBiasWeights(bias: QuestionBias): QuestionBias;
94
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Persona validation utilities.
3
+ *
4
+ * Validates persona configurations including bias weights and categories
5
+ * to ensure they form valid probability distributions.
6
+ */
7
+ import { MATH_FACTORS } from '../constants.js';
8
+ const DEFAULT_OPTIONS = {
9
+ sumTolerance: 0.01,
10
+ allowMissingSecurity: false,
11
+ warnUnusedBiases: true,
12
+ minActiveBias: 0.05,
13
+ };
14
+ /**
15
+ * Validate a persona's bias weights.
16
+ *
17
+ * @param bias - The question bias configuration
18
+ * @param options - Validation options
19
+ * @returns Validation result with errors and warnings
20
+ */
21
+ export function validateBiasWeights(bias, options = {}) {
22
+ const opts = { ...DEFAULT_OPTIONS, ...options };
23
+ const errors = [];
24
+ const warnings = [];
25
+ // Get all bias values
26
+ const biasFields = [
27
+ { field: 'happyPath', name: 'happyPath' },
28
+ { field: 'edgeCase', name: 'edgeCase' },
29
+ { field: 'errorHandling', name: 'errorHandling' },
30
+ { field: 'boundary', name: 'boundary' },
31
+ { field: 'security', name: 'security' },
32
+ ];
33
+ const values = [];
34
+ // Validate each bias weight is between 0 and 1
35
+ for (const { field, name } of biasFields) {
36
+ const value = bias[field];
37
+ // Skip undefined security (optional field)
38
+ if (value === undefined) {
39
+ continue;
40
+ }
41
+ // Check type
42
+ if (typeof value !== 'number') {
43
+ errors.push({
44
+ field: `questionBias.${name}`,
45
+ message: `Bias weight must be a number`,
46
+ actual: typeof value,
47
+ expected: 'number',
48
+ });
49
+ continue;
50
+ }
51
+ // Check range [0, 1]
52
+ if (value < 0 || value > 1) {
53
+ errors.push({
54
+ field: `questionBias.${name}`,
55
+ message: `Bias weight must be between 0 and 1`,
56
+ actual: value,
57
+ expected: '0 <= weight <= 1',
58
+ });
59
+ }
60
+ // Check for NaN or Infinity
61
+ if (!Number.isFinite(value)) {
62
+ errors.push({
63
+ field: `questionBias.${name}`,
64
+ message: `Bias weight must be a finite number`,
65
+ actual: value,
66
+ expected: 'finite number',
67
+ });
68
+ }
69
+ values.push(value);
70
+ }
71
+ // Validate sum approximately equals 1.0
72
+ if (values.length > 0 && errors.length === 0) {
73
+ const sum = values.reduce((a, b) => a + b, 0);
74
+ const deviation = Math.abs(sum - 1.0);
75
+ if (deviation > opts.sumTolerance) {
76
+ errors.push({
77
+ field: 'questionBias',
78
+ message: `Bias weights must sum to approximately 1.0 (tolerance: ${opts.sumTolerance})`,
79
+ actual: sum.toFixed(4),
80
+ expected: `1.0 ± ${opts.sumTolerance}`,
81
+ });
82
+ }
83
+ }
84
+ return {
85
+ valid: errors.length === 0,
86
+ errors,
87
+ warnings,
88
+ };
89
+ }
90
+ /**
91
+ * Validate that categories have corresponding active bias weights.
92
+ *
93
+ * @param bias - The question bias configuration
94
+ * @param categories - The categories this persona focuses on
95
+ * @param options - Validation options
96
+ * @returns Validation result with errors and warnings
97
+ */
98
+ export function validateCategoryBiasAlignment(bias, categories, options = {}) {
99
+ const opts = { ...DEFAULT_OPTIONS, ...options };
100
+ const errors = [];
101
+ const warnings = [];
102
+ // Map categories to bias fields
103
+ const categoryToBias = {
104
+ happy_path: 'happyPath',
105
+ edge_case: 'edgeCase',
106
+ error_handling: 'errorHandling',
107
+ boundary: 'boundary',
108
+ security: 'security',
109
+ };
110
+ // Check that each category has a corresponding non-zero bias
111
+ for (const category of categories) {
112
+ const biasField = categoryToBias[category];
113
+ const biasValue = bias[biasField];
114
+ // Security is special - can be undefined
115
+ if (category === 'security' && biasValue === undefined) {
116
+ if (!opts.allowMissingSecurity) {
117
+ errors.push({
118
+ field: `questionBias.security`,
119
+ message: `Category "security" is listed but security bias is not defined`,
120
+ actual: undefined,
121
+ expected: 'security bias > 0',
122
+ });
123
+ }
124
+ continue;
125
+ }
126
+ // Check if bias is too low to be meaningful
127
+ if (biasValue !== undefined && biasValue < opts.minActiveBias) {
128
+ warnings.push({
129
+ field: `questionBias.${biasField}`,
130
+ message: `Category "${category}" is listed but bias weight is very low`,
131
+ actual: biasValue,
132
+ expected: `>= ${opts.minActiveBias}`,
133
+ });
134
+ }
135
+ }
136
+ // Check for biases that are set but not in categories (warn)
137
+ if (opts.warnUnusedBiases) {
138
+ const allBiases = [
139
+ { field: 'happyPath', category: 'happy_path' },
140
+ { field: 'edgeCase', category: 'edge_case' },
141
+ { field: 'errorHandling', category: 'error_handling' },
142
+ { field: 'boundary', category: 'boundary' },
143
+ { field: 'security', category: 'security' },
144
+ ];
145
+ for (const { field, category } of allBiases) {
146
+ const value = bias[field];
147
+ if (value !== undefined && value >= opts.minActiveBias && !categories.includes(category)) {
148
+ warnings.push({
149
+ field: `questionBias.${field}`,
150
+ message: `Bias "${field}" has significant weight but "${category}" is not in categories list`,
151
+ actual: value,
152
+ expected: `Category "${category}" in categories array`,
153
+ });
154
+ }
155
+ }
156
+ }
157
+ return {
158
+ valid: errors.length === 0,
159
+ errors,
160
+ warnings,
161
+ };
162
+ }
163
+ /**
164
+ * Validate a complete persona configuration.
165
+ *
166
+ * @param persona - The persona to validate
167
+ * @param options - Validation options
168
+ * @returns Validation result with errors and warnings
169
+ */
170
+ export function validatePersona(persona, options = {}) {
171
+ const errors = [];
172
+ const warnings = [];
173
+ // Validate required fields
174
+ if (!persona.id || typeof persona.id !== 'string') {
175
+ errors.push({
176
+ field: 'id',
177
+ message: 'Persona ID is required and must be a string',
178
+ actual: persona.id,
179
+ });
180
+ }
181
+ if (!persona.name || typeof persona.name !== 'string') {
182
+ errors.push({
183
+ field: 'name',
184
+ message: 'Persona name is required and must be a string',
185
+ actual: persona.name,
186
+ });
187
+ }
188
+ if (!persona.systemPrompt || typeof persona.systemPrompt !== 'string') {
189
+ errors.push({
190
+ field: 'systemPrompt',
191
+ message: 'System prompt is required and must be a string',
192
+ actual: typeof persona.systemPrompt,
193
+ });
194
+ }
195
+ // Validate ID format (alphanumeric and underscores only)
196
+ if (persona.id && !/^[a-z][a-z0-9_]*$/.test(persona.id)) {
197
+ errors.push({
198
+ field: 'id',
199
+ message: 'Persona ID must start with a letter and contain only lowercase letters, numbers, and underscores',
200
+ actual: persona.id,
201
+ expected: 'pattern: ^[a-z][a-z0-9_]*$',
202
+ });
203
+ }
204
+ // Validate bias weights
205
+ const biasResult = validateBiasWeights(persona.questionBias, options);
206
+ errors.push(...biasResult.errors);
207
+ warnings.push(...biasResult.warnings);
208
+ // Validate categories
209
+ if (!persona.categories || !Array.isArray(persona.categories)) {
210
+ errors.push({
211
+ field: 'categories',
212
+ message: 'Categories must be an array',
213
+ actual: typeof persona.categories,
214
+ });
215
+ }
216
+ else if (persona.categories.length === 0) {
217
+ errors.push({
218
+ field: 'categories',
219
+ message: 'At least one category is required',
220
+ actual: 0,
221
+ expected: '>= 1 category',
222
+ });
223
+ }
224
+ else {
225
+ // Validate category values
226
+ const validCategories = ['happy_path', 'edge_case', 'error_handling', 'boundary', 'security'];
227
+ for (const cat of persona.categories) {
228
+ if (!validCategories.includes(cat)) {
229
+ errors.push({
230
+ field: 'categories',
231
+ message: `Invalid category "${cat}"`,
232
+ actual: cat,
233
+ expected: validCategories.join(', '),
234
+ });
235
+ }
236
+ }
237
+ // Validate category-bias alignment
238
+ if (biasResult.valid) {
239
+ const alignmentResult = validateCategoryBiasAlignment(persona.questionBias, persona.categories, options);
240
+ errors.push(...alignmentResult.errors);
241
+ warnings.push(...alignmentResult.warnings);
242
+ }
243
+ }
244
+ return {
245
+ valid: errors.length === 0,
246
+ errors,
247
+ warnings,
248
+ };
249
+ }
250
+ /**
251
+ * Format validation errors for display.
252
+ *
253
+ * @param result - Validation result
254
+ * @param personaSource - Source of the persona (e.g., file path or "built-in")
255
+ * @returns Formatted error message
256
+ */
257
+ export function formatValidationErrors(result, personaSource) {
258
+ const lines = [];
259
+ if (result.errors.length > 0) {
260
+ lines.push(`Persona validation failed for ${personaSource}:`);
261
+ for (const error of result.errors) {
262
+ lines.push(` - ${error.field}: ${error.message}`);
263
+ if (error.actual !== undefined) {
264
+ lines.push(` Actual: ${JSON.stringify(error.actual)}`);
265
+ }
266
+ if (error.expected) {
267
+ lines.push(` Expected: ${error.expected}`);
268
+ }
269
+ }
270
+ }
271
+ if (result.warnings.length > 0) {
272
+ if (lines.length > 0)
273
+ lines.push('');
274
+ lines.push('Warnings:');
275
+ for (const warning of result.warnings) {
276
+ lines.push(` - ${warning.field}: ${warning.message}`);
277
+ }
278
+ }
279
+ return lines.join('\n');
280
+ }
281
+ /**
282
+ * Assert a persona is valid, throwing if not.
283
+ *
284
+ * @param persona - The persona to validate
285
+ * @param source - Source identifier for error messages
286
+ * @param options - Validation options
287
+ * @throws Error if persona is invalid
288
+ */
289
+ export function assertValidPersona(persona, source, options = {}) {
290
+ const result = validatePersona(persona, options);
291
+ if (!result.valid) {
292
+ throw new Error(formatValidationErrors(result, source));
293
+ }
294
+ }
295
+ /**
296
+ * Normalize bias weights to sum to 1.0.
297
+ *
298
+ * @param bias - The original bias configuration
299
+ * @returns Normalized bias with weights summing to 1.0
300
+ */
301
+ export function normalizeBiasWeights(bias) {
302
+ // Calculate sum of all defined weights
303
+ const happyPath = typeof bias.happyPath === 'number' ? bias.happyPath : 0;
304
+ const edgeCase = typeof bias.edgeCase === 'number' ? bias.edgeCase : 0;
305
+ const errorHandling = typeof bias.errorHandling === 'number' ? bias.errorHandling : 0;
306
+ const boundary = typeof bias.boundary === 'number' ? bias.boundary : 0;
307
+ const security = typeof bias.security === 'number' ? bias.security : 0;
308
+ const sum = happyPath + edgeCase + errorHandling + boundary + security;
309
+ if (sum === 0) {
310
+ // All zeros - return equal weights for the required fields
311
+ return {
312
+ happyPath: MATH_FACTORS.DEFAULT_QUESTION_BIAS,
313
+ edgeCase: MATH_FACTORS.DEFAULT_QUESTION_BIAS,
314
+ errorHandling: MATH_FACTORS.DEFAULT_QUESTION_BIAS,
315
+ boundary: MATH_FACTORS.DEFAULT_QUESTION_BIAS,
316
+ security: bias.security !== undefined ? 0 : undefined,
317
+ };
318
+ }
319
+ // Normalize to sum to 1.0
320
+ const result = {
321
+ happyPath: happyPath / sum,
322
+ edgeCase: edgeCase / sum,
323
+ errorHandling: errorHandling / sum,
324
+ boundary: boundary / sum,
325
+ };
326
+ // Only include security if it was originally defined
327
+ if (bias.security !== undefined) {
328
+ result.security = security / sum;
329
+ }
330
+ return result;
331
+ }
332
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Prompt templates and utilities.
3
+ */
4
+ export * from './templates.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Prompt templates and utilities.
3
+ */
4
+ export * from './templates.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Prompt templates for LLM-guided interview and analysis.
3
+ *
4
+ * All prompts are extracted here for:
5
+ * - Easier maintenance and versioning
6
+ * - Consistent formatting
7
+ * - Potential future i18n support
8
+ * - Testing and validation
9
+ *
10
+ * SECURITY NOTE: All user-provided data (tool descriptions, schemas, etc.)
11
+ * is sanitized before inclusion in prompts to prevent prompt injection attacks.
12
+ */
13
+ import type { MCPTool, MCPToolCallResult, MCPPrompt, MCPPromptGetResult } from '../transport/types.js';
14
+ import type { InterviewQuestion, ToolProfile, ServerContext, PromptQuestion } from '../interview/types.js';
15
+ import type { DiscoveryResult } from '../discovery/types.js';
16
+ import type { Persona } from '../persona/types.js';
17
+ import type { Workflow, WorkflowStep, WorkflowStepResult } from '../workflow/types.js';
18
+ /**
19
+ * Default system prompt for documentation-focused interviews.
20
+ */
21
+ export declare const DEFAULT_SYSTEM_PROMPT = "You are a technical documentation assistant helping to generate API documentation for software tools. Your task is to create helpful usage examples and documentation that developers can reference. All examples you generate are for documentation purposes only and will be used in developer guides and API references. Focus on being helpful and educational.";
22
+ export interface QuestionGenerationContext {
23
+ tool: MCPTool;
24
+ maxQuestions: number;
25
+ categoryGuidance: string;
26
+ categoryList: string;
27
+ skipErrorTests: boolean;
28
+ serverContext?: ServerContext;
29
+ previousErrors?: Array<{
30
+ args: Record<string, unknown>;
31
+ error: string;
32
+ }>;
33
+ }
34
+ /**
35
+ * Generate the prompt for creating interview questions for a tool.
36
+ *
37
+ * SECURITY: Tool name, description, and schema are sanitized to prevent
38
+ * prompt injection attacks from malicious MCP servers.
39
+ */
40
+ export declare function buildQuestionGenerationPrompt(ctx: QuestionGenerationContext): string;
41
+ export interface ResponseAnalysisContext {
42
+ tool: MCPTool;
43
+ question: InterviewQuestion;
44
+ response: MCPToolCallResult | null;
45
+ error: string | null;
46
+ persona: Persona;
47
+ }
48
+ /**
49
+ * Generate the prompt for analyzing a tool response.
50
+ *
51
+ * SECURITY: Response content is sanitized to prevent prompt injection.
52
+ */
53
+ export declare function buildResponseAnalysisPrompt(ctx: ResponseAnalysisContext): string;
54
+ export interface ToolProfileSynthesisContext {
55
+ tool: MCPTool;
56
+ interactions: Array<{
57
+ question: InterviewQuestion;
58
+ response: MCPToolCallResult | null;
59
+ error: string | null;
60
+ analysis: string;
61
+ }>;
62
+ }
63
+ /**
64
+ * Generate the prompt for synthesizing a tool profile.
65
+ *
66
+ * SECURITY: Tool data and interaction results are sanitized.
67
+ */
68
+ export declare function buildToolProfileSynthesisPrompt(ctx: ToolProfileSynthesisContext): string;
69
+ export interface OverallSynthesisContext {
70
+ discovery: DiscoveryResult;
71
+ toolProfiles: ToolProfile[];
72
+ }
73
+ /**
74
+ * Generate the prompt for synthesizing overall interview results.
75
+ */
76
+ export declare function buildOverallSynthesisPrompt(ctx: OverallSynthesisContext): string;
77
+ export interface WorkflowStepAnalysisContext {
78
+ workflow: Workflow;
79
+ step: WorkflowStep;
80
+ stepIndex: number;
81
+ response: MCPToolCallResult | null;
82
+ error: string | undefined;
83
+ }
84
+ /**
85
+ * Generate the prompt for analyzing a workflow step.
86
+ */
87
+ export declare function buildWorkflowStepAnalysisPrompt(ctx: WorkflowStepAnalysisContext): string;
88
+ export interface WorkflowSummaryContext {
89
+ workflow: Workflow;
90
+ stepResults: WorkflowStepResult[];
91
+ success: boolean;
92
+ }
93
+ /**
94
+ * Generate the prompt for summarizing a workflow execution.
95
+ */
96
+ export declare function buildWorkflowSummaryPrompt(ctx: WorkflowSummaryContext): string;
97
+ export interface PromptQuestionGenerationContext {
98
+ prompt: MCPPrompt;
99
+ maxQuestions: number;
100
+ }
101
+ /**
102
+ * Generate test cases for an MCP prompt.
103
+ */
104
+ export declare function buildPromptQuestionGenerationPrompt(ctx: PromptQuestionGenerationContext): string;
105
+ export interface PromptResponseAnalysisContext {
106
+ prompt: MCPPrompt;
107
+ question: PromptQuestion;
108
+ response: MCPPromptGetResult | null;
109
+ error: string | null;
110
+ }
111
+ /**
112
+ * Generate the prompt for analyzing a prompt response.
113
+ */
114
+ export declare function buildPromptResponseAnalysisPrompt(ctx: PromptResponseAnalysisContext): string;
115
+ export interface PromptProfileSynthesisContext {
116
+ prompt: MCPPrompt;
117
+ interactions: Array<{
118
+ question: PromptQuestion;
119
+ response: MCPPromptGetResult | null;
120
+ error: string | null;
121
+ analysis: string;
122
+ }>;
123
+ }
124
+ /**
125
+ * Generate the prompt for synthesizing a prompt profile.
126
+ */
127
+ export declare function buildPromptProfileSynthesisPrompt(ctx: PromptProfileSynthesisContext): string;
128
+ /**
129
+ * Standard completion options for different prompt types.
130
+ */
131
+ export declare const COMPLETION_OPTIONS: {
132
+ /** For question generation - slightly higher temperature for variety */
133
+ readonly questionGeneration: {
134
+ readonly temperature: 0.4;
135
+ readonly responseFormat: "json";
136
+ readonly maxTokens: 2048;
137
+ };
138
+ /** For response analysis - lower temperature for consistency */
139
+ readonly responseAnalysis: {
140
+ readonly temperature: 0.3;
141
+ readonly maxTokens: 1024;
142
+ };
143
+ /** For profile synthesis - structured output */
144
+ readonly profileSynthesis: {
145
+ readonly temperature: 0.3;
146
+ readonly responseFormat: "json";
147
+ };
148
+ /** For overall summary - structured output */
149
+ readonly overallSynthesis: {
150
+ readonly temperature: 0.3;
151
+ readonly responseFormat: "json";
152
+ };
153
+ /** For workflow step analysis */
154
+ readonly workflowStepAnalysis: {
155
+ readonly temperature: 0.3;
156
+ readonly maxTokens: 1024;
157
+ };
158
+ /** For workflow summary */
159
+ readonly workflowSummary: {
160
+ readonly temperature: 0.3;
161
+ readonly maxTokens: 1024;
162
+ };
163
+ /** For prompt question generation */
164
+ readonly promptQuestionGeneration: {
165
+ readonly temperature: 0.4;
166
+ readonly responseFormat: "json";
167
+ readonly maxTokens: 2048;
168
+ };
169
+ /** For prompt response analysis */
170
+ readonly promptResponseAnalysis: {
171
+ readonly temperature: 0.3;
172
+ readonly maxTokens: 1024;
173
+ };
174
+ /** For prompt profile synthesis */
175
+ readonly promptProfileSynthesis: {
176
+ readonly temperature: 0.3;
177
+ readonly responseFormat: "json";
178
+ };
179
+ };
180
+ //# sourceMappingURL=templates.d.ts.map