@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,215 @@
1
+ /**
2
+ * HTTP cloud client for production API.
3
+ *
4
+ * Makes real HTTP requests to the Bellwether Cloud API.
5
+ * Handles automatic session token rotation when the server returns
6
+ * a new token via the X-Rotated-Session-Token header.
7
+ */
8
+ import { updateSessionToken } from './auth.js';
9
+ import { isLocalhost } from '../utils/index.js';
10
+ /**
11
+ * Header name for receiving rotated session token from server.
12
+ */
13
+ const ROTATED_TOKEN_HEADER = 'x-rotated-session-token';
14
+ /**
15
+ * Validate that a URL uses HTTPS in production.
16
+ * Allows HTTP only for localhost/127.0.0.1 for local development.
17
+ */
18
+ function validateSecureUrl(url) {
19
+ const parsed = new URL(url);
20
+ // Allow HTTP for local development
21
+ if (parsed.protocol !== 'https:' && !isLocalhost(parsed.hostname)) {
22
+ throw new Error(`Insecure URL rejected: ${url}. ` +
23
+ 'Cloud API must use HTTPS for security. ' +
24
+ 'HTTP is only allowed for localhost.');
25
+ }
26
+ }
27
+ /**
28
+ * HTTP cloud client implementation.
29
+ */
30
+ export class HttpCloudClient {
31
+ baseUrl;
32
+ sessionToken;
33
+ teamId;
34
+ timeout;
35
+ constructor(baseUrl, sessionToken, timeout = 30000, teamId) {
36
+ // Validate HTTPS requirement
37
+ validateSecureUrl(baseUrl);
38
+ // Remove trailing slash
39
+ this.baseUrl = baseUrl.replace(/\/$/, '');
40
+ this.sessionToken = sessionToken;
41
+ this.teamId = teamId;
42
+ this.timeout = timeout;
43
+ }
44
+ /**
45
+ * Make an authenticated request.
46
+ * Handles automatic session token rotation when the server returns
47
+ * a new token via the X-Rotated-Session-Token header.
48
+ */
49
+ async request(method, path, body) {
50
+ const url = `${this.baseUrl}${path}`;
51
+ const controller = new AbortController();
52
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
53
+ // Build headers, including X-Team-Id if available
54
+ const headers = {
55
+ 'Authorization': `Bearer ${this.sessionToken}`,
56
+ 'Content-Type': 'application/json',
57
+ 'Accept': 'application/json',
58
+ };
59
+ if (this.teamId) {
60
+ headers['X-Team-Id'] = this.teamId;
61
+ }
62
+ try {
63
+ const response = await fetch(url, {
64
+ method,
65
+ headers,
66
+ body: body ? JSON.stringify(body) : undefined,
67
+ signal: controller.signal,
68
+ });
69
+ clearTimeout(timeoutId);
70
+ // Check for rotated session token
71
+ const rotatedToken = response.headers.get(ROTATED_TOKEN_HEADER);
72
+ if (rotatedToken) {
73
+ // Update stored session with new token (non-blocking)
74
+ updateSessionToken(rotatedToken).catch(() => {
75
+ // Silently ignore errors - rotation is best-effort
76
+ // The old token will still work during grace period
77
+ });
78
+ // Update this client's token for subsequent requests
79
+ this.sessionToken = rotatedToken;
80
+ }
81
+ if (!response.ok) {
82
+ let errorData;
83
+ try {
84
+ errorData = await response.json();
85
+ }
86
+ catch {
87
+ errorData = {
88
+ error: 'unknown',
89
+ message: `HTTP ${response.status}: ${response.statusText}`,
90
+ };
91
+ }
92
+ throw new Error(errorData.message);
93
+ }
94
+ return response.json();
95
+ }
96
+ catch (error) {
97
+ clearTimeout(timeoutId);
98
+ if (error instanceof Error && error.name === 'AbortError') {
99
+ throw new Error(`Request timeout after ${this.timeout}ms`);
100
+ }
101
+ throw error;
102
+ }
103
+ }
104
+ // ============================================================================
105
+ // BellwetherCloudClient Implementation
106
+ // ============================================================================
107
+ isAuthenticated() {
108
+ return !!this.sessionToken;
109
+ }
110
+ async whoami() {
111
+ if (!this.sessionToken) {
112
+ return null;
113
+ }
114
+ try {
115
+ const response = await this.request('GET', '/auth/me');
116
+ return response.user;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ async listProjects() {
123
+ const response = await this.request('GET', '/projects');
124
+ return response.projects;
125
+ }
126
+ async createProject(name, serverCommand) {
127
+ const response = await this.request('POST', '/projects', {
128
+ name,
129
+ serverCommand,
130
+ });
131
+ return response.project;
132
+ }
133
+ async getProject(projectId) {
134
+ try {
135
+ const response = await this.request('GET', `/projects/${projectId}`);
136
+ return response.project;
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
142
+ async deleteProject(projectId) {
143
+ await this.request('DELETE', `/projects/${projectId}`);
144
+ }
145
+ async uploadBaseline(projectId, baseline) {
146
+ const response = await this.request('POST', `/projects/${projectId}/baselines`, baseline);
147
+ return {
148
+ baselineId: response.baseline.id,
149
+ version: response.baseline.version,
150
+ projectId,
151
+ viewUrl: `${this.baseUrl}/baselines/${response.baseline.id}`,
152
+ diffUrl: response.diff
153
+ ? `${this.baseUrl}/projects/${projectId}/diff/${response.baseline.version - 1}/${response.baseline.version}`
154
+ : undefined,
155
+ };
156
+ }
157
+ async getHistory(projectId, limit = 10) {
158
+ const response = await this.request('GET', `/projects/${projectId}/baselines?limit=${limit}`);
159
+ return response.baselines;
160
+ }
161
+ async getBaseline(baselineId) {
162
+ try {
163
+ const response = await this.request('GET', `/baselines/${baselineId}/download`);
164
+ return response;
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ }
170
+ async getDiff(projectId, fromVersion, toVersion) {
171
+ const response = await this.request('GET', `/projects/${projectId}/diff/${fromVersion}/${toVersion}`);
172
+ return response.diff.summary;
173
+ }
174
+ async getLatestDiff(projectId) {
175
+ try {
176
+ const response = await this.request('GET', `/projects/${projectId}/latest-diff`);
177
+ return response.diff?.summary ?? null;
178
+ }
179
+ catch {
180
+ return null;
181
+ }
182
+ }
183
+ async getBadgeInfo(projectId) {
184
+ try {
185
+ const response = await this.request('GET', `/projects/${projectId}/badge`);
186
+ return response.badge;
187
+ }
188
+ catch {
189
+ return null;
190
+ }
191
+ }
192
+ async submitVerification(projectId, result, report) {
193
+ const response = await this.request('POST', `/projects/${projectId}/verifications`, {
194
+ serverId: result.serverId,
195
+ version: result.version,
196
+ status: result.status,
197
+ tier: result.tier ?? null,
198
+ verifiedAt: result.verifiedAt,
199
+ expiresAt: result.expiresAt,
200
+ toolsVerified: result.toolsVerified,
201
+ testsPassed: result.testsPassed,
202
+ testsTotal: result.testsTotal,
203
+ passRate: result.passRate,
204
+ reportHash: result.reportHash,
205
+ bellwetherVersion: result.bellwetherVersion,
206
+ report: report ?? null,
207
+ });
208
+ return {
209
+ verificationId: response.verification.id,
210
+ projectId,
211
+ viewUrl: `${this.baseUrl.replace('/api', '')}/projects/${projectId}/verification`,
212
+ };
213
+ }
214
+ }
215
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Cloud integration module for Bellwether.
3
+ *
4
+ * Provides functionality for:
5
+ * - Authentication with Bellwether Cloud
6
+ * - Project and baseline management
7
+ * - Uploading and comparing baselines
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { createCloudClient, getToken, isAuthenticated } from './cloud/index.js';
12
+ *
13
+ * if (isAuthenticated()) {
14
+ * const client = createCloudClient();
15
+ * const projects = await client.listProjects();
16
+ * }
17
+ * ```
18
+ */
19
+ export type { BellwetherCloudClient, CloudConfig, CloudUser, Project, BaselineVersion, UploadResult, DiffSummary, BellwetherBaseline, BaselineMetadata, CloudServerFingerprint, ToolCapability, ResourceCapability, PromptCapability, PersonaInterview, PersonaFinding, CloudToolProfile, ProjectLink, StoredSession, } from './types.js';
20
+ export { createCloudClient, createCloudClientWithSession } from './client.js';
21
+ export { getSessionToken, getStoredSession, saveSession, clearSession, getBaseUrl, isAuthenticated, isValidSessionFormat, isMockSession, getLinkedProject, saveProjectLink, removeProjectLink, isLinked, CONFIG_DIR, SESSION_FILE, SESSION_ENV_VAR, BASE_URL_ENV_VAR, SESSION_PREFIX, MOCK_SESSION_PREFIX, } from './auth.js';
22
+ export { MockCloudClient, generateMockSession, getMockDataDir, clearMockData, } from './mock-client.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Cloud integration module for Bellwether.
3
+ *
4
+ * Provides functionality for:
5
+ * - Authentication with Bellwether Cloud
6
+ * - Project and baseline management
7
+ * - Uploading and comparing baselines
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { createCloudClient, getToken, isAuthenticated } from './cloud/index.js';
12
+ *
13
+ * if (isAuthenticated()) {
14
+ * const client = createCloudClient();
15
+ * const projects = await client.listProjects();
16
+ * }
17
+ * ```
18
+ */
19
+ // Client factory
20
+ export { createCloudClient, createCloudClientWithSession } from './client.js';
21
+ // Authentication
22
+ export { getSessionToken, getStoredSession, saveSession, clearSession, getBaseUrl, isAuthenticated, isValidSessionFormat, isMockSession, getLinkedProject, saveProjectLink, removeProjectLink, isLinked, CONFIG_DIR, SESSION_FILE, SESSION_ENV_VAR, BASE_URL_ENV_VAR, SESSION_PREFIX, MOCK_SESSION_PREFIX, } from './auth.js';
23
+ // Mock client utilities (for testing)
24
+ export { MockCloudClient, generateMockSession, getMockDataDir, clearMockData, } from './mock-client.js';
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Mock cloud client for LOCAL DEVELOPMENT AND TESTING ONLY.
3
+ *
4
+ * ⚠️ WARNING: This is NOT a production implementation!
5
+ *
6
+ * This mock client:
7
+ * - Stores data locally in ~/.bellwether/mock-cloud/ as JSON files
8
+ * - Simulates cloud API responses for development purposes
9
+ * - Does NOT sync data to any remote server
10
+ * - Should ONLY be used with mock sessions (sess_mock_*)
11
+ *
12
+ * For production use, connect to the real Bellwether Cloud API.
13
+ *
14
+ * Usage:
15
+ * bellwether login --mock # Creates a mock session for development
16
+ */
17
+ import type { BellwetherCloudClient, CloudUser, Project, BaselineVersion, UploadResult, DiffSummary, BellwetherBaseline, StoredSession, BadgeInfo, CloudVerificationResult, VerificationSubmissionResult } from './types.js';
18
+ /**
19
+ * Mock cloud client implementation for development and testing.
20
+ *
21
+ * ⚠️ DEVELOPMENT ONLY - NOT FOR PRODUCTION USE!
22
+ *
23
+ * This client:
24
+ * - Stores all data locally in ~/.bellwether/mock-cloud/
25
+ * - Provides a full implementation of the BellwetherCloudClient interface
26
+ * - Does NOT communicate with any remote servers
27
+ * - Should only be used with mock sessions (generated via `bellwether login --mock`)
28
+ *
29
+ * Features that work differently in mock mode:
30
+ * - Badge URLs point to shields.io for display purposes only
31
+ * - Project URLs are local file:// paths
32
+ * - No data synchronization across machines
33
+ *
34
+ * For production deployments, use the real CloudClient with proper authentication.
35
+ */
36
+ export declare class MockCloudClient implements BellwetherCloudClient {
37
+ private dataDir;
38
+ private sessionToken;
39
+ /**
40
+ * Create a new MockCloudClient.
41
+ *
42
+ * @param sessionToken - A mock session token (must start with 'sess_mock_')
43
+ */
44
+ constructor(sessionToken?: string);
45
+ /**
46
+ * Ensure the mock data directory exists.
47
+ */
48
+ private ensureDataDir;
49
+ /**
50
+ * Get path to projects file.
51
+ */
52
+ private get projectsFile();
53
+ /**
54
+ * Get path to baselines file for a project.
55
+ */
56
+ private getBaselinesFile;
57
+ /**
58
+ * Get path to a specific baseline data file.
59
+ */
60
+ private getBaselineDataFile;
61
+ /**
62
+ * Load projects from storage.
63
+ */
64
+ private loadProjects;
65
+ /**
66
+ * Save projects to storage.
67
+ */
68
+ private saveProjects;
69
+ /**
70
+ * Load baselines for a project.
71
+ */
72
+ private loadBaselines;
73
+ /**
74
+ * Save baselines for a project.
75
+ */
76
+ private saveBaselines;
77
+ isAuthenticated(): boolean;
78
+ whoami(): Promise<CloudUser | null>;
79
+ listProjects(): Promise<Project[]>;
80
+ createProject(name: string, serverCommand: string): Promise<Project>;
81
+ getProject(projectId: string): Promise<Project | null>;
82
+ deleteProject(projectId: string): Promise<void>;
83
+ uploadBaseline(projectId: string, baseline: BellwetherBaseline): Promise<UploadResult>;
84
+ getHistory(projectId: string, limit?: number): Promise<BaselineVersion[]>;
85
+ getBaseline(baselineId: string): Promise<BellwetherBaseline | null>;
86
+ getDiff(projectId: string, fromVersion: number, toVersion: number): Promise<DiffSummary>;
87
+ getLatestDiff(projectId: string): Promise<DiffSummary | null>;
88
+ getBadgeInfo(projectId: string): Promise<BadgeInfo | null>;
89
+ submitVerification(projectId: string, result: CloudVerificationResult, report?: Record<string, unknown>): Promise<VerificationSubmissionResult>;
90
+ /**
91
+ * Compute diff between two baselines.
92
+ */
93
+ private computeDiff;
94
+ }
95
+ /**
96
+ * Generate a mock session for development.
97
+ */
98
+ export declare function generateMockSession(username?: string): StoredSession;
99
+ /**
100
+ * Get the mock data directory path.
101
+ */
102
+ export declare function getMockDataDir(): string;
103
+ /**
104
+ * Clear all mock data (for testing).
105
+ */
106
+ export declare function clearMockData(): void;
107
+ //# sourceMappingURL=mock-client.d.ts.map