@lgriffin/esi.ts 9.7.0 → 10.2.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 (439) hide show
  1. package/CHANGELOG.md +512 -0
  2. package/README.md +182 -236
  3. package/dist/EsiClient.d.mts +140 -0
  4. package/dist/EsiClient.d.ts +4 -0
  5. package/dist/EsiClient.d.ts.map +1 -1
  6. package/dist/EsiClientBuilder.d.mts +75 -0
  7. package/dist/EsiClientBuilder.d.ts.map +1 -1
  8. package/dist/auth/EsiTokenManager.d.mts +200 -0
  9. package/dist/auth/EsiTokenManager.d.ts +200 -0
  10. package/dist/auth/EsiTokenManager.d.ts.map +1 -0
  11. package/dist/auth/EveSsoClient.d.mts +88 -0
  12. package/dist/auth/EveSsoClient.d.ts +88 -0
  13. package/dist/auth/EveSsoClient.d.ts.map +1 -0
  14. package/dist/auth/errors.d.mts +42 -0
  15. package/dist/auth/errors.d.ts +42 -0
  16. package/dist/auth/errors.d.ts.map +1 -0
  17. package/dist/auth/index.d.mts +14 -0
  18. package/dist/auth/index.d.ts +14 -0
  19. package/dist/auth/index.d.ts.map +1 -0
  20. package/dist/auth/jwt.d.mts +43 -0
  21. package/dist/auth/jwt.d.ts +43 -0
  22. package/dist/auth/jwt.d.ts.map +1 -0
  23. package/dist/auth/pkce.d.mts +21 -0
  24. package/dist/auth/pkce.d.ts +21 -0
  25. package/dist/auth/pkce.d.ts.map +1 -0
  26. package/dist/auth/storage/FileTokenStorage.d.mts +44 -0
  27. package/dist/auth/storage/FileTokenStorage.d.ts +44 -0
  28. package/dist/auth/storage/FileTokenStorage.d.ts.map +1 -0
  29. package/dist/auth/storage/MemoryTokenStorage.d.mts +18 -0
  30. package/dist/auth/storage/MemoryTokenStorage.d.ts +18 -0
  31. package/dist/auth/storage/MemoryTokenStorage.d.ts.map +1 -0
  32. package/dist/auth/types.d.mts +42 -0
  33. package/dist/auth/types.d.ts +42 -0
  34. package/dist/auth/types.d.ts.map +1 -0
  35. package/dist/chunk-3ZI5A37L.mjs +1065 -0
  36. package/dist/chunk-3ZI5A37L.mjs.map +1 -0
  37. package/dist/chunk-BBSHKVPI.js +71 -0
  38. package/dist/chunk-BBSHKVPI.js.map +1 -0
  39. package/dist/chunk-D5L5HZVF.mjs +417 -0
  40. package/dist/chunk-D5L5HZVF.mjs.map +1 -0
  41. package/dist/chunk-JIW4BXLP.mjs +17 -0
  42. package/dist/chunk-JIW4BXLP.mjs.map +1 -0
  43. package/dist/chunk-MSJHIJXA.js +1065 -0
  44. package/dist/chunk-MSJHIJXA.js.map +1 -0
  45. package/dist/chunk-PZ5AY32C.js +10 -0
  46. package/dist/chunk-PZ5AY32C.js.map +1 -0
  47. package/dist/chunk-R7D7M2LQ.mjs +71 -0
  48. package/dist/chunk-R7D7M2LQ.mjs.map +1 -0
  49. package/dist/chunk-SAQBXXTM.js +2614 -0
  50. package/dist/chunk-SAQBXXTM.js.map +1 -0
  51. package/dist/chunk-VZS32UQ3.mjs +2614 -0
  52. package/dist/chunk-VZS32UQ3.mjs.map +1 -0
  53. package/dist/chunk-XIB2OXEZ.js +417 -0
  54. package/dist/chunk-XIB2OXEZ.js.map +1 -0
  55. package/dist/clients/AccessListsClient.d.mts +25 -0
  56. package/dist/clients/AllianceClient.d.mts +59 -0
  57. package/dist/clients/AllianceClient.d.ts.map +1 -1
  58. package/dist/clients/AssetsClient.d.mts +65 -0
  59. package/dist/clients/BaseEsiClient.d.mts +19 -0
  60. package/dist/clients/CalendarClient.d.mts +48 -0
  61. package/dist/clients/CharacterClient.d.mts +134 -0
  62. package/dist/clients/ClonesClient.d.mts +27 -0
  63. package/dist/clients/ContactsClient.d.mts +96 -0
  64. package/dist/clients/ContractsClient.d.mts +91 -0
  65. package/dist/clients/ContractsClient.d.ts +12 -9
  66. package/dist/clients/ContractsClient.d.ts.map +1 -1
  67. package/dist/clients/CorporationProjectsClient.d.mts +54 -0
  68. package/dist/clients/CorporationProjectsClient.d.ts +22 -12
  69. package/dist/clients/CorporationProjectsClient.d.ts.map +1 -1
  70. package/dist/clients/CorporationsClient.d.mts +219 -0
  71. package/dist/clients/CosmeticsClient.d.mts +11 -0
  72. package/dist/clients/DogmaClient.d.mts +42 -0
  73. package/dist/clients/FactionClient.d.mts +60 -0
  74. package/dist/clients/FactionClient.d.ts +4 -4
  75. package/dist/clients/FactionClient.d.ts.map +1 -1
  76. package/dist/clients/FittingsClient.d.mts +38 -0
  77. package/dist/clients/FleetClient.d.mts +134 -0
  78. package/dist/clients/FreelanceJobsClient.d.mts +61 -0
  79. package/dist/clients/FreelanceJobsClient.d.ts +3 -3
  80. package/dist/clients/FreelanceJobsClient.d.ts.map +1 -1
  81. package/dist/clients/IncursionsClient.d.mts +14 -0
  82. package/dist/clients/IndustryClient.d.mts +86 -0
  83. package/dist/clients/IndustryClient.d.ts +4 -4
  84. package/dist/clients/IndustryClient.d.ts.map +1 -1
  85. package/dist/clients/InsuranceClient.d.mts +14 -0
  86. package/dist/clients/KillmailsClient.d.mts +37 -0
  87. package/dist/clients/LocationClient.d.mts +32 -0
  88. package/dist/clients/LoyaltyClient.d.mts +28 -0
  89. package/dist/clients/MailClient.d.mts +104 -0
  90. package/dist/clients/MailClient.d.ts +4 -4
  91. package/dist/clients/MailClient.d.ts.map +1 -1
  92. package/dist/clients/MarketClient.d.mts +102 -0
  93. package/dist/clients/MercenaryClient.d.mts +42 -0
  94. package/dist/clients/MetaClient.d.mts +45 -0
  95. package/dist/clients/MetaClient.d.ts +3 -2
  96. package/dist/clients/MetaClient.d.ts.map +1 -1
  97. package/dist/clients/MilitaryCampaignsClient.d.mts +53 -0
  98. package/dist/clients/ParagonHubClient.d.mts +13 -0
  99. package/dist/clients/PiClient.d.mts +45 -0
  100. package/dist/clients/RouteClient.d.mts +25 -0
  101. package/dist/clients/SearchClient.d.mts +17 -0
  102. package/dist/clients/SkillsClient.d.mts +39 -0
  103. package/dist/clients/SkyhooksClient.d.mts +48 -0
  104. package/dist/clients/SovereigntyClient.d.mts +20 -0
  105. package/dist/clients/StatusClient.d.mts +14 -0
  106. package/dist/clients/UiClient.d.mts +44 -0
  107. package/dist/clients/UniverseClient.d.mts +212 -0
  108. package/dist/clients/WalletClient.d.mts +70 -0
  109. package/dist/clients/WalletClient.d.ts +4 -4
  110. package/dist/clients/WalletClient.d.ts.map +1 -1
  111. package/dist/clients/WarsClient.d.mts +33 -0
  112. package/dist/core/ApiClient.d.mts +73 -0
  113. package/dist/core/ApiClient.d.ts +4 -0
  114. package/dist/core/ApiClient.d.ts.map +1 -1
  115. package/dist/core/ApiClientBuilder.d.mts +24 -0
  116. package/dist/core/ApiRequestHandler.d.ts.map +1 -1
  117. package/dist/core/BatchRequestHandler.d.mts +12 -0
  118. package/dist/core/BatchRequestHandler.d.ts.map +1 -1
  119. package/dist/core/ClientRegistry.d.mts +45 -0
  120. package/dist/core/EsiDiagnostics.d.mts +35 -0
  121. package/dist/core/IDeduplicator.d.mts +22 -0
  122. package/dist/core/IDeduplicator.d.ts +16 -0
  123. package/dist/core/IDeduplicator.d.ts.map +1 -1
  124. package/dist/core/IRetryStrategy.d.mts +5 -0
  125. package/dist/core/RequestDeduplicator.d.mts +21 -0
  126. package/dist/core/RequestDeduplicator.d.ts +13 -0
  127. package/dist/core/RequestDeduplicator.d.ts.map +1 -1
  128. package/dist/core/RetryStrategy.d.mts +21 -0
  129. package/dist/core/RetryStrategy.d.ts +2 -0
  130. package/dist/core/RetryStrategy.d.ts.map +1 -1
  131. package/dist/core/cache/ETagCacheManager.d.mts +75 -0
  132. package/dist/core/cache/ETagCacheManager.d.ts +4 -0
  133. package/dist/core/cache/ETagCacheManager.d.ts.map +1 -1
  134. package/dist/core/cache/ICache.d.mts +27 -0
  135. package/dist/core/cache/cacheKey.d.ts +11 -0
  136. package/dist/core/cache/cacheKey.d.ts.map +1 -1
  137. package/dist/core/circuitBreaker/CircuitBreaker.d.mts +52 -0
  138. package/dist/core/circuitBreaker/CircuitBreaker.d.ts +3 -0
  139. package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
  140. package/dist/core/circuitBreaker/ICircuitBreaker.d.mts +23 -0
  141. package/dist/core/configureApiClient.d.mts +18 -0
  142. package/dist/core/configureApiClient.d.ts.map +1 -1
  143. package/dist/core/constants.d.ts +2 -2
  144. package/dist/core/constants.d.ts.map +1 -1
  145. package/dist/core/endpoints/EndpointDefinition.d.mts +63 -0
  146. package/dist/core/endpoints/accessListEndpoints.d.mts +34 -0
  147. package/dist/core/endpoints/allianceEndpoints.d.mts +43 -0
  148. package/dist/core/endpoints/assetEndpoints.d.mts +76 -0
  149. package/dist/core/endpoints/buildEndpointPath.d.mts +7 -0
  150. package/dist/core/endpoints/calendarEndpoints.d.mts +54 -0
  151. package/dist/core/endpoints/calendarEndpoints.d.ts +7 -7
  152. package/dist/core/endpoints/characterEndpoints.d.mts +185 -0
  153. package/dist/core/endpoints/characterEndpoints.d.ts +2 -2
  154. package/dist/core/endpoints/cloneEndpoints.d.mts +32 -0
  155. package/dist/core/endpoints/cloneEndpoints.d.ts +2 -2
  156. package/dist/core/endpoints/contactEndpoints.d.mts +106 -0
  157. package/dist/core/endpoints/contractEndpoints.d.mts +168 -0
  158. package/dist/core/endpoints/contractEndpoints.d.ts +15 -22
  159. package/dist/core/endpoints/contractEndpoints.d.ts.map +1 -1
  160. package/dist/core/endpoints/corporationEndpoints.d.mts +324 -0
  161. package/dist/core/endpoints/corporationEndpoints.d.ts +19 -22
  162. package/dist/core/endpoints/corporationEndpoints.d.ts.map +1 -1
  163. package/dist/core/endpoints/corporationProjectEndpoints.d.mts +102 -0
  164. package/dist/core/endpoints/corporationProjectEndpoints.d.ts +75 -23
  165. package/dist/core/endpoints/corporationProjectEndpoints.d.ts.map +1 -1
  166. package/dist/core/endpoints/cosmeticsEndpoints.d.mts +52 -0
  167. package/dist/core/endpoints/createClient.d.mts +69 -0
  168. package/dist/core/endpoints/createClient.d.ts.map +1 -1
  169. package/dist/core/endpoints/dogmaEndpoints.d.mts +89 -0
  170. package/dist/core/endpoints/dogmaEndpoints.d.ts +2 -2
  171. package/dist/core/endpoints/esi-cache-ttls.generated.d.ts.map +1 -1
  172. package/dist/core/endpoints/esi-rate-limit-groups.generated.d.mts +7 -0
  173. package/dist/core/endpoints/esi-rate-limit-groups.generated.d.ts.map +1 -1
  174. package/dist/core/endpoints/esi-scopes.generated.d.mts +3 -0
  175. package/dist/core/endpoints/esi-scopes.generated.d.ts.map +1 -1
  176. package/dist/core/endpoints/factionEndpoints.d.mts +194 -0
  177. package/dist/core/endpoints/factionEndpoints.d.ts +36 -36
  178. package/dist/core/endpoints/factionEndpoints.d.ts.map +1 -1
  179. package/dist/core/endpoints/fittingEndpoints.d.mts +34 -0
  180. package/dist/core/endpoints/fleetEndpoints.d.mts +137 -0
  181. package/dist/core/endpoints/fleetEndpoints.d.ts +1 -1
  182. package/dist/core/endpoints/freelanceJobsEndpoints.d.mts +181 -0
  183. package/dist/core/endpoints/freelanceJobsEndpoints.d.ts +131 -122
  184. package/dist/core/endpoints/freelanceJobsEndpoints.d.ts.map +1 -1
  185. package/dist/core/endpoints/incursionEndpoints.d.mts +19 -0
  186. package/dist/core/endpoints/industryEndpoints.d.mts +138 -0
  187. package/dist/core/endpoints/industryEndpoints.d.ts +6 -6
  188. package/dist/core/endpoints/industryEndpoints.d.ts.map +1 -1
  189. package/dist/core/endpoints/insuranceEndpoints.d.mts +17 -0
  190. package/dist/core/endpoints/killmailEndpoints.d.mts +62 -0
  191. package/dist/core/endpoints/locationEndpoints.d.mts +37 -0
  192. package/dist/core/endpoints/loyaltyEndpoints.d.mts +32 -0
  193. package/dist/core/endpoints/mailEndpoints.d.mts +111 -0
  194. package/dist/core/endpoints/mailEndpoints.d.ts +3 -5
  195. package/dist/core/endpoints/mailEndpoints.d.ts.map +1 -1
  196. package/dist/core/endpoints/marketEndpoints.d.mts +191 -0
  197. package/dist/core/endpoints/mercenaryEndpoints.d.mts +79 -0
  198. package/dist/core/endpoints/mercenaryEndpoints.d.ts +1 -1
  199. package/dist/core/endpoints/metaEndpoints.d.mts +50 -0
  200. package/dist/core/endpoints/metaEndpoints.d.ts +5 -1
  201. package/dist/core/endpoints/metaEndpoints.d.ts.map +1 -1
  202. package/dist/core/endpoints/militaryCampaignEndpoints.d.mts +87 -0
  203. package/dist/core/endpoints/paragonHubEndpoints.d.mts +163 -0
  204. package/dist/core/endpoints/piEndpoints.d.mts +101 -0
  205. package/dist/core/endpoints/piEndpoints.d.ts +2 -2
  206. package/dist/core/endpoints/routeEndpoints.d.mts +14 -0
  207. package/dist/core/endpoints/searchEndpoints.d.mts +26 -0
  208. package/dist/core/endpoints/skillEndpoints.d.mts +52 -0
  209. package/dist/core/endpoints/skyhookEndpoints.d.mts +111 -0
  210. package/dist/core/endpoints/sovereigntyEndpoints.d.mts +59 -0
  211. package/dist/core/endpoints/statusEndpoints.d.mts +14 -0
  212. package/dist/core/endpoints/statusEndpoints.d.ts +1 -1
  213. package/dist/core/endpoints/uiEndpoints.d.mts +43 -0
  214. package/dist/core/endpoints/universeEndpoints.d.mts +456 -0
  215. package/dist/core/endpoints/universeEndpoints.d.ts +22 -22
  216. package/dist/core/endpoints/walletEndpoints.d.mts +98 -0
  217. package/dist/core/endpoints/walletEndpoints.d.ts +2 -3
  218. package/dist/core/endpoints/walletEndpoints.d.ts.map +1 -1
  219. package/dist/core/endpoints/warEndpoints.d.mts +51 -0
  220. package/dist/core/logger/DefaultLogger.d.mts +31 -0
  221. package/dist/core/logger/DefaultLogger.d.ts +31 -0
  222. package/dist/core/logger/DefaultLogger.d.ts.map +1 -0
  223. package/dist/core/logger/ILogger.d.mts +17 -0
  224. package/dist/core/logger/ILogger.d.ts +14 -4
  225. package/dist/core/logger/ILogger.d.ts.map +1 -1
  226. package/dist/core/logger/NoopLogger.d.mts +7 -0
  227. package/dist/core/logger/NoopLogger.d.ts +4 -0
  228. package/dist/core/logger/NoopLogger.d.ts.map +1 -1
  229. package/dist/core/logger/clientLog.d.ts +11 -0
  230. package/dist/core/logger/clientLog.d.ts.map +1 -0
  231. package/dist/core/logger/logger.d.ts +11 -3
  232. package/dist/core/logger/logger.d.ts.map +1 -1
  233. package/dist/core/logger/loggerUtil.d.mts +11 -0
  234. package/dist/core/logger/loggerUtil.d.ts +8 -6
  235. package/dist/core/logger/loggerUtil.d.ts.map +1 -1
  236. package/dist/core/logger/resolveLogger.d.ts +10 -0
  237. package/dist/core/logger/resolveLogger.d.ts.map +1 -0
  238. package/dist/core/middleware/Middleware.d.mts +30 -0
  239. package/dist/core/pagination/AsyncPaginationIterator.d.mts +12 -0
  240. package/dist/core/pagination/AsyncPaginationIterator.d.ts.map +1 -1
  241. package/dist/core/pagination/CursorPaginationHandler.d.mts +68 -0
  242. package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
  243. package/dist/core/pagination/PaginationHandler.d.ts.map +1 -1
  244. package/dist/core/rateLimiter/IRateLimiter.d.mts +27 -0
  245. package/dist/core/rateLimiter/RateLimiter.d.mts +62 -0
  246. package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
  247. package/dist/core/requestPipeline/cachePolicy.d.ts +25 -1
  248. package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -1
  249. package/dist/core/requestPipeline/fetchExecution.d.ts +1 -1
  250. package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -1
  251. package/dist/core/requestPipeline/headers.d.ts.map +1 -1
  252. package/dist/core/requestPipeline/index.d.ts +2 -2
  253. package/dist/core/requestPipeline/index.d.ts.map +1 -1
  254. package/dist/core/requestPipeline/paginationOrchestration.d.ts +1 -1
  255. package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -1
  256. package/dist/core/requestPipeline/statusHandling.d.ts +14 -2
  257. package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -1
  258. package/dist/core/util/concurrency.d.ts +29 -0
  259. package/dist/core/util/concurrency.d.ts.map +1 -0
  260. package/dist/core/util/error.d.mts +37 -0
  261. package/dist/core/util/retry.d.mts +8 -0
  262. package/dist/core/util/retry.d.ts.map +1 -1
  263. package/dist/errors.d.mts +5 -0
  264. package/dist/errors.d.ts +1 -0
  265. package/dist/errors.d.ts.map +1 -1
  266. package/dist/errors.js +53 -195
  267. package/dist/errors.js.map +1 -1
  268. package/dist/errors.mjs +37 -129
  269. package/dist/errors.mjs.map +1 -1
  270. package/dist/index.d.mts +81 -0
  271. package/dist/index.d.ts +6 -2
  272. package/dist/index.d.ts.map +1 -1
  273. package/dist/index.js +2195 -3517
  274. package/dist/index.js.map +1 -1
  275. package/dist/index.mjs +1833 -3044
  276. package/dist/index.mjs.map +1 -1
  277. package/dist/schemas/access-lists.d.mts +16 -0
  278. package/dist/schemas/alliance.d.mts +26 -0
  279. package/dist/schemas/assets.d.mts +24 -0
  280. package/dist/schemas/calendar.d.mts +27 -0
  281. package/dist/schemas/calendar.d.ts +9 -7
  282. package/dist/schemas/calendar.d.ts.map +1 -1
  283. package/dist/schemas/character.d.mts +109 -0
  284. package/dist/schemas/character.d.ts +2 -2
  285. package/dist/schemas/clones.d.mts +17 -0
  286. package/dist/schemas/clones.d.ts +2 -2
  287. package/dist/schemas/common.d.mts +74 -0
  288. package/dist/schemas/contacts.d.mts +14 -0
  289. package/dist/schemas/contracts.d.mts +104 -0
  290. package/dist/schemas/contracts.d.ts +69 -6
  291. package/dist/schemas/contracts.d.ts.map +1 -1
  292. package/dist/schemas/corporation-projects.d.mts +104 -0
  293. package/dist/schemas/corporation-projects.d.ts +96 -9
  294. package/dist/schemas/corporation-projects.d.ts.map +1 -1
  295. package/dist/schemas/corporation.d.mts +193 -0
  296. package/dist/schemas/corporation.d.ts +34 -22
  297. package/dist/schemas/corporation.d.ts.map +1 -1
  298. package/dist/schemas/cosmetics.d.mts +58 -0
  299. package/dist/schemas/dogma.d.mts +57 -0
  300. package/dist/schemas/dogma.d.ts +2 -2
  301. package/dist/schemas/esiEnum.d.mts +3 -0
  302. package/dist/schemas/faction-warfare.d.mts +203 -0
  303. package/dist/schemas/faction-warfare.d.ts +125 -12
  304. package/dist/schemas/faction-warfare.d.ts.map +1 -1
  305. package/dist/schemas/fittings.d.mts +13 -0
  306. package/dist/schemas/fleet.d.mts +37 -0
  307. package/dist/schemas/fleet.d.ts +1 -1
  308. package/dist/schemas/freelance-jobs.d.mts +171 -0
  309. package/dist/schemas/freelance-jobs.d.ts +52 -22
  310. package/dist/schemas/freelance-jobs.d.ts.map +1 -1
  311. package/dist/schemas/incursions.d.mts +12 -0
  312. package/dist/schemas/index.d.mts +39 -0
  313. package/dist/schemas/index.js +420 -2479
  314. package/dist/schemas/index.js.map +1 -1
  315. package/dist/schemas/index.mjs +225 -2065
  316. package/dist/schemas/index.mjs.map +1 -1
  317. package/dist/schemas/industry.d.mts +99 -0
  318. package/dist/schemas/industry.d.ts +33 -0
  319. package/dist/schemas/industry.d.ts.map +1 -1
  320. package/dist/schemas/insurance.d.mts +10 -0
  321. package/dist/schemas/killmails.d.mts +38 -0
  322. package/dist/schemas/location.d.mts +18 -0
  323. package/dist/schemas/loyalty.d.mts +18 -0
  324. package/dist/schemas/mail.d.mts +53 -0
  325. package/dist/schemas/mail.d.ts +24 -5
  326. package/dist/schemas/mail.d.ts.map +1 -1
  327. package/dist/schemas/market.d.mts +123 -0
  328. package/dist/schemas/mercenary.d.mts +74 -0
  329. package/dist/schemas/mercenary.d.ts +1 -1
  330. package/dist/schemas/meta.d.mts +36 -0
  331. package/dist/schemas/meta.d.ts +12 -1
  332. package/dist/schemas/meta.d.ts.map +1 -1
  333. package/dist/schemas/military-campaigns.d.mts +26 -0
  334. package/dist/schemas/paragon-hub.d.mts +96 -0
  335. package/dist/schemas/pi.d.mts +71 -0
  336. package/dist/schemas/pi.d.ts +2 -2
  337. package/dist/schemas/skills.d.mts +28 -0
  338. package/dist/schemas/skyhooks.d.mts +129 -0
  339. package/dist/schemas/sovereignty.d.mts +56 -0
  340. package/dist/schemas/status.d.mts +8 -0
  341. package/dist/schemas/status.d.ts +1 -1
  342. package/dist/schemas/universe.d.mts +285 -0
  343. package/dist/schemas/universe.d.ts +22 -22
  344. package/dist/schemas/universe.d.ts.map +1 -1
  345. package/dist/schemas/wallet.d.mts +45 -0
  346. package/dist/schemas/wallet.d.ts +16 -0
  347. package/dist/schemas/wallet.d.ts.map +1 -1
  348. package/dist/schemas/wars.d.mts +27 -0
  349. package/dist/sde/IStaticDataProvider.d.mts +106 -0
  350. package/dist/sde/MemorySdeProvider.d.mts +167 -0
  351. package/dist/sde/SdeDataProvider.d.mts +119 -0
  352. package/dist/sde/SdeDataProvider.d.ts.map +1 -1
  353. package/dist/sde/SdeTestDataFactory.d.mts +33 -0
  354. package/dist/sde/errors.d.mts +23 -0
  355. package/dist/sde/index.d.mts +9 -0
  356. package/dist/sde/index.js +95 -1162
  357. package/dist/sde/index.js.map +1 -1
  358. package/dist/sde/index.mjs +73 -1091
  359. package/dist/sde/index.mjs.map +1 -1
  360. package/dist/sde/ingestion/SdeExtractor.d.ts.map +1 -1
  361. package/dist/sde/ingestion/metadata.d.ts +13 -0
  362. package/dist/sde/ingestion/metadata.d.ts.map +1 -0
  363. package/dist/sde/memory.d.mts +8 -0
  364. package/dist/sde/memory.js +21 -1095
  365. package/dist/sde/memory.js.map +1 -1
  366. package/dist/sde/memory.mjs +13 -1051
  367. package/dist/sde/memory.mjs.map +1 -1
  368. package/dist/sde/optionalPeers.d.ts +25 -0
  369. package/dist/sde/optionalPeers.d.ts.map +1 -0
  370. package/dist/sde/types.d.mts +1039 -0
  371. package/dist/sde/version.d.mts +7 -0
  372. package/dist/testing/TestDataFactory.d.mts +172 -0
  373. package/dist/testing/TestDataFactory.d.ts +28 -1
  374. package/dist/testing/TestDataFactory.d.ts.map +1 -1
  375. package/dist/testing/index.d.mts +2 -0
  376. package/dist/testing/index.js +116 -125
  377. package/dist/testing/index.js.map +1 -1
  378. package/dist/testing/index.mjs +110 -82
  379. package/dist/testing/index.mjs.map +1 -1
  380. package/dist/types/access-lists.d.mts +5 -0
  381. package/dist/types/alliance.d.mts +7 -0
  382. package/dist/types/api-responses.d.mts +40 -0
  383. package/dist/types/assets.d.mts +6 -0
  384. package/dist/types/branded.d.mts +23 -0
  385. package/dist/types/calendar.d.mts +6 -0
  386. package/dist/types/character.d.mts +17 -0
  387. package/dist/types/clones.d.mts +4 -0
  388. package/dist/types/common.d.mts +19 -0
  389. package/dist/types/contacts.d.mts +5 -0
  390. package/dist/types/contracts.d.mts +9 -0
  391. package/dist/types/contracts.d.ts +4 -1
  392. package/dist/types/contracts.d.ts.map +1 -1
  393. package/dist/types/corporation-projects.d.mts +10 -0
  394. package/dist/types/corporation-projects.d.ts +5 -1
  395. package/dist/types/corporation-projects.d.ts.map +1 -1
  396. package/dist/types/corporation.d.mts +19 -0
  397. package/dist/types/cosmetics.d.mts +8 -0
  398. package/dist/types/dogma.d.mts +6 -0
  399. package/dist/types/faction-warfare.d.mts +17 -0
  400. package/dist/types/faction-warfare.d.ts +9 -1
  401. package/dist/types/faction-warfare.d.ts.map +1 -1
  402. package/dist/types/fittings.d.mts +4 -0
  403. package/dist/types/fleet.d.mts +7 -0
  404. package/dist/types/freelance-jobs.d.mts +12 -0
  405. package/dist/types/freelance-jobs.d.ts +2 -1
  406. package/dist/types/freelance-jobs.d.ts.map +1 -1
  407. package/dist/types/generated/esi-spec.generated.d.mts +2136 -0
  408. package/dist/types/generated/esi-spec.generated.d.ts +164 -16
  409. package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
  410. package/dist/types/generated/spec-alignment.check.d.ts +2 -2
  411. package/dist/types/incursions.d.mts +4 -0
  412. package/dist/types/industry.d.mts +11 -0
  413. package/dist/types/industry.d.ts +2 -1
  414. package/dist/types/industry.d.ts.map +1 -1
  415. package/dist/types/insurance.d.mts +4 -0
  416. package/dist/types/killmails.d.mts +5 -0
  417. package/dist/types/location.d.mts +6 -0
  418. package/dist/types/loyalty.d.mts +5 -0
  419. package/dist/types/mail.d.mts +6 -0
  420. package/dist/types/mail.d.ts +2 -1
  421. package/dist/types/mail.d.ts.map +1 -1
  422. package/dist/types/market.d.mts +12 -0
  423. package/dist/types/mercenary.d.mts +7 -0
  424. package/dist/types/meta.d.mts +9 -0
  425. package/dist/types/meta.d.ts +2 -1
  426. package/dist/types/meta.d.ts.map +1 -1
  427. package/dist/types/military-campaigns.d.mts +6 -0
  428. package/dist/types/paragon-hub.d.mts +8 -0
  429. package/dist/types/pi.d.mts +6 -0
  430. package/dist/types/skills.d.mts +5 -0
  431. package/dist/types/skyhooks.d.mts +8 -0
  432. package/dist/types/sovereignty.d.mts +6 -0
  433. package/dist/types/status.d.mts +4 -0
  434. package/dist/types/universe.d.mts +27 -0
  435. package/dist/types/wallet.d.mts +6 -0
  436. package/dist/types/wallet.d.ts +2 -1
  437. package/dist/types/wallet.d.ts.map +1 -1
  438. package/dist/types/wars.d.mts +4 -0
  439. package/package.json +137 -46
package/CHANGELOG.md CHANGED
@@ -5,6 +5,518 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [10.2.0](https://github.com/lgriffin/ESI.ts/compare/v10.1.1...v10.2.0) (2026-09-19)
9
+
10
+
11
+ ### Added
12
+
13
+ * **release:** attach a signed CycloneDX SBOM to each release ([bf6c045](https://github.com/lgriffin/ESI.ts/commit/bf6c0458b81fc9123ca29f712db8a89948e2b382))
14
+ * **release:** attach a signed CycloneDX SBOM to each release ([1e29d7d](https://github.com/lgriffin/ESI.ts/commit/1e29d7de39237ecd250dcac3ef90da54a9c52df3))
15
+
16
+
17
+ ### Testing
18
+
19
+ * **contract:** re-record ESI payloads whose shape changed ([2ea4198](https://github.com/lgriffin/ESI.ts/commit/2ea4198d8832d12618e9f9a9da0720ffb9b07f55))
20
+ * **contract:** recorded ESI payloads changed shape ([06fa27a](https://github.com/lgriffin/ESI.ts/commit/06fa27ab0516af9f9d450059cb0cb3fcd6463345))
21
+
22
+ ## [10.1.1](https://github.com/lgriffin/ESI.ts/compare/v10.1.0...v10.1.1) (2026-09-18)
23
+
24
+
25
+ ### Documentation
26
+
27
+ * **mutation:** record the first complete sharded run, and fix what it exposed ([7acf195](https://github.com/lgriffin/ESI.ts/commit/7acf1950d5781dad571e2f79e52d03324683f7bd))
28
+ * **mutation:** record the first complete sharded run, and fix what it exposed ([3209241](https://github.com/lgriffin/ESI.ts/commit/32092415c551cbc7cc75266fa7158ab884040aad))
29
+
30
+ ## [10.1.0](https://github.com/lgriffin/ESI.ts/compare/v10.0.0...v10.1.0) (2026-09-18)
31
+
32
+
33
+ ### Added
34
+
35
+ * **dedupe:** detach in-flight reads of a path a write has just changed ([0339db7](https://github.com/lgriffin/ESI.ts/commit/0339db70d2cd34827c5575f1d731006fa1500ea0))
36
+ * **dedupe:** detach in-flight reads of a path a write has just changed ([e3a3d91](https://github.com/lgriffin/ESI.ts/commit/e3a3d91d2ef74759245cd43affb2e109040bf221))
37
+ * **release:** verify what npm serves, not only what CI built ([999125c](https://github.com/lgriffin/ESI.ts/commit/999125cd2c167410cdba7f35590afe6b5fa025d8))
38
+ * **release:** verify what npm serves, not only what CI built ([281e008](https://github.com/lgriffin/ESI.ts/commit/281e008d9fd65e45619f73c6abeb7a48dbc70831))
39
+
40
+
41
+ ### Fixed
42
+
43
+ * add the composition and concurrency test tier and fix the five pipeline races it found ([c7a7642](https://github.com/lgriffin/ESI.ts/commit/c7a764213ebc34fc47bd8396863b4f8f7938f4a1))
44
+ * **bdd:** escape backslashes in the job summary's table cells ([751d098](https://github.com/lgriffin/ESI.ts/commit/751d098f4d2fa81c86c80e7a8e8221991c81495d))
45
+ * **benchmark:** keep the harness filter a substring and gate the soak heap trend on Node 20 ([d559157](https://github.com/lgriffin/ESI.ts/commit/d5591576dcdb2823a7df8e2692597b7fc92575fe))
46
+ * **cache:** do not store a read that a write overtook while it was in flight ([e2f3141](https://github.com/lgriffin/ESI.ts/commit/e2f3141b2a4713bf4a46c2ea58ad42e02bc40814))
47
+ * **cache:** keep the stored ETag when a late 304 names an older one ([bb63097](https://github.com/lgriffin/ESI.ts/commit/bb6309753938f8868fcb1ea9684d44989933086a))
48
+ * **cache:** refetch when a 304 arrives for an entry evicted in flight ([4ae476e](https://github.com/lgriffin/ESI.ts/commit/4ae476e9462ae1eac33569b9d4c70bb36ad545d3))
49
+ * **ci:** pack the downloaded dist with npm 11 ([7e7ff71](https://github.com/lgriffin/ESI.ts/commit/7e7ff7131a3b383cae3ae65c79f677a28f1369b7))
50
+ * **circuit-breaker:** count the call that opens half-open as the first probe ([b418625](https://github.com/lgriffin/ESI.ts/commit/b418625bbf7ade64217fde9970bd76229dbb8ffd))
51
+ * **circuit-breaker:** keep an open circuit open when an earlier call succeeds ([03b27a5](https://github.com/lgriffin/ESI.ts/commit/03b27a5e1e641ddcf015f5e08f1420966c60b4ce))
52
+ * **ci:** read the attw report from a file so CI gets the whole JSON ([dac266d](https://github.com/lgriffin/ESI.ts/commit/dac266d5ec13b5bb2ba13a0a6f7a94b25da0ba0c))
53
+ * **dedupe:** key in-flight requests by identity as well as endpoint ([5bab05c](https://github.com/lgriffin/ESI.ts/commit/5bab05c85cfb8067baecffd8e740f6c1c27b6629))
54
+ * **dedupe:** key in-flight requests by identity as well as endpoint ([5d662d9](https://github.com/lgriffin/ESI.ts/commit/5d662d9699aab9f9bb34af93a8fb5809a02ccde6))
55
+ * five defects found by new model-based property tests (circuit breaker, pagination cache, backoff) ([80fcafa](https://github.com/lgriffin/ESI.ts/commit/80fcafa5bb99aed93348c30722c090e526b85fb7))
56
+ * **generate:** generate from the compatibility date the client actually sends ([ff781bd](https://github.com/lgriffin/ESI.ts/commit/ff781bd54777b2c3fda5189772e431e4d9de3657))
57
+ * **generate:** generate from the compatibility date the client actually sends ([5ea4a2f](https://github.com/lgriffin/ESI.ts/commit/5ea4a2fe0891bcba5c3d08171bb3d858639ea3f4))
58
+ * **mutation:** escape backslashes in the job summary table cells ([9ab23fa](https://github.com/lgriffin/ESI.ts/commit/9ab23fa685f68288b138dad749aed9bf871c215f))
59
+ * **package:** ship ES module declarations for the import condition ([2090682](https://github.com/lgriffin/ESI.ts/commit/20906829b64a093e8d66e2b6890cf2bbadb012c7))
60
+ * **package:** ship ES module declarations for the import condition ([d53fe91](https://github.com/lgriffin/ESI.ts/commit/d53fe914a156faad1835c1e748cd500254e57b69))
61
+ * **pagination:** cache an authenticated paginated result under the token-scoped key ([23313ff](https://github.com/lgriffin/ESI.ts/commit/23313ff95cf45a043ce2c27ea61d483969701366))
62
+ * **pagination:** never revalidate page 1 alone when a later page exhausts its retries ([8c48085](https://github.com/lgriffin/ESI.ts/commit/8c48085366af3eeb278be8bf033b45e53d353962))
63
+ * **pipeline:** name the status when an error response has no reason phrase ([94827fb](https://github.com/lgriffin/ESI.ts/commit/94827fb5652d8e76b27d509eb3eabb2ae21c6ecc))
64
+ * **pipeline:** time out and retry a response body that stalls or resets ([8e8753f](https://github.com/lgriffin/ESI.ts/commit/8e8753f36c272cbd796f93a92776c8c3d3fd7d0a))
65
+ * **rate-limiter:** honour Retry-After given as an HTTP date ([1fb7cba](https://github.com/lgriffin/ESI.ts/commit/1fb7cba9a6b553f969fa2466f181018102d63bf3))
66
+ * **rate-limit:** keep the error-limit back-off when a late response reports budget left ([1c7279b](https://github.com/lgriffin/ESI.ts/commit/1c7279b9223702e64943e71bef3278488b4762d6))
67
+ * **release:** keep the canary off the shared npm cache ([8604246](https://github.com/lgriffin/ESI.ts/commit/86042464188ec6603f681d5564984275acd40866))
68
+ * **release:** publish the tarball that was tested and signed ([8c7c25f](https://github.com/lgriffin/ESI.ts/commit/8c7c25f77413349eca764f542015e944a55f738f))
69
+ * **release:** publish the tarball that was tested and signed ([c4ac638](https://github.com/lgriffin/ESI.ts/commit/c4ac6389a1844ddddc37fb7d380377e296e90ba1))
70
+ * **retry:** return a zero backoff instead of NaN past attempt 1023 ([ae36c02](https://github.com/lgriffin/ESI.ts/commit/ae36c022ce2c05fc33474110a801bd9121cb2438))
71
+ * **retry:** serve a retry from a fresh cache entry a concurrent call stored ([de5f7ee](https://github.com/lgriffin/ESI.ts/commit/de5f7eee75b89a45bbbe8e909462145ea805fba1))
72
+ * **type-mutation:** resolve entry points whose types sit under a condition ([1dd356d](https://github.com/lgriffin/ESI.ts/commit/1dd356d7874ecad0ff5b81a2f56695f408b0ad93))
73
+ * **type-mutation:** resolve entry points whose types sit under a condition ([330c69e](https://github.com/lgriffin/ESI.ts/commit/330c69e78b7854e6a7a9718fa2ce0fff4257c3ef))
74
+ * **types:** escape backslashes before pipes in the type mutation survivor table ([8d7d4de](https://github.com/lgriffin/ESI.ts/commit/8d7d4de6278cd968070c0c58f3e5e781815ad512))
75
+
76
+
77
+ ### Changed
78
+
79
+ * **bdd:** share the feature outline and feature bindings ([f75f261](https://github.com/lgriffin/ESI.ts/commit/f75f261958addd53fb22571ac649de9153b8cdab))
80
+ * **ci:** lint the packed tarball and budget each exports sub-path's size ([63c5f26](https://github.com/lgriffin/ESI.ts/commit/63c5f26d19236d6ab397e5e95b5d3ee3328aead9))
81
+ * **ci:** run the properties nightly at 10000 runs and document the tier ([06c79d2](https://github.com/lgriffin/ESI.ts/commit/06c79d268c85cd654d8f8e48b6b93ceb4d2cfc5d))
82
+ * **ci:** sample four overlapping calls nightly in seeded random order ([510b940](https://github.com/lgriffin/ESI.ts/commit/510b940f2cdf10abdbaaa38097f289143d7bf307))
83
+ * **lint:** lint tests/ for focused, skipped, assertion-free and silenced tests ([9bdf6bf](https://github.com/lgriffin/ESI.ts/commit/9bdf6bf174fe0476a213389ca4103fe90b00898c))
84
+ * **scripts:** check that every npm script points at a file that exists ([7b1fe81](https://github.com/lgriffin/ESI.ts/commit/7b1fe81b2cc52ac958a34490fdcd445eb57b2528))
85
+ * **scripts:** check that every npm script points at a file that exists ([55b03c7](https://github.com/lgriffin/ESI.ts/commit/55b03c77f0b6d636b7ec6ce6837f2bf642cb48c9))
86
+ * **scripts:** run every offline CI tier locally with one command ([14fc738](https://github.com/lgriffin/ESI.ts/commit/14fc738a13e5a8e6c782b032c708e46243b66087))
87
+ * **scripts:** run every offline CI tier locally with one command ([31197ac](https://github.com/lgriffin/ESI.ts/commit/31197accc81750b20a7412421e7b9e3ada57f9c6))
88
+
89
+
90
+ ### Documentation
91
+
92
+ * **agents:** pin the semver rules against drift, and fix a retired config reference ([52ad44f](https://github.com/lgriffin/ESI.ts/commit/52ad44fa6e79018d21d0fafac6c98ab42117fe44))
93
+ * **agents:** pin the semver rules against drift, and fix a retired config reference ([d2af258](https://github.com/lgriffin/ESI.ts/commit/d2af258aa7a2d82a12eb56a014432f1d14c1a558))
94
+ * **bdd:** document the execution check, bug tags and when a Rule is protection ([fa0be02](https://github.com/lgriffin/ESI.ts/commit/fa0be0281996fd5e7fadeffcadbece5c81299b59))
95
+ * **contract:** name the real reason those endpoints cannot be recorded ([1b864da](https://github.com/lgriffin/ESI.ts/commit/1b864da3c9688833cf90ac748acb775f135d39b5))
96
+ * **contract:** name the real reason those endpoints cannot be recorded ([b8ea80d](https://github.com/lgriffin/ESI.ts/commit/b8ea80d3861813490fe012fcc1abda57bdce5485))
97
+ * declare TypeScript 5.4 as the oldest supported version ([f9e5f66](https://github.com/lgriffin/ESI.ts/commit/f9e5f66c4a3065ac82d8f0dab809b44d931e2a0a))
98
+ * describe the benchmark and heap soak tier ([f28cc2c](https://github.com/lgriffin/ESI.ts/commit/f28cc2c9d74115ebffce382a27ed362d96e5401a))
99
+ * **mutation:** record the measured pull request job timings ([62c70c9](https://github.com/lgriffin/ESI.ts/commit/62c70c93c7f0904a4804e64a8c7a62d971e79cea))
100
+ * **testing:** describe the composition and concurrency tier ([e1ee338](https://github.com/lgriffin/ESI.ts/commit/e1ee338f738a35c8bcdcfc461304a8d8c560e0c3))
101
+ * **testing:** describe the fault tier and the decisions it pins ([39416c7](https://github.com/lgriffin/ESI.ts/commit/39416c72167ab589dce475912a75832fc2318c1e))
102
+ * **testing:** describe the recorded payload replay tier ([1b190f3](https://github.com/lgriffin/ESI.ts/commit/1b190f31e4c2d10de462905f83681881ecb9ee20))
103
+ * **testing:** map the suite in C4 and refresh the tier counts ([06facdb](https://github.com/lgriffin/ESI.ts/commit/06facdb6994e41bff84eea7ca5fe1fe649066ba6))
104
+
105
+
106
+ ### Testing
107
+
108
+ * **bdd:** let the transport seam fail an exchange the way a network does ([8f0a7a9](https://github.com/lgriffin/ESI.ts/commit/8f0a7a9d9eb4dc9c7eeb9a2ffe1d958ca64d7f2f))
109
+ * **bdd:** prove every scenario executes, name JUnit cases by Rule, and link [@bug](https://github.com/bug) to a tracker ([752de4c](https://github.com/lgriffin/ESI.ts/commit/752de4caa193c8fbb6d4f6d79de2a54fc071a46f))
110
+ * **bdd:** report every scenario by Rule and fail when one did not run ([b04a2d7](https://github.com/lgriffin/ESI.ts/commit/b04a2d7818754cd3daa1b504ed17d2fe1af4bd23))
111
+ * **bdd:** state what the performance scenarios verify, not a latency budget ([12b4461](https://github.com/lgriffin/ESI.ts/commit/12b44616b7b2f7e59cac06fc27e1d9eaed797815))
112
+ * **benchmark:** decide regressions statistically, not by percentage ([a3da1f8](https://github.com/lgriffin/ESI.ts/commit/a3da1f875fd2853e4312b41b2a3aaa799f49db9b))
113
+ * **benchmark:** measure the client hot paths with a mitata harness ([307b978](https://github.com/lgriffin/ESI.ts/commit/307b97850e4d5127b1572b6bed9313dcee17b698))
114
+ * **benchmark:** soak the pipeline for 100 000 requests and watch the heap ([34ab5ec](https://github.com/lgriffin/ESI.ts/commit/34ab5eca8c4918ee9f1147e0ff41318078e81d43))
115
+ * **benchmark:** statistical benchmark comparison, heap soak and a smoke-only latency spec ([1c62567](https://github.com/lgriffin/ESI.ts/commit/1c625674c1befaa90bf39438f931e16f15eb4119))
116
+ * **composition:** add a deterministic interleaving scheduler at the transport seam ([9ebbedb](https://github.com/lgriffin/ESI.ts/commit/9ebbedbc0935e3351e3fad55f56984cf9ea0d457))
117
+ * **composition:** escape backslashes in the printed reproduce command ([d96de7b](https://github.com/lgriffin/ESI.ts/commit/d96de7ba999268d0438661d67b407e8df945d86b))
118
+ * **composition:** explore retry inside an opening circuit and stale-on-error during a refresh ([309658d](https://github.com/lgriffin/ESI.ts/commit/309658d9490261e7eef84b5a6de1da12e16e161a))
119
+ * **composition:** explore three overlapping calls on PRs and four nightly ([4122f14](https://github.com/lgriffin/ESI.ts/commit/4122f14693ed1927f957836304999db42078393e))
120
+ * **consumer:** check the tarball as a matrix of consumer cells ([81c0cd0](https://github.com/lgriffin/ESI.ts/commit/81c0cd0cd97f548b35266991aad7c1ec805a233d))
121
+ * **consumer:** stop esbuild once the tree-shaking check has run ([9e9bea3](https://github.com/lgriffin/ESI.ts/commit/9e9bea30affcc0fdd73a015c9cb516f8b3d79144))
122
+ * **consumer:** widen the consumer contract to a Node x TypeScript x resolution matrix ([14880dd](https://github.com/lgriffin/ESI.ts/commit/14880dd5e341ec66f0871d5fadd5092e1e681b52))
123
+ * **contract:** assert replay failures through named helpers the lint knows ([48cd863](https://github.com/lgriffin/ESI.ts/commit/48cd863d5f74d0ea38c42f3bf2b60cdc236bcde9))
124
+ * **contract:** assert replay failures through named helpers the lint knows ([53e4b03](https://github.com/lgriffin/ESI.ts/commit/53e4b032ba437a71841086ec68541ea9fa78f295))
125
+ * **contract:** re-record ESI payloads whose shape changed ([bfe9af5](https://github.com/lgriffin/ESI.ts/commit/bfe9af5bb1ef26b639c5f836446633d7fb76a924))
126
+ * **contract:** re-record ESI payloads whose shape changed ([1f1be53](https://github.com/lgriffin/ESI.ts/commit/1f1be53fdec4f2a42ba260d5113c3e85d4dc0a4c))
127
+ * **contract:** record public ESI payloads and replay them through the client pipeline ([60d897e](https://github.com/lgriffin/ESI.ts/commit/60d897e45f845bb729cda580730412c5bb2d4ecb))
128
+ * **contract:** record sanitised public ESI payloads as fixtures ([d08cae6](https://github.com/lgriffin/ESI.ts/commit/d08cae62d9dc09ca86f773602641f89363044c69))
129
+ * **contract:** recorded ESI payloads changed shape ([184d67f](https://github.com/lgriffin/ESI.ts/commit/184d67f781e32c6be8763eb93ef8a4ffa293c509))
130
+ * **contract:** recorded ESI payloads changed shape ([6d1bbe8](https://github.com/lgriffin/ESI.ts/commit/6d1bbe83f3ecd2239b3abffe5df472b2b02ccdfe))
131
+ * **contract:** replay recorded ESI payloads through the client pipeline ([ee8f0df](https://github.com/lgriffin/ESI.ts/commit/ee8f0dff5dd527ad089d77c5246456f48fa08c9b))
132
+ * **docs:** type-check documentation examples against the packed package ([7746ada](https://github.com/lgriffin/ESI.ts/commit/7746ada98d04b8af72a005cc3645efc205e83cc3))
133
+ * **faults:** add a 400 served while the cache holds an entry ([d85b4fb](https://github.com/lgriffin/ESI.ts/commit/d85b4fba2c2e496337b46f3dce6ff1974870775e))
134
+ * **faults:** add a status the client has no text for, without a reason phrase ([1fe646a](https://github.com/lgriffin/ESI.ts/commit/1fe646a526ece7434966e0211c4a933071aad0b5))
135
+ * **faults:** add a transport fault catalogue run through the real pipeline ([1f5f055](https://github.com/lgriffin/ESI.ts/commit/1f5f055c2721cb7da9e67518d6237425b599e980))
136
+ * **faults:** assert through the helpers the suite-health lint knows ([0064539](https://github.com/lgriffin/ESI.ts/commit/0064539656221bdd30e1b0559da5d9854ee88e5c))
137
+ * **faults:** drop the x-pages gap the pagination fix closed ([6e367d6](https://github.com/lgriffin/ESI.ts/commit/6e367d6f1b6f6e864654384ba656cb00b709efa2))
138
+ * **faults:** drop the x-pages gap the pagination fix closed ([2f89d91](https://github.com/lgriffin/ESI.ts/commit/2f89d919c531c2b06f1eb41539e4c5ed71f4297a))
139
+ * **faults:** fault injection and fuzzing tier (transport fault catalogue) ([e3cee50](https://github.com/lgriffin/ESI.ts/commit/e3cee50f55a9f4c75b3d73569c55b1a608580acf))
140
+ * **faults:** fuzz every endpoint's payloads from its Zod schema nightly ([49dc045](https://github.com/lgriffin/ESI.ts/commit/49dc045d33fb538483e046c1c525d1982c7a0512))
141
+ * **fuzz:** model-based properties with a vacuity check for every property ([d2890ab](https://github.com/lgriffin/ESI.ts/commit/d2890ab5b6e1b9de690b6ba4ac7c08d8e33af253))
142
+ * **fuzz:** require eager pagination repeat calls to come from the cache ([cc57bc8](https://github.com/lgriffin/ESI.ts/commit/cc57bc8507f76af3614ddfc8441b6172fcde73d1))
143
+ * **fuzz:** respell all occurrences in cache-key lookalikes; ratchet export baseline ([1554338](https://github.com/lgriffin/ESI.ts/commit/155433898d56a6f52055f13f4847cf5ca025c56d))
144
+ * **mutation:** gate changed files per directory and prove the gate can fail ([c9a1b44](https://github.com/lgriffin/ESI.ts/commit/c9a1b4436643d529d30049eceaad8fb088a9b029))
145
+ * reference the exports v10 added and drop ContractBid from the export baseline ([dcb2081](https://github.com/lgriffin/ESI.ts/commit/dcb208160d195fef9cbfe226c61c9cc16a9c187d))
146
+ * reference the exports v10 added and drop ContractBid from the export baseline ([2633694](https://github.com/lgriffin/ESI.ts/commit/26336943d3897e1a8af85b82d0f9cc5754f54b75))
147
+ * **spec-audit:** require a tracker tag beside every [@bug](https://github.com/bug) ([04ad7a0](https://github.com/lgriffin/ESI.ts/commit/04ad7a00ed0e1b009c39db799740b2e32bbbcaa0))
148
+ * **types:** mutate the built declarations nightly and ratchet the tsd kill score ([5d0a8a8](https://github.com/lgriffin/ESI.ts/commit/5d0a8a8c3ba32ac383e01de768040ac9d075bd64))
149
+
150
+ ## [10.0.0](https://github.com/lgriffin/ESI.ts/compare/v9.9.0...v10.0.0) (2026-09-17)
151
+
152
+
153
+ ### ⚠ BREAKING CHANGES
154
+
155
+ * **schemas:** four response fields are now required, a runtime tightening.
156
+ - CharacterFleetInfo.fleet_boss_id, CustomsOffice.allow_alliance_access,
157
+ CustomsOffice.allow_access_with_standings and SolarSystemInfo.position no
158
+ longer include `undefined` in their types, and a body without one throws
159
+ EsiValidationError. ESI always sends them, so live responses are
160
+ unaffected; test doubles that stub GET /characters/{id}/fleet,
161
+ GET /corporations/{id}/customs_offices or GET /universe/systems/{id}
162
+ must include them. `?? fallback` guards on these reads can be removed.
163
+ * **schemas:** these response fields widen to `T | undefined`, so code that reads them may stop compiling under strict null checks; guard the reads (`?.`, `??` or an explicit check). Bodies without them no longer throw.
164
+ - CalendarEvent: event_id, event_date, title, importance, event_response.
165
+ - CalendarEventAttendee: character_id, event_response.
166
+ - CharacterTitle: title_id, name.
167
+ - CloneInfo.home_location: location_id, location_type.
168
+ - DogmaAttribute.name, DogmaEffect.name.
169
+ - BulkIdResult (postBulkNamesToIds): id and name of each entry in agents,
170
+ alliances, characters, constellations, corporations, factions,
171
+ inventory_types, regions, systems and stations.
172
+ * **wallet:** corporation wallet transactions have their own type. getCorporationWalletTransactions, fetchAllCorporationWalletTransactions and streamCorporationWalletTransactions return CorporationWalletTransaction instead of WalletTransaction; it has no is_personal, which ESI never sent on this route. Remove reads of is_personal on corporation trades and retype `WalletTransaction[]` annotations on these calls. New exports: CorporationWalletTransaction, CorporationWalletTransactionSchema, and TestDataFactory.createCorporationWalletTransaction in @lgriffin/esi.ts/testing.
173
+ * **meta:** MetaStatus is { routes: MetaRouteStatus[] } instead of { status: string }. meta.getStatus() used to throw on every real response, so no working code read `status`; read `routes` and filter by `route.status !== 'OK'` to find degraded routes. New exports: MetaRouteStatus, MetaRouteStatusSchema. (Server status from client.status.getStatus() is unchanged.)
174
+ * **mail:** mail headers and messages have separate types.
175
+ - getMailHeaders, fetchAllMailHeaders and streamMailHeaders return
176
+ MailHeader (new) instead of MailMessage. MailHeader has the same fields
177
+ minus body, which ESI never sent in headers.
178
+ - MailMessage (getMail) no longer has mail_id or is_read, which ESI never
179
+ sent on this route; read the new `read` flag instead of is_read, and use
180
+ the mailId you passed in.
181
+ - MailLabel.label_id and MailLabel.name are `| undefined`; guard reads.
182
+ New exports: MailHeader, MailHeaderSchema.
183
+ * **industry:** corporation industry jobs have their own type. getCorporationIndustryJobs, fetchAllCorporationIndustryJobs and streamCorporationIndustryJobs return CorporationIndustryJob instead of IndustryJob. It has location_id (number) and no station_id; ESI never sent station_id on this route, so code reading it got undefined and should read location_id. Retype `IndustryJob[]` annotations on these calls to `CorporationIndustryJob[]`. New exports: CorporationIndustryJob, CorporationIndustryJobSchema, and TestDataFactory.createCorporationIndustryJob in @lgriffin/esi.ts/testing.
184
+ * **corporation:** corporation response types now match ESI.
185
+ - CorporationMedal.date is renamed created_at.
186
+ - CorporationIssuedMedal no longer has title or description; join on
187
+ medal_id to getCorporationMedals for them.
188
+ - CorporationRoleHistory.before and .after are renamed old_roles and
189
+ new_roles.
190
+ - CorporationStarbaseDetail no longer has state (read it from
191
+ getCorporationStarbases). Its eleven access and defence settings listed
192
+ above are required: types drop `| undefined`, and a body without one
193
+ throws EsiValidationError.
194
+ - CorporationStarbase.state, CorporationTitle.title_id, the division number
195
+ in CorporationDivisions.hangar[] and .wallet[], and
196
+ CorporationMemberTracking.start_date are now `| undefined`; guard reads
197
+ of them.
198
+ * **freelance-jobs:** freelance job participation, participants, detail and cursor types now match ESI.
199
+ - FreelanceJobParticipation is { state, contributed, last_modified }
200
+ instead of { job_id, character_id, status, contributions,
201
+ last_contribution? }. Read state (e.g. 'Committed') for status,
202
+ contributed for contributions and last_modified for last_contribution;
203
+ the job and character IDs are the ones you passed in.
204
+ - getCorporationFreelanceJobParticipants returns
205
+ FreelanceJobParticipantsListing ({ participants, cursor? }) instead of
206
+ FreelanceJobParticipant[]. Read listing.participants.
207
+ FreelanceJobParticipant is { id, name, state, contributed }: character_id
208
+ -> id, status -> state, contributions -> contributed; corporation_id and
209
+ last_contribution are gone.
210
+ - EsiCursor.before and EsiCursor.after are string | undefined, not
211
+ string | null, on every freelance listing. Replace `=== null` checks with
212
+ a falsy or `=== undefined` check; a body with a null token now throws
213
+ EsiValidationError.
214
+ - FreelanceJobDetail.contribution, details.expires and
215
+ access_and_visibility.broadcast_locations may be undefined; guard reads
216
+ (e.g. `detail.contribution?.max_committed_participants`). New optional
217
+ details.finished, contribution.contribution_per_participant_limit,
218
+ contribution.submission_limit and access_and_visibility.restrictions.
219
+ New exports: FreelanceJobParticipantsListing,
220
+ FreelanceJobParticipantsListingSchema.
221
+ * **contracts:** public contract bids and items have their own types, and three contract fields are required.
222
+ - getPublicContractBids returns PublicContractBid[] ({ bid_id, date_bid,
223
+ amount }) instead of ContractBid[]. There is no bidder_id: ESI never sent
224
+ one here, so code reading it got undefined. Retype annotations from
225
+ ContractBid to PublicContractBid.
226
+ - getPublicContractItems returns PublicContractItem[] instead of
227
+ ContractItem[]: no is_singleton or raw_quantity; new optional item_id,
228
+ is_blueprint_copy, material_efficiency, time_efficiency and runs.
229
+ - Contract.assignee_id, Contract.acceptor_id (number) and
230
+ Contract.for_corporation (boolean) are no longer `| undefined`; a
231
+ character or corporation contract body without them throws
232
+ EsiValidationError. Test doubles must include all three (0 for an unset
233
+ assignee or acceptor).
234
+ - ContractItem (character and corporation items) no longer declares
235
+ is_blueprint_copy; read it from PublicContractItem, where ESI sends it.
236
+ New exports: PublicContractBid, PublicContractItem, PublicContractBidSchema,
237
+ PublicContractItemSchema.
238
+ * **testing:** default payloads from @lgriffin/esi.ts/testing changed.
239
+ - createAllianceInfo(), createCorporationInfo(), createStar() and
240
+ createStructure() no longer set alliance_id, corporation_id, star_id or
241
+ structure_id. Pass the ID as an override if your test reads it from the
242
+ payload.
243
+ - createItemType() no longer sets category_id. Read the category from
244
+ createItemGroup(), or pass { category_id } as an override.
245
+ - createSearchResults() returns { solar_system, station, structure,
246
+ character, corporation, alliance } instead of { systems, stations,
247
+ structures, characters, corporations, alliances }. Rename the keys you read
248
+ or override (e.g. { solar_system: [30000142] }).
249
+ - createSolarSystem() adds position and createContract() adds
250
+ acceptor_id: 0. Tests comparing a builder's whole output with toEqual must
251
+ expect the new fields.
252
+ * **testing:** default payloads from @lgriffin/esi.ts/testing changed.
253
+ - createCharacterInfo() no longer sets character_id. Pass
254
+ { character_id } as an override if your test reads it.
255
+ - createFleetInfo() no longer sets fleet_id or fleet_boss_id; pass them
256
+ as overrides if needed (GET /characters/{id}/fleet is where ESI sends
257
+ them).
258
+ - createFleetWing() returns { id, name, squads: [{ id, name }] }; read
259
+ wing.id and squad.id instead of wing_id and squad_id, and override `id`
260
+ instead of `wing_id`.
261
+ - createFleetMember() adds wing_id: -1, squad_id: -1,
262
+ role_name: 'Fleet Commander (Boss)', join_time and takes_fleet_warp;
263
+ override them for a squad member.
264
+ - createIndustryJob(), createCharacterAsset(), createCorporationAsset(),
265
+ createCharacterMedal(), createCorporationStructure() and createStation()
266
+ add the fields listed above. Tests comparing a builder's whole output
267
+ with toEqual must expect the new fields.
268
+ * **schemas:** three response fields are now required and public contracts have their own type.
269
+ - ServerStatus.vip is `boolean`, not `boolean | undefined`, and a status
270
+ body without vip now throws EsiValidationError. Drop `?? false`
271
+ fallbacks if you like; test doubles that stub /status must include vip.
272
+ - Contract.status and Contract.availability (character and corporation
273
+ contracts) are required; bodies without them throw EsiValidationError.
274
+ Test doubles must include both.
275
+ - getPublicContracts, fetchAllPublicContracts and streamPublicContracts
276
+ return PublicContract (new, with PublicContractSchema) instead of
277
+ Contract. PublicContract has no status, availability, assignee_id,
278
+ acceptor_id, date_accepted or date_completed, which ESI never sent for
279
+ public contracts; code reading them got undefined and can remove those
280
+ reads. Annotations of `Contract[]` on these calls become
281
+ `PublicContract[]`.
282
+ * **factions:** faction warfare leaderboard types changed.
283
+ - getLeaderboardsOverall() returns FactionWarfareFactionLeaderboard,
284
+ getLeaderboardsCharacters() FactionWarfareCharacterLeaderboard and
285
+ getLeaderboardsCorporations() FactionWarfareCorporationLeaderboard,
286
+ instead of FactionWarfareLeaderboard for all three.
287
+ - Entry `id` is gone: read `faction_id`, `character_id` or
288
+ `corporation_id` for the board you called.
289
+ - Entry `amount` is now `number | undefined`: default it
290
+ (`entry.amount ?? 0`) or skip unscored entries.
291
+ - FactionWarfareLeaderboard and FactionWarfareLeaderboardSchema are
292
+ deprecated and no longer validate any endpoint; each new board type is
293
+ assignable to FactionWarfareLeaderboard. Switch to the per-board type or
294
+ schema (FactionWarfareFactionLeaderboardSchema,
295
+ FactionWarfareCharacterLeaderboardSchema,
296
+ FactionWarfareCorporationLeaderboardSchema).
297
+ * **corporation-projects:** corporation project types, schemas and methods now match ESI, and the old shapes are gone.
298
+ - getCorporationProjects(corporationId, before?, after?) returns
299
+ CorporationProjectsListing ({ projects: CorporationProjectSummary[],
300
+ cursor?: { before?, after? } }) instead of CorporationProject[].
301
+ Read listing.projects; pass listing.cursor?.after as `after` for the next
302
+ page.
303
+ - getCorporationProjectContributors(corporationId, projectId, before?,
304
+ after?) returns CorporationProjectContributorsListing ({ contributors,
305
+ cursor? }) instead of CorporationProjectContributor[]. Read
306
+ listing.contributors.
307
+ - projectId is a string (the project UUID) in getCorporationProject,
308
+ getCorporationProjectContribution and getCorporationProjectContributors.
309
+ Pass project.id from a listing.
310
+ - CorporationProject / CorporationProjectSchema: project_id -> id (string),
311
+ progress number -> { current, desired } (fraction = current / desired),
312
+ start_time -> details.created, finish_time -> details.finished. New
313
+ required fields name, last_modified, creator, details, configuration;
314
+ optional reward and contribution. state is an esiEnum ('Active',
315
+ 'Completed', ...), capitalised as ESI sends it.
316
+ - CorporationProjectContributor / Schema: character_id -> id,
317
+ contribution -> contributed, plus name.
318
+ - CorporationProjectContribution / Schema: { character_id, contribution }
319
+ -> { contributed, last_modified? }; the character ID is the one you
320
+ passed in.
321
+ New exports: CorporationProjectsListing, CorporationProjectSummary,
322
+ CorporationProjectContributorsListing, CorporationProjectCursor and their
323
+ schemas.
324
+
325
+ ### Added
326
+
327
+ * **auth:** add EsiTokenManager with pluggable storage and bulk refresh ([1b6ca0a](https://github.com/lgriffin/ESI.ts/commit/1b6ca0a1bb7c460e74b26ee753660f1ee20342b0))
328
+ * **auth:** add EsiTokenManager with pluggable storage and bulk refresh ([91de317](https://github.com/lgriffin/ESI.ts/commit/91de317460b229547eb6fcbc78edd31582e6448d)), closes [#185](https://github.com/lgriffin/ESI.ts/issues/185) [#187](https://github.com/lgriffin/ESI.ts/issues/187)
329
+ * **logging:** per-client structured logging, engineering charter, release 9.9.0 ([ca9773b](https://github.com/lgriffin/ESI.ts/commit/ca9773bc9106741f9400690e4a14dbc6d39168fa))
330
+ * ramp-up phases 1, 3, 4 and 5 — load-bearing spec, CI gate, agent governance ([8453187](https://github.com/lgriffin/ESI.ts/commit/8453187e836dedcefc1d686a8371e19835c97bd2))
331
+ * **skills:** gate ears-gherkin-dev changes with an eval suite ([18865c8](https://github.com/lgriffin/ESI.ts/commit/18865c8848cde16b7243f3f17b60b270a98f3cca))
332
+ * **spec-consistency:** check Rule titles against response schemas ([eb4ed10](https://github.com/lgriffin/ESI.ts/commit/eb4ed105c28e33814cffb8bcdae9689cd6b74f6c))
333
+
334
+
335
+ ### Fixed
336
+
337
+ * **auth:** address review findings on SSO exchange, refresh races and storage ([e8172f1](https://github.com/lgriffin/ESI.ts/commit/e8172f1efd781040bffc0a29ecca683fd61aeba6))
338
+ * **build:** let release-please bump PACKAGE_VERSION ([8ef9c19](https://github.com/lgriffin/ESI.ts/commit/8ef9c1994671891a67be438c5efd0cc2b4f5ffba))
339
+ * **build:** share one copy of each class across sub-path entries ([8110d73](https://github.com/lgriffin/ESI.ts/commit/8110d73cfd7016aebfe9bed5a85aed84fc12dec7))
340
+ * **build:** share one copy of each class across sub-path entries ([2f0ec0a](https://github.com/lgriffin/ESI.ts/commit/2f0ec0aa73051615a2bad3ed3a42c0e952c98d97))
341
+ * **cache:** evict a response body that fails schema validation ([22b0d0b](https://github.com/lgriffin/ESI.ts/commit/22b0d0b31276bf6526d52eb9ad3c7db43d3b8d7e))
342
+ * **cache:** evict cached reads after writes answered with 201 or 204 ([7e41381](https://github.com/lgriffin/ESI.ts/commit/7e413819ceaa591d961c254124fb4b4f25d16288))
343
+ * **cache:** keep entries an hour past their freshness TTL for stale-on-error ([e4f7e9a](https://github.com/lgriffin/ESI.ts/commit/e4f7e9a9dfe09afc7aead67d7810fd677de9bc47))
344
+ * **cache:** keep entries an hour past their freshness TTL for stale-on-error ([fec657d](https://github.com/lgriffin/ESI.ts/commit/fec657d28b4806a1ba6bddd04a722065bd247523))
345
+ * **ci:** publish releases created by release-please and sign with cosign bundles ([befc639](https://github.com/lgriffin/ESI.ts/commit/befc6392f347dbd2f9c76c1fd76af96ccfd76083))
346
+ * **ci:** unblock the v10.0.0 release: drift baseline, version marker, dispatchable publish, cosign bundles ([5271515](https://github.com/lgriffin/ESI.ts/commit/527151572053fb07ff9690b603743e7a65806efd))
347
+ * **contracts:** give public bids and items their spec shape; require acceptor ([3ab3198](https://github.com/lgriffin/ESI.ts/commit/3ab31987abbd64acb578af92fc1dcaaf13ea9d0b))
348
+ * **corporation-projects:** match project schemas, types and methods to ESI ([afa7e8f](https://github.com/lgriffin/ESI.ts/commit/afa7e8ff37a24395beb591e7698da25a6cf1dee7))
349
+ * **corporation:** match medals, role history, starbases, titles and tracking to ESI ([16ee3d7](https://github.com/lgriffin/ESI.ts/commit/16ee3d7c3f0c96022abe3e861358e13526a3f739))
350
+ * **errors:** keep ESI's reason in the error message ([9ad8902](https://github.com/lgriffin/ESI.ts/commit/9ad8902ba5c67b45386a6f70a6edfa61ca17cad4))
351
+ * **errors:** surface network failures and timeouts as EsiError ([cd661a3](https://github.com/lgriffin/ESI.ts/commit/cd661a39a9dd46810ab8cbc8be96f67bb03d4158))
352
+ * **factions:** give each faction warfare leaderboard its spec entry shape ([b997d2c](https://github.com/lgriffin/ESI.ts/commit/b997d2cd4f86929dc9007615d7d604c435d522a7))
353
+ * **freelance-jobs:** match participation, participants, detail and cursor to ESI ([e49c3d1](https://github.com/lgriffin/ESI.ts/commit/e49c3d11cb400f0620d45821228543f25defab12))
354
+ * **industry:** place corporation industry jobs by location_id as ESI does ([8ebe25d](https://github.com/lgriffin/ESI.ts/commit/8ebe25d48270d62b5a860822eef1a024a216cc32))
355
+ * **mail:** split mail headers from the full message and type its read flag ([600472b](https://github.com/lgriffin/ESI.ts/commit/600472baeebc741a172460ab6cc03721a9327c6d))
356
+ * **meta:** give getStatus the per-route shape ESI sends ([7b72f40](https://github.com/lgriffin/ESI.ts/commit/7b72f40a44205d94a7b708e83f15795c5a00625c))
357
+ * **mutation:** satisfy noUncheckedIndexedAccess in the ratchet script ([07ae337](https://github.com/lgriffin/ESI.ts/commit/07ae337107001ec3cdff319edc35a0bc190c65c6))
358
+ * ramp-up phase 6 — library safety gates and a validation cache fix ([a2629ad](https://github.com/lgriffin/ESI.ts/commit/a2629ada8d7cb1b896211f6762f185ef46667359))
359
+ * **release:** tag releases vX.Y.Z and start the changelog at 9.9.0 ([2067882](https://github.com/lgriffin/ESI.ts/commit/2067882e9920e60d3e3b5bda3d373187671baa30))
360
+ * **release:** tag releases vX.Y.Z and start the changelog at 9.9.0 ([15e62d6](https://github.com/lgriffin/ESI.ts/commit/15e62d66a742325ef05b90aeb3c590fa1b2c661e))
361
+ * **schemas:** require fleet boss, customs office access flags and system position ([00fff7c](https://github.com/lgriffin/ESI.ts/commit/00fff7c06d946043e833833894f9f885093393c5))
362
+ * **schemas:** require vip, contract status and availability as ESI does ([24c8c35](https://github.com/lgriffin/ESI.ts/commit/24c8c35de56e92ceb821383808cc2359acfb6659))
363
+ * **schemas:** stop requiring fields the ESI spec marks optional ([fc8e489](https://github.com/lgriffin/ESI.ts/commit/fc8e489274a0b40700fd0f63818830a44db3bd60))
364
+ * **scripts:** drop drift baseline entries resolved by v10 part 2 ([1c54a30](https://github.com/lgriffin/ESI.ts/commit/1c54a3098d591c06479b3baee83c9efe23c3ea51))
365
+ * **scripts:** drop the 83 drift baseline entries [#317](https://github.com/lgriffin/ESI.ts/issues/317) resolved ([2cb7d18](https://github.com/lgriffin/ESI.ts/commit/2cb7d18779d70ecddff6b814715a50a2af5f7953))
366
+ * **scripts:** make schema:drift compare what it reports ([3dc4c53](https://github.com/lgriffin/ESI.ts/commit/3dc4c532d61fe100e842fda7d25f16093d19fe41))
367
+ * **scripts:** make schema:drift compare what it reports, with a ratcheted baseline ([7f428f9](https://github.com/lgriffin/ESI.ts/commit/7f428f926ca5b4e6ce43ef2dd626578409c1552c))
368
+ * **sde:** load js-yaml and adm-zip lazily as optional peer dependencies ([22afdce](https://github.com/lgriffin/ESI.ts/commit/22afdce1cabc9c6bbe860b14194222c3c9e39872))
369
+ * **sde:** load js-yaml and adm-zip lazily as optional peer dependencies ([526587b](https://github.com/lgriffin/ESI.ts/commit/526587beb77612daaf77e7c2da581fa21cf7ce69))
370
+ * **sde:** read nested _sde.yaml metadata from ZIP archives ([1f46860](https://github.com/lgriffin/ESI.ts/commit/1f46860834a6ab9f9e4320f9eee8259e1d2b8931))
371
+ * **sde:** read nested _sde.yaml metadata from ZIP archives ([13d04cb](https://github.com/lgriffin/ESI.ts/commit/13d04cbc3ce74b431f94688ad293163a97f29489))
372
+ * **spec-audit:** close five holes that let a non-compliant spec pass ([9106978](https://github.com/lgriffin/ESI.ts/commit/910697878270e34450af40431b90d9fa605b94b9))
373
+ * **spec-audit:** close five holes that let a non-compliant spec pass ([df06b64](https://github.com/lgriffin/ESI.ts/commit/df06b64cd1a116c885627240931fb734954e7b2f))
374
+ * **spec-audit:** load Cucumber through dynamic import so the audit runs on Node 18 ([4f0f819](https://github.com/lgriffin/ESI.ts/commit/4f0f819262aa7d7f0de70bbcdfbc4b143d3b2cde))
375
+ * **spec-audit:** split the pure checks out so Jest can load them ([34100d7](https://github.com/lgriffin/ESI.ts/commit/34100d77101bc1d2d4c5998b1cf70b69dbeeef9d))
376
+ * **spec-consistency:** run on shallow CI checkouts and on Node 18 ([98be8be](https://github.com/lgriffin/ESI.ts/commit/98be8bee5b2271a7086d4dbd8cb83792ef6ed9ed))
377
+ * **spec:** qualify Rule titles that promise optional response fields ([227ebbf](https://github.com/lgriffin/ESI.ts/commit/227ebbfd5f62de1f47b450d0a75db4fc3799da89))
378
+ * **spec:** reconcile domain failure Rules with retry and stale-on-error ([a2695dd](https://github.com/lgriffin/ESI.ts/commit/a2695ddb777ee53d3ef1f65b6cee105c61103646))
379
+ * **testing:** drop invented IDs and add required fields in TestDataFactory ([d59388c](https://github.com/lgriffin/ESI.ts/commit/d59388c15cbe8ffb9752b99a53cb31da538bbc1a))
380
+ * **testing:** make TestDataFactory builders emit schema-valid ESI payloads ([8d81bb8](https://github.com/lgriffin/ESI.ts/commit/8d81bb8af09e6cebfc25a2c74e558242861533b2))
381
+ * **wallet:** stop requiring is_personal on corporation wallet transactions ([c013e88](https://github.com/lgriffin/ESI.ts/commit/c013e88c9e0b7558a26757eb25c8e4d0c4ebdffe))
382
+
383
+
384
+ ### Changed
385
+
386
+ * add CODEOWNERS covering bot-touched manifests, workflows and release config ([892bcbc](https://github.com/lgriffin/ESI.ts/commit/892bcbc4da005f116d3900f6171e57f6ee8f929a))
387
+ * **beads:** export the ramp-up phase notes and follow-up issues ([6fef0bc](https://github.com/lgriffin/ESI.ts/commit/6fef0bc7085256563afc29a135d30031c334c5d0))
388
+ * **ci:** bump github/codeql-action to 4.38.0 ([741000c](https://github.com/lgriffin/ESI.ts/commit/741000c28c2af735fd33442b809057afdaa23382))
389
+ * **ci:** fail pull requests that add a public export no test references ([4981c9d](https://github.com/lgriffin/ESI.ts/commit/4981c9db189cbe5e02e958a062c2fc4df8709f11))
390
+ * **ci:** file an issue when the spec drift check fails, not a red pull request ([ad06498](https://github.com/lgriffin/ESI.ts/commit/ad06498a9767732ff57954e31e60fdcb07ea6a64))
391
+ * **ci:** hold the API SemVer gate to squash merges ([bb0bdba](https://github.com/lgriffin/ESI.ts/commit/bb0bdbac1ae05ae8222d54c4d62431fdcd6187ba))
392
+ * **ci:** require a breaking-change commit when the public API report loses a line ([6363b31](https://github.com/lgriffin/ESI.ts/commit/6363b3139c40a8881fbcf3cce0a919d3fef14130))
393
+ * **ci:** run schema drift against its ratcheted baseline ([e113851](https://github.com/lgriffin/ESI.ts/commit/e1138514a174bf31f97e9303bb74c7e1e2cbcda2))
394
+ * **deps:** add a Dependabot cooldown for npm and GitHub Actions updates ([f595daa](https://github.com/lgriffin/ESI.ts/commit/f595daa66c0a68fe83d220694cc6d88d71cc3a2e))
395
+ * **deps:** bump @cucumber/gherkin from 28.0.0 to 42.0.1 ([899f128](https://github.com/lgriffin/ESI.ts/commit/899f128fbd230a81ea2613e558e16bb8ff05f28b))
396
+ * **deps:** bump @cucumber/messages from 24.1.0 to 34.2.1 ([bc563d4](https://github.com/lgriffin/ESI.ts/commit/bc563d4d3afedaa5ab1d914fa2afccb0486636da))
397
+ * **deps:** bump @cucumber/messages from 24.1.0 to 34.2.1 ([bf2414d](https://github.com/lgriffin/ESI.ts/commit/bf2414d8add5b0b872db7da21b0218a7f2cce742))
398
+ * **deps:** bump the minor-and-patch group with 7 updates ([7039ca7](https://github.com/lgriffin/ESI.ts/commit/7039ca7a64dae5013eb426e63905dcd36af9bf8e))
399
+ * **deps:** bump zod to 4.6.4 and js-yaml to 5.4.2 ([09dd9f0](https://github.com/lgriffin/ESI.ts/commit/09dd9f03888962f823f194bf7ae88ec1b6a276ca))
400
+ * **deps:** bundle Dependabot updates (zod, js-yaml, codeql-action) ([ea7a211](https://github.com/lgriffin/ESI.ts/commit/ea7a2113e24f90ecc3a5591bff8a23eb8b2ee5f4))
401
+ * **lint:** load the seam lint parser from the listed typescript-eslint package ([c87e31b](https://github.com/lgriffin/ESI.ts/commit/c87e31bd9183406838f7fbbfa7f2b984f4527d41))
402
+ * **lint:** ratchet wall-clock, timer and Math.random use in src/ ([8a9fb4f](https://github.com/lgriffin/ESI.ts/commit/8a9fb4fb5018c5744e57ab82f1107bdb455cdd50))
403
+ * **lint:** ratchet wall-clock, timer and Math.random use in src/ ([37ede1d](https://github.com/lgriffin/ESI.ts/commit/37ede1d541aa1ffad4998ef9c870ef15d75b210c))
404
+ * **scripts:** move the schema drift comparison into a testable core ([ba293c1](https://github.com/lgriffin/ESI.ts/commit/ba293c1f47a209161402103f924b3dc154a4bada))
405
+ * **scripts:** plain plurals in the schema drift ratchet messages ([99724b8](https://github.com/lgriffin/ESI.ts/commit/99724b8b578e30c858b4d3ac676d8abfa5c36477))
406
+
407
+
408
+ ### Documentation
409
+
410
+ * **agents:** write the reviewer checklist and per-area agent notes ([113b145](https://github.com/lgriffin/ESI.ts/commit/113b14555986f9ef696a73c93a1606f467039048))
411
+ * **bdd:** list the batch 2 domains as converted ([446f914](https://github.com/lgriffin/ESI.ts/commit/446f914dd0d18f1655586cb1ee140b6b727d7e85))
412
+ * **bdd:** record the runner decision and the one-step-per-file layout ([266c6ea](https://github.com/lgriffin/ESI.ts/commit/266c6ead4762df12a20887b531135f625baa758d))
413
+ * **bdd:** state which leg carries the 100ms latency in the fan-out Rule ([b7ac123](https://github.com/lgriffin/ESI.ts/commit/b7ac123faff9b1d36919affea8ee8d5c0ebc893a))
414
+ * **guides:** describe ci-success, the live tier guard, cooldown and the no-retry nightly ([605333b](https://github.com/lgriffin/ESI.ts/commit/605333b8a745a02153fc1fa810edea35f34d2aaf))
415
+ * **guides:** document the seam lint and the BDD-only mutation ratchet ([9d228ad](https://github.com/lgriffin/ESI.ts/commit/9d228ad549ef2c8b542eb9247bff3ebe9f8591fb))
416
+ * **guides:** write the charter guides and retire docs/ ([8ffb88f](https://github.com/lgriffin/ESI.ts/commit/8ffb88f471e5259ad8f31fdee67ca1624194078e))
417
+ * **guides:** write the charter guides and retire docs/ ([5b61eaa](https://github.com/lgriffin/ESI.ts/commit/5b61eaa41929efadf5a7233a922adc7202fd4dde))
418
+ * **quality-gates:** document schema drift matching, guard and baseline ([ccb1ce1](https://github.com/lgriffin/ESI.ts/commit/ccb1ce10d45c29f4c820f7c8de6779c5afb5669d))
419
+ * **sde:** document js-yaml and adm-zip as optional peer dependencies ([d8d8843](https://github.com/lgriffin/ESI.ts/commit/d8d884364f997d91c1bdc2d540a9170939af3832))
420
+ * **semver:** add a semantic versioning guide and enforce it in CLAUDE.md ([48fedaa](https://github.com/lgriffin/ESI.ts/commit/48fedaa8fdac0ddba5326dc89b31e6b781cb68a2))
421
+ * **semver:** add a semantic versioning guide and enforce it in CLAUDE.md ([87d391b](https://github.com/lgriffin/ESI.ts/commit/87d391b14633262c4b58e1eb3b24af1f22cbe10c))
422
+
423
+
424
+ ### Testing
425
+
426
+ * **api-semver-gate:** build the empty-report commit without moving HEAD ([b697a31](https://github.com/lgriffin/ESI.ts/commit/b697a3180c445f4cb199ed16a15dbdc409bf3e7c))
427
+ * **bdd:** add a runner-agnostic step library and a Jest binder ([d16b169](https://github.com/lgriffin/ESI.ts/commit/d16b1696078ad2658257777c854d8c09e2eb3b66))
428
+ * **bdd:** add the HTTP transport seam and ban client-method mocks ([1112b81](https://github.com/lgriffin/ESI.ts/commit/1112b815b59eba99a846f21a3104cd7b1ace57e4))
429
+ * **bdd:** assert only what the reconciled Rules promise ([3366028](https://github.com/lgriffin/ESI.ts/commit/336602818ec8544eb024f43bc93036e4b88149ac))
430
+ * **bdd:** convert access-lists, alliance, clones, cosmetics, dogma, insurance, meta and route to one step per file ([8117957](https://github.com/lgriffin/ESI.ts/commit/81179572c97f7d61bbc37427de0634f576b949a6))
431
+ * **bdd:** convert wars, killmails, wallet, mail and universe to one step per file ([997bc63](https://github.com/lgriffin/ESI.ts/commit/997bc63df4d71c7a6a52ee47551fc968ef250043))
432
+ * **bdd:** move every domain step file onto the transport seam ([538fdee](https://github.com/lgriffin/ESI.ts/commit/538fdee76aaea55df56a7f939ef8e1a4c6a22545))
433
+ * **bdd:** name the access-list 401 scenario for the token it uses ([41ef2cd](https://github.com/lgriffin/ESI.ts/commit/41ef2cd24f2159b1eb33b9c7aab1f7bbef990fe5))
434
+ * **bdd:** name two converted steps for the domain they assert ([602c0f9](https://github.com/lgriffin/ESI.ts/commit/602c0f9a46211cd2f2158d63fb25bef8f59f9439))
435
+ * **bdd:** ramp-up phase 2 — one step per file on a Jest step library, with a dry run ([a9a154d](https://github.com/lgriffin/ESI.ts/commit/a9a154d83f0ff55ae3d4dc8d760eff42695a4e13))
436
+ * **bdd:** send 204, 205 and 304 through the seam with no body ([643ab69](https://github.com/lgriffin/ESI.ts/commit/643ab69c98850ff3c5bf0c5be3581cbf43ccd4ef))
437
+ * **bdd:** split the access-lists steps into one file per step ([3eedda5](https://github.com/lgriffin/ESI.ts/commit/3eedda58fdf3962537e545ab800df83be479284a))
438
+ * **bdd:** split the alliance steps into one file per step ([49c6068](https://github.com/lgriffin/ESI.ts/commit/49c6068ffb7f6121253998cb6c194f6643637e06))
439
+ * **bdd:** split the clones steps into one file per step ([d75dda7](https://github.com/lgriffin/ESI.ts/commit/d75dda7630319f73160e8ffcb5d6b3c2fa8025bd))
440
+ * **bdd:** split the cosmetics steps into one file per step ([2bdb41d](https://github.com/lgriffin/ESI.ts/commit/2bdb41d447d7f82720a84928e1d0edfe8a337215))
441
+ * **bdd:** split the dogma steps into one file per step ([1b0a7e5](https://github.com/lgriffin/ESI.ts/commit/1b0a7e573edf8432caa3fa6d55234136fce31fc7))
442
+ * **bdd:** split the insurance steps into one file per step ([2baf51b](https://github.com/lgriffin/ESI.ts/commit/2baf51b9b45b84dcc9f6fe158cf7997a55d34dbd))
443
+ * **bdd:** split the killmails steps into one file per step ([d437485](https://github.com/lgriffin/ESI.ts/commit/d43748599a5fdfa4c4179a21fc2f1afeedff3cba))
444
+ * **bdd:** split the mail steps into one file per step ([7f4395e](https://github.com/lgriffin/ESI.ts/commit/7f4395ed1118bb338e89c028fe0534671ffe1203))
445
+ * **bdd:** split the market steps into one file per step ([a6af26e](https://github.com/lgriffin/ESI.ts/commit/a6af26e9999e0df2615db48dbab3fb91e1d505ff))
446
+ * **bdd:** split the meta steps into one file per step ([51fbcbb](https://github.com/lgriffin/ESI.ts/commit/51fbcbbf17bcbfea418a9d1f0a8a9e2ef4c0dd66))
447
+ * **bdd:** split the route steps into one file per step ([606b0e2](https://github.com/lgriffin/ESI.ts/commit/606b0e20fa466fcf3fd72b641a835d8816faac77))
448
+ * **bdd:** split the universe steps into one file per step ([4241d68](https://github.com/lgriffin/ESI.ts/commit/4241d68a4642703ff1b640860f2b7d0ffde25fa5))
449
+ * **bdd:** split the wallet steps into one file per step ([32c5305](https://github.com/lgriffin/ESI.ts/commit/32c5305d00a8fb941fbc3ad7b687bae9d7c0ca64))
450
+ * **bdd:** split the wars steps into one file per step ([76dfbff](https://github.com/lgriffin/ESI.ts/commit/76dfbffb0c17198120f9229a5850edc1dc9a6fa2))
451
+ * **bdd:** sync the transport seam with the integration branch ([8c0baa6](https://github.com/lgriffin/ESI.ts/commit/8c0baa6403e710839838d0e5342da58e084821b3))
452
+ * **bdd:** time the real pipeline in the performance Rules ([eb32df5](https://github.com/lgriffin/ESI.ts/commit/eb32df53bb7e9ba083240ca34789c2f4742b76f6))
453
+ * **cache:** specify entry retention past the freshness TTL ([cc4c04c](https://github.com/lgriffin/ESI.ts/commit/cc4c04c14a56c55ddf5abd2bb72fde5e2ebd319a))
454
+ * **clients:** give each shared error case its own ApiClient ([11259e3](https://github.com/lgriffin/ESI.ts/commit/11259e345af95b1ae3f6506512161920be8cb3e8))
455
+ * **consumer:** assert ./errors shares class identity with the root entry ([cb7575a](https://github.com/lgriffin/ESI.ts/commit/cb7575abc9f187733023bf57b286d7c3e90e3a6b))
456
+ * **consumer:** install the packed tarball into a clean consumer and run it ([517ce18](https://github.com/lgriffin/ESI.ts/commit/517ce18d1e023ea72b028e73caa56d686cbc0fd9))
457
+ * **consumer:** load SDE metadata nested under sde: in the optional-peers probe ([8375d14](https://github.com/lgriffin/ESI.ts/commit/8375d1440ab4870aba8ba51b65fd7ecc8cdd34d4))
458
+ * **etag-cache:** specify stale-on-error over HTTP ([ded4537](https://github.com/lgriffin/ESI.ts/commit/ded45377795087318e438a1315d0a41e096089eb))
459
+ * **export-coverage:** fail when a public export has no test referencing it ([c6920ce](https://github.com/lgriffin/ESI.ts/commit/c6920ceea24a2b9aa574a267bc61e620a103b8bd))
460
+ * **export-coverage:** report public exports that no test references ([ff5bf1f](https://github.com/lgriffin/ESI.ts/commit/ff5bf1f2f43d7221874c2b546b8f543a6bb7b5b0))
461
+ * **fuzz:** inject schema-violating ESI bodies through the transport seam ([e4cd35d](https://github.com/lgriffin/ESI.ts/commit/e4cd35dce60e643996a3368c1fda8b5b229ecfc9))
462
+ * make client suites order-independent and randomise the nightly no-retry run ([02e9b77](https://github.com/lgriffin/ESI.ts/commit/02e9b770981f3caaa2a5b349406c8dbfeb263fa7))
463
+ * make the live integration and contract tiers fail loudly without ESI_LIVE_TESTS ([79aee8b](https://github.com/lgriffin/ESI.ts/commit/79aee8b3b9a47917d16aa8a1a09a55f814532535))
464
+ * **mutation:** add a BDD-only Stryker run with a per-directory ratchet ([c47dde1](https://github.com/lgriffin/ESI.ts/commit/c47dde17ecff0d196c4c03d88a92faf062c4b641))
465
+ * **resilience:** specify retry classes, circuit states and dedupe over HTTP ([bf42a7a](https://github.com/lgriffin/ESI.ts/commit/bf42a7ac9bc0d6652dc2aa2b5d1d5c24e386f3a4))
466
+ * **scripts:** schema drift reports drift behind definition-style paths ([46bb854](https://github.com/lgriffin/ESI.ts/commit/46bb854dda03b8eaffdab7d979a28df04c0e3e12))
467
+ * **skills:** build the review fixture's EsiError with status first ([5f3553f](https://github.com/lgriffin/ESI.ts/commit/5f3553f77c28933282923fae09d59ae39218ef1f))
468
+ * **spec-audit:** hold step files to one step per file and ratchet the legacy ones ([405298e](https://github.com/lgriffin/ESI.ts/commit/405298e75bede0da43a83ce14ad2ba2294511475))
469
+ * **spec-audit:** skip the CLI fixtures where the audit cannot start ([3cb173e](https://github.com/lgriffin/ESI.ts/commit/3cb173eb3ed7a0587b4a87c9b517c0405f258fba))
470
+
471
+ ## [Unreleased]
472
+
473
+ ### Added
474
+
475
+ - **`EsiTokenManager`** — higher-level auth abstraction that owns the SSO token lifecycle for one or many characters (#185). Exchanges an authorization code, decodes the character id, name and scopes from the token, persists it through a pluggable `ITokenStorage`, refreshes ahead of expiry (`refreshSkewMs`, default 60 s), coalesces concurrent refreshes per character, persists the rotated refresh token before returning, and records an SSO `invalid_grant` so later calls fail locally with `TokenRevokedError`. `createClient(characterId)` returns an `EsiClient` wired with the character's token and a refresh provider bound to the manager; `tokenProviderFor(characterId)` exposes that provider for clients built by hand
476
+ - **Bulk refresh** — `refreshAll({ concurrency, expiringWithinMs, signal })` refreshes stored tokens with a concurrency cap (default 5), isolates failures per character, skips tokens outside an optional staleness window, and flags SSO 429/5xx failures as `retryable` (#187). Per-character failures never reject; every character gets a `RefreshResult`. A throwing `onProgress` callback and a non-finite `concurrency` value are tolerated; only a storage adapter that cannot list tokens rejects the call
477
+ - **`EveSsoClient`** — zero-dependency client for `login.eveonline.com`: `getAuthorizationUrl`, `exchangeCode`, `refresh`, `revoke`. `exchangeCode` repeats the `redirect_uri` from the authorization request (configured `callbackUrl` or a per-request `redirectUri`); an `invalid_grant` on a code exchange or revoke stays an `SsoError` and only a refresh maps it to `TokenRevokedError`; a 2xx body that is not a JSON object with both tokens is reported as `SsoError` `invalid_response`. Confidential clients authenticate with HTTP Basic; public clients use PKCE (`generatePkcePair`, `generateState`). SSO errors surface as `SsoError` (status + OAuth error code) or `TokenRevokedError`
478
+ - **Storage adapters** — `MemoryTokenStorage` and `FileTokenStorage` (atomic temp-file-and-rename writes, `0600` mode, serialised in-process writes, malformed entries skipped on load, `invalidate()` fenced against reads already in progress)
479
+ - **`runWithConcurrency`** internal utility in `src/core/util/concurrency.ts`
480
+ - `tests/bdd/features/core/0054-token-management.feature` — 26 EARS requirements covering the above, including the refresh-versus-removal and refresh-versus-re-authorization races, which the manager resolves in favour of the newer state
481
+ - `examples/token-manager.ts` and `npm run example:token-manager`
482
+
483
+ ## [9.9.0] - 2026-09-15
484
+
485
+ ### Added
486
+
487
+ - **Per-client structured logging** — `EsiClientConfig.logger` and `EsiClientConfig.logLevel` attach an `ILogger` to one client. `ILogger` gains `fatal` and `trace` levels and a second `context` argument; the pipeline now logs structured fields (`endpoint`, `method`, `url`, `status`) instead of interpolated strings. New root exports: `createDefaultLogger`, `toPinoLogger`, `getLogger`, `logFatal`, `logError`, `logWarn`, `logInfo`, `logDebug`, `logTrace`, `LogContext`, `LogLevel`
488
+ - **`guides/CHARTER.md`** — the engineering charter: architecture, design rules, testing tiers, quality gates, security, documentation, release and process as numbered EARS requirements with their enforcing script or CI job. Its gap register and guide roadmap are tracked as beads under `esi-l38` and GitHub issues #262–#287
489
+
490
+ ### Changed
491
+
492
+ - The global `setLogger()` now applies to every client that has no logger of its own. Resolution order is per-client logger, then the global logger, then the built-in pino default at `ESI_LOG_LEVEL` (default `warn`)
493
+ - The default export of `core/logger/logger` is deprecated in favour of `createDefaultLogger(level?)`
494
+ - TypeDoc output moved from `docs/` to `docs-site/public/api/` (git-ignored). `npm run clean` and `npm run docs` no longer delete the hand-written markdown in `docs/`
495
+ - Version sources realigned: `src/core/constants.ts` and the release-please manifest had stayed at 9.8.0 while `package.json` moved to 9.8.1
496
+
497
+ ### Fixed
498
+
499
+ - `toPinoLogger` detached pino's methods from their instance, so every log call through the default logger threw `Cannot read properties of undefined (reading 'Symbol(pino.msgPrefix)')`
500
+
501
+ ## [9.8.0] - 2026-09-10
502
+
503
+ No change to the published API surface — this release is entirely about how
504
+ the library's behaviour is specified and enforced. Consumers upgrading from
505
+ 9.7.0 get identical runtime code.
506
+
507
+ ### Added
508
+
509
+ - **EARS specification for the BDD suite** — all 52 feature files in `tests/bdd/` are now written as 327 atomic requirements in Easy Approach to Requirements Syntax, one per Gherkin `Rule:` block, with the scenarios that verify each nested beneath it. The same 401 scenarios run as before; no test was added, dropped, or merged
510
+ - **`npm run spec:audit`** — parses the Gherkin AST and enforces requirement form: exactly one `shall` per Rule, no vague or unmeasurable language, correct EARS grammar for `If`/`While`/`When`/`Where`, no requirement hidden in prose, no scenario outside a Rule, no feature without a description. Also `npm run spec:audit:verbose`. Runs as a required CI check (`EARS Spec Audit`) and as the final step of `npm run check:all`
511
+ - **`tests/bdd/GUIDE.md` and `tests/bdd/README.md`** — the conventions and a practical guide to writing requirements, including the pattern decision procedure, a finding-by-finding fix table, and the anti-pattern catalogue
512
+
513
+ ### Changed
514
+
515
+ - **Requirements now state what the tests actually assert.** Deriving each requirement from its assertions rather than its old scenario title surfaced scenarios whose titles claimed coverage the assertions never provided — a "transitions to half-open" check that asserts the circuit is closed, an "empty result" case that expects a 404 rejection, performance titles with no stated bound. Those requirements are now written narrowly and honestly, and the gaps are tracked as issues rather than papered over
516
+ - Four Gherkin step texts corrected where they misnamed the fixture or the method under test
517
+ - `@cucumber/gherkin` and `@cucumber/messages` promoted from transitive to explicit devDependencies
518
+ - Types regenerated from the ESI spec (hash only; no interface changes)
519
+
8
520
  ## [9.7.0] - 2026-09-09
9
521
 
10
522
  First release since 9.6.0. Versions 9.6.1 and 9.6.2 were bumped in