@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,14 @@
1
+ /**
2
+ * Network utility functions.
3
+ */
4
+ /**
5
+ * Check if a hostname is localhost.
6
+ *
7
+ * Uses the centralized LOCALHOST_HOSTS constant to ensure consistent
8
+ * localhost detection across the codebase.
9
+ *
10
+ * @param hostname - The hostname to check (from URL.hostname)
11
+ * @returns true if the hostname is localhost
12
+ */
13
+ export declare function isLocalhost(hostname: string): boolean;
14
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Network utility functions.
3
+ */
4
+ import { CLI_SECURITY } from '../constants.js';
5
+ /**
6
+ * Check if a hostname is localhost.
7
+ *
8
+ * Uses the centralized LOCALHOST_HOSTS constant to ensure consistent
9
+ * localhost detection across the codebase.
10
+ *
11
+ * @param hostname - The hostname to check (from URL.hostname)
12
+ * @returns true if the hostname is localhost
13
+ */
14
+ export function isLocalhost(hostname) {
15
+ return CLI_SECURITY.LOCALHOST_HOSTS.includes(hostname);
16
+ }
17
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Input sanitization utilities for prompt injection protection.
3
+ *
4
+ * These utilities help prevent malicious content in MCP server responses
5
+ * from manipulating LLM behavior through prompt injection attacks.
6
+ */
7
+ /**
8
+ * Result of sanitization with metadata about what was found.
9
+ */
10
+ export interface SanitizeResult {
11
+ /** The sanitized text */
12
+ sanitized: string;
13
+ /** Whether any potential injection patterns were detected */
14
+ hadInjectionPatterns: boolean;
15
+ /** List of detected patterns (for logging) */
16
+ detectedPatterns: string[];
17
+ /** Whether structural characters were escaped */
18
+ hadStructuralChars: boolean;
19
+ }
20
+ /**
21
+ * Sanitize user-provided text for safe inclusion in LLM prompts.
22
+ *
23
+ * This function:
24
+ * 1. Detects potential prompt injection patterns
25
+ * 2. Escapes structural characters that could manipulate prompt format
26
+ * 3. Wraps content in clear data delimiters
27
+ *
28
+ * @param text - The text to sanitize (e.g., tool description, schema)
29
+ * @param options - Sanitization options
30
+ * @returns Sanitized text safe for prompt inclusion
31
+ */
32
+ export declare function sanitizeForPrompt(text: string, options?: {
33
+ /** Whether to escape structural characters */
34
+ escapeStructural?: boolean;
35
+ /** Whether to wrap in data delimiters */
36
+ wrapInDelimiters?: boolean;
37
+ /** Custom delimiter name */
38
+ delimiterName?: string;
39
+ /** Whether to strip detected injection patterns */
40
+ stripInjections?: boolean;
41
+ }): SanitizeResult;
42
+ /**
43
+ * Sanitize a JSON object for prompt inclusion.
44
+ * Recursively sanitizes all string values.
45
+ *
46
+ * @param obj - The object to sanitize
47
+ * @returns Sanitized object with all strings processed
48
+ */
49
+ export declare function sanitizeObjectForPrompt(obj: unknown): unknown;
50
+ /**
51
+ * Create a safely delimited data section for prompts.
52
+ * Uses instruction/data separation pattern to prevent injection.
53
+ *
54
+ * @param label - Label for the data section
55
+ * @param content - Content to include
56
+ * @returns Formatted data section
57
+ */
58
+ export declare function createDataSection(label: string, content: string): string;
59
+ /**
60
+ * Sanitize a tool for safe inclusion in prompts.
61
+ * Returns a structured representation with sanitized fields.
62
+ *
63
+ * @param tool - Tool object with name, description, and schema
64
+ * @returns Sanitized prompt-safe representation
65
+ */
66
+ export declare function sanitizeToolForPrompt(tool: {
67
+ name: string;
68
+ description?: string;
69
+ inputSchema?: unknown;
70
+ }): {
71
+ name: string;
72
+ description: string;
73
+ schema: string;
74
+ warnings: string[];
75
+ };
76
+ /**
77
+ * Check if text contains potential injection patterns without modifying it.
78
+ *
79
+ * @param text - Text to check
80
+ * @returns True if potential injection detected
81
+ */
82
+ export declare function hasInjectionPatterns(text: string): boolean;
83
+ /**
84
+ * Truncate text to a maximum length with indicator.
85
+ * Useful for limiting context size in prompts.
86
+ *
87
+ * @param text - Text to truncate
88
+ * @param maxLength - Maximum length
89
+ * @returns Truncated text
90
+ */
91
+ export declare function truncateForPrompt(text: string, maxLength: number): string;
92
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Input sanitization utilities for prompt injection protection.
3
+ *
4
+ * These utilities help prevent malicious content in MCP server responses
5
+ * from manipulating LLM behavior through prompt injection attacks.
6
+ */
7
+ /**
8
+ * Patterns that may indicate prompt injection attempts.
9
+ * These patterns look for instruction-like content in user data.
10
+ */
11
+ const INJECTION_PATTERNS = [
12
+ // Direct instruction patterns
13
+ /ignore\s+(all\s+)?(previous|above|prior)\s+(instructions?|prompts?|rules?)/i,
14
+ /disregard\s+(all\s+)?(previous|above|prior)/i,
15
+ /forget\s+(everything|all|what)\s+(you|i)/i,
16
+ // New instruction patterns
17
+ /new\s+instructions?:/i,
18
+ /system\s*:\s*you\s+(are|should|must|will)/i,
19
+ /\bact\s+as\s+(if|though)\b/i,
20
+ /\byou\s+are\s+now\b/i,
21
+ /\bpretend\s+(to\s+be|you\s+are)\b/i,
22
+ // Output manipulation
23
+ /\breturn\s+(only|just)\s+["']?success/i,
24
+ /\balways\s+(return|respond|output|say)\b/i,
25
+ /\bnever\s+(return|respond|output|mention|reveal)\b/i,
26
+ // Role/persona manipulation
27
+ /\byour\s+(new\s+)?role\s+is\b/i,
28
+ /\bswitch\s+(to\s+)?(role|persona|mode)\b/i,
29
+ // Jailbreak attempts
30
+ /\bdo\s+anything\s+now\b/i,
31
+ /\bdan\s+mode\b/i,
32
+ /\bdeveloper\s+mode\b/i,
33
+ // Markdown/formatting exploits
34
+ /```\s*(system|instruction|prompt)/i,
35
+ ];
36
+ /**
37
+ * Characters that could be used for prompt structure manipulation.
38
+ */
39
+ const STRUCTURAL_CHARS = {
40
+ '`': '\\`',
41
+ '$': '\\$',
42
+ '{': '\\{',
43
+ '}': '\\}',
44
+ };
45
+ /**
46
+ * Sanitize user-provided text for safe inclusion in LLM prompts.
47
+ *
48
+ * This function:
49
+ * 1. Detects potential prompt injection patterns
50
+ * 2. Escapes structural characters that could manipulate prompt format
51
+ * 3. Wraps content in clear data delimiters
52
+ *
53
+ * @param text - The text to sanitize (e.g., tool description, schema)
54
+ * @param options - Sanitization options
55
+ * @returns Sanitized text safe for prompt inclusion
56
+ */
57
+ export function sanitizeForPrompt(text, options = {}) {
58
+ const { escapeStructural = true, wrapInDelimiters = false, delimiterName = 'DATA', stripInjections = false, } = options;
59
+ let sanitized = text;
60
+ const detectedPatterns = [];
61
+ let hadStructuralChars = false;
62
+ // Detect injection patterns
63
+ for (const pattern of INJECTION_PATTERNS) {
64
+ if (pattern.test(sanitized)) {
65
+ detectedPatterns.push(pattern.source);
66
+ if (stripInjections) {
67
+ // Replace detected patterns with a placeholder
68
+ sanitized = sanitized.replace(pattern, '[FILTERED]');
69
+ }
70
+ }
71
+ }
72
+ // Escape structural characters
73
+ if (escapeStructural) {
74
+ for (const [char, escaped] of Object.entries(STRUCTURAL_CHARS)) {
75
+ if (sanitized.includes(char)) {
76
+ hadStructuralChars = true;
77
+ sanitized = sanitized.split(char).join(escaped);
78
+ }
79
+ }
80
+ }
81
+ // Wrap in delimiters if requested
82
+ if (wrapInDelimiters) {
83
+ sanitized = `<${delimiterName}>\n${sanitized}\n</${delimiterName}>`;
84
+ }
85
+ return {
86
+ sanitized,
87
+ hadInjectionPatterns: detectedPatterns.length > 0,
88
+ detectedPatterns,
89
+ hadStructuralChars,
90
+ };
91
+ }
92
+ /**
93
+ * Sanitize a JSON object for prompt inclusion.
94
+ * Recursively sanitizes all string values.
95
+ *
96
+ * @param obj - The object to sanitize
97
+ * @returns Sanitized object with all strings processed
98
+ */
99
+ export function sanitizeObjectForPrompt(obj) {
100
+ if (obj === null || obj === undefined) {
101
+ return obj;
102
+ }
103
+ if (typeof obj === 'string') {
104
+ return sanitizeForPrompt(obj, { escapeStructural: true }).sanitized;
105
+ }
106
+ if (Array.isArray(obj)) {
107
+ return obj.map(item => sanitizeObjectForPrompt(item));
108
+ }
109
+ if (typeof obj === 'object') {
110
+ const result = {};
111
+ for (const [key, value] of Object.entries(obj)) {
112
+ // Also sanitize keys (though less critical)
113
+ const sanitizedKey = sanitizeForPrompt(key, { escapeStructural: true }).sanitized;
114
+ result[sanitizedKey] = sanitizeObjectForPrompt(value);
115
+ }
116
+ return result;
117
+ }
118
+ // Numbers, booleans, etc. pass through
119
+ return obj;
120
+ }
121
+ /**
122
+ * Create a safely delimited data section for prompts.
123
+ * Uses instruction/data separation pattern to prevent injection.
124
+ *
125
+ * @param label - Label for the data section
126
+ * @param content - Content to include
127
+ * @returns Formatted data section
128
+ */
129
+ export function createDataSection(label, content) {
130
+ const sanitized = sanitizeForPrompt(content, { escapeStructural: true });
131
+ // Use XML-like delimiters that are less likely to be in user data
132
+ return `<${label.toUpperCase()}_DATA>
133
+ ${sanitized.sanitized}
134
+ </${label.toUpperCase()}_DATA>`;
135
+ }
136
+ /**
137
+ * Sanitize a tool for safe inclusion in prompts.
138
+ * Returns a structured representation with sanitized fields.
139
+ *
140
+ * @param tool - Tool object with name, description, and schema
141
+ * @returns Sanitized prompt-safe representation
142
+ */
143
+ export function sanitizeToolForPrompt(tool) {
144
+ const warnings = [];
145
+ // Sanitize name (should be safe, but check anyway)
146
+ const nameResult = sanitizeForPrompt(tool.name, { escapeStructural: true });
147
+ if (nameResult.hadInjectionPatterns) {
148
+ warnings.push(`Tool name contains suspicious patterns: ${tool.name}`);
149
+ }
150
+ // Sanitize description
151
+ const descResult = sanitizeForPrompt(tool.description ?? 'No description provided', { escapeStructural: true });
152
+ if (descResult.hadInjectionPatterns) {
153
+ warnings.push(`Tool description contains potential injection patterns`);
154
+ }
155
+ // Sanitize schema
156
+ let schemaStr = 'No schema provided';
157
+ if (tool.inputSchema) {
158
+ const sanitizedSchema = sanitizeObjectForPrompt(tool.inputSchema);
159
+ schemaStr = JSON.stringify(sanitizedSchema, null, 2);
160
+ }
161
+ return {
162
+ name: nameResult.sanitized,
163
+ description: descResult.sanitized,
164
+ schema: schemaStr,
165
+ warnings,
166
+ };
167
+ }
168
+ /**
169
+ * Check if text contains potential injection patterns without modifying it.
170
+ *
171
+ * @param text - Text to check
172
+ * @returns True if potential injection detected
173
+ */
174
+ export function hasInjectionPatterns(text) {
175
+ return INJECTION_PATTERNS.some(pattern => pattern.test(text));
176
+ }
177
+ /**
178
+ * Truncate text to a maximum length with indicator.
179
+ * Useful for limiting context size in prompts.
180
+ *
181
+ * @param text - Text to truncate
182
+ * @param maxLength - Maximum length
183
+ * @returns Truncated text
184
+ */
185
+ export function truncateForPrompt(text, maxLength) {
186
+ if (text.length <= maxLength) {
187
+ return text;
188
+ }
189
+ return text.substring(0, maxLength - 3) + '...';
190
+ }
191
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Semantic text analysis utilities.
3
+ *
4
+ * Provides stemming, negation handling, constraint normalization,
5
+ * and enhanced keyword extraction for semantic matching.
6
+ */
7
+ /**
8
+ * Stem a single word using simplified Porter-like rules.
9
+ *
10
+ * @param word - Word to stem (should be lowercase)
11
+ * @returns Stemmed word
12
+ */
13
+ export declare function stem(word: string): string;
14
+ /**
15
+ * Stem all words in a text.
16
+ *
17
+ * @param text - Text to stem
18
+ * @returns Text with all words stemmed
19
+ */
20
+ export declare function stemText(text: string): string;
21
+ /**
22
+ * Extract keywords with stemming applied.
23
+ *
24
+ * @param text - Text to extract keywords from
25
+ * @returns Set of stemmed keywords
26
+ */
27
+ export declare function extractStemmedKeywords(text: string): Set<string>;
28
+ /**
29
+ * Calculate keyword overlap with stemming.
30
+ *
31
+ * @param text1 - First text
32
+ * @param text2 - Second text
33
+ * @returns Overlap percentage (0-100)
34
+ */
35
+ export declare function calculateStemmedKeywordOverlap(text1: string, text2: string): number;
36
+ /**
37
+ * Result of negation analysis.
38
+ */
39
+ export interface NegationResult {
40
+ /** Negated words found in text */
41
+ negatedWords: string[];
42
+ /** Whether the overall sentiment is negated */
43
+ isNegated: boolean;
44
+ /** Original text with negations marked */
45
+ markedText: string;
46
+ }
47
+ /**
48
+ * Analyze text for negation patterns.
49
+ *
50
+ * @param text - Text to analyze
51
+ * @returns Negation analysis result
52
+ */
53
+ export declare function analyzeNegation(text: string): NegationResult;
54
+ /**
55
+ * Check if a severity keyword is negated in the text.
56
+ *
57
+ * @param text - Text to check
58
+ * @param keyword - Severity keyword to look for
59
+ * @returns True if keyword is negated
60
+ */
61
+ export declare function isSeverityNegated(text: string, keyword: string): boolean;
62
+ /**
63
+ * Extract severity from text with negation handling.
64
+ *
65
+ * @param text - Text to extract severity from
66
+ * @returns Extracted severity level
67
+ */
68
+ export declare function extractSeverityWithNegation(text: string): 'low' | 'medium' | 'high' | 'critical';
69
+ /**
70
+ * Normalized constraint value.
71
+ */
72
+ export interface NormalizedConstraint {
73
+ /** Original constraint string */
74
+ original: string;
75
+ /** Type of constraint */
76
+ type: 'size' | 'time' | 'rate' | 'count' | 'unknown';
77
+ /** Numeric value */
78
+ value: number;
79
+ /** Normalized unit */
80
+ unit: string;
81
+ /** Value in base units (bytes for size, ms for time, per-second for rate) */
82
+ baseValue: number;
83
+ }
84
+ /**
85
+ * Parse and normalize a constraint value.
86
+ *
87
+ * @param constraint - Constraint string (e.g., "10MB", "30 seconds", "100 requests/min")
88
+ * @returns Normalized constraint or undefined if not parseable
89
+ */
90
+ export declare function normalizeConstraint(constraint: string): NormalizedConstraint | undefined;
91
+ /**
92
+ * Compare two constraint values with unit normalization.
93
+ *
94
+ * @param a - First constraint
95
+ * @param b - Second constraint
96
+ * @returns Similarity score (0-100)
97
+ */
98
+ export declare function compareConstraints(a: string | undefined, b: string | undefined): number;
99
+ /**
100
+ * Extended security category keywords including new categories.
101
+ */
102
+ export declare const EXTENDED_SECURITY_KEYWORDS: Record<string, string[]>;
103
+ /**
104
+ * Extract security category from text using extended keywords.
105
+ *
106
+ * @param text - Text to analyze
107
+ * @returns Detected security category
108
+ */
109
+ export declare function extractSecurityCategoryExtended(text: string): string;
110
+ /**
111
+ * Check if two texts are semantically similar considering stemming.
112
+ *
113
+ * @param text1 - First text
114
+ * @param text2 - Second text
115
+ * @param threshold - Minimum similarity threshold (0-100, default 60)
116
+ * @returns True if texts are similar
117
+ */
118
+ export declare function areSemanticallySimular(text1: string, text2: string, threshold?: number): boolean;
119
+ /**
120
+ * Database type qualifiers that distinguish different injection types.
121
+ */
122
+ export type DatabaseQualifier = 'sql' | 'nosql' | 'mongodb' | 'redis' | 'generic';
123
+ /**
124
+ * Direction qualifiers for file/data operations.
125
+ */
126
+ export type DirectionQualifier = 'upload' | 'download' | 'read' | 'write' | 'generic';
127
+ /**
128
+ * Timeout type qualifiers.
129
+ */
130
+ export type TimeoutQualifier = 'connection' | 'read' | 'write' | 'request' | 'response' | 'idle' | 'generic';
131
+ /**
132
+ * Polarity indicator for assertions (positive vs negative statements).
133
+ */
134
+ export type Polarity = 'positive' | 'negative' | 'neutral';
135
+ /**
136
+ * Full qualifier extraction result.
137
+ */
138
+ export interface QualifierResult {
139
+ database: DatabaseQualifier;
140
+ direction: DirectionQualifier;
141
+ timeout: TimeoutQualifier;
142
+ polarity: Polarity;
143
+ isNegated: boolean;
144
+ rateTimeUnit: 'second' | 'minute' | 'hour' | 'day' | 'unknown';
145
+ }
146
+ /**
147
+ * Extract database type qualifier from text.
148
+ * Distinguishes SQL from NoSQL/MongoDB/Redis etc.
149
+ */
150
+ export declare function extractDatabaseQualifier(text: string): DatabaseQualifier;
151
+ /**
152
+ * Extract direction qualifier from text.
153
+ * Distinguishes upload from download, read from write.
154
+ */
155
+ export declare function extractDirectionQualifier(text: string): DirectionQualifier;
156
+ /**
157
+ * Extract timeout type qualifier from text.
158
+ * Distinguishes connection timeout from read/write/request timeouts.
159
+ */
160
+ export declare function extractTimeoutQualifier(text: string): TimeoutQualifier;
161
+ /**
162
+ * Extract rate limit time unit from text.
163
+ * Distinguishes per-second from per-minute from per-hour limits.
164
+ */
165
+ export declare function extractRateTimeUnit(text: string): 'second' | 'minute' | 'hour' | 'day' | 'unknown';
166
+ /**
167
+ * Detect overall polarity of an assertion.
168
+ * Returns 'negative' if the statement is negated/denied.
169
+ */
170
+ export declare function detectPolarity(text: string): Polarity;
171
+ /**
172
+ * Check if a security finding or assertion is negated.
173
+ * Returns true if the text explicitly denies the assertion/vulnerability.
174
+ */
175
+ export declare function isSecurityFindingNegated(text: string): boolean;
176
+ /**
177
+ * Extract all qualifiers from text.
178
+ * Provides comprehensive context for semantic comparison.
179
+ */
180
+ export declare function extractQualifiers(text: string): QualifierResult;
181
+ /**
182
+ * Compare qualifiers between two texts.
183
+ * Returns a compatibility score (0-100).
184
+ */
185
+ export declare function compareQualifiers(text1: string, text2: string): {
186
+ score: number;
187
+ incompatibilities: string[];
188
+ };
189
+ /**
190
+ * Check if two texts have compatible qualifiers for matching.
191
+ * Returns false if there are critical incompatibilities.
192
+ */
193
+ export declare function qualifiersCompatible(text1: string, text2: string): boolean;
194
+ //# sourceMappingURL=semantic.d.ts.map