@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,189 @@
1
+ /**
2
+ * Schema Evolution Timeline
3
+ *
4
+ * Tracks schema changes over time with visual timeline.
5
+ * Provides version history, deprecation tracking, and change summaries.
6
+ */
7
+ import type { BehavioralBaseline } from './types.js';
8
+ import { type SchemaChangeDetail } from './change-impact-analyzer.js';
9
+ /**
10
+ * Event type for schema lifecycle events.
11
+ */
12
+ export type SchemaEventType = 'created' | 'updated' | 'deprecated' | 'removed' | 'restored';
13
+ /**
14
+ * A single version of a tool's schema.
15
+ */
16
+ export interface SchemaVersion {
17
+ /** Tool name */
18
+ toolName: string;
19
+ /** Semantic version of the schema */
20
+ version: string;
21
+ /** Full input schema */
22
+ schema: Record<string, unknown> | undefined;
23
+ /** Schema hash for quick comparison */
24
+ schemaHash: string;
25
+ /** Changes from previous version */
26
+ changes: SchemaChangeDetail[];
27
+ /** Whether this version contains breaking changes */
28
+ hasBreakingChanges: boolean;
29
+ /** When this version was registered */
30
+ registeredAt: Date;
31
+ /** Release notes or change description */
32
+ releaseNotes?: string;
33
+ /** Git SHA if available */
34
+ gitSha?: string;
35
+ /** Source baseline file if available */
36
+ sourceBaseline?: string;
37
+ }
38
+ /**
39
+ * Deprecation event in the timeline.
40
+ */
41
+ export interface DeprecationEvent {
42
+ /** Tool name */
43
+ toolName: string;
44
+ /** Event type */
45
+ eventType: 'deprecated' | 'sunset' | 'removed' | 'restored';
46
+ /** When the event occurred */
47
+ occurredAt: Date;
48
+ /** Reason for deprecation */
49
+ reason?: string;
50
+ /** Suggested replacement tool */
51
+ replacementTool?: string;
52
+ /** Planned removal date */
53
+ removalDate?: Date;
54
+ }
55
+ /**
56
+ * Complete timeline for a single tool.
57
+ */
58
+ export interface SchemaTimeline {
59
+ /** Tool name */
60
+ toolName: string;
61
+ /** Current description */
62
+ description: string;
63
+ /** All schema versions */
64
+ versions: SchemaVersion[];
65
+ /** Deprecation history */
66
+ deprecationHistory: DeprecationEvent[];
67
+ /** When the tool was first seen */
68
+ firstSeen: Date;
69
+ /** When the tool was last updated */
70
+ lastUpdated: Date;
71
+ /** Current deprecation status */
72
+ isDeprecated: boolean;
73
+ /** Whether the tool has been removed */
74
+ isRemoved: boolean;
75
+ /** Total number of breaking changes across all versions */
76
+ totalBreakingChanges: number;
77
+ }
78
+ /**
79
+ * Timeline for an entire server across multiple baselines.
80
+ */
81
+ export interface ServerTimeline {
82
+ /** Server name */
83
+ serverName: string;
84
+ /** Server version (latest) */
85
+ serverVersion: string;
86
+ /** Individual tool timelines */
87
+ toolTimelines: Map<string, SchemaTimeline>;
88
+ /** Total number of baselines analyzed */
89
+ baselineCount: number;
90
+ /** Date range covered */
91
+ dateRange: {
92
+ earliest: Date;
93
+ latest: Date;
94
+ };
95
+ /** Summary statistics */
96
+ stats: TimelineStats;
97
+ }
98
+ /**
99
+ * Summary statistics for a timeline.
100
+ */
101
+ export interface TimelineStats {
102
+ /** Total tools tracked */
103
+ totalTools: number;
104
+ /** Tools currently active */
105
+ activeTools: number;
106
+ /** Tools deprecated */
107
+ deprecatedTools: number;
108
+ /** Tools removed */
109
+ removedTools: number;
110
+ /** Total schema versions tracked */
111
+ totalVersions: number;
112
+ /** Total breaking changes */
113
+ totalBreakingChanges: number;
114
+ /** Average versions per tool */
115
+ avgVersionsPerTool: number;
116
+ }
117
+ /**
118
+ * Options for building timelines.
119
+ */
120
+ export interface TimelineBuildOptions {
121
+ /** Include full schema in each version (increases size) */
122
+ includeFullSchemas?: boolean;
123
+ /** Maximum versions to keep per tool (0 = unlimited) */
124
+ maxVersionsPerTool?: number;
125
+ /** Include removed tools in timeline */
126
+ includeRemovedTools?: boolean;
127
+ }
128
+ /**
129
+ * Build a server timeline from multiple baselines.
130
+ * Baselines should be provided in chronological order (oldest first).
131
+ */
132
+ export declare function buildServerTimeline(baselines: BehavioralBaseline[], options?: TimelineBuildOptions): ServerTimeline;
133
+ /**
134
+ * Build a timeline for a single tool from multiple baselines.
135
+ */
136
+ export declare function buildToolTimeline(toolName: string, baselines: BehavioralBaseline[], options?: TimelineBuildOptions): SchemaTimeline | null;
137
+ /**
138
+ * Get all breaking changes for a tool.
139
+ */
140
+ export declare function getBreakingChanges(timeline: SchemaTimeline): SchemaVersion[];
141
+ /**
142
+ * Get version at a specific point in time.
143
+ */
144
+ export declare function getVersionAtTime(timeline: SchemaTimeline, targetDate: Date): SchemaVersion | null;
145
+ /**
146
+ * Get changes between two dates.
147
+ */
148
+ export declare function getChangesBetween(timeline: SchemaTimeline, startDate: Date, endDate: Date): SchemaVersion[];
149
+ /**
150
+ * Check if a tool had breaking changes in a time period.
151
+ */
152
+ export declare function hadBreakingChanges(timeline: SchemaTimeline, since: Date): boolean;
153
+ /**
154
+ * Get tools with most versions (most active/changing tools).
155
+ */
156
+ export declare function getMostActiveTools(serverTimeline: ServerTimeline, limit?: number): SchemaTimeline[];
157
+ /**
158
+ * Get tools with most breaking changes.
159
+ */
160
+ export declare function getMostBreakingTools(serverTimeline: ServerTimeline, limit?: number): SchemaTimeline[];
161
+ /**
162
+ * Format a timeline for console display.
163
+ */
164
+ export declare function formatTimeline(timeline: SchemaTimeline): string;
165
+ /**
166
+ * Format server timeline summary.
167
+ */
168
+ export declare function formatServerTimelineSummary(timeline: ServerTimeline): string;
169
+ /**
170
+ * Generate a visual timeline (ASCII art).
171
+ */
172
+ export declare function generateVisualTimeline(timeline: SchemaTimeline, width?: number): string;
173
+ /**
174
+ * Convert timeline to JSON-serializable format.
175
+ */
176
+ export declare function serializeTimeline(timeline: SchemaTimeline): Record<string, unknown>;
177
+ /**
178
+ * Deserialize timeline from JSON.
179
+ */
180
+ export declare function deserializeTimeline(data: Record<string, unknown>): SchemaTimeline;
181
+ /**
182
+ * Serialize server timeline to JSON.
183
+ */
184
+ export declare function serializeServerTimeline(timeline: ServerTimeline): Record<string, unknown>;
185
+ /**
186
+ * Deserialize server timeline from JSON.
187
+ */
188
+ export declare function deserializeServerTimeline(data: Record<string, unknown>): ServerTimeline;
189
+ //# sourceMappingURL=schema-evolution.d.ts.map
@@ -0,0 +1,467 @@
1
+ /**
2
+ * Schema Evolution Timeline
3
+ *
4
+ * Tracks schema changes over time with visual timeline.
5
+ * Provides version history, deprecation tracking, and change summaries.
6
+ */
7
+ import { analyzeSchemaChanges, } from './change-impact-analyzer.js';
8
+ import { SCHEMA_EVOLUTION } from '../constants.js';
9
+ /**
10
+ * Build a server timeline from multiple baselines.
11
+ * Baselines should be provided in chronological order (oldest first).
12
+ */
13
+ export function buildServerTimeline(baselines, options = {}) {
14
+ const opts = {
15
+ includeFullSchemas: options.includeFullSchemas ?? false,
16
+ maxVersionsPerTool: options.maxVersionsPerTool ?? SCHEMA_EVOLUTION.DEFAULT_MAX_VERSIONS_PER_TOOL,
17
+ includeRemovedTools: options.includeRemovedTools ?? true,
18
+ };
19
+ if (baselines.length === 0) {
20
+ throw new Error('At least one baseline is required to build a timeline');
21
+ }
22
+ const toolTimelines = new Map();
23
+ const seenTools = new Set();
24
+ const removedTools = new Set();
25
+ // Process baselines in order
26
+ for (let i = 0; i < baselines.length; i++) {
27
+ const baseline = baselines[i];
28
+ const previousBaseline = i > 0 ? baselines[i - 1] : undefined;
29
+ const currentTools = new Set(baseline.tools.map(t => t.name));
30
+ // Track new and updated tools
31
+ for (const tool of baseline.tools) {
32
+ seenTools.add(tool.name);
33
+ removedTools.delete(tool.name); // Tool is back if it was removed
34
+ const existingTimeline = toolTimelines.get(tool.name);
35
+ const previousTool = previousBaseline?.tools.find(t => t.name === tool.name);
36
+ if (!existingTimeline) {
37
+ // New tool - create timeline
38
+ const timeline = createToolTimeline(tool, baseline, opts);
39
+ toolTimelines.set(tool.name, timeline);
40
+ }
41
+ else {
42
+ // Existing tool - check for changes
43
+ updateToolTimeline(existingTimeline, tool, previousTool, baseline, opts);
44
+ }
45
+ // Track deprecation events
46
+ if (tool.deprecated && !previousTool?.deprecated) {
47
+ addDeprecationEvent(toolTimelines.get(tool.name), tool, 'deprecated', baseline.createdAt);
48
+ }
49
+ }
50
+ // Track removed tools
51
+ if (previousBaseline) {
52
+ for (const prevTool of previousBaseline.tools) {
53
+ if (!currentTools.has(prevTool.name)) {
54
+ removedTools.add(prevTool.name);
55
+ const timeline = toolTimelines.get(prevTool.name);
56
+ if (timeline && !timeline.isRemoved) {
57
+ timeline.isRemoved = true;
58
+ addDeprecationEvent(timeline, prevTool, 'removed', baseline.createdAt);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ // Remove timelines for removed tools if not including them
65
+ if (!opts.includeRemovedTools) {
66
+ for (const toolName of removedTools) {
67
+ toolTimelines.delete(toolName);
68
+ }
69
+ }
70
+ // Trim versions if needed
71
+ if (opts.maxVersionsPerTool > 0) {
72
+ for (const timeline of toolTimelines.values()) {
73
+ if (timeline.versions.length > opts.maxVersionsPerTool) {
74
+ timeline.versions = timeline.versions.slice(-opts.maxVersionsPerTool);
75
+ }
76
+ }
77
+ }
78
+ const latestBaseline = baselines[baselines.length - 1];
79
+ const earliestBaseline = baselines[0];
80
+ return {
81
+ serverName: latestBaseline.server.name,
82
+ serverVersion: latestBaseline.server.version,
83
+ toolTimelines,
84
+ baselineCount: baselines.length,
85
+ dateRange: {
86
+ earliest: earliestBaseline.createdAt,
87
+ latest: latestBaseline.createdAt,
88
+ },
89
+ stats: calculateTimelineStats(toolTimelines),
90
+ };
91
+ }
92
+ /**
93
+ * Build a timeline for a single tool from multiple baselines.
94
+ */
95
+ export function buildToolTimeline(toolName, baselines, options = {}) {
96
+ const serverTimeline = buildServerTimeline(baselines, options);
97
+ return serverTimeline.toolTimelines.get(toolName) || null;
98
+ }
99
+ /**
100
+ * Create a new tool timeline from its first appearance.
101
+ */
102
+ function createToolTimeline(tool, baseline, opts) {
103
+ const initialVersion = {
104
+ toolName: tool.name,
105
+ version: '1.0.0',
106
+ schema: opts.includeFullSchemas ? tool.inputSchema : undefined,
107
+ schemaHash: tool.schemaHash,
108
+ changes: [],
109
+ hasBreakingChanges: false,
110
+ registeredAt: baseline.createdAt,
111
+ sourceBaseline: baseline.integrityHash,
112
+ };
113
+ return {
114
+ toolName: tool.name,
115
+ description: tool.description,
116
+ versions: [initialVersion],
117
+ deprecationHistory: [],
118
+ firstSeen: baseline.createdAt,
119
+ lastUpdated: baseline.createdAt,
120
+ isDeprecated: tool.deprecated ?? false,
121
+ isRemoved: false,
122
+ totalBreakingChanges: 0,
123
+ };
124
+ }
125
+ /**
126
+ * Update an existing tool timeline with a new version if changed.
127
+ */
128
+ function updateToolTimeline(timeline, tool, previousTool, baseline, opts) {
129
+ const latestVersion = timeline.versions[timeline.versions.length - 1];
130
+ // Check if schema changed
131
+ if (latestVersion.schemaHash !== tool.schemaHash) {
132
+ const changes = analyzeSchemaChanges(previousTool?.inputSchema, tool.inputSchema);
133
+ const hasBreaking = changes.some(c => c.breaking);
134
+ // Increment version
135
+ const newVersionNumber = incrementVersion(latestVersion.version, hasBreaking);
136
+ const newVersion = {
137
+ toolName: tool.name,
138
+ version: newVersionNumber,
139
+ schema: opts.includeFullSchemas ? tool.inputSchema : undefined,
140
+ schemaHash: tool.schemaHash,
141
+ changes,
142
+ hasBreakingChanges: hasBreaking,
143
+ registeredAt: baseline.createdAt,
144
+ sourceBaseline: baseline.integrityHash,
145
+ };
146
+ timeline.versions.push(newVersion);
147
+ timeline.lastUpdated = baseline.createdAt;
148
+ if (hasBreaking) {
149
+ timeline.totalBreakingChanges++;
150
+ }
151
+ }
152
+ // Update description if changed
153
+ if (tool.description !== timeline.description) {
154
+ timeline.description = tool.description;
155
+ }
156
+ // Update deprecation status
157
+ timeline.isDeprecated = tool.deprecated ?? false;
158
+ }
159
+ /**
160
+ * Add a deprecation event to a timeline.
161
+ */
162
+ function addDeprecationEvent(timeline, tool, eventType, occurredAt) {
163
+ timeline.deprecationHistory.push({
164
+ toolName: tool.name,
165
+ eventType,
166
+ occurredAt,
167
+ reason: tool.deprecationNotice,
168
+ replacementTool: tool.replacementTool,
169
+ removalDate: tool.removalDate,
170
+ });
171
+ }
172
+ /**
173
+ * Increment version number based on whether change is breaking.
174
+ */
175
+ function incrementVersion(currentVersion, isBreaking) {
176
+ const parts = currentVersion.split('.').map(Number);
177
+ if (parts.length !== 3) {
178
+ return isBreaking ? '2.0.0' : '1.1.0';
179
+ }
180
+ if (isBreaking) {
181
+ // Major version bump
182
+ return `${parts[0] + 1}.0.0`;
183
+ }
184
+ else {
185
+ // Minor version bump
186
+ return `${parts[0]}.${parts[1] + 1}.0`;
187
+ }
188
+ }
189
+ /**
190
+ * Calculate statistics for a timeline.
191
+ */
192
+ function calculateTimelineStats(toolTimelines) {
193
+ let totalVersions = 0;
194
+ let totalBreakingChanges = 0;
195
+ let activeTools = 0;
196
+ let deprecatedTools = 0;
197
+ let removedTools = 0;
198
+ for (const timeline of toolTimelines.values()) {
199
+ totalVersions += timeline.versions.length;
200
+ totalBreakingChanges += timeline.totalBreakingChanges;
201
+ if (timeline.isRemoved) {
202
+ removedTools++;
203
+ }
204
+ else if (timeline.isDeprecated) {
205
+ deprecatedTools++;
206
+ }
207
+ else {
208
+ activeTools++;
209
+ }
210
+ }
211
+ const totalTools = toolTimelines.size;
212
+ return {
213
+ totalTools,
214
+ activeTools,
215
+ deprecatedTools,
216
+ removedTools,
217
+ totalVersions,
218
+ totalBreakingChanges,
219
+ avgVersionsPerTool: totalTools > 0 ? totalVersions / totalTools : 0,
220
+ };
221
+ }
222
+ /**
223
+ * Get all breaking changes for a tool.
224
+ */
225
+ export function getBreakingChanges(timeline) {
226
+ return timeline.versions.filter(v => v.hasBreakingChanges);
227
+ }
228
+ /**
229
+ * Get version at a specific point in time.
230
+ */
231
+ export function getVersionAtTime(timeline, targetDate) {
232
+ // Find the latest version before or at the target date
233
+ for (let i = timeline.versions.length - 1; i >= 0; i--) {
234
+ if (timeline.versions[i].registeredAt <= targetDate) {
235
+ return timeline.versions[i];
236
+ }
237
+ }
238
+ return null;
239
+ }
240
+ /**
241
+ * Get changes between two dates.
242
+ */
243
+ export function getChangesBetween(timeline, startDate, endDate) {
244
+ return timeline.versions.filter(v => v.registeredAt >= startDate && v.registeredAt <= endDate);
245
+ }
246
+ /**
247
+ * Check if a tool had breaking changes in a time period.
248
+ */
249
+ export function hadBreakingChanges(timeline, since) {
250
+ return timeline.versions.some(v => v.registeredAt >= since && v.hasBreakingChanges);
251
+ }
252
+ /**
253
+ * Get tools with most versions (most active/changing tools).
254
+ */
255
+ export function getMostActiveTools(serverTimeline, limit = SCHEMA_EVOLUTION.DEFAULT_ACTIVE_TOOLS_LIMIT) {
256
+ return Array.from(serverTimeline.toolTimelines.values())
257
+ .sort((a, b) => b.versions.length - a.versions.length)
258
+ .slice(0, limit);
259
+ }
260
+ /**
261
+ * Get tools with most breaking changes.
262
+ */
263
+ export function getMostBreakingTools(serverTimeline, limit = SCHEMA_EVOLUTION.DEFAULT_ACTIVE_TOOLS_LIMIT) {
264
+ return Array.from(serverTimeline.toolTimelines.values())
265
+ .sort((a, b) => b.totalBreakingChanges - a.totalBreakingChanges)
266
+ .filter(t => t.totalBreakingChanges > 0)
267
+ .slice(0, limit);
268
+ }
269
+ /**
270
+ * Format a timeline for console display.
271
+ */
272
+ export function formatTimeline(timeline) {
273
+ const lines = [];
274
+ lines.push(`Schema Timeline: ${timeline.toolName}`);
275
+ lines.push('═'.repeat(50));
276
+ lines.push('');
277
+ // Status
278
+ const status = timeline.isRemoved ? 'REMOVED' :
279
+ timeline.isDeprecated ? 'DEPRECATED' : 'ACTIVE';
280
+ lines.push(`Status: ${status}`);
281
+ lines.push(`First seen: ${timeline.firstSeen.toISOString()}`);
282
+ lines.push(`Last updated: ${timeline.lastUpdated.toISOString()}`);
283
+ lines.push(`Total versions: ${timeline.versions.length}`);
284
+ lines.push(`Breaking changes: ${timeline.totalBreakingChanges}`);
285
+ lines.push('');
286
+ // Versions
287
+ lines.push('Version History:');
288
+ lines.push('─'.repeat(40));
289
+ for (const version of timeline.versions.slice(-SCHEMA_EVOLUTION.DEFAULT_DISPLAY_VERSIONS)) {
290
+ const breakingIndicator = version.hasBreakingChanges ? ' [BREAKING]' : '';
291
+ lines.push(` v${version.version}${breakingIndicator}`);
292
+ lines.push(` Registered: ${version.registeredAt.toISOString()}`);
293
+ if (version.changes.length > 0) {
294
+ lines.push(` Changes:`);
295
+ for (const change of version.changes.slice(0, SCHEMA_EVOLUTION.DEFAULT_DISPLAY_CHANGES)) {
296
+ const breakingMark = change.breaking ? '!' : ' ';
297
+ lines.push(` ${breakingMark} ${change.type}: ${change.parameterPath}`);
298
+ }
299
+ if (version.changes.length > SCHEMA_EVOLUTION.DEFAULT_DISPLAY_CHANGES) {
300
+ lines.push(` ... and ${version.changes.length - SCHEMA_EVOLUTION.DEFAULT_DISPLAY_CHANGES} more changes`);
301
+ }
302
+ }
303
+ lines.push('');
304
+ }
305
+ // Deprecation history
306
+ if (timeline.deprecationHistory.length > 0) {
307
+ lines.push('Deprecation History:');
308
+ lines.push('─'.repeat(40));
309
+ for (const event of timeline.deprecationHistory) {
310
+ lines.push(` ${event.eventType.toUpperCase()} at ${event.occurredAt.toISOString()}`);
311
+ if (event.reason) {
312
+ lines.push(` Reason: ${event.reason}`);
313
+ }
314
+ if (event.replacementTool) {
315
+ lines.push(` Replacement: ${event.replacementTool}`);
316
+ }
317
+ }
318
+ }
319
+ return lines.join('\n');
320
+ }
321
+ /**
322
+ * Format server timeline summary.
323
+ */
324
+ export function formatServerTimelineSummary(timeline) {
325
+ const lines = [];
326
+ lines.push(`Server Timeline: ${timeline.serverName}`);
327
+ lines.push('═'.repeat(50));
328
+ lines.push('');
329
+ lines.push(`Server version: ${timeline.serverVersion}`);
330
+ lines.push(`Baselines analyzed: ${timeline.baselineCount}`);
331
+ lines.push(`Date range: ${timeline.dateRange.earliest.toISOString()} to ${timeline.dateRange.latest.toISOString()}`);
332
+ lines.push('');
333
+ lines.push('Statistics:');
334
+ lines.push(` Total tools: ${timeline.stats.totalTools}`);
335
+ lines.push(` Active: ${timeline.stats.activeTools}`);
336
+ lines.push(` Deprecated: ${timeline.stats.deprecatedTools}`);
337
+ lines.push(` Removed: ${timeline.stats.removedTools}`);
338
+ lines.push(` Total versions: ${timeline.stats.totalVersions}`);
339
+ lines.push(` Total breaking changes: ${timeline.stats.totalBreakingChanges}`);
340
+ lines.push(` Avg versions/tool: ${timeline.stats.avgVersionsPerTool.toFixed(1)}`);
341
+ return lines.join('\n');
342
+ }
343
+ /**
344
+ * Generate a visual timeline (ASCII art).
345
+ */
346
+ export function generateVisualTimeline(timeline, width = SCHEMA_EVOLUTION.DEFAULT_VISUAL_TIMELINE_WIDTH) {
347
+ if (timeline.versions.length === 0) {
348
+ return 'No versions to display.';
349
+ }
350
+ const lines = [];
351
+ const maxVersions = Math.min(timeline.versions.length, SCHEMA_EVOLUTION.MAX_VISUAL_TIMELINE_VERSIONS);
352
+ const displayVersions = timeline.versions.slice(-maxVersions);
353
+ lines.push(`${timeline.toolName} Schema Evolution`);
354
+ lines.push('');
355
+ // Timeline bar
356
+ const barWidth = width - 20;
357
+ const segmentWidth = Math.floor(barWidth / displayVersions.length);
358
+ let bar = '';
359
+ for (let i = 0; i < displayVersions.length; i++) {
360
+ const v = displayVersions[i];
361
+ const marker = v.hasBreakingChanges ? '◆' : '●';
362
+ bar += marker + '─'.repeat(segmentWidth - 1);
363
+ }
364
+ lines.push(' ' + bar);
365
+ // Version labels
366
+ let labels = ' ';
367
+ for (const v of displayVersions) {
368
+ const label = `v${v.version}`;
369
+ labels += label + ' '.repeat(Math.max(0, segmentWidth - label.length));
370
+ }
371
+ lines.push(labels);
372
+ // Legend
373
+ lines.push('');
374
+ lines.push('Legend: ● Minor change | ◆ Breaking change');
375
+ return lines.join('\n');
376
+ }
377
+ /**
378
+ * Convert timeline to JSON-serializable format.
379
+ */
380
+ export function serializeTimeline(timeline) {
381
+ return {
382
+ toolName: timeline.toolName,
383
+ description: timeline.description,
384
+ versions: timeline.versions.map(v => ({
385
+ ...v,
386
+ registeredAt: v.registeredAt.toISOString(),
387
+ })),
388
+ deprecationHistory: timeline.deprecationHistory.map(e => ({
389
+ ...e,
390
+ occurredAt: e.occurredAt.toISOString(),
391
+ removalDate: e.removalDate?.toISOString(),
392
+ })),
393
+ firstSeen: timeline.firstSeen.toISOString(),
394
+ lastUpdated: timeline.lastUpdated.toISOString(),
395
+ isDeprecated: timeline.isDeprecated,
396
+ isRemoved: timeline.isRemoved,
397
+ totalBreakingChanges: timeline.totalBreakingChanges,
398
+ };
399
+ }
400
+ /**
401
+ * Deserialize timeline from JSON.
402
+ */
403
+ export function deserializeTimeline(data) {
404
+ const versions = data.versions.map(v => ({
405
+ ...v,
406
+ registeredAt: new Date(v.registeredAt),
407
+ }));
408
+ const deprecationHistory = data.deprecationHistory.map(e => ({
409
+ ...e,
410
+ occurredAt: new Date(e.occurredAt),
411
+ removalDate: e.removalDate ? new Date(e.removalDate) : undefined,
412
+ }));
413
+ return {
414
+ toolName: data.toolName,
415
+ description: data.description,
416
+ versions,
417
+ deprecationHistory,
418
+ firstSeen: new Date(data.firstSeen),
419
+ lastUpdated: new Date(data.lastUpdated),
420
+ isDeprecated: data.isDeprecated,
421
+ isRemoved: data.isRemoved,
422
+ totalBreakingChanges: data.totalBreakingChanges,
423
+ };
424
+ }
425
+ /**
426
+ * Serialize server timeline to JSON.
427
+ */
428
+ export function serializeServerTimeline(timeline) {
429
+ const toolTimelines = {};
430
+ for (const [name, t] of timeline.toolTimelines) {
431
+ toolTimelines[name] = serializeTimeline(t);
432
+ }
433
+ return {
434
+ serverName: timeline.serverName,
435
+ serverVersion: timeline.serverVersion,
436
+ toolTimelines,
437
+ baselineCount: timeline.baselineCount,
438
+ dateRange: {
439
+ earliest: timeline.dateRange.earliest.toISOString(),
440
+ latest: timeline.dateRange.latest.toISOString(),
441
+ },
442
+ stats: timeline.stats,
443
+ };
444
+ }
445
+ /**
446
+ * Deserialize server timeline from JSON.
447
+ */
448
+ export function deserializeServerTimeline(data) {
449
+ const toolTimelines = new Map();
450
+ const toolData = data.toolTimelines;
451
+ for (const [name, t] of Object.entries(toolData)) {
452
+ toolTimelines.set(name, deserializeTimeline(t));
453
+ }
454
+ const dateRange = data.dateRange;
455
+ return {
456
+ serverName: data.serverName,
457
+ serverVersion: data.serverVersion,
458
+ toolTimelines,
459
+ baselineCount: data.baselineCount,
460
+ dateRange: {
461
+ earliest: new Date(dateRange.earliest),
462
+ latest: new Date(dateRange.latest),
463
+ },
464
+ stats: data.stats,
465
+ };
466
+ }
467
+ //# sourceMappingURL=schema-evolution.js.map