@lgriffin/esi.ts 10.2.0 → 11.0.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.
- package/CHANGELOG.md +414 -32
- package/LICENSE +667 -19
- package/NOTICE +19 -0
- package/README.md +149 -902
- package/dist/EsiClient.d.mts +5 -36
- package/dist/EsiClient.d.ts +5 -36
- package/dist/EsiClient.d.ts.map +1 -1
- package/dist/EsiClientBuilder.d.mts +128 -1
- package/dist/EsiClientBuilder.d.ts +128 -1
- package/dist/EsiClientBuilder.d.ts.map +1 -1
- package/dist/adapters/PipelineTransport.d.ts +16 -0
- package/dist/adapters/PipelineTransport.d.ts.map +1 -0
- package/dist/auth/EsiTokenManager.d.mts +62 -21
- package/dist/auth/EsiTokenManager.d.ts +62 -21
- package/dist/auth/EsiTokenManager.d.ts.map +1 -1
- package/dist/auth/EveSsoClient.d.mts +9 -9
- package/dist/auth/EveSsoClient.d.ts +9 -9
- package/dist/auth/EveSsoClient.d.ts.map +1 -1
- package/dist/auth/errors.d.mts +2 -2
- package/dist/auth/errors.d.ts +2 -2
- package/dist/auth/errors.d.ts.map +1 -1
- package/dist/auth/jwt.d.mts +7 -7
- package/dist/auth/jwt.d.ts +7 -7
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/storage/FileTokenStorage.d.mts +1 -1
- package/dist/auth/storage/FileTokenStorage.d.ts +1 -1
- package/dist/auth/storage/FileTokenStorage.d.ts.map +1 -1
- package/dist/{chunk-BBSHKVPI.js → chunk-CM63VGGF.js} +1 -1
- package/dist/chunk-CM63VGGF.js.map +1 -0
- package/dist/chunk-DFRTIZK4.js +275 -0
- package/dist/chunk-DFRTIZK4.js.map +1 -0
- package/dist/{chunk-VZS32UQ3.mjs → chunk-HXS7ZVEL.mjs} +129 -28
- package/dist/chunk-HXS7ZVEL.mjs.map +1 -0
- package/dist/chunk-JNFQXEWZ.mjs +275 -0
- package/dist/chunk-JNFQXEWZ.mjs.map +1 -0
- package/dist/chunk-KIY3XA5Q.mjs +2980 -0
- package/dist/chunk-KIY3XA5Q.mjs.map +1 -0
- package/dist/{chunk-R7D7M2LQ.mjs → chunk-MGOE2YNH.mjs} +1 -1
- package/dist/chunk-MGOE2YNH.mjs.map +1 -0
- package/dist/{chunk-SAQBXXTM.js → chunk-MRKZ55XI.js} +130 -29
- package/dist/chunk-MRKZ55XI.js.map +1 -0
- package/dist/chunk-NKFIHGC6.js +2980 -0
- package/dist/chunk-NKFIHGC6.js.map +1 -0
- package/dist/{chunk-MSJHIJXA.js → chunk-S73PKM2Y.js} +20 -5
- package/dist/chunk-S73PKM2Y.js.map +1 -0
- package/dist/{chunk-3ZI5A37L.mjs → chunk-YUHGSPQ7.mjs} +19 -4
- package/dist/chunk-YUHGSPQ7.mjs.map +1 -0
- package/dist/client/identity.d.mts +20 -0
- package/dist/client/identity.d.ts +20 -0
- package/dist/client/identity.d.ts.map +1 -0
- package/dist/client/index.d.mts +11 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6607 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +6607 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/client/runtime.d.mts +67 -0
- package/dist/client/runtime.d.ts +67 -0
- package/dist/client/runtime.d.ts.map +1 -0
- package/dist/clients/BaseEsiClient.d.ts.map +1 -1
- package/dist/clients/ClientRegistry.d.mts +45 -0
- package/dist/clients/ClientRegistry.d.ts +45 -0
- package/dist/clients/ClientRegistry.d.ts.map +1 -0
- package/dist/clients/CorporationsClient.d.mts +3 -3
- package/dist/clients/CorporationsClient.d.ts +3 -3
- package/dist/clients/CorporationsClient.d.ts.map +1 -1
- package/dist/clients/MailClient.d.mts +2 -2
- package/dist/clients/MailClient.d.ts +2 -2
- package/dist/clients/MailClient.d.ts.map +1 -1
- package/dist/clients/MetaClient.d.mts +3 -2
- package/dist/clients/MetaClient.d.ts +3 -2
- package/dist/clients/MetaClient.d.ts.map +1 -1
- package/dist/clients/MilitaryCampaignsClient.d.mts +14 -7
- package/dist/clients/MilitaryCampaignsClient.d.ts +14 -7
- package/dist/clients/MilitaryCampaignsClient.d.ts.map +1 -1
- package/dist/clients/RouteClient.d.mts +4 -4
- package/dist/clients/RouteClient.d.ts +4 -4
- package/dist/clients/RouteClient.d.ts.map +1 -1
- package/dist/clients/SkillsClient.d.mts +1 -1
- package/dist/clients/SkillsClient.d.ts +1 -1
- package/dist/clients/SkillsClient.d.ts.map +1 -1
- package/dist/clients/SkyhooksClient.d.mts +4 -3
- package/dist/clients/SkyhooksClient.d.ts +4 -3
- package/dist/clients/SkyhooksClient.d.ts.map +1 -1
- package/dist/core/ApiClient.d.mts +11 -0
- package/dist/core/ApiClient.d.ts +11 -0
- package/dist/core/ApiClient.d.ts.map +1 -1
- package/dist/core/ApiClientBuilder.d.ts.map +1 -1
- package/dist/core/ApiRequestHandler.d.ts +2 -1
- package/dist/core/ApiRequestHandler.d.ts.map +1 -1
- package/dist/core/BatchRequestHandler.d.mts +13 -2
- package/dist/core/BatchRequestHandler.d.ts +13 -2
- package/dist/core/BatchRequestHandler.d.ts.map +1 -1
- package/dist/core/EsiClientConfig.d.mts +60 -0
- package/dist/core/EsiClientConfig.d.ts +60 -0
- package/dist/core/EsiClientConfig.d.ts.map +1 -0
- package/dist/core/RetryStrategy.d.mts +3 -3
- package/dist/core/RetryStrategy.d.ts +3 -3
- package/dist/core/RetryStrategy.d.ts.map +1 -1
- package/dist/core/cache/ETagCacheManager.d.mts +9 -4
- package/dist/core/cache/ETagCacheManager.d.ts +9 -4
- package/dist/core/cache/ETagCacheManager.d.ts.map +1 -1
- package/dist/core/cache/cacheKey.d.ts +31 -6
- package/dist/core/cache/cacheKey.d.ts.map +1 -1
- package/dist/core/circuitBreaker/CircuitBreaker.d.mts +8 -12
- package/dist/core/circuitBreaker/CircuitBreaker.d.ts +8 -12
- package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
- package/dist/core/clock.d.ts +8 -0
- package/dist/core/clock.d.ts.map +1 -0
- package/dist/core/configureApiClient.d.mts +1 -1
- package/dist/core/configureApiClient.d.ts +1 -1
- package/dist/core/configureApiClient.d.ts.map +1 -1
- package/dist/core/constants.d.ts +3 -3
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/endpoints/EndpointDefinition.d.mts +17 -0
- package/dist/core/endpoints/EndpointDefinition.d.ts +17 -0
- package/dist/core/endpoints/EndpointDefinition.d.ts.map +1 -1
- package/dist/core/endpoints/assetEndpoints.d.mts +12 -0
- package/dist/core/endpoints/assetEndpoints.d.ts +12 -0
- package/dist/core/endpoints/assetEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/characterEndpoints.d.mts +10 -0
- package/dist/core/endpoints/characterEndpoints.d.ts +10 -0
- package/dist/core/endpoints/characterEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/contactEndpoints.d.mts +1 -0
- package/dist/core/endpoints/contactEndpoints.d.ts +1 -0
- package/dist/core/endpoints/contactEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/contractEndpoints.d.mts +2 -0
- package/dist/core/endpoints/contractEndpoints.d.ts +2 -0
- package/dist/core/endpoints/contractEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/corporationEndpoints.d.mts +16 -3
- package/dist/core/endpoints/corporationEndpoints.d.ts +16 -3
- package/dist/core/endpoints/corporationEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/createClient.d.mts +2 -2
- package/dist/core/endpoints/createClient.d.ts +2 -2
- package/dist/core/endpoints/createClient.d.ts.map +1 -1
- package/dist/core/endpoints/esi-cache-ttls.generated.d.ts.map +1 -1
- package/dist/core/endpoints/esi-rate-limit-groups.generated.d.ts.map +1 -1
- package/dist/core/endpoints/esi-scopes.generated.d.ts.map +1 -1
- package/dist/core/endpoints/fittingEndpoints.d.mts +3 -0
- package/dist/core/endpoints/fittingEndpoints.d.ts +3 -0
- package/dist/core/endpoints/fittingEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/fleetEndpoints.d.mts +6 -0
- package/dist/core/endpoints/fleetEndpoints.d.ts +6 -0
- package/dist/core/endpoints/fleetEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/industryEndpoints.d.mts +2 -2
- package/dist/core/endpoints/industryEndpoints.d.ts +2 -2
- package/dist/core/endpoints/mailEndpoints.d.mts +2 -0
- package/dist/core/endpoints/mailEndpoints.d.ts +2 -0
- package/dist/core/endpoints/mailEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/mercenaryEndpoints.d.mts +1 -1
- package/dist/core/endpoints/mercenaryEndpoints.d.ts +1 -1
- package/dist/core/endpoints/metaEndpoints.d.mts +23 -8
- package/dist/core/endpoints/metaEndpoints.d.ts +23 -8
- package/dist/core/endpoints/metaEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/militaryCampaignEndpoints.d.mts +78 -49
- package/dist/core/endpoints/militaryCampaignEndpoints.d.ts +78 -49
- package/dist/core/endpoints/militaryCampaignEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/paragonHubEndpoints.d.mts +5 -5
- package/dist/core/endpoints/paragonHubEndpoints.d.ts +5 -5
- package/dist/core/endpoints/skyhookEndpoints.d.mts +10 -8
- package/dist/core/endpoints/skyhookEndpoints.d.ts +10 -8
- package/dist/core/endpoints/skyhookEndpoints.d.ts.map +1 -1
- package/dist/core/logger/DefaultLogger.d.mts +20 -1
- package/dist/core/logger/DefaultLogger.d.ts +20 -1
- package/dist/core/logger/DefaultLogger.d.ts.map +1 -1
- package/dist/core/logger/ILogger.d.mts +9 -0
- package/dist/core/logger/ILogger.d.ts +9 -0
- package/dist/core/logger/ILogger.d.ts.map +1 -1
- package/dist/core/logger/NoopLogger.d.ts.map +1 -1
- package/dist/core/logger/clientLog.d.ts.map +1 -1
- package/dist/core/logger/loggerUtil.d.ts.map +1 -1
- package/dist/core/logger/redactLog.d.ts +23 -0
- package/dist/core/logger/redactLog.d.ts.map +1 -0
- package/dist/core/logger/resolveLogger.d.ts +3 -3
- package/dist/core/logger/resolveLogger.d.ts.map +1 -1
- package/dist/core/pagination/AsyncPaginationIterator.d.ts.map +1 -1
- package/dist/core/pagination/CursorPaginationHandler.d.mts +2 -1
- package/dist/core/pagination/CursorPaginationHandler.d.ts +2 -1
- package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
- package/dist/core/ports/CacheStore.d.mts +32 -0
- package/dist/core/ports/CacheStore.d.ts +32 -0
- package/dist/core/ports/CacheStore.d.ts.map +1 -0
- package/dist/core/ports/Clock.d.mts +13 -0
- package/dist/core/ports/Clock.d.ts +13 -0
- package/dist/core/ports/Clock.d.ts.map +1 -0
- package/dist/core/ports/HttpTransport.d.mts +7 -0
- package/dist/core/ports/HttpTransport.d.ts +7 -0
- package/dist/core/ports/HttpTransport.d.ts.map +1 -0
- package/dist/core/ports/Identity.d.mts +31 -0
- package/dist/core/ports/Identity.d.ts +31 -0
- package/dist/core/ports/Identity.d.ts.map +1 -0
- package/dist/core/ports/Logger.d.mts +17 -0
- package/dist/core/ports/Logger.d.ts +17 -0
- package/dist/core/ports/Logger.d.ts.map +1 -0
- package/dist/core/ports/OperationTransport.d.mts +42 -0
- package/dist/core/ports/OperationTransport.d.ts +42 -0
- package/dist/core/ports/OperationTransport.d.ts.map +1 -0
- package/dist/core/ports/TokenProvider.d.mts +7 -0
- package/dist/core/ports/TokenProvider.d.ts +7 -0
- package/dist/core/ports/TokenProvider.d.ts.map +1 -0
- package/dist/core/ports/index.d.mts +14 -0
- package/dist/core/ports/index.d.ts +14 -0
- package/dist/core/ports/index.d.ts.map +1 -0
- package/dist/core/rateLimiter/RateLimiter.d.mts +11 -4
- package/dist/core/rateLimiter/RateLimiter.d.ts +11 -4
- package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
- package/dist/core/requestPipeline/cachePolicy.d.ts +5 -3
- package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -1
- package/dist/core/requestPipeline/fetchExecution.d.ts +3 -1
- package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -1
- package/dist/core/requestPipeline/headers.d.ts +1 -1
- package/dist/core/requestPipeline/headers.d.ts.map +1 -1
- package/dist/core/requestPipeline/index.d.ts +3 -5
- package/dist/core/requestPipeline/index.d.ts.map +1 -1
- package/dist/core/requestPipeline/paginationOrchestration.d.ts +1 -1
- package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -1
- package/dist/core/requestPipeline/statusHandling.d.ts +3 -3
- package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -1
- package/dist/core/util/callerIdentity.d.ts +10 -0
- package/dist/core/util/callerIdentity.d.ts.map +1 -0
- package/dist/core/util/concurrency.d.ts +2 -2
- package/dist/core/util/concurrency.d.ts.map +1 -1
- package/dist/core/util/error.d.mts +92 -3
- package/dist/core/util/error.d.ts +92 -3
- package/dist/core/util/error.d.ts.map +1 -1
- package/dist/core/util/retry.d.mts +4 -4
- package/dist/core/util/retry.d.ts +4 -4
- package/dist/core/util/retry.d.ts.map +1 -1
- package/dist/core/util/validation.d.ts +6 -0
- package/dist/core/util/validation.d.ts.map +1 -1
- package/dist/errors.d.mts +2 -3
- package/dist/errors.d.ts +2 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +29 -3
- package/dist/errors.js.map +1 -1
- package/dist/errors.mjs +28 -2
- package/dist/generated/operations.generated.d.mts +9379 -0
- package/dist/generated/operations.generated.d.ts +9379 -0
- package/dist/generated/operations.generated.d.ts.map +1 -0
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +699 -2865
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +359 -2525
- package/dist/index.mjs.map +1 -1
- package/dist/schemas/character.d.mts +5 -0
- package/dist/schemas/character.d.ts +5 -0
- package/dist/schemas/character.d.ts.map +1 -1
- package/dist/schemas/contacts.d.mts +2 -0
- package/dist/schemas/contacts.d.ts +2 -0
- package/dist/schemas/contacts.d.ts.map +1 -1
- package/dist/schemas/corporation.d.mts +24 -3
- package/dist/schemas/corporation.d.ts +24 -3
- package/dist/schemas/corporation.d.ts.map +1 -1
- package/dist/schemas/fittings.d.mts +4 -0
- package/dist/schemas/fittings.d.ts +4 -0
- package/dist/schemas/fittings.d.ts.map +1 -1
- package/dist/schemas/fleet.d.mts +8 -0
- package/dist/schemas/fleet.d.ts +8 -0
- package/dist/schemas/fleet.d.ts.map +1 -1
- package/dist/schemas/index.js +24 -2
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/index.mjs +23 -1
- package/dist/schemas/industry.d.mts +2 -2
- package/dist/schemas/industry.d.ts +2 -2
- package/dist/schemas/mail.d.mts +4 -0
- package/dist/schemas/mail.d.ts +4 -0
- package/dist/schemas/mail.d.ts.map +1 -1
- package/dist/schemas/mercenary.d.mts +1 -1
- package/dist/schemas/mercenary.d.ts +1 -1
- package/dist/schemas/meta.d.mts +18 -9
- package/dist/schemas/meta.d.ts +18 -9
- package/dist/schemas/meta.d.ts.map +1 -1
- package/dist/schemas/military-campaigns.d.mts +54 -10
- package/dist/schemas/military-campaigns.d.ts +54 -10
- package/dist/schemas/military-campaigns.d.ts.map +1 -1
- package/dist/schemas/paragon-hub.d.mts +4 -4
- package/dist/schemas/paragon-hub.d.ts +4 -4
- package/dist/schemas/skyhooks.d.mts +18 -6
- package/dist/schemas/skyhooks.d.ts +18 -6
- package/dist/schemas/skyhooks.d.ts.map +1 -1
- package/dist/sde/clock.d.ts +11 -0
- package/dist/sde/clock.d.ts.map +1 -0
- package/dist/sde/domain/characters/schemas.d.ts +149 -0
- package/dist/sde/domain/characters/schemas.d.ts.map +1 -0
- package/dist/sde/domain/characters/types.d.mts +163 -0
- package/dist/sde/domain/characters/types.d.ts +163 -0
- package/dist/sde/domain/characters/types.d.ts.map +1 -0
- package/dist/sde/domain/content/schemas.d.ts +84 -0
- package/dist/sde/domain/content/schemas.d.ts.map +1 -0
- package/dist/sde/domain/content/types.d.mts +91 -0
- package/dist/sde/domain/content/types.d.ts +91 -0
- package/dist/sde/domain/content/types.d.ts.map +1 -0
- package/dist/sde/domain/corporations/schemas.d.ts +113 -0
- package/dist/sde/domain/corporations/schemas.d.ts.map +1 -0
- package/dist/sde/domain/corporations/types.d.mts +118 -0
- package/dist/sde/domain/corporations/types.d.ts +118 -0
- package/dist/sde/domain/corporations/types.d.ts.map +1 -0
- package/dist/sde/domain/dogma/schemas.d.ts +76 -0
- package/dist/sde/domain/dogma/schemas.d.ts.map +1 -0
- package/dist/sde/domain/dogma/types.d.mts +80 -0
- package/dist/sde/domain/dogma/types.d.ts +80 -0
- package/dist/sde/domain/dogma/types.d.ts.map +1 -0
- package/dist/sde/domain/industry/schemas.d.ts +204 -0
- package/dist/sde/domain/industry/schemas.d.ts.map +1 -0
- package/dist/sde/domain/industry/types.d.mts +88 -0
- package/dist/sde/domain/industry/types.d.ts +88 -0
- package/dist/sde/domain/industry/types.d.ts.map +1 -0
- package/dist/sde/domain/market/schemas.d.ts +24 -0
- package/dist/sde/domain/market/schemas.d.ts.map +1 -0
- package/dist/sde/domain/market/types.d.mts +25 -0
- package/dist/sde/domain/market/types.d.ts +25 -0
- package/dist/sde/domain/market/types.d.ts.map +1 -0
- package/dist/sde/domain/schemas.d.ts +15 -0
- package/dist/sde/domain/schemas.d.ts.map +1 -0
- package/dist/sde/domain/skins/schemas.d.ts +109 -0
- package/dist/sde/domain/skins/schemas.d.ts.map +1 -0
- package/dist/sde/domain/skins/types.d.mts +121 -0
- package/dist/sde/domain/skins/types.d.ts +121 -0
- package/dist/sde/domain/skins/types.d.ts.map +1 -0
- package/dist/sde/domain/types/schemas.d.ts +163 -0
- package/dist/sde/domain/types/schemas.d.ts.map +1 -0
- package/dist/sde/domain/types/types.d.mts +182 -0
- package/dist/sde/domain/types/types.d.ts +182 -0
- package/dist/sde/domain/types/types.d.ts.map +1 -0
- package/dist/sde/domain/types.d.mts +16 -0
- package/dist/sde/domain/types.d.ts +16 -0
- package/dist/sde/domain/types.d.ts.map +1 -0
- package/dist/sde/domain/ui/schemas.d.ts +42 -0
- package/dist/sde/domain/ui/schemas.d.ts.map +1 -0
- package/dist/sde/domain/ui/types.d.mts +45 -0
- package/dist/sde/domain/ui/types.d.ts +45 -0
- package/dist/sde/domain/ui/types.d.ts.map +1 -0
- package/dist/sde/domain/universe/schemas.d.ts +239 -0
- package/dist/sde/domain/universe/schemas.d.ts.map +1 -0
- package/dist/sde/domain/universe/types.d.mts +206 -0
- package/dist/sde/domain/universe/types.d.ts +206 -0
- package/dist/sde/domain/universe/types.d.ts.map +1 -0
- package/dist/sde/domain/version/schemas.d.ts +11 -0
- package/dist/sde/domain/version/schemas.d.ts.map +1 -0
- package/dist/sde/errors.d.mts +1 -1
- package/dist/sde/errors.d.ts +1 -1
- package/dist/sde/errors.d.ts.map +1 -1
- package/dist/sde/index.d.mts +7 -6
- package/dist/sde/index.d.ts +7 -6
- package/dist/sde/index.d.ts.map +1 -1
- package/dist/sde/index.js +31 -21
- package/dist/sde/index.js.map +1 -1
- package/dist/sde/index.mjs +26 -16
- package/dist/sde/index.mjs.map +1 -1
- package/dist/sde/ingestion/SdeDatabaseBuilder.d.ts +11 -0
- package/dist/sde/ingestion/SdeDatabaseBuilder.d.ts.map +1 -1
- package/dist/sde/ingestion/SdeDownloader.d.ts +2 -2
- package/dist/sde/ingestion/SdeDownloader.d.ts.map +1 -1
- package/dist/sde/memory.d.mts +5 -5
- package/dist/sde/memory.d.ts +5 -5
- package/dist/sde/memory.d.ts.map +1 -1
- package/dist/sde/memory.js +2 -2
- package/dist/sde/memory.mjs +1 -1
- package/dist/sde/{IStaticDataProvider.d.mts → ports/IStaticDataProvider.d.mts} +9 -2
- package/dist/sde/{IStaticDataProvider.d.ts → ports/IStaticDataProvider.d.ts} +9 -2
- package/dist/sde/ports/IStaticDataProvider.d.ts.map +1 -0
- package/dist/sde/{MemorySdeProvider.d.mts → providers/memory/MemorySdeProvider.d.mts} +3 -3
- package/dist/sde/{MemorySdeProvider.d.ts → providers/memory/MemorySdeProvider.d.ts} +3 -3
- package/dist/sde/providers/memory/MemorySdeProvider.d.ts.map +1 -0
- package/dist/sde/providers/order.d.ts +10 -0
- package/dist/sde/providers/order.d.ts.map +1 -0
- package/dist/sde/{SdeDataProvider.d.mts → providers/yaml/SdeDataProvider.d.mts} +14 -5
- package/dist/sde/{SdeDataProvider.d.ts → providers/yaml/SdeDataProvider.d.ts} +14 -5
- package/dist/sde/providers/yaml/SdeDataProvider.d.ts.map +1 -0
- package/dist/sde/{SdeTestDataFactory.d.mts → testing/SdeTestDataFactory.d.mts} +3 -3
- package/dist/sde/{SdeTestDataFactory.d.ts → testing/SdeTestDataFactory.d.ts} +3 -3
- package/dist/sde/testing/SdeTestDataFactory.d.ts.map +1 -0
- package/dist/sde/version.d.mts +1 -1
- package/dist/sde/version.d.ts +1 -1
- package/dist/sde/version.d.ts.map +1 -1
- package/dist/testing/TestDataFactory.d.mts +21 -3
- package/dist/testing/TestDataFactory.d.ts +21 -3
- package/dist/testing/TestDataFactory.d.ts.map +1 -1
- package/dist/testing/index.d.mts +1 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +157 -10
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/index.mjs +155 -8
- package/dist/testing/index.mjs.map +1 -1
- package/dist/testing/mockTransport.d.mts +87 -0
- package/dist/testing/mockTransport.d.ts +87 -0
- package/dist/testing/mockTransport.d.ts.map +1 -0
- package/dist/types/generated/esi-spec.generated.d.mts +230 -10
- package/dist/types/generated/esi-spec.generated.d.ts +230 -10
- package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
- package/dist/types/military-campaigns.d.mts +4 -1
- package/dist/types/military-campaigns.d.ts +4 -1
- package/dist/types/military-campaigns.d.ts.map +1 -1
- package/dist/types/skyhooks.d.mts +2 -1
- package/dist/types/skyhooks.d.ts +2 -1
- package/dist/types/skyhooks.d.ts.map +1 -1
- package/package.json +167 -131
- package/dist/chunk-3ZI5A37L.mjs.map +0 -1
- package/dist/chunk-BBSHKVPI.js.map +0 -1
- package/dist/chunk-D5L5HZVF.mjs +0 -417
- package/dist/chunk-D5L5HZVF.mjs.map +0 -1
- package/dist/chunk-MSJHIJXA.js.map +0 -1
- package/dist/chunk-R7D7M2LQ.mjs.map +0 -1
- package/dist/chunk-SAQBXXTM.js.map +0 -1
- package/dist/chunk-VZS32UQ3.mjs.map +0 -1
- package/dist/chunk-XIB2OXEZ.js +0 -417
- package/dist/chunk-XIB2OXEZ.js.map +0 -1
- package/dist/config/jest/globalSetup.d.ts +0 -2
- package/dist/config/jest/globalSetup.d.ts.map +0 -1
- package/dist/config/jest/globalTeardown.d.ts +0 -2
- package/dist/config/jest/globalTeardown.d.ts.map +0 -1
- package/dist/config/jest/jest.setup.d.ts +0 -3
- package/dist/config/jest/jest.setup.d.ts.map +0 -1
- package/dist/core/ClientRegistry.d.mts +0 -45
- package/dist/core/ClientRegistry.d.ts +0 -45
- package/dist/core/ClientRegistry.d.ts.map +0 -1
- package/dist/core/logger/logger.d.ts +0 -12
- package/dist/core/logger/logger.d.ts.map +0 -1
- package/dist/sde/IStaticDataProvider.d.ts.map +0 -1
- package/dist/sde/MemorySdeProvider.d.ts.map +0 -1
- package/dist/sde/SdeDataProvider.d.ts.map +0 -1
- package/dist/sde/SdeTestDataFactory.d.ts.map +0 -1
- package/dist/sde/schemas.d.ts +0 -1121
- package/dist/sde/schemas.d.ts.map +0 -1
- package/dist/sde/types.d.mts +0 -1039
- package/dist/sde/types.d.ts +0 -1039
- package/dist/sde/types.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/ESI.ts/ESI.ts/dist/index.js","../src/core/middleware/Middleware.ts","../src/core/ApiClient.ts","../src/core/cache/cacheKey.ts","../src/core/constants.ts","../src/core/requestPipeline/headers.ts","../src/core/util/stringUtil.ts","../src/core/endpoints/esi-cache-ttls.generated.ts","../src/core/requestPipeline/cachePolicy.ts","../src/core/requestPipeline/statusHandling.ts","../src/core/util/retry.ts","../src/core/util/sleep.ts","../src/core/RetryStrategy.ts","../src/core/requestPipeline/dependencies.ts","../src/core/pagination/PaginationHandler.ts","../src/core/requestPipeline/paginationOrchestration.ts","../src/core/requestPipeline/middlewareBridge.ts","../src/core/util/headersUtil.ts","../src/core/requestPipeline/fetchExecution.ts","../src/core/ApiRequestHandler.ts","../src/core/util/validation.ts","../src/core/endpoints/buildEndpointPath.ts","../src/core/endpoints/createClient.ts","../src/core/pagination/AsyncPaginationIterator.ts","../src/clients/BaseEsiClient.ts","../src/core/endpoints/allianceEndpoints.ts","../src/core/endpoints/contactEndpoints.ts","../src/clients/AllianceClient.ts","../src/core/endpoints/assetEndpoints.ts","../src/clients/AssetsClient.ts","../src/core/endpoints/calendarEndpoints.ts","../src/clients/CalendarClient.ts","../src/core/endpoints/characterEndpoints.ts","../src/clients/CharacterClient.ts","../src/core/endpoints/cloneEndpoints.ts","../src/clients/ClonesClient.ts","../src/clients/ContactsClient.ts","../src/core/endpoints/contractEndpoints.ts","../src/clients/ContractsClient.ts","../src/core/endpoints/corporationEndpoints.ts","../src/clients/CorporationsClient.ts","../src/core/endpoints/corporationProjectEndpoints.ts","../src/clients/CorporationProjectsClient.ts","../src/core/endpoints/dogmaEndpoints.ts","../src/clients/DogmaClient.ts","../src/core/endpoints/factionEndpoints.ts","../src/clients/FactionClient.ts","../src/core/endpoints/fittingEndpoints.ts","../src/clients/FittingsClient.ts","../src/core/endpoints/fleetEndpoints.ts","../src/clients/FleetClient.ts","../src/core/endpoints/incursionEndpoints.ts","../src/clients/IncursionsClient.ts","../src/core/endpoints/industryEndpoints.ts","../src/clients/IndustryClient.ts","../src/core/endpoints/insuranceEndpoints.ts","../src/clients/InsuranceClient.ts","../src/core/endpoints/killmailEndpoints.ts","../src/clients/KillmailsClient.ts","../src/core/endpoints/locationEndpoints.ts","../src/clients/LocationClient.ts","../src/core/endpoints/loyaltyEndpoints.ts","../src/clients/LoyaltyClient.ts","../src/core/endpoints/mailEndpoints.ts","../src/clients/MailClient.ts","../src/core/endpoints/marketEndpoints.ts","../src/clients/MarketClient.ts","../src/core/endpoints/piEndpoints.ts","../src/clients/PiClient.ts","../src/core/endpoints/routeEndpoints.ts","../src/clients/RouteClient.ts","../src/core/endpoints/searchEndpoints.ts","../src/clients/SearchClient.ts","../src/core/endpoints/skillEndpoints.ts","../src/clients/SkillsClient.ts","../src/core/endpoints/sovereigntyEndpoints.ts","../src/clients/SovereigntyClient.ts","../src/core/endpoints/statusEndpoints.ts","../src/clients/StatusClient.ts","../src/core/endpoints/uiEndpoints.ts","../src/clients/UiClient.ts","../src/core/endpoints/universeEndpoints.ts","../src/clients/UniverseClient.ts","../src/core/endpoints/walletEndpoints.ts","../src/clients/WalletClient.ts","../src/core/endpoints/warEndpoints.ts","../src/clients/WarsClient.ts","../src/core/endpoints/metaEndpoints.ts","../src/clients/MetaClient.ts","../src/core/endpoints/freelanceJobsEndpoints.ts","../src/clients/FreelanceJobsClient.ts","../src/core/endpoints/skyhookEndpoints.ts","../src/clients/SkyhooksClient.ts","../src/core/endpoints/mercenaryEndpoints.ts","../src/clients/MercenaryClient.ts","../src/core/endpoints/accessListEndpoints.ts","../src/clients/AccessListsClient.ts","../src/core/endpoints/cosmeticsEndpoints.ts","../src/clients/CosmeticsClient.ts","../src/core/endpoints/paragonHubEndpoints.ts","../src/clients/ParagonHubClient.ts","../src/core/endpoints/militaryCampaignEndpoints.ts","../src/clients/MilitaryCampaignsClient.ts","../src/core/ClientRegistry.ts","../src/core/EsiDiagnostics.ts","../src/core/BatchRequestHandler.ts","../src/core/cache/ETagCacheManager.ts","../src/core/endpoints/esi-rate-limit-groups.generated.ts","../src/core/rateLimiter/RateLimiter.ts","../src/core/RequestDeduplicator.ts","../src/core/configureApiClient.ts","../src/EsiClient.ts","../src/EsiClientBuilder.ts","../src/core/ApiClientBuilder.ts","../src/core/endpoints/esi-scopes.generated.ts","../src/core/logger/NoopLogger.ts","../src/types/branded.ts","../src/types/generated/esi-spec.generated.ts","../src/auth/EveSsoClient.ts","../src/core/util/concurrency.ts","../src/auth/jwt.ts","../src/auth/storage/MemoryTokenStorage.ts","../src/auth/EsiTokenManager.ts","../src/auth/storage/FileTokenStorage.ts","../src/auth/pkce.ts"],"names":["logDebug","resolveCache","path","logWarn","logInfo","logError","resolveRateLimiter","resolveCircuitBreaker","data","responseBody","z","bucket","superseded"],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACA;ACxLO,IAAM,kBAAA,YAAN,MAAwB;AAAA,iBACrB,oBAAA,EAA4C,CAAC,EAAA;AAAA,kBAC7C,qBAAA,EAA8C,CAAC,EAAA;AAAA,EAEvD,q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AAA;AACE,IAAA;AACM,IAAA;AACW,IAAA;AACT,IAAA;AAClB,EAAA;AACmB,EAAA;AACX,IAAA;AACE,IAAA;AACM,IAAA;AACoB,IAAA;AACpC,EAAA;AACsB,EAAA;AACd,IAAA;AACE,IAAA;AACM,IAAA;AACgB,IAAA;AACd,IAAA;AAClB,EAAA;AACa,EAAA;AACL,IAAA;AACE,IAAA;AACM,IAAA;AACuB,IAAA;AACvC,EAAA;AACa,EAAA;AACL,IAAA;AACE,IAAA;AACM,IAAA;AACoB,IAAA;AACpC,EAAA;AACgB,EAAA;AACR,IAAA;AACE,IAAA;AACM,IAAA;AACU,IAAA;AACR,IAAA;AAClB,EAAA;AACe,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACoB,IAAA;AACpC,EAAA;AACkB,EAAA;AACV,IAAA;AACE,IAAA;AACM,IAAA;AACQ,IAAA;AACN,IAAA;AAClB,EAAA;AACoB,EAAA;AACZ,IAAA;AACE,IAAA;AACM,IAAA;AACoB,IAAA;AAClB,IAAA;AACwB,IAAA;AAC1C,EAAA;AACa,EAAA;AACL,IAAA;AACE,IAAA;AACM,IAAA;AACO,IAAA;AACL,IAAA;AAClB,EAAA;AACwB,EAAA;AAChB,IAAA;AACE,IAAA;AACM,IAAA;AACkB,IAAA;AACa,IAAA;AACN,IAAA;AACzC,EAAA;AACe,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACS,IAAA;AACP,IAAA;AAClB,EAAA;AACU,EAAA;AACF,IAAA;AACE,IAAA;AACM,IAAA;AACoB,IAAA;AACpC,EAAA;AACY,EAAA;AACJ,IAAA;AACE,IAAA;AACM,IAAA;AACoB,IAAA;AACpC,EAAA;AACe,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACS,IAAA;AACP,IAAA;AAClB,EAAA;AACkB,EAAA;AACV,IAAA;AACE,IAAA;AACM,IAAA;AACY,IAAA;AACV,IAAA;AAClB,EAAA;AACiB,EAAA;AACT,IAAA;AACE,IAAA;AACM,IAAA;AACW,IAAA;AACT,IAAA;AAClB,EAAA;AACa,EAAA;AACL,IAAA;AACE,IAAA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AAA;AACiD,EAAA;AACE,EAAA;AACC,EAAA;AACD,EAAA;AACG,EAAA;AACH,EAAA;AACC,EAAA;AACpD,EAAA;AACA,EAAA;AACgD,EAAA;AACE,EAAA;AACC,EAAA;AACC,EAAA;AACpD,EAAA;AACgD,EAAA;AACE,EAAA;AAClD,EAAA;AACmD,EAAA;AACA,EAAA;AACF,EAAA;AACG,EAAA;AACD,EAAA;AACD,EAAA;AACH,EAAA;AACC,EAAA;AACE,EAAA;AACA,EAAA;AACG,EAAA;AACC,EAAA;AACC,EAAA;AACvD,EAAA;AACqD,EAAA;AACJ,EAAA;AACjD,EAAA;AACA,EAAA;AACiD,EAAA;AACA,EAAA;AACjD,EAAA;AACiD,EAAA;AACC,EAAA;AACK,EAAA;AACJ,EAAA;AACH,EAAA;AACD,EAAA;AACM,EAAA;AACJ,EAAA;AACG,EAAA;AACpD,EAAA;AACA,EAAA;AACiD,EAAA;AACA,EAAA;AACC,EAAA;AACK,EAAA;AACA,EAAA;AACA,EAAA;AACvD,EAAA;AACqD,EAAA;AACE,EAAA;AACF,EAAA;AACH,EAAA;AACK,EAAA;AACA,EAAA;AACA,EAAA;AACN,EAAA;AACjD,EAAA;AACA,EAAA;AACuD,EAAA;AACN,EAAA;AACC,EAAA;AACI,EAAA;AACtD,EAAA;AACuD,EAAA;AACF,EAAA;AACC,EAAA;AACD,EAAA;AACA,EAAA;AACC,EAAA;AACD,EAAA;AACC,EAAA;AACA,EAAA;AACC,EAAA;AACvD,EAAA;AACA,EAAA;AACA,EAAA;AACoD,EAAA;AACC,EAAA;AACD,EAAA;AACH,EAAA;AACA,EAAA;AACjD,EAAA;AACkD,EAAA;AAClD,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACqD,EAAA;AACC,EAAA;AACtD,EAAA;AACA,EAAA;AACsD,EAAA;AACA,EAAA;AACH,EAAA;AACC,EAAA;AACE,EAAA;AACJ,EAAA;AACE,EAAA;AACG,EAAA;AACN,EAAA;AACC,EAAA;AACA,EAAA;AACG,EAAA;AACF,EAAA;AACH,EAAA;AACR,EAAA;AACa,EAAA;AACV,EAAA;AACE,EA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IAAA;AACY,IAAA;AACkB,IAAA;AACf,IAAA;AAChB,MAAA;AACQ,QAAA;AAClC,MAAA;AACF,IAAA;AACO,IAAA;AACT,EAAA;AAEiE,EAAA;AACnC,IAAA;AACjB,MAAA;AACA,MAAA;AACX,IAAA;AACkC,IAAA;AACF,MAAA;AAChC,IAAA;AACuC,IAAA;AACC,MAAA;AACC,MAAA;AACQ,MAAA;AACE,MAAA;AACrC,QAAA;AACC,QAAA;AACZ,MAAA;AACiC,MAAA;AACpC,IAAA;AAC+C,IAAA;AACnC,IAAA;AACd,EAAA;AACF;A3HglTyD;AACA;A4H3vTjB;AAgBO;AACF,EAAA;AAC7C;AAGwE;AACrB,EAAA;AACnD;AAG6C;AACD,EAAA;AACnC,EAAA;AACL,IAAA;AACqD,IAAA;AAChC,IAAA;AACvB,EAAA;AACF;AAGwC;AACK,EAAA;AAC7C;A5HwuTyD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ESI.ts/ESI.ts/dist/index.js","sourcesContent":[null,"export interface RequestContext {\n url: string;\n endpoint: string;\n method: string;\n headers: Record<string, string>;\n body?: unknown;\n}\n\nexport interface ResponseContext {\n url: string;\n endpoint: string;\n method: string;\n status: number;\n headers: Record<string, string>;\n body: unknown;\n durationMs: number;\n fromCache: boolean;\n}\n\nexport type RequestInterceptor = (\n context: RequestContext,\n) => RequestContext | Promise<RequestContext>;\n\nexport type ResponseInterceptor = (\n context: ResponseContext,\n) => ResponseContext | Promise<ResponseContext>;\n\nexport class MiddlewareManager {\n private requestInterceptors: RequestInterceptor[] = [];\n private responseInterceptors: ResponseInterceptor[] = [];\n\n addRequestInterceptor(fn: RequestInterceptor): () => void {\n this.requestInterceptors.push(fn);\n return () => {\n this.requestInterceptors = this.requestInterceptors.filter(\n (i) => i !== fn,\n );\n };\n }\n\n addResponseInterceptor(fn: ResponseInterceptor): () => void {\n this.responseInterceptors.push(fn);\n return () => {\n this.responseInterceptors = this.responseInterceptors.filter(\n (i) => i !== fn,\n );\n };\n }\n\n async applyRequestInterceptors(\n context: RequestContext,\n ): Promise<RequestContext> {\n let ctx = context;\n for (const interceptor of this.requestInterceptors) {\n ctx = await interceptor(ctx);\n }\n return ctx;\n }\n\n async applyResponseInterceptors(\n context: ResponseContext,\n ): Promise<ResponseContext> {\n let ctx = context;\n for (const interceptor of this.responseInterceptors) {\n ctx = await interceptor(ctx);\n }\n return ctx;\n }\n\n hasInterceptors(): boolean {\n return (\n this.requestInterceptors.length > 0 ||\n this.responseInterceptors.length > 0\n );\n }\n\n clear(): void {\n this.requestInterceptors = [];\n this.responseInterceptors = [];\n }\n}\n","import {\n MiddlewareManager,\n RequestInterceptor,\n ResponseInterceptor,\n} from './middleware/Middleware';\nimport { ICache } from './cache/ICache';\nimport { IRateLimiter } from './rateLimiter/IRateLimiter';\nimport { ICircuitBreaker } from './circuitBreaker/ICircuitBreaker';\nimport { IDeduplicator } from './IDeduplicator';\nimport { IRetryStrategy } from './IRetryStrategy';\nimport { RetryConfig } from './util/retry';\nimport type { ILogger } from './logger/ILogger';\n\nexport type EsiDatasource = 'tranquility' | 'singularity';\n\nexport type TokenProvider = () => Promise<string>;\n\nexport type FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport class ApiClient {\n private datasource?: EsiDatasource;\n private tokenProvider?: TokenProvider;\n private refreshInFlight?: Promise<string>;\n private middleware: MiddlewareManager = new MiddlewareManager();\n private cache: ICache | null = null;\n private rateLimiter: IRateLimiter | null = null;\n private circuitBreaker: ICircuitBreaker | null = null;\n private timeout: number = 30_000;\n private deduplicator: IDeduplicator | null = null;\n private retryConfig: RetryConfig | null = null;\n private retryStrategy: IRetryStrategy | null = null;\n private validateResponse: boolean = true;\n private validateRequest: boolean = false;\n private language?: string;\n private compatibilityDate?: string;\n private fetchFn: FetchLike | null = null;\n private logger: ILogger | null = null;\n\n constructor(\n private clientId: string,\n private link: string,\n private accessToken?: string,\n ) {\n this.link = this.link.replace(/\\/$/, '');\n }\n\n getTimeout(): number {\n return this.timeout;\n }\n\n setTimeout(timeout: number): void {\n this.timeout = timeout;\n }\n\n getCache(): ICache | null {\n return this.cache;\n }\n\n setCache(cache: ICache | null): void {\n this.cache = cache;\n }\n\n getRateLimiter(): IRateLimiter | null {\n return this.rateLimiter;\n }\n\n setRateLimiter(limiter: IRateLimiter | null): void {\n this.rateLimiter = limiter;\n }\n\n getCircuitBreaker(): ICircuitBreaker | null {\n return this.circuitBreaker;\n }\n\n setCircuitBreaker(cb: ICircuitBreaker | null): void {\n this.circuitBreaker = cb;\n }\n\n getDeduplicator(): IDeduplicator | null {\n return this.deduplicator;\n }\n\n setDeduplicator(dedup: IDeduplicator | null): void {\n this.deduplicator = dedup;\n }\n\n getRetryConfig(): RetryConfig | null {\n return this.retryConfig;\n }\n\n setRetryConfig(config: RetryConfig | null): void {\n this.retryConfig = config;\n }\n\n getRetryStrategy(): IRetryStrategy | null {\n return this.retryStrategy;\n }\n\n setRetryStrategy(strategy: IRetryStrategy | null): void {\n this.retryStrategy = strategy;\n }\n\n getValidateResponse(): boolean {\n return this.validateResponse;\n }\n\n setValidateResponse(validate: boolean): void {\n this.validateResponse = validate;\n }\n\n getValidateRequest(): boolean {\n return this.validateRequest;\n }\n\n setValidateRequest(validate: boolean): void {\n this.validateRequest = validate;\n }\n\n getFetch(): FetchLike {\n return this.fetchFn ?? globalThis.fetch;\n }\n\n setFetch(fn: FetchLike): void {\n this.fetchFn = fn;\n }\n\n getMiddleware(): MiddlewareManager {\n return this.middleware;\n }\n\n addRequestInterceptor(fn: RequestInterceptor): () => void {\n return this.middleware.addRequestInterceptor(fn);\n }\n\n addResponseInterceptor(fn: ResponseInterceptor): () => void {\n return this.middleware.addResponseInterceptor(fn);\n }\n\n getAuthorizationHeader(): string | undefined {\n return this.accessToken ? `Bearer ${this.accessToken}` : undefined;\n }\n\n getLink(): string {\n return this.link;\n }\n\n getDatasource(): EsiDatasource | undefined {\n return this.datasource;\n }\n\n setDatasource(datasource: EsiDatasource | undefined): void {\n this.datasource = datasource;\n }\n\n getLanguage(): string | undefined {\n return this.language;\n }\n\n setLanguage(language: string | undefined): void {\n this.language = language;\n }\n\n getCompatibilityDate(): string | undefined {\n return this.compatibilityDate;\n }\n\n setCompatibilityDate(date: string | undefined): void {\n this.compatibilityDate = date;\n }\n\n setAccessToken(token: string): void {\n this.accessToken = token;\n }\n\n setTokenProvider(provider: TokenProvider | undefined): void {\n this.tokenProvider = provider;\n }\n\n getLogger(): ILogger | null {\n return this.logger;\n }\n\n setLogger(logger: ILogger | null): void {\n this.logger = logger;\n }\n\n hasTokenProvider(): boolean {\n return this.tokenProvider !== undefined;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n link: this.link,\n datasource: this.datasource,\n timeout: this.timeout,\n hasCache: this.cache !== null,\n hasRateLimiter: this.rateLimiter !== null,\n hasCircuitBreaker: this.circuitBreaker !== null,\n hasDeduplicator: this.deduplicator !== null,\n hasTokenProvider: this.tokenProvider !== undefined,\n validateResponse: this.validateResponse,\n validateRequest: this.validateRequest,\n language: this.language,\n compatibilityDate: this.compatibilityDate,\n };\n }\n\n async refreshToken(): Promise<string> {\n if (!this.tokenProvider) {\n throw new Error('No token provider configured');\n }\n\n if (this.refreshInFlight) {\n return this.refreshInFlight;\n }\n\n this.refreshInFlight = this.tokenProvider().then(\n (token) => {\n this.accessToken = token;\n this.refreshInFlight = undefined;\n return token;\n },\n (err) => {\n this.refreshInFlight = undefined;\n throw err;\n },\n );\n\n return this.refreshInFlight;\n }\n}\n","import { createHash } from 'crypto';\nimport { ApiClient } from '../ApiClient';\n\n/**\n * Scope a key to the identity whose token the request carries.\n *\n * One client can serve more than one identity: `setAccessToken` and a\n * `tokenProvider` both replace the token in place. A path says nothing about\n * whose data comes back — `characters/{character_id}/online` answers\n * differently for every token that asks it — so any key that outlives a single\n * request has to carry the identity too, or one caller is served another's\n * data.\n *\n * The Authorization header is hashed rather than stored: keys reach logs and\n * diagnostics, and a bearer token should not.\n */\nfunction scopeToIdentity(\n key: string,\n client: ApiClient,\n requiresAuth: boolean,\n): string {\n if (!requiresAuth) return key;\n const authHeader = client.getAuthorizationHeader();\n if (!authHeader) return key;\n const hash = createHash('sha256')\n .update(authHeader)\n .digest('hex')\n .slice(0, 16);\n return `${hash}:${key}`;\n}\n\n/** The ETag cache key for a request: its URL, scoped to the identity. */\nexport function buildCacheKey(\n url: string,\n client: ApiClient,\n requiresAuth: boolean = false,\n): string {\n return scopeToIdentity(url, client, requiresAuth);\n}\n\n/**\n * The deduplication key for an in-flight request: its endpoint, scoped to the\n * identity.\n *\n * Coalescing has to draw the same line the cache does. Two concurrent GETs to\n * one authenticated endpoint under different tokens are two different\n * questions, and answering both from one response hands one caller the other\n * identity's data.\n */\nexport function buildDedupeKey(\n endpoint: string,\n client: ApiClient,\n requiresAuth: boolean = false,\n): string {\n return scopeToIdentity(endpoint, client, requiresAuth);\n}\n","export const PACKAGE_NAME = 'esi.ts';\nexport const PACKAGE_VERSION = '10.2.0'; // x-release-please-version\nexport const USER_AGENT = `${PACKAGE_NAME}/${PACKAGE_VERSION}`;\nexport const COMPATIBILITY_DATE = '2026-05-19';\n","import { ApiClient } from '../ApiClient';\nimport { buildError } from '../util/error';\nimport { logDebug } from '../logger/clientLog';\nimport { ICache } from '../cache/ICache';\nimport { buildCacheKey } from '../cache/cacheKey';\nimport { USER_AGENT, COMPATIBILITY_DATE } from '../constants';\n\n/**\n * Parse Cache-Control header to extract max-age TTL in milliseconds.\n */\nexport const parseCacheControlTtl = (\n headers: Record<string, string>,\n): number | undefined => {\n const cacheControl = headers['cache-control'] ?? headers['Cache-Control'];\n if (!cacheControl) return undefined;\n const match = /max-age=(\\d+)/.exec(cacheControl);\n return match ? parseInt(match[1]!, 10) * 1000 : undefined;\n};\n\n/**\n * Build the request headers for an ESI API call.\n */\nexport function buildRequestHeaders(\n client: ApiClient,\n url: string,\n method: string,\n requiresAuth: boolean,\n useETag: boolean,\n body: unknown,\n resolveCache: (client: ApiClient) => ICache | null,\n): HeadersInit {\n const headers: HeadersInit = {\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'User-Agent': USER_AGENT,\n 'X-Compatibility-Date': client.getCompatibilityDate() ?? COMPATIBILITY_DATE,\n };\n\n const language = client.getLanguage();\n if (language) {\n headers['Accept-Language'] = language;\n }\n\n if (requiresAuth) {\n const authHeader = client.getAuthorizationHeader();\n if (!authHeader) {\n throw buildError(\n [\n 'Authorization header is required for this endpoint but no access token is configured',\n 'Fix: set ESI_ACCESS_TOKEN in your environment (see .env.example), or call client.setAccessToken(token), or pass accessToken to the EsiClient constructor',\n ].join(' — '),\n 'NO_AUTH_TOKEN',\n );\n }\n headers['Authorization'] = authHeader;\n }\n\n const cache = resolveCache(client);\n if (useETag && method === 'GET' && cache) {\n const key = buildCacheKey(url, client, requiresAuth);\n const cachedETag = cache.getETag(key);\n if (cachedETag) {\n headers['If-None-Match'] = cachedETag;\n logDebug(client, `Adding If-None-Match header: ${cachedETag}`, {\n etag: cachedETag,\n });\n }\n }\n\n if (body) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n}\n","export function camelToSnake(s: string): string {\n return s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);\n}\n","// Auto-generated from ESI OpenAPI spec — do not edit manually\n// Compatibility date: 2026-05-19\n// Endpoints with cache TTLs: 136\n\nexport const esiCacheTtls: Record<string, number> = {\n 'GET:alliances': 3600,\n 'GET:alliances/{alliance_id}': 3600,\n 'GET:alliances/{alliance_id}/contacts': 300,\n 'GET:alliances/{alliance_id}/contacts/labels': 300,\n 'GET:alliances/{alliance_id}/corporations': 3600,\n 'GET:characters/{character_id}': 86400,\n 'GET:characters/{character_id}/access-lists': 300,\n 'GET:characters/{character_id}/access-lists/{access_list_id}': 300,\n 'GET:characters/{character_id}/agents_research': 3600,\n 'GET:characters/{character_id}/assets': 3600,\n 'GET:characters/{character_id}/attributes': 120,\n 'GET:characters/{character_id}/blueprints': 3600,\n 'GET:characters/{character_id}/calendar': 5,\n 'GET:characters/{character_id}/calendar/{event_id}': 5,\n 'PUT:characters/{character_id}/calendar/{event_id}': 5,\n 'GET:characters/{character_id}/calendar/{event_id}/attendees': 600,\n 'GET:characters/{character_id}/clones': 120,\n 'GET:characters/{character_id}/contacts': 300,\n 'GET:characters/{character_id}/contacts/labels': 300,\n 'GET:characters/{character_id}/contracts': 300,\n 'GET:characters/{character_id}/contracts/{contract_id}/bids': 300,\n 'GET:characters/{character_id}/contracts/{contract_id}/items': 3600,\n 'GET:characters/{character_id}/corporationhistory': 86400,\n 'GET:characters/{character_id}/fatigue': 300,\n 'GET:characters/{character_id}/fittings': 300,\n 'GET:characters/{character_id}/fleet': 60,\n 'GET:characters/{character_id}/freelance-jobs': 60,\n 'GET:characters/{character_id}/freelance-jobs/{job_id}/participation': 60,\n 'GET:characters/{character_id}/implants': 120,\n 'GET:characters/{character_id}/industry/jobs': 300,\n 'GET:characters/{character_id}/killmails/recent': 300,\n 'GET:characters/{character_id}/location': 5,\n 'GET:characters/{character_id}/loyalty/points': 3600,\n 'GET:characters/{character_id}/mail': 30,\n 'GET:characters/{character_id}/mail/{mail_id}': 30,\n 'GET:characters/{character_id}/mail/labels': 30,\n 'GET:characters/{character_id}/mail/lists': 120,\n 'GET:characters/{character_id}/medals': 3600,\n 'GET:characters/{character_id}/mercenary-tactical-operations': 300,\n 'GET:characters/{character_id}/mercenary-tactical-operations/{operation_id}': 300,\n 'GET:characters/{character_id}/mining': 600,\n 'GET:characters/{character_id}/notifications': 600,\n 'GET:characters/{character_id}/notifications/contacts': 600,\n 'GET:characters/{character_id}/online': 60,\n 'GET:characters/{character_id}/orders': 1200,\n 'GET:characters/{character_id}/orders/history': 3600,\n 'GET:characters/{character_id}/planets': 600,\n 'GET:characters/{character_id}/planets/{planet_id}': 600,\n 'GET:characters/{character_id}/roles': 3600,\n 'GET:characters/{character_id}/search': 3600,\n 'GET:characters/{character_id}/ship': 5,\n 'GET:characters/{character_id}/skillqueue': 60,\n 'GET:characters/{character_id}/skills': 60,\n 'GET:characters/{character_id}/standings': 3600,\n 'GET:characters/{character_id}/structures/mercenary-dens': 3600,\n 'GET:characters/{character_id}/structures/mercenary-dens/{mercenary_den_id}': 3600,\n 'GET:characters/{character_id}/titles': 3600,\n 'GET:characters/{character_id}/wallet': 120,\n 'GET:characters/{character_id}/wallet/journal': 3600,\n 'GET:characters/{character_id}/wallet/transactions': 3600,\n 'POST:characters/affiliation': 3600,\n 'GET:contracts/public/{region_id}': 1800,\n 'GET:contracts/public/bids/{contract_id}': 300,\n 'GET:contracts/public/items/{contract_id}': 3600,\n 'GET:corporation/{corporation_id}/mining/extractions': 1800,\n 'GET:corporation/{corporation_id}/mining/observers': 3600,\n 'GET:corporation/{corporation_id}/mining/observers/{observer_id}': 3600,\n 'GET:corporations/{corporation_id}': 3600,\n 'GET:corporations/{corporation_id}/alliancehistory': 3600,\n 'GET:corporations/{corporation_id}/assets': 3600,\n 'GET:corporations/{corporation_id}/blueprints': 3600,\n 'GET:corporations/{corporation_id}/contacts': 300,\n 'GET:corporations/{corporation_id}/contacts/labels': 300,\n 'GET:corporations/{corporation_id}/containers/logs': 600,\n 'GET:corporations/{corporation_id}/contracts': 300,\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/bids': 3600,\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/items': 3600,\n 'GET:corporations/{corporation_id}/customs_offices': 3600,\n 'GET:corporations/{corporation_id}/divisions': 3600,\n 'GET:corporations/{corporation_id}/facilities': 3600,\n 'GET:corporations/{corporation_id}/icons': 3600,\n 'GET:corporations/{corporation_id}/industry/jobs': 300,\n 'GET:corporations/{corporation_id}/killmails/recent': 300,\n 'GET:corporations/{corporation_id}/medals': 3600,\n 'GET:corporations/{corporation_id}/medals/issued': 3600,\n 'GET:corporations/{corporation_id}/members': 3600,\n 'GET:corporations/{corporation_id}/members/limit': 3600,\n 'GET:corporations/{corporation_id}/members/titles': 3600,\n 'GET:corporations/{corporation_id}/membertracking': 3600,\n 'GET:corporations/{corporation_id}/orders': 1200,\n 'GET:corporations/{corporation_id}/orders/history': 3600,\n 'GET:corporations/{corporation_id}/projects/{project_id}': 60,\n 'GET:corporations/{corporation_id}/projects/{project_id}/contribution/{character_id}': 60,\n 'GET:corporations/{corporation_id}/roles': 3600,\n 'GET:corporations/{corporation_id}/roles/history': 3600,\n 'GET:corporations/{corporation_id}/shareholders': 3600,\n 'GET:corporations/{corporation_id}/standings': 3600,\n 'GET:corporations/{corporation_id}/starbases': 3600,\n 'GET:corporations/{corporation_id}/starbases/{starbase_id}': 3600,\n 'GET:corporations/{corporation_id}/structures': 3600,\n 'GET:corporations/{corporation_id}/structures/skyhooks': 3600,\n 'GET:corporations/{corporation_id}/structures/skyhooks/{skyhook_id}': 3600,\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs': 3600,\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs/{sovereignty_hub_id}': 3600,\n 'GET:corporations/{corporation_id}/titles': 3600,\n 'GET:corporations/{corporation_id}/wallets': 300,\n 'GET:corporations/{corporation_id}/wallets/{division}/journal': 3600,\n 'GET:corporations/{corporation_id}/wallets/{division}/transactions': 3600,\n 'GET:fleets/{fleet_id}': 5,\n 'GET:fleets/{fleet_id}/members': 5,\n 'GET:fleets/{fleet_id}/wings': 5,\n 'GET:freelance-jobs/{job_id}': 60,\n 'GET:fw/systems': 1800,\n 'GET:incursions': 300,\n 'GET:industry/facilities': 3600,\n 'GET:industry/systems': 3600,\n 'GET:insurance/prices': 3600,\n 'GET:killmails/{killmail_id}/{killmail_hash}': 2592000,\n 'GET:markets/{region_id}/orders': 300,\n 'GET:markets/{region_id}/types': 600,\n 'GET:markets/prices': 3600,\n 'GET:markets/structures/{structure_id}': 300,\n 'GET:meta/changelog': 600,\n 'GET:meta/compatibility-dates': 600,\n 'GET:skyhooks/raidable': 300,\n 'GET:sovereignty/campaigns': 5,\n 'GET:sovereignty/systems': 300,\n 'GET:status': 30,\n 'GET:universe/schematics/{schematic_id}': 3600,\n 'GET:universe/structures': 3600,\n 'GET:universe/structures/{structure_id}': 3600,\n 'GET:universe/system_jumps': 3600,\n 'GET:universe/system_kills': 3600,\n 'GET:wars': 3600,\n 'GET:wars/{war_id}': 3600,\n 'GET:wars/{war_id}/killmails': 3600,\n};\n","import { ApiClient } from '../ApiClient';\nimport { logDebug } from '../logger/clientLog';\nimport { ICache } from '../cache/ICache';\nimport { buildCacheKey } from '../cache/cacheKey';\nimport { ParsedHeaders } from '../util/headersUtil';\nimport { camelToSnake } from '../util/stringUtil';\nimport { esiCacheTtls } from '../endpoints/esi-cache-ttls.generated';\nimport { parseCacheControlTtl } from './headers';\n\nexport interface EsiHandlerResponse {\n headers: Record<string, string>;\n body: unknown;\n status?: number;\n fromCache?: boolean;\n stale?: boolean;\n cacheHitType?: 'spec-ttl' | 'etag-304' | 'stale-on-error';\n responseTimeMs?: number;\n cursors?: import('../pagination/CursorPaginationHandler').CursorTokens;\n}\n\n/**\n * How long a cached entry is kept after its freshness TTL elapses. Past the\n * freshness TTL the entry is no longer served without a request, but it still\n * supplies the ETag for an `If-None-Match` revalidation and the body served\n * stale when ESI answers with a 5xx. One hour spans ESI's daily downtime. The\n * cache's `maxEntries` still bounds memory.\n */\nconst STALE_RETENTION_MS = 60 * 60 * 1000;\n\n/**\n * The lifetime to store an entry for: its freshness TTL plus the stale\n * retention window. Undefined when the response gave no freshness TTL, so the\n * cache applies its own `defaultTtl`.\n */\nfunction retentionTtl(freshnessTtlMs: number | undefined): number | undefined {\n return freshnessTtlMs === undefined\n ? undefined\n : freshnessTtlMs + STALE_RETENTION_MS;\n}\n\n/**\n * Look up the spec-defined cache TTL for a given method + template path.\n * Returns TTL in milliseconds, or undefined if not found.\n */\nexport function lookupSpecTtl(\n method: string,\n templatePath: string,\n): number | undefined {\n const normalized = templatePath\n .replace(/\\/$/, '')\n .replace(/\\{(\\w+)\\}/g, (_, name: string) => `{${camelToSnake(name)}}`);\n const key = `${method}:${normalized}`;\n const seconds = esiCacheTtls[key];\n return typeof seconds === 'number' ? seconds * 1000 : undefined;\n}\n\n/**\n * Attempt a spec-aware cache hit (TTL-based, no network request).\n */\nexport function trySpecAwareCacheHit(\n client: ApiClient,\n url: string,\n method: string,\n templatePath: string | undefined,\n resolveCache: (client: ApiClient) => ICache | null,\n requiresAuth: boolean = false,\n): EsiHandlerResponse | null {\n if (method !== 'GET' || !templatePath) return null;\n const specTtlMs = lookupSpecTtl(method, templatePath);\n if (!specTtlMs) return null;\n const cache = resolveCache(client);\n if (!cache) return null;\n const key = buildCacheKey(url, client, requiresAuth);\n const entry = cache.get(key);\n if (!entry) return null;\n const age = Date.now() - entry.timestamp;\n if (age < specTtlMs) {\n logDebug(\n client,\n `Spec-aware cache hit for ${url} (age=${Math.round(age / 1000)}s, ttl=${Math.round(specTtlMs / 1000)}s)`,\n { method, templatePath },\n );\n return {\n headers: entry.headers,\n body: entry.data,\n status: 200,\n fromCache: true,\n cacheHitType: 'spec-ttl',\n };\n }\n return null;\n}\n\n/** Whether the cache holds an unexpired entry for the URL. */\nexport function hasCachedEntry(\n client: ApiClient,\n url: string,\n resolveCache: (client: ApiClient) => ICache | null,\n requiresAuth: boolean = false,\n): boolean {\n const cache = resolveCache(client);\n return !!cache && cache.has(buildCacheKey(url, client, requiresAuth));\n}\n\n/**\n * Attempt to return a stale cached response (used on server errors).\n */\nexport function tryStaleCacheResponse(\n client: ApiClient,\n url: string,\n parsed: ParsedHeaders,\n resolveCache: (client: ApiClient) => ICache | null,\n requiresAuth: boolean = false,\n): EsiHandlerResponse | null {\n const cache = resolveCache(client);\n if (!cache) return null;\n const key = buildCacheKey(url, client, requiresAuth);\n const cachedEntry = cache.get(key);\n if (!cachedEntry) return null;\n return {\n headers: { ...cachedEntry.headers, ...parsed.raw },\n body: cachedEntry.data,\n status: 200,\n fromCache: true,\n stale: true,\n cacheHitType: 'stale-on-error',\n };\n}\n\n/**\n * Successful writes seen by a cache, so a read that was in flight when one of\n * them invalidated its path does not store the pre-write body afterwards.\n * `recent` keeps the last RECENT_WRITES paths; a read that outlived more\n * writes than that is treated as overtaken.\n */\ninterface WriteLog {\n generation: number;\n recent: { generation: number; path: string }[];\n}\n\nconst RECENT_WRITES = 64;\nconst writeLogs = new WeakMap<ICache, WriteLog>();\n\nfunction writeLogFor(cache: ICache): WriteLog {\n let log = writeLogs.get(cache);\n if (!log) {\n log = { generation: 0, recent: [] };\n writeLogs.set(cache, log);\n }\n return log;\n}\n\n/**\n * The client's write generation. Take it before sending a GET and pass it to\n * cacheResponse, which then declines to store the response if a write has\n * invalidated the same path since.\n */\nexport function currentWriteGeneration(\n client: ApiClient,\n resolveCache: (client: ApiClient) => ICache | null,\n): number {\n const cache = resolveCache(client);\n return cache ? writeLogFor(cache).generation : 0;\n}\n\nfunction invalidatedSince(\n cache: ICache,\n generation: number,\n key: string,\n): boolean {\n const log = writeLogFor(cache);\n if (log.generation === generation) return false;\n if (log.generation - generation > log.recent.length) return true;\n return log.recent.some(\n (write) => write.generation > generation && key.includes(write.path),\n );\n}\n\n/**\n * Cache a successful response, or invalidate cache for non-GET methods.\n * `sentAtWriteGeneration` (see currentWriteGeneration) skips storing a GET\n * response whose path a write invalidated while the request was in flight.\n */\nexport function cacheResponse(\n client: ApiClient,\n url: string,\n method: string,\n endpoint: string,\n parsed: ParsedHeaders,\n data: unknown,\n useETag: boolean,\n resolveCache: (client: ApiClient) => ICache | null,\n templatePath?: string,\n requiresAuth: boolean = false,\n sentAtWriteGeneration?: number,\n): void {\n const cache = resolveCache(client);\n if (useETag && method === 'GET' && cache && parsed.etag) {\n const key = buildCacheKey(url, client, requiresAuth);\n if (\n sentAtWriteGeneration !== undefined &&\n invalidatedSince(cache, sentAtWriteGeneration, key)\n ) {\n logDebug(\n client,\n `Not caching ${url}: a write invalidated it while the request was in flight`,\n { method },\n );\n return;\n }\n const headerTtl = parseCacheControlTtl(parsed.raw);\n const specTtlMs = templatePath\n ? lookupSpecTtl(method, templatePath)\n : undefined;\n const freshnessTtl = specTtlMs ?? headerTtl;\n const ttl = retentionTtl(freshnessTtl);\n cache.set(key, parsed.etag, data, parsed.raw, ttl);\n const ttlInfo =\n freshnessTtl !== undefined\n ? ` (ttl=${freshnessTtl}ms, kept for ${ttl}ms)`\n : '';\n logDebug(\n client,\n `Cached response for ${url} with ETag ${parsed.etag}${ttlInfo}`,\n {\n method,\n etag: parsed.etag,\n },\n );\n }\n\n invalidateAfterWrite(client, method, endpoint, resolveCache);\n}\n\n/**\n * Evict the cached copy of a response the caller rejected. `executeRequest`\n * caches a GET body before `createClient` validates it, so a body that fails\n * the endpoint's schema would otherwise be served again, from the spec TTL or\n * after a 304, until the entry expired.\n */\nexport function evictRejectedResponse(\n client: ApiClient,\n endpoint: string,\n requiresAuth: boolean,\n resolveCache: (client: ApiClient) => ICache | null,\n): void {\n const cache = resolveCache(client);\n if (!cache) return;\n const url = `${client.getLink()}/${endpoint}`;\n if (cache.delete(buildCacheKey(url, client, requiresAuth))) {\n logDebug(\n client,\n `Evicted cached response for ${url} after it failed validation`,\n );\n }\n}\n\n/**\n * Evict cached reads under the endpoint's path after a successful write, so a\n * read that follows a POST/PUT/DELETE fetches rather than serving the\n * pre-write copy. Called for every 2xx status, including the body-less\n * 201/204 replies that return before a response is cached.\n */\nexport function invalidateAfterWrite(\n client: ApiClient,\n method: string,\n endpoint: string,\n resolveCache: (client: ApiClient) => ICache | null,\n): void {\n if (method === 'GET') return;\n const path = endpoint.split('?')[0]!;\n\n // Before the cache, and whether or not there is one: a read that starts\n // after this write must not be handed the response to a read that started\n // before it. Deduplication would do exactly that, because its key is the\n // path and the path has not changed.\n client.getDeduplicator()?.detachByPath?.(path);\n\n const cache = resolveCache(client);\n if (cache) {\n cache.deleteByPath(path);\n const log = writeLogFor(cache);\n log.generation += 1;\n log.recent.push({ generation: log.generation, path });\n if (log.recent.length > RECENT_WRITES) log.recent.shift();\n }\n}\n","import { ApiClient } from '../ApiClient';\nimport { EsiError } from '../util/error';\nimport { logInfo, logWarn, logError } from '../logger/clientLog';\nimport { ICache } from '../cache/ICache';\nimport { buildCacheKey } from '../cache/cacheKey';\nimport { ParsedHeaders } from '../util/headersUtil';\nimport { CircuitOpenError } from '../circuitBreaker/CircuitBreaker';\nimport { buildError } from '../util/error';\nimport { tryStaleCacheResponse, EsiHandlerResponse } from './cachePolicy';\n\nexport const STATUS_MESSAGES: Record<number, string> = {\n 201: 'Created',\n 204: 'No Content',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Resource not found',\n 420: 'Error Limited',\n 422: 'Unprocessable Entity',\n 429: 'Too many requests',\n 500: 'Internal server error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 520: 'Internal server error, did the request terminate too soon?',\n};\n\n/**\n * The text an error status is reported with: the client's own message, else\n * the reason phrase, else `HTTP <status>`. HTTP/2 carries no reason phrase, so\n * `statusText` is empty for any status missing from STATUS_MESSAGES.\n */\nexport function statusMessage(response: Response): string {\n return (\n STATUS_MESSAGES[response.status] ||\n response.statusText ||\n `HTTP ${response.status}`\n );\n}\n\n/**\n * Handle early-return HTTP statuses (201, 204, 304).\n */\nexport function handleEarlyStatus(\n client: ApiClient,\n status: number,\n url: string,\n parsed: ParsedHeaders,\n useETag: boolean,\n resolveCache: (client: ApiClient) => ICache | null,\n requiresAuth: boolean = false,\n): EsiHandlerResponse | null {\n if (status === 201) {\n return { headers: parsed.raw, body: undefined, status: 201 };\n }\n\n if (status === 204) {\n logInfo(client, `No Content for endpoint: ${url}`, { status });\n return { headers: parsed.raw, body: undefined, status: 204 };\n }\n\n if (status === 304) {\n const cache = resolveCache(client);\n if (useETag && cache) {\n const key = buildCacheKey(url, client, requiresAuth);\n const cachedEntry = cache.get(key);\n if (cachedEntry) {\n logInfo(client, `Cache hit (304) for endpoint: ${url}`, {\n status,\n cacheHitType: 'etag-304',\n });\n const headers: Record<string, string> = {\n ...cachedEntry.headers,\n ...parsed.raw,\n };\n // The stored ETag names the stored body. A concurrent request may have\n // replaced the entry after this one was sent with an older\n // If-None-Match, so the 304's own ETag can name a body the cache no\n // longer holds and must not overwrite the stored one.\n if ('etag' in parsed.raw) headers['etag'] = cachedEntry.etag;\n // A 304 confirms the stored body is current: store it again so its\n // freshness TTL, and the retention window after it, start over.\n cache.set(\n key,\n cachedEntry.etag,\n cachedEntry.data,\n headers,\n cachedEntry.ttl,\n );\n return {\n headers,\n body: cachedEntry.data,\n status: 304,\n fromCache: true,\n cacheHitType: 'etag-304',\n };\n }\n }\n throw new EsiError(\n 304,\n 'Not Modified — no cached data available',\n url,\n parsed.requestId ?? undefined,\n );\n }\n\n return null;\n}\n\nconst MAX_REASON_LENGTH = 200;\n\n/**\n * The reason ESI gives for an error, from its `{ \"error\": \"...\" }` body.\n * Undefined for any other body. Consumes the response body.\n */\nexport async function readEsiErrorReason(\n response: Response,\n): Promise<string | undefined> {\n try {\n const parsed = JSON.parse(await response.text()) as unknown;\n const reason =\n typeof parsed === 'object' && parsed !== null\n ? (parsed as { error?: unknown }).error\n : undefined;\n if (typeof reason !== 'string') return undefined;\n const trimmed = reason.trim();\n return trimmed ? trimmed.slice(0, MAX_REASON_LENGTH) : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Handle error HTTP responses (4xx, 5xx). May serve stale cache on 5xx.\n * `esiReason` (see readEsiErrorReason) is appended to the status message.\n */\nexport function handleErrorResponse(\n client: ApiClient,\n response: Response,\n url: string,\n parsed: ParsedHeaders,\n useETag: boolean,\n resolveCache: (client: ApiClient) => ICache | null,\n requiresAuth: boolean = false,\n esiReason?: string,\n): EsiHandlerResponse | never {\n const text = statusMessage(response);\n const errorMessage = esiReason ? `${text}: ${esiReason}` : text;\n\n if (response.status >= 500 && useETag) {\n const staleResult = tryStaleCacheResponse(\n client,\n url,\n parsed,\n resolveCache,\n requiresAuth,\n );\n if (staleResult) {\n logWarn(client, `${errorMessage} for ${url} — serving stale cache`, {\n status: response.status,\n });\n return { ...staleResult, status: response.status };\n }\n }\n\n if (response.status === 420 || response.status === 429) {\n logWarn(client, `Rate limited (${response.status}) on ${url}`, {\n status: response.status,\n });\n }\n\n let message = errorMessage;\n if (response.status === 401) {\n message = `${errorMessage} — the access token was missing, expired, or lacks the required ESI scope. Fix: verify ESI_ACCESS_TOKEN, or configure onTokenRefresh for automatic refresh on 401`;\n } else if (response.status === 403) {\n message = `${errorMessage} — your access token does not have the OAuth scopes required for this endpoint. Check the scopes on your EVE SSO application`;\n }\n\n throw new EsiError(\n response.status,\n message,\n url,\n parsed.requestId ?? undefined,\n );\n}\n\n/**\n * Wrap an unknown error into an EsiError or rethrow known errors.\n */\nexport function wrapError(error: unknown, client?: ApiClient): never {\n if (error instanceof EsiError || error instanceof CircuitOpenError) {\n throw error;\n }\n if (error instanceof Error) {\n logError(client, `Unexpected error: ${error.message}`);\n throw buildError(error.message, 'ESIJS_ERROR');\n }\n logError(client, `Unexpected error: ${String(error)}`);\n throw buildError(String(error), 'ESIJS_ERROR');\n}\n","export interface RetryConfig {\n maxRetries?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n retryMutations?: boolean;\n}\n\nexport function retryDelay(\n attempt: number,\n baseMs: number,\n maxMs: number,\n): number {\n // 2^attempt overflows to Infinity from attempt 1024, and 0 × Infinity is NaN.\n const exponential = baseMs === 0 ? 0 : baseMs * Math.pow(2, attempt);\n // eslint-disable-next-line sonarjs/pseudo-random\n const jitter = exponential * (0.75 + Math.random() * 0.5);\n return Math.min(jitter, maxMs);\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { ApiClient } from './ApiClient';\nimport { EsiError } from './util/error';\nimport { CircuitOpenError } from './circuitBreaker/CircuitBreaker';\nimport { RetryConfig, retryDelay } from './util/retry';\nimport { sleep } from './util/sleep';\nimport { logInfo, logWarn, logError } from './logger/clientLog';\nimport { buildError } from './util/error';\nimport { IRetryStrategy } from './IRetryStrategy';\n\nexport interface RetryContext {\n client?: ApiClient;\n endpoint: string;\n method: string;\n requiresAuth: boolean;\n refreshToken?: () => Promise<void>;\n /** @deprecated Unused — after refresh the strategy re-enters the main operation loop. */\n retryOperation?: () => Promise<unknown>;\n}\n\nexport class RetryStrategy implements IRetryStrategy {\n private readonly maxRetries: number;\n private readonly baseDelayMs: number;\n private readonly maxDelayMs: number;\n private readonly retryMutations: boolean;\n\n constructor(config?: RetryConfig) {\n this.maxRetries = config?.maxRetries ?? 0;\n this.baseDelayMs = config?.baseDelayMs ?? 1000;\n this.maxDelayMs = config?.maxDelayMs ?? 30000;\n this.retryMutations = config?.retryMutations ?? false;\n }\n\n async execute<T>(\n operation: () => Promise<T>,\n context: RetryContext,\n ): Promise<T> {\n const canRetryMethod = context.method === 'GET' || this.retryMutations;\n\n let lastError: unknown;\n let refreshAttempted = false;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error: unknown) {\n if (error instanceof CircuitOpenError) {\n throw error;\n }\n\n if (\n !refreshAttempted &&\n error instanceof EsiError &&\n error.statusCode === 401 &&\n context.requiresAuth &&\n context.refreshToken\n ) {\n refreshAttempted = true;\n logInfo(context.client, 'Received 401, attempting token refresh...', {\n endpoint: context.endpoint,\n });\n try {\n await context.refreshToken();\n } catch (refreshError: unknown) {\n if (\n refreshError instanceof EsiError ||\n refreshError instanceof CircuitOpenError\n ) {\n throw refreshError;\n }\n const msg =\n refreshError instanceof Error\n ? refreshError.message\n : String(refreshError);\n logError(context.client, `Token refresh failed: ${msg}`, {\n endpoint: context.endpoint,\n });\n throw buildError(\n `Token refresh failed: ${msg}`,\n 'TOKEN_REFRESH_FAILED',\n );\n }\n logInfo(context.client, 'Token refreshed, retrying request', {\n endpoint: context.endpoint,\n });\n // Re-enter the loop so post-refresh failures use normal retry/error handling\n // (and are never mislabeled as TOKEN_REFRESH_FAILED).\n attempt--;\n continue;\n }\n\n if (\n error instanceof EsiError &&\n error.retryable &&\n canRetryMethod &&\n attempt < this.maxRetries\n ) {\n const delay = retryDelay(attempt, this.baseDelayMs, this.maxDelayMs);\n logWarn(\n context.client,\n `Request to ${context.endpoint} failed (${error.statusCode}), retrying in ${Math.round(delay)}ms (attempt ${attempt + 1}/${this.maxRetries})`,\n { method: context.method, statusCode: error.statusCode },\n );\n await sleep(delay);\n lastError = error;\n continue;\n }\n\n throw error;\n }\n }\n\n throw lastError;\n }\n}\n","import { ApiClient } from '../ApiClient';\nimport { buildError } from '../util/error';\nimport { ICache } from '../cache/ICache';\nimport { IRateLimiter } from '../rateLimiter/IRateLimiter';\nimport { ICircuitBreaker } from '../circuitBreaker/ICircuitBreaker';\nimport { IRetryStrategy } from '../IRetryStrategy';\nimport { RetryStrategy } from '../RetryStrategy';\n\nexport function resolveCache(client: ApiClient): ICache | null {\n return client.getCache();\n}\n\nexport function resolveRateLimiter(client: ApiClient): IRateLimiter {\n const limiter = client.getRateLimiter();\n if (!limiter) {\n throw buildError(\n 'No rate limiter configured on ApiClient. ' +\n 'Set one via apiClient.setRateLimiter(new RateLimiter()).',\n 'CONFIGURATION_ERROR',\n );\n }\n return limiter;\n}\n\nexport function resolveCircuitBreaker(\n client: ApiClient,\n): ICircuitBreaker | null {\n return client.getCircuitBreaker();\n}\n\nexport function resolveRetryStrategy(client: ApiClient): IRetryStrategy {\n return (\n client.getRetryStrategy() ??\n new RetryStrategy(client.getRetryConfig() ?? undefined)\n );\n}\n","/**\n * Pagination Handler for ESI API calls\n * Handles pagination with proper error handling and empty page detection\n */\n\nimport { ApiClient } from '../ApiClient';\nimport { logInfo, logWarn, logError } from '../logger/clientLog';\nimport { resolveRetryStrategy } from '../requestPipeline/dependencies';\n\nexport interface PaginationOptions {\n maxPages?: number;\n stopOnEmptyPage?: boolean;\n}\n\nexport type PageFetcher = (paginatedEndpoint: string) => Promise<unknown[]>;\n\nexport class PaginationHandler {\n private static readonly DEFAULT_OPTIONS: Required<PaginationOptions> = {\n maxPages: 1000,\n stopOnEmptyPage: true,\n };\n\n /**\n * Fetch remaining pages (2..totalPages) and combine with first page data.\n * The caller has already fetched page 1 and knows the total page count.\n */\n static async fetchRemainingPages(\n client: ApiClient,\n endpoint: string,\n method: string,\n requiresAuth: boolean,\n firstPageData: unknown[],\n totalPages: number,\n body: unknown,\n options: PaginationOptions,\n pageFetch: PageFetcher,\n templatePath?: string,\n ): Promise<unknown[]> {\n const opts = { ...this.DEFAULT_OPTIONS, ...options };\n const rateLimiter = client.getRateLimiter();\n const allData: unknown[] = [...firstPageData];\n\n const effectiveMaxPage = Math.min(totalPages, opts.maxPages);\n\n if (effectiveMaxPage <= 1) {\n return allData;\n }\n\n logInfo(client, `Fetching pages 2-${effectiveMaxPage} for ${endpoint}...`, {\n method,\n totalPages,\n });\n\n for (let page = 2; page <= effectiveMaxPage; page++) {\n try {\n if (rateLimiter) await rateLimiter.checkRateLimit(templatePath, method);\n\n const pageData = await this.fetchPageWithRetry(\n client,\n endpoint,\n method,\n requiresAuth,\n page,\n pageFetch,\n );\n\n if (opts.stopOnEmptyPage && (!pageData || pageData.length === 0)) {\n logWarn(client, `Page ${page} is empty. Stopping pagination.`, {\n page,\n });\n break;\n }\n\n allData.push(...pageData);\n logInfo(\n client,\n `Fetched page ${page}/${effectiveMaxPage} (${pageData.length} items)`,\n { page, items: pageData.length },\n );\n } catch (error) {\n logError(\n client,\n `Failed to fetch page ${page}: ${error instanceof Error ? error.message : String(error)}`,\n { page },\n );\n throw error instanceof Error\n ? error\n : new Error(`Failed to fetch page ${page}: ${String(error)}`);\n }\n }\n\n logInfo(\n client,\n `Pagination complete. Fetched ${allData.length} total items from up to ${effectiveMaxPage} pages.`,\n { totalItems: allData.length },\n );\n return allData;\n }\n\n /**\n * Fetch a single page with retry logic.\n *\n * Delegates to the configured `IRetryStrategy` (exponential backoff\n * with jitter) instead of implementing a custom retry loop.\n */\n private static async fetchPageWithRetry(\n client: ApiClient,\n endpoint: string,\n method: string,\n requiresAuth: boolean,\n page: number,\n pageFetch: PageFetcher,\n ): Promise<unknown[]> {\n const retryStrategy = resolveRetryStrategy(client);\n const paginatedEndpoint = this.buildPaginatedEndpoint(endpoint, page);\n\n return retryStrategy.execute(\n () => {\n logInfo(\n client,\n `Fetching page ${page} via pipeline: ${paginatedEndpoint}`,\n { page },\n );\n return pageFetch(paginatedEndpoint);\n },\n {\n client,\n endpoint: paginatedEndpoint,\n method,\n requiresAuth,\n refreshToken: client.hasTokenProvider()\n ? () => client.refreshToken().then(() => {})\n : undefined,\n },\n );\n }\n\n /**\n * Build a paginated endpoint path.\n * Preserves any existing query params on the endpoint and appends page=N.\n */\n private static buildPaginatedEndpoint(\n endpoint: string,\n page: number,\n ): string {\n const separator = endpoint.includes('?') ? '&' : '?';\n return `${endpoint}${separator}page=${page}`;\n }\n}\n","import { ApiClient } from '../ApiClient';\nimport { buildError, EsiError } from '../util/error';\nimport { logInfo, logWarn } from '../logger/clientLog';\nimport { ParsedHeaders } from '../util/headersUtil';\nimport {\n PaginationHandler,\n PageFetcher,\n} from '../pagination/PaginationHandler';\nimport { CursorTokens } from '../pagination/CursorPaginationHandler';\nimport { CircuitOpenError } from '../circuitBreaker/CircuitBreaker';\nimport { ICache } from '../cache/ICache';\nimport { cacheResponse, EsiHandlerResponse } from './cachePolicy';\n\n/**\n * Handle cursor-based pagination. Returns null if the response\n * does not contain cursor pagination headers.\n */\nexport function handleCursorPagination(\n parsed: ParsedHeaders,\n data: unknown,\n): EsiHandlerResponse | null {\n if (!parsed.hasCursorPagination) return null;\n\n const cursors: CursorTokens = {\n before: parsed.cursorBefore,\n after: parsed.cursorAfter,\n };\n\n return { headers: parsed.raw, body: data, status: 200, cursors };\n}\n\n/**\n * Handle offset-based pagination. Fetches remaining pages if xPages > 1.\n */\nexport async function handleOffsetPagination(\n client: ApiClient,\n endpoint: string,\n method: string,\n requiresAuth: boolean,\n parsed: ParsedHeaders,\n data: unknown,\n body: unknown,\n url: string,\n useETag: boolean,\n pageFetch: PageFetcher,\n resolveCache: (client: ApiClient) => ICache | null,\n templatePath?: string,\n sentAtWriteGeneration?: number,\n): Promise<EsiHandlerResponse> {\n const totalPages = parsed.xPages;\n\n if (totalPages <= 1) {\n return { headers: parsed.raw, body: data, status: 200 };\n }\n\n logInfo(\n client,\n `Found ${totalPages} pages, fetching additional pages with rate limiting...`,\n { endpoint, totalPages },\n );\n\n try {\n const firstPageData = Array.isArray(data) ? data : [data];\n const allData = await PaginationHandler.fetchRemainingPages(\n client,\n endpoint,\n method,\n requiresAuth,\n firstPageData,\n totalPages,\n body,\n {\n maxPages: Math.min(totalPages, 1000),\n stopOnEmptyPage: true,\n },\n pageFetch,\n templatePath,\n );\n\n cacheResponse(\n client,\n url,\n method,\n endpoint,\n parsed,\n allData,\n useETag,\n resolveCache,\n templatePath,\n requiresAuth,\n sentAtWriteGeneration,\n );\n return { headers: parsed.raw, body: allData, status: 200 };\n } catch (paginationError: unknown) {\n const msg =\n paginationError instanceof Error\n ? paginationError.message\n : String(paginationError);\n logWarn(client, `Pagination failed for ${url}: ${msg}`, {\n url,\n endpoint,\n error: msg,\n });\n if (\n paginationError instanceof EsiError ||\n paginationError instanceof CircuitOpenError\n ) {\n throw paginationError;\n }\n throw buildError(\n `Pagination incomplete for ${url}: ${msg}`,\n 'PAGINATION_INCOMPLETE',\n url,\n );\n }\n}\n","import { ApiClient } from '../ApiClient';\nimport { RequestContext, ResponseContext } from '../middleware/Middleware';\nimport { EsiHandlerResponse } from './cachePolicy';\n\n/**\n * Apply request interceptors from the middleware pipeline.\n */\nexport async function applyRequestMiddleware(\n client: ApiClient,\n url: string,\n endpoint: string,\n method: string,\n headers: Record<string, string>,\n body: unknown,\n): Promise<{ url: string; headers: Record<string, string>; body: unknown }> {\n const middleware = client.getMiddleware();\n if (!middleware.hasInterceptors()) {\n return { url, headers, body };\n }\n const reqCtx: RequestContext = {\n url,\n endpoint,\n method,\n headers: { ...headers },\n body,\n };\n const modified = await middleware.applyRequestInterceptors(reqCtx);\n return {\n url: modified.url,\n headers: modified.headers,\n body: modified.body,\n };\n}\n\n/**\n * Apply response interceptors from the middleware pipeline.\n */\nexport async function applyResponseInterceptors(\n client: ApiClient,\n result: EsiHandlerResponse,\n url: string,\n endpoint: string,\n method: string,\n startTime: number,\n): Promise<EsiHandlerResponse> {\n const middleware = client.getMiddleware();\n if (!middleware.hasInterceptors()) return result;\n\n const responseCtx: ResponseContext = {\n url,\n endpoint,\n method,\n status: result.status ?? 200,\n headers: result.headers,\n body: result.body,\n durationMs: Date.now() - startTime,\n fromCache: result.fromCache ?? false,\n };\n\n const modified = await middleware.applyResponseInterceptors(responseCtx);\n return {\n ...result,\n headers: modified.headers,\n body: modified.body,\n };\n}\n","export interface EsiWarning {\n code: number;\n message: string;\n}\n\nexport interface ParsedHeaders {\n raw: Record<string, string>;\n xPages: number;\n etag: string | null;\n cacheControl: string | null;\n expires: string | null;\n lastModified: string | null;\n cursorBefore: string | null;\n cursorAfter: string | null;\n hasCursorPagination: boolean;\n warning: EsiWarning | null;\n requestId: string | null;\n date: string | null;\n contentLanguage: string | null;\n}\n\nexport function parseWarning(\n value: string | null | undefined,\n): EsiWarning | null {\n if (!value) return null;\n const match =\n /^(\\d{3}) - \"([^\"]+)\"$/.exec(value) ??\n /^(\\d{3}) - ([^ ].+[^ ])$/.exec(value);\n if (!match) return null;\n const [, code, message] = match;\n return { code: parseInt(code!, 10), message: message! };\n}\n\nexport function parseHeaders(fetchHeaders: Headers): ParsedHeaders {\n const raw: Record<string, string> = {};\n fetchHeaders.forEach((value, key) => {\n raw[key.toLowerCase()] = value;\n });\n\n const cursorBefore = raw['x-cursor-before'] ?? null;\n const cursorAfter = raw['x-cursor-after'] ?? null;\n\n return {\n raw,\n xPages: parseInt(raw['x-pages'] ?? '1', 10),\n etag: raw['etag'] ?? null,\n cacheControl: raw['cache-control'] ?? null,\n expires: raw['expires'] ?? null,\n lastModified: raw['last-modified'] ?? null,\n cursorBefore,\n cursorAfter,\n hasCursorPagination: 'x-cursor-before' in raw || 'x-cursor-after' in raw,\n warning: parseWarning(raw['warning']),\n requestId: raw['x-esi-request-id'] ?? null,\n date: raw['date'] ?? null,\n contentLanguage: raw['content-language'] ?? null,\n };\n}\n","import { ApiClient } from '../ApiClient';\nimport { EsiError, TimeoutError } from '../util/error';\nimport { logInfo, logWarn, logError } from '../logger/clientLog';\nimport { parseHeaders, ParsedHeaders } from '../util/headersUtil';\nimport { ICache } from '../cache/ICache';\nimport { IRateLimiter } from '../rateLimiter/IRateLimiter';\nimport { ICircuitBreaker } from '../circuitBreaker/ICircuitBreaker';\nimport { buildError } from '../util/error';\nimport { buildRequestHeaders } from './headers';\nimport { applyRequestMiddleware } from './middlewareBridge';\nimport { readEsiErrorReason, statusMessage } from './statusHandling';\n\nexport interface RawFetchResult {\n response: Response;\n parsed: ParsedHeaders;\n url: string;\n}\n\nexport interface SingleFetchResult {\n data: unknown;\n parsed: ParsedHeaders;\n url: string;\n}\n\n/**\n * An abort from the request timer. Matched by name because DOMException is not\n * an `instanceof Error` in every runtime.\n */\nfunction isAbortError(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n (err as { name?: unknown }).name === 'AbortError'\n );\n}\n\n/**\n * A request that never produced an HTTP response (DNS, connection reset, TLS).\n * Status 0 makes it an EsiError like every other request failure, and\n * retryable for GET; the original error is kept as `cause`.\n */\nfunction networkError(err: unknown, url: string): EsiError {\n const reason = err instanceof Error ? err.message : String(err);\n return Object.assign(\n new EsiError(0, `Network request failed: ${reason}`, url),\n { cause: err },\n );\n}\n\n/**\n * Read the whole body while the request timer is still running, then let\n * `text()` and `json()` answer from that copy. Later stages read the body\n * after this function returns, when a stalled or reset stream would no longer\n * be under the timeout or classed as a network failure.\n */\nasync function bufferBody(response: Response): Promise<void> {\n if (typeof response.text !== 'function') return;\n const text = await response.text();\n Object.defineProperties(response, {\n text: { value: () => Promise.resolve(text), configurable: true },\n json: {\n value: () => Promise.resolve(text).then((t) => JSON.parse(t) as unknown),\n configurable: true,\n },\n });\n}\n\n/**\n * Execute a single HTTP fetch with rate limiting, circuit breaker, and timeout.\n */\nexport async function executeSingleFetch(\n client: ApiClient,\n endpoint: string,\n method: string,\n body: unknown,\n requiresAuth: boolean,\n useETag: boolean,\n resolveCache: (client: ApiClient) => ICache | null,\n resolveRateLimiter: (client: ApiClient) => IRateLimiter,\n resolveCircuitBreaker: (client: ApiClient) => ICircuitBreaker | null,\n requestTimeout?: number,\n templatePath?: string,\n): Promise<RawFetchResult> {\n const rawUrl = `${client.getLink()}/${endpoint}`;\n const builtHeaders = buildRequestHeaders(\n client,\n rawUrl,\n method,\n requiresAuth,\n useETag,\n body,\n resolveCache,\n ) as Record<string, string>;\n\n const req = await applyRequestMiddleware(\n client,\n rawUrl,\n endpoint,\n method,\n builtHeaders,\n body,\n );\n\n const options: RequestInit = {\n method,\n headers: req.headers,\n body: req.body ? JSON.stringify(req.body) : undefined,\n };\n\n const url = req.url;\n logInfo(client, `Hitting endpoint: ${url}`, { method, endpoint });\n\n const cb = resolveCircuitBreaker(client);\n const cbKey =\n cb && templatePath && cb.getKeyStrategy?.() === 'template'\n ? templatePath\n : endpoint;\n\n if (cb) cb.checkCircuit(cbKey);\n\n let cbRecorded = false;\n\n try {\n const rateLimiter = resolveRateLimiter(client);\n await rateLimiter.checkRateLimit(templatePath, method, req.headers);\n\n const timeoutMs = requestTimeout ?? client.getTimeout();\n const controller = new AbortController();\n const timer = globalThis.setTimeout(() => controller.abort(), timeoutMs);\n options.signal = controller.signal;\n\n let response: Response;\n try {\n response = await client.getFetch()(url, options);\n // The timeout covers the body as well as the headers, and a body that\n // fails to arrive is a network failure, not a malformed response.\n await bufferBody(response);\n } catch (err) {\n clearTimeout(timer);\n if (cb) {\n cb.recordFailure(cbKey, 0);\n cbRecorded = true;\n }\n if (isAbortError(err)) {\n throw new TimeoutError(timeoutMs, url);\n }\n throw networkError(err, url);\n }\n clearTimeout(timer);\n\n const parsed = parseHeaders(response.headers);\n\n rateLimiter.updateFromResponse(\n parsed.raw,\n response.status,\n templatePath,\n method,\n req.headers,\n );\n\n if (cb) {\n if (\n response.status >= 500 ||\n response.status === 420 ||\n response.status === 429\n ) {\n cb.recordFailure(cbKey, response.status);\n } else {\n cb.recordSuccess(cbKey);\n }\n cbRecorded = true;\n }\n\n if (parsed.warning) {\n logWarn(\n client,\n `ESI Warning ${parsed.warning.code}: ${parsed.warning.message}`,\n {\n url,\n warningCode: parsed.warning.code,\n },\n );\n }\n\n return { response, parsed, url };\n } finally {\n if (cb && !cbRecorded) {\n cb.recordFailure(cbKey, 0);\n }\n }\n}\n\n/**\n * Parse a JSON response body, throwing on parse failure.\n */\nexport async function parseJsonBody(\n client: ApiClient | null | undefined,\n response: Response,\n _url: string,\n): Promise<unknown> {\n try {\n return (await response.json()) as unknown;\n } catch (jsonError) {\n const msg =\n jsonError instanceof Error ? jsonError.message : String(jsonError);\n logError(client, `Failed to parse JSON response: ${msg}`, { url: _url });\n throw buildError(`Invalid JSON response: ${msg}`, 'JSON_PARSE_ERROR');\n }\n}\n\n/**\n * Fetch a single page: execute the fetch, check for errors, parse JSON.\n */\nexport async function fetchOnePage(\n client: ApiClient,\n endpoint: string,\n method: string,\n body: unknown,\n requiresAuth: boolean,\n useETag: boolean,\n resolveCache: (client: ApiClient) => ICache | null,\n resolveRateLimiter: (client: ApiClient) => IRateLimiter,\n resolveCircuitBreaker: (client: ApiClient) => ICircuitBreaker | null,\n requestTimeout?: number,\n templatePath?: string,\n): Promise<SingleFetchResult> {\n const { response, parsed, url } = await executeSingleFetch(\n client,\n endpoint,\n method,\n body,\n requiresAuth,\n useETag,\n resolveCache,\n resolveRateLimiter,\n resolveCircuitBreaker,\n requestTimeout,\n templatePath,\n );\n\n if (!response.ok) {\n const text = statusMessage(response);\n const reason = await readEsiErrorReason(response);\n throw new EsiError(\n response.status,\n reason ? `${text}: ${reason}` : text,\n url,\n parsed.requestId ?? undefined,\n );\n }\n\n const data = await parseJsonBody(client, response, url);\n return { data, parsed, url };\n}\n","import { ApiClient } from './ApiClient';\nimport { buildDedupeKey } from './cache/cacheKey';\n\nimport {\n trySpecAwareCacheHit,\n cacheResponse,\n currentWriteGeneration,\n hasCachedEntry,\n invalidateAfterWrite,\n handleEarlyStatus,\n handleErrorResponse,\n readEsiErrorReason,\n wrapError,\n handleCursorPagination,\n handleOffsetPagination,\n applyResponseInterceptors,\n executeSingleFetch,\n fetchOnePage,\n parseJsonBody,\n resolveCache,\n resolveRateLimiter,\n resolveCircuitBreaker,\n resolveRetryStrategy,\n} from './requestPipeline';\nexport type { EsiHandlerResponse } from './requestPipeline';\nimport type { EsiHandlerResponse } from './requestPipeline';\n\n// --- Main request orchestration ---\n\nconst executeRequest = async (\n client: ApiClient,\n endpoint: string,\n method: string,\n body?: unknown,\n requiresAuth: boolean = false,\n useETag: boolean = true,\n requestTimeout?: number,\n templatePath?: string,\n): Promise<EsiHandlerResponse> => {\n const startTime = Date.now();\n const finish = (r: EsiHandlerResponse) => {\n r.responseTimeMs = Date.now() - startTime;\n const rawUrl = `${client.getLink()}/${endpoint}`;\n return applyResponseInterceptors(\n client,\n r,\n rawUrl,\n endpoint,\n method,\n startTime,\n );\n };\n\n try {\n const writeGeneration = currentWriteGeneration(client, resolveCache);\n const revalidating =\n useETag &&\n method === 'GET' &&\n hasCachedEntry(\n client,\n `${client.getLink()}/${endpoint}`,\n resolveCache,\n requiresAuth,\n );\n const { response, parsed, url } = await executeSingleFetch(\n client,\n endpoint,\n method,\n body,\n requiresAuth,\n useETag,\n resolveCache,\n resolveRateLimiter,\n resolveCircuitBreaker,\n requestTimeout,\n templatePath,\n );\n\n if (response.status === 201 || response.status === 204) {\n invalidateAfterWrite(client, method, endpoint, resolveCache);\n }\n\n if (response.status === 201) {\n let data: unknown;\n try {\n data = (await response.json()) as unknown;\n } catch {\n data = undefined;\n }\n return finish({ headers: parsed.raw, body: data, status: 201 });\n }\n\n if (\n response.status === 304 &&\n revalidating &&\n !hasCachedEntry(client, url, resolveCache, requiresAuth)\n ) {\n // The entry this request revalidated left the cache while it was in\n // flight (a write to its path evicted it, or it expired), so the 304 has\n // no body to stand for. The repeat finds no entry, sends no\n // If-None-Match and gets the current representation.\n return await executeRequest(\n client,\n endpoint,\n method,\n body,\n requiresAuth,\n useETag,\n requestTimeout,\n templatePath,\n );\n }\n\n const earlyResult = handleEarlyStatus(\n client,\n response.status,\n url,\n parsed,\n useETag,\n resolveCache,\n requiresAuth,\n );\n if (earlyResult) return finish(earlyResult);\n\n if (!response.ok) {\n const staleOrThrow = handleErrorResponse(\n client,\n response,\n url,\n parsed,\n useETag,\n resolveCache,\n requiresAuth,\n await readEsiErrorReason(response),\n );\n return finish(staleOrThrow);\n }\n\n const data = await parseJsonBody(client, response, url);\n // A multi-page response is cached by handleOffsetPagination once every\n // page is in. Caching page 1 here would let a retried call revalidate\n // against page 1 alone and resolve with it after a 304.\n if (parsed.xPages <= 1 || parsed.hasCursorPagination) {\n cacheResponse(\n client,\n url,\n method,\n endpoint,\n parsed,\n data,\n useETag,\n resolveCache,\n templatePath,\n requiresAuth,\n writeGeneration,\n );\n }\n\n const cursorResult = handleCursorPagination(parsed, data);\n if (cursorResult) return finish(cursorResult);\n\n const pageFetch = async (paginatedEndpoint: string): Promise<unknown[]> => {\n const result = await fetchOnePage(\n client,\n paginatedEndpoint,\n method,\n body,\n requiresAuth,\n false,\n resolveCache,\n resolveRateLimiter,\n resolveCircuitBreaker,\n requestTimeout,\n templatePath,\n );\n return Array.isArray(result.data)\n ? (result.data as unknown[])\n : [result.data];\n };\n\n const paginatedResult = await handleOffsetPagination(\n client,\n endpoint,\n method,\n requiresAuth,\n parsed,\n data,\n body,\n url,\n useETag,\n pageFetch,\n resolveCache,\n templatePath,\n writeGeneration,\n );\n return finish(paginatedResult);\n } catch (error: unknown) {\n wrapError(error, client);\n }\n};\n\nexport const handleSinglePageRequest = async (\n client: ApiClient,\n endpoint: string,\n method: string,\n body?: unknown,\n requiresAuth: boolean = false,\n templatePath?: string,\n requestTimeout?: number,\n): Promise<EsiHandlerResponse> => {\n const doExecute = () =>\n fetchOnePage(\n client,\n endpoint,\n method,\n body,\n requiresAuth,\n true,\n resolveCache,\n resolveRateLimiter,\n resolveCircuitBreaker,\n requestTimeout,\n templatePath,\n ).then(({ data, parsed }) => ({\n headers: parsed.raw,\n body: data,\n }));\n\n const retryStrategy = resolveRetryStrategy(client);\n\n return retryStrategy.execute<EsiHandlerResponse>(doExecute, {\n client,\n endpoint,\n method: 'GET',\n requiresAuth,\n refreshToken: client.hasTokenProvider()\n ? () => client.refreshToken().then(() => {})\n : undefined,\n });\n};\n\nexport const handleRequest = async (\n client: ApiClient,\n endpoint: string,\n method: string,\n body?: unknown,\n requiresAuth: boolean = false,\n useETag: boolean = true,\n templatePath?: string,\n requestTimeout?: number,\n): Promise<EsiHandlerResponse> => {\n const rawUrl = `${client.getLink()}/${endpoint}`;\n const startTime = Date.now();\n const specCacheHit = (): Promise<EsiHandlerResponse> | null => {\n const hit = trySpecAwareCacheHit(\n client,\n rawUrl,\n method,\n templatePath,\n resolveCache,\n requiresAuth,\n );\n return hit\n ? applyResponseInterceptors(\n client,\n hit,\n rawUrl,\n endpoint,\n method,\n startTime,\n )\n : null;\n };\n const specHit = specCacheHit();\n if (specHit) return specHit;\n\n const doExecute = () =>\n executeRequest(\n client,\n endpoint,\n method,\n body,\n requiresAuth,\n useETag,\n requestTimeout,\n templatePath,\n );\n\n const dedup = client.getDeduplicator();\n const canDedup = dedup && method === 'GET' && !body;\n\n let attempted = false;\n const operation = () => {\n // A retry waited out a backoff, during which a concurrent call may have\n // cached a fresh copy. Serve it rather than spend another request.\n const retryHit = attempted ? specCacheHit() : null;\n attempted = true;\n if (retryHit) return retryHit;\n // Keyed by identity as well as endpoint: one client can hold more than one\n // token over its life, and two concurrent authenticated GETs under\n // different tokens must not be answered from one response.\n return canDedup\n ? dedup.dedupe<EsiHandlerResponse>(\n buildDedupeKey(endpoint, client, requiresAuth),\n doExecute,\n )\n : doExecute();\n };\n\n const retryStrategy = resolveRetryStrategy(client);\n\n return retryStrategy.execute<EsiHandlerResponse>(operation, {\n client,\n endpoint,\n method,\n requiresAuth,\n refreshToken: client.hasTokenProvider()\n ? () => client.refreshToken().then(() => {})\n : undefined,\n });\n};\n","import { buildError } from './error';\n\nconst UNSAFE_PATH_CHARS = /[/\\\\?#@!$&'()*+,;=<>{}|^`]/;\n\nexport function validatePathParam(paramName: string, value: unknown): string {\n if (value === null || value === undefined || value === '') {\n throw buildError(\n `Path parameter '${paramName}' must not be empty`,\n 'VALIDATION_ERROR',\n );\n }\n\n const str = `${value as string | number}`;\n\n if (UNSAFE_PATH_CHARS.test(str)) {\n throw buildError(\n `Path parameter '${paramName}' contains invalid characters`,\n 'VALIDATION_ERROR',\n );\n }\n\n if (typeof value === 'number' && !Number.isFinite(value)) {\n throw buildError(\n `Path parameter '${paramName}' must be a finite number`,\n 'VALIDATION_ERROR',\n );\n }\n\n return str;\n}\n\nconst ALLOWED_ESI_HOSTS = ['esi.evetech.net'];\n\nexport function validateBaseUrl(\n url: string,\n allowCustomHost?: boolean,\n): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw buildError(`Invalid base URL: ${url}`, 'VALIDATION_ERROR');\n }\n\n if (parsed.protocol !== 'https:') {\n throw buildError('Base URL must use HTTPS protocol', 'VALIDATION_ERROR');\n }\n\n if (!allowCustomHost && !ALLOWED_ESI_HOSTS.includes(parsed.hostname)) {\n throw buildError(\n `Base URL host '${parsed.hostname}' is not in the allowlist. ` +\n `Allowed hosts: ${ALLOWED_ESI_HOSTS.join(', ')}. ` +\n `Set unsafeAllowCustomHost to bypass this check.`,\n 'VALIDATION_ERROR',\n );\n }\n\n return url.replace(/\\/$/, '');\n}\n\nexport function validateQueryParam(paramName: string, value: unknown): string {\n if (value === null || value === undefined) {\n throw buildError(\n `Query parameter '${paramName}' must not be null or undefined`,\n 'VALIDATION_ERROR',\n );\n }\n\n const str = `${value as string | number}`;\n\n if (typeof value === 'number' && !Number.isFinite(value)) {\n throw buildError(\n `Query parameter '${paramName}' must be a finite number`,\n 'VALIDATION_ERROR',\n );\n }\n\n if (str.length > 2000) {\n throw buildError(\n `Query parameter '${paramName}' exceeds maximum length`,\n 'VALIDATION_ERROR',\n );\n }\n\n return str;\n}\n","import { EndpointDefinition } from './EndpointDefinition';\nimport { validatePathParam, validateQueryParam } from '../util/validation';\n\nexport interface EndpointPathResult {\n path: string;\n body: unknown;\n}\n\nexport function buildEndpointPath(\n def: EndpointDefinition,\n args: unknown[],\n datasource?: string,\n): EndpointPathResult {\n let argIndex = 0;\n let path = def.path;\n\n if (def.pathParams) {\n for (const param of def.pathParams) {\n const raw = args[argIndex++];\n const validated = validatePathParam(param, raw);\n path = path.replace(`{${param}}`, encodeURIComponent(validated));\n }\n }\n\n if (def.queryParams) {\n const queryParts: string[] = [];\n for (const [paramName, queryKey] of Object.entries(def.queryParams)) {\n const value = args[argIndex++];\n if (value !== undefined) {\n const validated = validateQueryParam(paramName, value);\n queryParts.push(`${queryKey}=${encodeURIComponent(validated)}`);\n }\n }\n if (queryParts.length > 0) {\n path += (path.includes('?') ? '&' : '?') + queryParts.join('&');\n }\n }\n\n let body: unknown = undefined;\n if (def.bodyBuilder) {\n /* eslint-disable @typescript-eslint/no-unsafe-argument */\n body = def.bodyBuilder(\n ...(args.slice(argIndex) as Parameters<typeof def.bodyBuilder>),\n );\n /* eslint-enable @typescript-eslint/no-unsafe-argument */\n } else if (def.hasBody) {\n // eslint-disable-next-line security/detect-object-injection\n body = args[argIndex];\n }\n\n if (datasource) {\n path +=\n (path.includes('?') ? '&' : '?') +\n `datasource=${encodeURIComponent(datasource)}`;\n }\n\n return { path, body };\n}\n","import { ApiClient } from '../ApiClient';\nimport { handleRequest, EsiHandlerResponse } from '../ApiRequestHandler';\nimport { EndpointMap, EndpointArgs } from './EndpointDefinition';\nimport { CursorTokens } from '../pagination/CursorPaginationHandler';\nimport {\n EsiResponse,\n EsiResult,\n EsiResponseMeta,\n} from '../../types/api-responses';\nimport { buildEndpointPath } from './buildEndpointPath';\nimport { parseWarning } from '../util/headersUtil';\nimport { logWarn } from '../logger/clientLog';\nimport { EsiError, EsiValidationError } from '../util/error';\nimport { evictRejectedResponse, resolveCache } from '../requestPipeline';\nimport type { z } from 'zod';\n\nexport interface CursorOptions {\n before?: string;\n after?: string;\n}\n\nexport interface CursorResult<T = unknown> {\n data: T[];\n cursors: CursorTokens;\n}\n\nexport interface CreateClientOptions {\n returnMetadata?: boolean;\n safeMode?: boolean;\n}\n\n/** Extract the element type from an array type, or return T unchanged. */\nexport type UnwrapArray<T> = T extends readonly (infer E)[] ? E : T;\n\n/**\n * Infer the result type from an endpoint definition's responseSchema.\n *\n * - When `cursorPagination: true`, wraps in `CursorResult<ElementType>`.\n * - When `responseSchema` is present, uses `z.infer` to extract the type.\n * - Falls back to `unknown` when no `responseSchema` is defined.\n */\nexport type InferEndpointResult<D> = D extends { cursorPagination: true }\n ? D extends { responseSchema: infer S extends z.ZodType }\n ? CursorResult<UnwrapArray<z.infer<S>>>\n : CursorResult\n : D extends { responseSchema: infer S extends z.ZodType }\n ? z.infer<S>\n : unknown;\n\ntype ClientMethods<T extends EndpointMap> = {\n [K in keyof T]: (\n ...args: EndpointArgs<T[K]>\n ) => Promise<InferEndpointResult<T[K]>>;\n};\n\nexport type WithMetadata<T> = {\n [K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R>\n ? (...args: A) => Promise<EsiResponse<R>>\n : T[K];\n};\n\nexport type WithSafeMode<T> = {\n [K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R>\n ? (...args: A) => Promise<EsiResult<R>>\n : T[K];\n};\n\nfunction buildMeta(response: EsiHandlerResponse): EsiResponseMeta {\n const meta: EsiResponseMeta = {\n headers: response.headers,\n fromCache: response.fromCache ?? false,\n stale: response.stale ?? false,\n };\n if (response.cacheHitType) meta.cacheHitType = response.cacheHitType;\n if (response.responseTimeMs !== undefined)\n meta.responseTimeMs = response.responseTimeMs;\n const w = parseWarning(response.headers['warning']);\n if (w) meta.warning = w;\n if (response.headers['x-esi-request-id'])\n meta.requestId = response.headers['x-esi-request-id'];\n if (response.headers['date']) meta.date = response.headers['date'];\n if (response.headers['content-language'])\n meta.contentLanguage = response.headers['content-language'];\n if (response.headers['x-ratelimit-remaining']) {\n meta.rateLimit = {\n remaining: parseInt(response.headers['x-ratelimit-remaining'], 10),\n limit: parseInt(response.headers['x-ratelimit-limit'] ?? '0', 10),\n used: parseInt(response.headers['x-ratelimit-used'] ?? '0', 10),\n group: response.headers['x-ratelimit-group'] ?? null,\n };\n }\n if (response.headers['etag']) meta.etag = response.headers['etag'];\n if (response.headers['x-pages'])\n meta.pages = parseInt(response.headers['x-pages'], 10);\n if (response.headers['expires']) meta.expires = response.headers['expires'];\n if (response.headers['x-esi-error-limit-remain'])\n meta.errorLimitRemain = parseInt(\n response.headers['x-esi-error-limit-remain'],\n 10,\n );\n if (response.headers['x-esi-error-limit-reset'])\n meta.errorLimitReset = parseInt(\n response.headers['x-esi-error-limit-reset'],\n 10,\n );\n return meta;\n}\n\n/* eslint-disable sonarjs/cognitive-complexity */\nexport function createClient<T extends EndpointMap>(\n apiClient: ApiClient,\n endpoints: T,\n options?: CreateClientOptions,\n): ClientMethods<T> {\n const client = {} as ClientMethods<T>;\n const returnMetadata = options?.returnMetadata ?? false;\n const safeMode = options?.safeMode ?? false;\n\n for (const [methodName, def] of Object.entries(endpoints)) {\n // eslint-disable-next-line security/detect-object-injection\n (client as Record<string, (...args: unknown[]) => Promise<unknown>>)[\n methodName\n ] = async (...args: unknown[]) => {\n try {\n if (def.deprecated) {\n const parts = [`Endpoint '${methodName}' is deprecated.`];\n if (def.deprecated.message) parts.push(def.deprecated.message);\n if (def.deprecated.replacedBy)\n parts.push(`Use '${def.deprecated.replacedBy}' instead.`);\n if (def.deprecated.sunsetDate)\n parts.push(`Sunset date: ${def.deprecated.sunsetDate}.`);\n logWarn(apiClient, parts.join(' '), { endpoint: methodName });\n }\n\n const built = buildEndpointPath(def, args, apiClient.getDatasource());\n let path = built.path;\n const body = built.body;\n\n // Opt-in request body validation\n if (\n apiClient.getValidateRequest() &&\n def.requestSchema &&\n body != null\n ) {\n const reqResult = def.requestSchema.safeParse(body);\n if (!reqResult.success) {\n throw new EsiValidationError(\n `${apiClient.getLink()}/${path}`,\n reqResult.error,\n undefined,\n 'request',\n );\n }\n }\n\n if (def.cursorPagination) {\n const lastArg = args[args.length - 1];\n const isCursorArg =\n lastArg != null &&\n typeof lastArg === 'object' &&\n ('before' in lastArg || 'after' in lastArg);\n const cursorOpts: CursorOptions | undefined = isCursorArg\n ? (lastArg as CursorOptions)\n : undefined;\n\n if (cursorOpts) {\n const parts: string[] = [];\n if (cursorOpts.before)\n parts.push(`before=${encodeURIComponent(cursorOpts.before)}`);\n if (cursorOpts.after)\n parts.push(`after=${encodeURIComponent(cursorOpts.after)}`);\n if (parts.length > 0) {\n path += (path.includes('?') ? '&' : '?') + parts.join('&');\n }\n }\n\n const response = await handleRequest(\n apiClient,\n path,\n def.method,\n body,\n def.requiresAuth,\n true,\n def.path,\n );\n let responseBody = response.body;\n if (def.responseSchema && apiClient.getValidateResponse()) {\n const result = def.responseSchema.safeParse(responseBody);\n if (!result.success) {\n evictRejectedResponse(\n apiClient,\n path,\n def.requiresAuth,\n resolveCache,\n );\n throw new EsiValidationError(\n `${apiClient.getLink()}/${path}`,\n result.error,\n );\n }\n responseBody = result.data;\n }\n let data: unknown[];\n if (Array.isArray(responseBody)) {\n data = responseBody as unknown[];\n } else if (responseBody !== null && responseBody !== undefined) {\n data = [responseBody];\n } else {\n data = [];\n }\n const cursorResult: CursorResult = {\n data,\n cursors: response.cursors ?? { before: null, after: null },\n };\n\n if (returnMetadata || safeMode) {\n const meta = buildMeta(response);\n if (safeMode) {\n return { ok: true, data: cursorResult, meta };\n }\n return { data: cursorResult, meta };\n }\n return cursorResult;\n }\n\n const response = await handleRequest(\n apiClient,\n path,\n def.method,\n body,\n def.requiresAuth,\n true,\n def.path,\n );\n let responseBody = response.body;\n if (def.responseSchema && apiClient.getValidateResponse()) {\n const result = def.responseSchema.safeParse(responseBody);\n if (!result.success) {\n evictRejectedResponse(\n apiClient,\n path,\n def.requiresAuth,\n resolveCache,\n );\n throw new EsiValidationError(\n `${apiClient.getLink()}/${path}`,\n result.error,\n );\n }\n responseBody = result.data;\n }\n if (safeMode) {\n return { ok: true, data: responseBody, meta: buildMeta(response) };\n }\n if (returnMetadata) {\n return { data: responseBody, meta: buildMeta(response) };\n }\n return responseBody;\n } catch (err) {\n if (safeMode) {\n const error =\n err instanceof EsiError\n ? err\n : new EsiError(\n 0,\n err instanceof Error ? err.message : String(err),\n );\n return { ok: false, error };\n }\n throw err;\n }\n };\n }\n\n return client;\n}\n/* eslint-enable sonarjs/cognitive-complexity */\n\n/**\n * Fetch all pages of a cursor-paginated endpoint.\n *\n * ESI returns cursor tokens in the response body. This helper follows\n * `after` tokens until the dataset is exhausted (empty items array).\n *\n * Usage with body-based cursors (ESI's actual format):\n * const allJobs = await fetchAllCursorPages(\n * (before, after) => client.freelanceJobs.getFreelanceJobs(before, after),\n * (response) => response.freelance_jobs,\n * (response) => response.cursor,\n * );\n *\n * Usage with CursorResult shape:\n * const all = await fetchAllCursorPages(\n * (before, after) => fetcher({ before, after }),\n * (r) => r.data,\n * (r) => r.cursors,\n * );\n */\nexport async function fetchAllCursorPages<TResponse, TItem = unknown>(\n fetcher: (before?: string, after?: string) => Promise<TResponse>,\n getItems: (response: TResponse) => TItem[],\n getCursor: (response: TResponse) => {\n before?: string | null;\n after?: string | null;\n },\n): Promise<TItem[]> {\n const allData: TItem[] = [];\n let afterToken: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const response = await fetcher(undefined, afterToken);\n const items = getItems(response);\n\n if (!items || items.length === 0) {\n hasMore = false;\n continue;\n }\n\n allData.push(...items);\n\n const cursor = getCursor(response);\n if (!cursor.after) {\n hasMore = false;\n continue;\n }\n\n afterToken = cursor.after;\n }\n\n return allData;\n}\n","import { ApiClient } from '../ApiClient';\nimport { handleSinglePageRequest } from '../ApiRequestHandler';\nimport { logInfo } from '../logger/clientLog';\nimport { EsiValidationError } from '../util/error';\nimport type { EndpointDefinition } from '../endpoints/EndpointDefinition';\n\nexport interface PageResult<T = unknown> {\n data: T[];\n page: number;\n totalPages: number;\n}\n\ntype ResponseSchema = NonNullable<EndpointDefinition['responseSchema']>;\n\nfunction extractArray<T>(body: unknown): T[] {\n if (Array.isArray(body)) return body as T[];\n if (body !== undefined && body !== null) return [body as T];\n return [];\n}\n\nfunction validatePageBody(\n body: unknown,\n schema: ResponseSchema | undefined,\n url: string,\n validate: boolean,\n): unknown {\n if (!schema || !validate) return body;\n const result = schema.safeParse(body);\n if (!result.success) {\n throw new EsiValidationError(url, result.error);\n }\n return result.data;\n}\n\nexport async function fetchAllPages<T = unknown>(\n client: ApiClient,\n endpoint: string,\n method: string,\n requiresAuth: boolean = false,\n body?: unknown,\n templatePath?: string,\n responseSchema?: ResponseSchema,\n concurrency: number = 8,\n): Promise<T[]> {\n const validate = client.getValidateResponse();\n const firstResponse = await handleSinglePageRequest(\n client,\n endpoint,\n method,\n body,\n requiresAuth,\n templatePath,\n );\n\n const firstBody = validatePageBody(\n firstResponse.body,\n responseSchema,\n `${client.getLink()}/${endpoint}`,\n validate,\n );\n\n const totalPages = parseInt(firstResponse.headers['x-pages'] || '1', 10);\n const result: T[] = extractArray<T>(firstBody);\n\n if (totalPages <= 1) return result;\n\n const remaining = Array.from({ length: totalPages - 1 }, (_, i) => i + 2);\n\n for (let i = 0; i < remaining.length; i += concurrency) {\n const batch = remaining.slice(i, i + concurrency);\n const pages = await Promise.all(\n batch.map(async (page) => {\n const sep = endpoint.includes('?') ? '&' : '?';\n const pagedEndpoint = `${endpoint}${sep}page=${page}`;\n\n logInfo(\n client,\n `Fetching page ${page}/${totalPages}: ${pagedEndpoint}`,\n { page, totalPages },\n );\n\n const response = await handleSinglePageRequest(\n client,\n pagedEndpoint,\n method,\n body,\n requiresAuth,\n templatePath,\n );\n\n return validatePageBody(\n response.body,\n responseSchema,\n `${client.getLink()}/${pagedEndpoint}`,\n validate,\n );\n }),\n );\n\n for (const pageBody of pages) {\n result.push(...extractArray<T>(pageBody));\n }\n }\n\n return result;\n}\n\nexport async function* fetchPages<T = unknown>(\n client: ApiClient,\n endpoint: string,\n method: string,\n requiresAuth: boolean = false,\n body?: unknown,\n templatePath?: string,\n responseSchema?: ResponseSchema,\n): AsyncGenerator<PageResult<T>, void, undefined> {\n const validate = client.getValidateResponse();\n const firstResponse = await handleSinglePageRequest(\n client,\n endpoint,\n method,\n body,\n requiresAuth,\n templatePath,\n );\n\n const firstBody = validatePageBody(\n firstResponse.body,\n responseSchema,\n `${client.getLink()}/${endpoint}`,\n validate,\n );\n\n const totalPages = parseInt(firstResponse.headers['x-pages'] || '1', 10);\n\n yield { data: extractArray<T>(firstBody), page: 1, totalPages };\n\n for (let page = 2; page <= totalPages; page++) {\n const sep = endpoint.includes('?') ? '&' : '?';\n const pagedEndpoint = `${endpoint}${sep}page=${page}`;\n\n logInfo(client, `Fetching page ${page}/${totalPages}: ${pagedEndpoint}`, {\n page,\n totalPages,\n });\n\n const response = await handleSinglePageRequest(\n client,\n pagedEndpoint,\n method,\n body,\n requiresAuth,\n templatePath,\n );\n\n const pageBody = validatePageBody(\n response.body,\n responseSchema,\n `${client.getLink()}/${pagedEndpoint}`,\n validate,\n );\n const pageData = extractArray<T>(pageBody);\n if (pageData.length === 0) break;\n\n yield { data: pageData, page, totalPages };\n }\n}\n","import { ApiClient } from '../core/ApiClient';\nimport {\n createClient,\n CreateClientOptions,\n WithMetadata,\n WithSafeMode,\n} from '../core/endpoints/createClient';\nimport { EndpointMap } from '../core/endpoints/EndpointDefinition';\nimport { buildEndpointPath } from '../core/endpoints/buildEndpointPath';\nimport {\n fetchAllPages,\n fetchPages,\n PageResult,\n} from '../core/pagination/AsyncPaginationIterator';\n\ntype ClientMethods<T extends EndpointMap> = ReturnType<typeof createClient<T>>;\n\nexport abstract class BaseEsiClient<T extends EndpointMap> {\n protected api: ClientMethods<T>;\n protected _client: ApiClient;\n protected _endpoints: T;\n private _metaApi?: ClientMethods<T>;\n private _safeApi?: ClientMethods<T>;\n\n constructor(client: ApiClient, endpoints: T) {\n this._client = client;\n this._endpoints = endpoints;\n this.api = createClient(client, endpoints);\n }\n\n public streamEndpoint<R>(\n endpointName: string & keyof T,\n ...args: unknown[]\n ): AsyncGenerator<PageResult<R>, void, undefined> {\n const def = this._endpoints[endpointName]!;\n const { path, body } = buildEndpointPath(\n def,\n args,\n this._client.getDatasource(),\n );\n return fetchPages<R>(\n this._client,\n path,\n def.method,\n def.requiresAuth,\n body,\n def.path,\n def.responseSchema,\n );\n }\n\n public fetchAllEndpoint<R>(\n endpointName: string & keyof T,\n args: unknown[],\n concurrency?: number,\n ): Promise<R[]> {\n const def = this._endpoints[endpointName]!;\n const { path, body } = buildEndpointPath(\n def,\n args,\n this._client.getDatasource(),\n );\n return fetchAllPages<R>(\n this._client,\n path,\n def.method,\n def.requiresAuth,\n body,\n def.path,\n def.responseSchema,\n concurrency,\n );\n }\n\n withMetadata(): WithMetadata<Omit<this, 'withMetadata' | 'withSafeMode'>> {\n if (!this._metaApi) {\n this._metaApi = createClient(this._client, this._endpoints, {\n returnMetadata: true,\n });\n }\n return this._metaApi as unknown as WithMetadata<\n Omit<this, 'withMetadata' | 'withSafeMode'>\n >;\n }\n\n withSafeMode(): WithSafeMode<Omit<this, 'withMetadata' | 'withSafeMode'>> {\n if (!this._safeApi) {\n this._safeApi = createClient(this._client, this._endpoints, {\n safeMode: true,\n });\n }\n return this._safeApi as unknown as WithSafeMode<\n Omit<this, 'withMetadata' | 'withSafeMode'>\n >;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { AllianceInfoSchema, AllianceIconSchema } from '../../schemas/alliance';\n\nexport const allianceEndpoints = {\n getAllianceById: {\n path: 'alliances/{allianceId}/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['allianceId'],\n responseSchema: AllianceInfoSchema,\n },\n getCorporations: {\n path: 'alliances/{allianceId}/corporations/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['allianceId'],\n responseSchema: z.array(z.number()),\n },\n getIcons: {\n path: 'alliances/{allianceId}/icons/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['allianceId'],\n responseSchema: AllianceIconSchema,\n },\n getAlliances: {\n path: 'alliances',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { ContactSchema, ContactLabelSchema } from '../../schemas/contacts';\n\nexport const contactEndpoints = {\n getAllianceContacts: {\n path: 'alliances/{allianceId}/contacts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['allianceId'],\n responseSchema: z.array(ContactSchema),\n },\n getAllianceContactLabels: {\n path: 'alliances/{allianceId}/contacts/labels',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['allianceId'],\n responseSchema: z.array(ContactLabelSchema),\n },\n getCharacterContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContactSchema),\n },\n getCharacterContactLabels: {\n path: 'characters/{characterId}/contacts/labels',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContactLabelSchema),\n },\n getCorporationContacts: {\n path: 'corporations/{corporationId}/contacts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContactSchema),\n },\n getCorporationContactLabels: {\n path: 'corporations/{corporationId}/contacts/labels',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContactLabelSchema),\n },\n addContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { standing: 'standing' },\n bodyBuilder: (contactIds: number[]) => contactIds,\n requestSchema: z.array(z.number().int()),\n },\n editContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { standing: 'standing' },\n bodyBuilder: (contactIds: number[]) => contactIds,\n },\n deleteCharacterContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { contactIds: 'contact_ids' },\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { createClient } from '../core/endpoints/createClient';\nimport { allianceEndpoints } from '../core/endpoints/allianceEndpoints';\nimport { contactEndpoints } from '../core/endpoints/contactEndpoints';\nimport {\n AllianceInfo,\n AllianceContact,\n AllianceContactLabel,\n AllianceIcon,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\nimport { logWarn } from '../core/logger/clientLog';\n\nexport class AllianceClient extends BaseEsiClient<typeof allianceEndpoints> {\n private contactApi: ReturnType<typeof createClient<typeof contactEndpoints>>;\n\n constructor(client: ApiClient) {\n super(client, allianceEndpoints);\n this.contactApi = createClient(client, contactEndpoints);\n }\n\n /**\n * Retrieve public information about an alliance.\n *\n * @param allianceId - The ID of the alliance to look up\n * @returns Public alliance information including name, ticker, and founding date\n */\n getAllianceById(allianceId: number): Promise<AllianceInfo> {\n return this.api.getAllianceById(allianceId);\n }\n\n /**\n * Retrieve contacts for an alliance.\n *\n * @deprecated Use ContactsClient.getAllianceContacts() instead\n * @param allianceId - The ID of the alliance whose contacts to retrieve\n * @returns A list of alliance contacts with standings and contact types\n * @requires Authentication\n */\n getContacts(allianceId: number): Promise<AllianceContact[]> {\n logWarn(\n this._client,\n 'AllianceClient.getContacts() is deprecated. Use ContactsClient.getAllianceContacts() instead. Planned removal in next major version.',\n { allianceId },\n );\n // Schema mismatch: ContactSchema uses a wider contact_type enum than AllianceContactSchema.\n // Cast through unknown until schemas are unified.\n return this.contactApi.getAllianceContacts(allianceId);\n }\n\n /**\n * Retrieve custom contact labels for an alliance.\n *\n * @deprecated Use ContactsClient.getAllianceContactLabels() instead\n * @param allianceId - The ID of the alliance whose contact labels to retrieve\n * @returns A list of custom labels used to categorize alliance contacts\n * @requires Authentication\n */\n getContactLabels(allianceId: number): Promise<AllianceContactLabel[]> {\n logWarn(\n this._client,\n 'AllianceClient.getContactLabels() is deprecated. Use ContactsClient.getAllianceContactLabels() instead. Planned removal in next major version.',\n { allianceId },\n );\n // Schema mismatch: ContactLabelSchema vs AllianceContactLabelSchema are structurally\n // identical but TypeScript treats them as distinct nominal types from different schemas.\n return this.contactApi.getAllianceContactLabels(allianceId);\n }\n\n /**\n * Retrieve the list of corporation IDs that are members of an alliance.\n *\n * @param allianceId - The ID of the alliance whose member corporations to retrieve\n * @returns An array of corporation IDs belonging to the alliance\n */\n getCorporations(allianceId: number): Promise<number[]> {\n return this.api.getCorporations(allianceId);\n }\n\n /**\n * Retrieve icon URLs for an alliance.\n *\n * @param allianceId - The ID of the alliance whose icons to retrieve\n * @returns Icon URLs at various resolutions for the alliance\n */\n getIcons(allianceId: number): Promise<AllianceIcon> {\n return this.api.getIcons(allianceId);\n }\n\n /**\n * Retrieve a list of all active alliance IDs in EVE Online.\n *\n * @returns An array of all active alliance IDs\n */\n getAlliances(): Promise<number[]> {\n return this.api.getAlliances();\n }\n\n fetchAllAlliances(concurrency?: number): Promise<number[]> {\n return this.fetchAllEndpoint<number>('getAlliances', [], concurrency);\n }\n\n fetchAllCorporations(\n allianceId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getCorporations',\n [allianceId],\n concurrency,\n );\n }\n\n streamAlliances(): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getAlliances');\n }\n\n streamCorporations(\n allianceId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getCorporations', allianceId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterAssetSchema,\n AssetLocationSchema,\n AssetNameSchema,\n} from '../../schemas/assets';\n\nexport const assetEndpoints = {\n getCharacterAssets: {\n path: 'characters/{characterId}/assets/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterAssetSchema),\n },\n getCorporationAssets: {\n path: 'corporations/{corporationId}/assets/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CharacterAssetSchema),\n },\n postCharacterAssetLocations: {\n path: 'characters/{characterId}/assets/locations/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n responseSchema: z.array(AssetLocationSchema),\n },\n postCharacterAssetNames: {\n path: 'characters/{characterId}/assets/names/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n responseSchema: z.array(AssetNameSchema),\n },\n postCorporationAssetLocations: {\n path: 'corporations/{corporationId}/assets/locations/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['corporationId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n },\n postCorporationAssetNames: {\n path: 'corporations/{corporationId}/assets/names/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['corporationId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { assetEndpoints } from '../core/endpoints/assetEndpoints';\nimport {\n CharacterAsset,\n AssetLocation,\n AssetName,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class AssetsClient extends BaseEsiClient<typeof assetEndpoints> {\n constructor(client: ApiClient) {\n super(client, assetEndpoints);\n }\n\n /**\n * Retrieve a list of assets owned by a character.\n *\n * @param characterId - The ID of the character whose assets to retrieve\n * @returns A list of the character's assets including type, quantity, and location\n * @requires Authentication\n */\n getCharacterAssets(characterId: number): Promise<CharacterAsset[]> {\n return this.api.getCharacterAssets(characterId);\n }\n\n /**\n * Look up the locations of specific assets owned by a character via a bulk POST request.\n *\n * @param characterId - The ID of the character who owns the assets\n * @param itemIds - An array of item IDs to look up locations for\n * @returns Location information for each requested asset\n * @requires Authentication\n */\n postCharacterAssetLocations(\n characterId: number,\n itemIds: number[],\n ): Promise<AssetLocation[]> {\n return this.api.postCharacterAssetLocations(characterId, itemIds);\n }\n\n /**\n * Look up the names of specific assets owned by a character via a bulk POST request.\n *\n * @param characterId - The ID of the character who owns the assets\n * @param itemIds - An array of item IDs to look up names for\n * @returns The user-assigned names for each requested asset\n * @requires Authentication\n */\n postCharacterAssetNames(\n characterId: number,\n itemIds: number[],\n ): Promise<AssetName[]> {\n return this.api.postCharacterAssetNames(characterId, itemIds);\n }\n\n /**\n * Retrieve a list of assets owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose assets to retrieve\n * @returns A list of the corporation's assets including type, quantity, and location\n * @requires Authentication\n */\n getCorporationAssets(corporationId: number): Promise<CharacterAsset[]> {\n return this.api.getCorporationAssets(corporationId);\n }\n\n /**\n * Look up the locations of specific assets owned by a corporation via a bulk POST request.\n *\n * @param corporationId - The ID of the corporation that owns the assets\n * @param itemIds - An array of item IDs to look up locations for\n * @returns Location information for each requested asset\n * @requires Authentication\n */\n postCorporationAssetLocations(\n corporationId: number,\n itemIds: number[],\n ): Promise<AssetLocation[]> {\n return this.api.postCorporationAssetLocations(\n corporationId,\n itemIds,\n ) as Promise<AssetLocation[]>;\n }\n\n /**\n * Look up the names of specific assets owned by a corporation via a bulk POST request.\n *\n * @param corporationId - The ID of the corporation that owns the assets\n * @param itemIds - An array of item IDs to look up names for\n * @returns The user-assigned names for each requested asset\n * @requires Authentication\n */\n postCorporationAssetNames(\n corporationId: number,\n itemIds: number[],\n ): Promise<AssetName[]> {\n return this.api.postCorporationAssetNames(\n corporationId,\n itemIds,\n ) as Promise<AssetName[]>;\n }\n\n fetchAllCharacterAssets(\n characterId: number,\n concurrency?: number,\n ): Promise<CharacterAsset[]> {\n return this.fetchAllEndpoint<CharacterAsset>(\n 'getCharacterAssets',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationAssets(\n corporationId: number,\n concurrency?: number,\n ): Promise<CharacterAsset[]> {\n return this.fetchAllEndpoint<CharacterAsset>(\n 'getCorporationAssets',\n [corporationId],\n concurrency,\n );\n }\n\n streamCharacterAssets(\n characterId: number,\n ): AsyncGenerator<PageResult<CharacterAsset>, void, undefined> {\n return this.streamEndpoint<CharacterAsset>(\n 'getCharacterAssets',\n characterId,\n );\n }\n\n streamCorporationAssets(\n corporationId: number,\n ): AsyncGenerator<PageResult<CharacterAsset>, void, undefined> {\n return this.streamEndpoint<CharacterAsset>(\n 'getCorporationAssets',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CalendarEventSchema,\n CalendarEventDetailSchema,\n CalendarEventAttendeeSchema,\n} from '../../schemas/calendar';\n\nexport const calendarEndpoints = {\n getCalendarEvents: {\n path: 'characters/{characterId}/calendar/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CalendarEventSchema),\n },\n getCalendarEventById: {\n path: 'characters/{characterId}/calendar/{eventId}/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'eventId'],\n responseSchema: CalendarEventDetailSchema,\n },\n getEventAttendees: {\n path: 'characters/{characterId}/calendar/{eventId}/attendees/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'eventId'],\n responseSchema: z.array(CalendarEventAttendeeSchema),\n },\n respondToCalendarEvent: {\n path: 'characters/{characterId}/calendar/{eventId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['characterId', 'eventId'],\n bodyBuilder: (response: string) => ({ response }),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { calendarEndpoints } from '../core/endpoints/calendarEndpoints';\nimport {\n CalendarEvent,\n CalendarEventDetail,\n CalendarEventAttendee,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CalendarClient extends BaseEsiClient<typeof calendarEndpoints> {\n constructor(client: ApiClient) {\n super(client, calendarEndpoints);\n }\n\n /**\n * Retrieve a character's upcoming calendar events.\n *\n * @param characterId - The ID of the character whose calendar events to retrieve\n * @returns A list of upcoming calendar events\n * @requires Authentication\n */\n getCalendarEvents(characterId: number): Promise<CalendarEvent[]> {\n return this.api.getCalendarEvents(characterId);\n }\n\n /**\n * Retrieve detailed information about a specific calendar event for a character.\n *\n * @param characterId - The ID of the character who owns the event\n * @param eventId - The ID of the calendar event to retrieve\n * @returns Detailed event information including title, description, and timing\n * @requires Authentication\n */\n getCalendarEventById(\n characterId: number,\n eventId: number,\n ): Promise<CalendarEventDetail> {\n return this.api.getCalendarEventById(characterId, eventId);\n }\n\n /**\n * Set a character's response to a calendar event (accepted, declined, or tentative).\n *\n * @param characterId - The ID of the character responding to the event\n * @param eventId - The ID of the calendar event to respond to\n * @param response - The response status to set for this event\n * @requires Authentication\n */\n respondToCalendarEvent(\n characterId: number,\n eventId: number,\n response: string,\n ): Promise<void> {\n return this.api.respondToCalendarEvent(\n characterId,\n eventId,\n response,\n ) as Promise<void>;\n }\n\n /**\n * Retrieve the list of attendees and their response statuses for a calendar event.\n *\n * @param characterId - The ID of the character who owns the event\n * @param eventId - The ID of the calendar event whose attendees to retrieve\n * @returns A list of attendees with their response statuses\n * @requires Authentication\n */\n getEventAttendees(\n characterId: number,\n eventId: number,\n ): Promise<CalendarEventAttendee[]> {\n return this.api.getEventAttendees(characterId, eventId);\n }\n\n fetchAllCalendarEvents(\n characterId: number,\n concurrency?: number,\n ): Promise<CalendarEvent[]> {\n return this.fetchAllEndpoint<CalendarEvent>(\n 'getCalendarEvents',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllEventAttendees(\n characterId: number,\n eventId: number,\n concurrency?: number,\n ): Promise<CalendarEventAttendee[]> {\n return this.fetchAllEndpoint<CalendarEventAttendee>(\n 'getEventAttendees',\n [characterId, eventId],\n concurrency,\n );\n }\n\n streamCalendarEvents(\n characterId: number,\n ): AsyncGenerator<PageResult<CalendarEvent>, void, undefined> {\n return this.streamEndpoint<CalendarEvent>('getCalendarEvents', characterId);\n }\n\n streamEventAttendees(\n characterId: number,\n eventId: number,\n ): AsyncGenerator<PageResult<CalendarEventAttendee>, void, undefined> {\n return this.streamEndpoint<CalendarEventAttendee>(\n 'getEventAttendees',\n characterId,\n eventId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterInfoSchema,\n CharacterPortraitSchema,\n AgentResearchSchema,\n BlueprintSchema,\n CorporationHistorySchema,\n JumpFatigueSchema,\n MedalSchema,\n NotificationSchema,\n CharacterTitleSchema,\n CharacterRoleSchema,\n ContactNotificationSchema,\n} from '../../schemas/character';\nimport { StandingSchema } from '../../schemas/common';\n\nexport const characterEndpoints = {\n getCharacterPublicInfo: {\n path: 'characters/{characterId}/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['characterId'],\n responseSchema: CharacterInfoSchema,\n },\n getAgentsResearch: {\n path: 'characters/{characterId}/agents_research/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(AgentResearchSchema),\n },\n getBlueprints: {\n path: 'characters/{characterId}/blueprints/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(BlueprintSchema),\n },\n getRoles: {\n path: 'characters/{characterId}/roles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterRoleSchema,\n },\n getStandings: {\n path: 'characters/{characterId}/standings',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(StandingSchema),\n },\n getTitles: {\n path: 'characters/{characterId}/titles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterTitleSchema),\n },\n getContactNotifications: {\n path: 'characters/{characterId}/notifications/contacts/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContactNotificationSchema),\n },\n getCorporationHistory: {\n path: 'characters/{characterId}/corporationhistory/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['characterId'],\n responseSchema: z.array(CorporationHistorySchema),\n },\n getJumpFatigue: {\n path: 'characters/{characterId}/fatigue/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: JumpFatigueSchema,\n },\n getMedals: {\n path: 'characters/{characterId}/medals/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MedalSchema),\n },\n getNotifications: {\n path: 'characters/{characterId}/notifications/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(NotificationSchema),\n },\n getPortrait: {\n path: 'characters/{characterId}/portrait/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['characterId'],\n responseSchema: CharacterPortraitSchema,\n },\n postCharacterAffiliation: {\n path: 'characters/affiliation',\n method: 'POST',\n requiresAuth: false,\n hasBody: true,\n },\n calculateCspaChargeCost: {\n path: 'characters/{characterId}/cspa/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { characterEndpoints } from '../core/endpoints/characterEndpoints';\nimport {\n CharacterInfo,\n CharacterPortrait,\n AgentResearch,\n Blueprint,\n CorporationHistory,\n JumpFatigue,\n Medal,\n Notification,\n Standing,\n CharacterTitle,\n CharacterAffiliation,\n CharacterRole,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CharacterClient extends BaseEsiClient<typeof characterEndpoints> {\n constructor(client: ApiClient) {\n super(client, characterEndpoints);\n }\n\n /**\n * Retrieve publicly available information about a character.\n *\n * @param characterId - The ID of the character to look up\n * @returns Public character information including name, corporation, and birthday\n */\n getCharacterPublicInfo(characterId: number): Promise<CharacterInfo> {\n return this.api.getCharacterPublicInfo(characterId);\n }\n\n /**\n * Retrieve a character's active research agents and their accumulated research points.\n *\n * @param characterId - The ID of the character whose research agents to retrieve\n * @returns A list of research agents with skill, points, and start date information\n * @requires Authentication\n */\n getCharacterAgentsResearch(characterId: number): Promise<AgentResearch[]> {\n return this.api.getAgentsResearch(characterId);\n }\n\n /**\n * Retrieve blueprints owned by a character.\n *\n * @param characterId - The ID of the character whose blueprints to retrieve\n * @returns A list of blueprints with material/time efficiency and run information\n * @requires Authentication\n */\n getCharacterBlueprints(characterId: number): Promise<Blueprint[]> {\n return this.api.getBlueprints(characterId);\n }\n\n /**\n * Retrieve the corporation membership history of a character (public endpoint).\n *\n * @param characterId - The ID of the character whose corporation history to retrieve\n * @returns A chronological list of corporations the character has been a member of\n */\n getCharacterCorporationHistory(\n characterId: number,\n ): Promise<CorporationHistory[]> {\n return this.api.getCorporationHistory(characterId);\n }\n\n /**\n * Calculate the CSPA (CONCORD Spam Prevention Act) charge cost for sending mail to a set of characters.\n *\n * @param characterId - The ID of the character who would be sending mail\n * @param characters - An array of character IDs to calculate CSPA charges for\n * @returns The total CSPA charge cost in ISK\n * @requires Authentication\n */\n postCspaChargeCost(\n characterId: number,\n characters: number[],\n ): Promise<number> {\n return this.api.calculateCspaChargeCost(\n characterId,\n characters,\n ) as Promise<number>;\n }\n\n /**\n * Retrieve a character's current jump fatigue and activation cooldown timers.\n *\n * @param characterId - The ID of the character whose jump fatigue to retrieve\n * @returns Jump fatigue expiry dates and last jump information\n * @requires Authentication\n */\n getCharacterFatigue(characterId: number): Promise<JumpFatigue> {\n return this.api.getJumpFatigue(characterId);\n }\n\n /**\n * Retrieve medals awarded to a character.\n *\n * @param characterId - The ID of the character whose medals to retrieve\n * @returns A list of medals the character has been awarded\n * @requires Authentication\n */\n getCharacterMedals(characterId: number): Promise<Medal[]> {\n return this.api.getMedals(characterId);\n }\n\n /**\n * Retrieve a character's notifications from the notification center.\n *\n * @param characterId - The ID of the character whose notifications to retrieve\n * @returns A list of notifications including type, sender, and timestamp\n * @requires Authentication\n */\n getCharacterNotifications(characterId: number): Promise<Notification[]> {\n return this.api.getNotifications(characterId);\n }\n\n /**\n * Retrieve notifications related to contact changes for a character.\n *\n * @param characterId - The ID of the character whose contact notifications to retrieve\n * @returns A list of contact-related notifications\n * @requires Authentication\n */\n getCharacterNotificationsContacts(\n characterId: number,\n ): Promise<Notification[]> {\n // Schema mismatch: ContactNotification schema differs from Notification type.\n // Cast through unknown until schema is aligned with the type.\n return this.api.getContactNotifications(characterId) as unknown as Promise<\n Notification[]\n >;\n }\n\n /**\n * Retrieve portrait image URLs for a character at various resolutions.\n *\n * @param characterId - The ID of the character whose portrait to retrieve\n * @returns Portrait URLs at different resolutions (64x64, 128x128, 256x256, 512x512)\n */\n getCharacterPortrait(characterId: number): Promise<CharacterPortrait> {\n return this.api.getPortrait(characterId);\n }\n\n /**\n * Retrieve the corporation roles assigned to a character.\n *\n * @param characterId - The ID of the character whose roles to retrieve\n * @returns The character's roles including regular, HQ, base, and other role categories\n * @requires Authentication\n */\n getCharacterRoles(characterId: number): Promise<CharacterRole> {\n return this.api.getRoles(characterId);\n }\n\n /**\n * Retrieve a character's standings with NPC factions, corporations, and agents.\n *\n * @param characterId - The ID of the character whose standings to retrieve\n * @returns A list of standings with from_type, from_id, and standing value\n * @requires Authentication\n */\n getCharacterStandings(characterId: number): Promise<Standing[]> {\n return this.api.getStandings(characterId);\n }\n\n /**\n * Retrieve the corporation titles held by a character.\n *\n * @param characterId - The ID of the character whose titles to retrieve\n * @returns A list of corporation titles assigned to the character\n * @requires Authentication\n */\n getCharacterTitles(characterId: number): Promise<CharacterTitle[]> {\n return this.api.getTitles(characterId);\n }\n\n /**\n * Look up the current corporation, alliance, and faction affiliations for a set of characters via a bulk POST request.\n *\n * @param characters - An array of character IDs to look up affiliations for\n * @returns Affiliation data including corporation, alliance, and faction IDs for each character\n */\n postCharacterAffiliation(\n characters: number[],\n ): Promise<CharacterAffiliation[]> {\n return this.api.postCharacterAffiliation(characters) as Promise<\n CharacterAffiliation[]\n >;\n }\n\n fetchAllCharacterAgentsResearch(\n characterId: number,\n concurrency?: number,\n ): Promise<AgentResearch[]> {\n return this.fetchAllEndpoint<AgentResearch>(\n 'getAgentsResearch',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterBlueprints(\n characterId: number,\n concurrency?: number,\n ): Promise<Blueprint[]> {\n return this.fetchAllEndpoint<Blueprint>(\n 'getBlueprints',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterCorporationHistory(\n characterId: number,\n concurrency?: number,\n ): Promise<CorporationHistory[]> {\n return this.fetchAllEndpoint<CorporationHistory>(\n 'getCorporationHistory',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterMedals(\n characterId: number,\n concurrency?: number,\n ): Promise<Medal[]> {\n return this.fetchAllEndpoint<Medal>(\n 'getMedals',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterNotifications(\n characterId: number,\n concurrency?: number,\n ): Promise<Notification[]> {\n return this.fetchAllEndpoint<Notification>(\n 'getNotifications',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterNotificationsContacts(\n characterId: number,\n concurrency?: number,\n ): Promise<Notification[]> {\n return this.fetchAllEndpoint<Notification>(\n 'getContactNotifications',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterStandings(\n characterId: number,\n concurrency?: number,\n ): Promise<Standing[]> {\n return this.fetchAllEndpoint<Standing>(\n 'getStandings',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterTitles(\n characterId: number,\n concurrency?: number,\n ): Promise<CharacterTitle[]> {\n return this.fetchAllEndpoint<CharacterTitle>(\n 'getTitles',\n [characterId],\n concurrency,\n );\n }\n\n streamCharacterAgentsResearch(\n characterId: number,\n ): AsyncGenerator<PageResult<AgentResearch>, void, undefined> {\n return this.streamEndpoint<AgentResearch>('getAgentsResearch', characterId);\n }\n\n streamCharacterBlueprints(\n characterId: number,\n ): AsyncGenerator<PageResult<Blueprint>, void, undefined> {\n return this.streamEndpoint<Blueprint>('getBlueprints', characterId);\n }\n\n streamCharacterCorporationHistory(\n characterId: number,\n ): AsyncGenerator<PageResult<CorporationHistory>, void, undefined> {\n return this.streamEndpoint<CorporationHistory>(\n 'getCorporationHistory',\n characterId,\n );\n }\n\n streamCharacterMedals(\n characterId: number,\n ): AsyncGenerator<PageResult<Medal>, void, undefined> {\n return this.streamEndpoint<Medal>('getMedals', characterId);\n }\n\n streamCharacterNotifications(\n characterId: number,\n ): AsyncGenerator<PageResult<Notification>, void, undefined> {\n return this.streamEndpoint<Notification>('getNotifications', characterId);\n }\n\n streamCharacterNotificationsContacts(\n characterId: number,\n ): AsyncGenerator<PageResult<Notification>, void, undefined> {\n return this.streamEndpoint<Notification>(\n 'getContactNotifications',\n characterId,\n );\n }\n\n streamCharacterStandings(\n characterId: number,\n ): AsyncGenerator<PageResult<Standing>, void, undefined> {\n return this.streamEndpoint<Standing>('getStandings', characterId);\n }\n\n streamCharacterTitles(\n characterId: number,\n ): AsyncGenerator<PageResult<CharacterTitle>, void, undefined> {\n return this.streamEndpoint<CharacterTitle>('getTitles', characterId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { CloneInfoSchema } from '../../schemas/clones';\n\nexport const cloneEndpoints = {\n getClones: {\n path: 'characters/{characterId}/clones',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CloneInfoSchema,\n },\n getImplants: {\n path: 'characters/{characterId}/implants',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { cloneEndpoints } from '../core/endpoints/cloneEndpoints';\nimport { CloneInfo } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class ClonesClient extends BaseEsiClient<typeof cloneEndpoints> {\n constructor(client: ApiClient) {\n super(client, cloneEndpoints);\n }\n\n /**\n * Retrieve a character's clone state, including home station and available jump clones.\n *\n * @param characterId - The ID of the character whose clone information to retrieve\n * @returns Clone information including home location and jump clone details\n * @requires Authentication\n */\n getClones(characterId: number): Promise<CloneInfo> {\n return this.api.getClones(characterId);\n }\n\n /**\n * Retrieve the implants currently installed in a character's active clone.\n *\n * @param characterId - The ID of the character whose implants to retrieve\n * @returns An array of type IDs for the currently installed implants\n * @requires Authentication\n */\n getImplants(characterId: number): Promise<number[]> {\n return this.api.getImplants(characterId);\n }\n\n fetchAllImplants(\n characterId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getImplants',\n [characterId],\n concurrency,\n );\n }\n\n streamImplants(\n characterId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getImplants', characterId);\n }\n}\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { contactEndpoints } from '../core/endpoints/contactEndpoints';\nimport { Contact, ContactLabel } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class ContactsClient extends BaseEsiClient<typeof contactEndpoints> {\n constructor(client: ApiClient) {\n super(client, contactEndpoints);\n }\n\n /**\n * Retrieve contacts for an alliance.\n *\n * @param allianceId - The ID of the alliance whose contacts to retrieve\n * @returns A list of alliance contacts with standings and contact types\n * @requires Authentication\n */\n getAllianceContacts(allianceId: number): Promise<Contact[]> {\n return this.api.getAllianceContacts(allianceId);\n }\n\n /**\n * Retrieve custom contact labels for an alliance.\n *\n * @param allianceId - The ID of the alliance whose contact labels to retrieve\n * @returns A list of custom labels used to categorize alliance contacts\n * @requires Authentication\n */\n getAllianceContactLabels(allianceId: number): Promise<ContactLabel[]> {\n return this.api.getAllianceContactLabels(allianceId);\n }\n\n /**\n * Delete contacts from a character's contact list.\n *\n * @param characterId - The ID of the character whose contacts to delete\n * @param contactIds - An array of contact IDs to remove\n * @requires Authentication\n */\n deleteCharacterContacts(\n characterId: number,\n contactIds: number[],\n ): Promise<void> {\n return this.api.deleteCharacterContacts(\n characterId,\n contactIds.join(','),\n ) as Promise<void>;\n }\n\n /**\n * Retrieve a character's contact list.\n *\n * @param characterId - The ID of the character whose contacts to retrieve\n * @returns A list of character contacts with standings, labels, and contact types\n * @requires Authentication\n */\n getCharacterContacts(characterId: number): Promise<Contact[]> {\n return this.api.getCharacterContacts(characterId);\n }\n\n /**\n * Add contacts to a character's contact list via a POST request.\n *\n * @param characterId - The ID of the character to add contacts for\n * @param standing - Standing value for the contacts (-10 to 10)\n * @param contactIds - Array of character/corporation/alliance IDs to add\n * @returns An array of contact IDs that were successfully added\n * @requires Authentication\n */\n postCharacterContacts(\n characterId: number,\n standing: number,\n contactIds: number[],\n ): Promise<number[]> {\n return this.api.addContacts(characterId, standing, contactIds) as Promise<\n number[]\n >;\n }\n\n /**\n * Update existing contacts in a character's contact list via a PUT request.\n *\n * @param characterId - The ID of the character whose contacts to update\n * @param standing - New standing value for the contacts (-10 to 10)\n * @param contactIds - Array of contact IDs to update\n * @requires Authentication\n */\n putCharacterContacts(\n characterId: number,\n standing: number,\n contactIds: number[],\n ): Promise<void> {\n return this.api.editContacts(\n characterId,\n standing,\n contactIds,\n ) as Promise<void>;\n }\n\n /**\n * Retrieve custom contact labels for a character.\n *\n * @param characterId - The ID of the character whose contact labels to retrieve\n * @returns A list of custom labels used to categorize character contacts\n * @requires Authentication\n */\n getCharacterContactLabels(characterId: number): Promise<ContactLabel[]> {\n return this.api.getCharacterContactLabels(characterId);\n }\n\n /**\n * Retrieve contacts for a corporation.\n *\n * @param corporationId - The ID of the corporation whose contacts to retrieve\n * @returns A list of corporation contacts with standings and contact types\n * @requires Authentication\n */\n getCorporationContacts(corporationId: number): Promise<Contact[]> {\n return this.api.getCorporationContacts(corporationId);\n }\n\n /**\n * Retrieve custom contact labels for a corporation.\n *\n * @param corporationId - The ID of the corporation whose contact labels to retrieve\n * @returns A list of custom labels used to categorize corporation contacts\n * @requires Authentication\n */\n getCorporationContactLabels(corporationId: number): Promise<ContactLabel[]> {\n return this.api.getCorporationContactLabels(corporationId);\n }\n\n fetchAllAllianceContacts(\n allianceId: number,\n concurrency?: number,\n ): Promise<Contact[]> {\n return this.fetchAllEndpoint<Contact>(\n 'getAllianceContacts',\n [allianceId],\n concurrency,\n );\n }\n\n fetchAllAllianceContactLabels(\n allianceId: number,\n concurrency?: number,\n ): Promise<ContactLabel[]> {\n return this.fetchAllEndpoint<ContactLabel>(\n 'getAllianceContactLabels',\n [allianceId],\n concurrency,\n );\n }\n\n fetchAllCharacterContacts(\n characterId: number,\n concurrency?: number,\n ): Promise<Contact[]> {\n return this.fetchAllEndpoint<Contact>(\n 'getCharacterContacts',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterContactLabels(\n characterId: number,\n concurrency?: number,\n ): Promise<ContactLabel[]> {\n return this.fetchAllEndpoint<ContactLabel>(\n 'getCharacterContactLabels',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationContacts(\n corporationId: number,\n concurrency?: number,\n ): Promise<Contact[]> {\n return this.fetchAllEndpoint<Contact>(\n 'getCorporationContacts',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationContactLabels(\n corporationId: number,\n concurrency?: number,\n ): Promise<ContactLabel[]> {\n return this.fetchAllEndpoint<ContactLabel>(\n 'getCorporationContactLabels',\n [corporationId],\n concurrency,\n );\n }\n\n streamAllianceContacts(\n allianceId: number,\n ): AsyncGenerator<PageResult<Contact>, void, undefined> {\n return this.streamEndpoint<Contact>('getAllianceContacts', allianceId);\n }\n\n streamAllianceContactLabels(\n allianceId: number,\n ): AsyncGenerator<PageResult<ContactLabel>, void, undefined> {\n return this.streamEndpoint<ContactLabel>(\n 'getAllianceContactLabels',\n allianceId,\n );\n }\n\n streamCharacterContacts(\n characterId: number,\n ): AsyncGenerator<PageResult<Contact>, void, undefined> {\n return this.streamEndpoint<Contact>('getCharacterContacts', characterId);\n }\n\n streamCharacterContactLabels(\n characterId: number,\n ): AsyncGenerator<PageResult<ContactLabel>, void, undefined> {\n return this.streamEndpoint<ContactLabel>(\n 'getCharacterContactLabels',\n characterId,\n );\n }\n\n streamCorporationContacts(\n corporationId: number,\n ): AsyncGenerator<PageResult<Contact>, void, undefined> {\n return this.streamEndpoint<Contact>(\n 'getCorporationContacts',\n corporationId,\n );\n }\n\n streamCorporationContactLabels(\n corporationId: number,\n ): AsyncGenerator<PageResult<ContactLabel>, void, undefined> {\n return this.streamEndpoint<ContactLabel>(\n 'getCorporationContactLabels',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n ContractSchema,\n PublicContractSchema,\n ContractBidSchema,\n ContractItemSchema,\n PublicContractBidSchema,\n PublicContractItemSchema,\n} from '../../schemas/contracts';\n\nexport const contractEndpoints = {\n getCharacterContracts: {\n path: 'characters/{characterId}/contracts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContractSchema),\n },\n getCharacterContractBids: {\n path: 'characters/{characterId}/contracts/{contractId}/bids',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'contractId'],\n responseSchema: z.array(ContractBidSchema),\n },\n getCharacterContractItems: {\n path: 'characters/{characterId}/contracts/{contractId}/items',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'contractId'],\n responseSchema: z.array(ContractItemSchema),\n },\n getCorporationContracts: {\n path: 'corporations/{corporationId}/contracts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContractSchema),\n },\n getCorporationContractBids: {\n path: 'corporations/{corporationId}/contracts/{contractId}/bids',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'contractId'],\n responseSchema: z.array(ContractBidSchema),\n },\n getCorporationContractItems: {\n path: 'corporations/{corporationId}/contracts/{contractId}/items',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'contractId'],\n responseSchema: z.array(ContractItemSchema),\n },\n getPublicContracts: {\n path: 'contracts/public/{regionId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n responseSchema: z.array(PublicContractSchema),\n },\n getPublicContractBids: {\n path: 'contracts/public/bids/{contractId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['contractId'],\n responseSchema: z.array(PublicContractBidSchema),\n },\n getPublicContractItems: {\n path: 'contracts/public/items/{contractId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['contractId'],\n responseSchema: z.array(PublicContractItemSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { contractEndpoints } from '../core/endpoints/contractEndpoints';\nimport {\n Contract,\n ContractBid,\n ContractItem,\n PublicContract,\n PublicContractBid,\n PublicContractItem,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class ContractsClient extends BaseEsiClient<typeof contractEndpoints> {\n constructor(client: ApiClient) {\n super(client, contractEndpoints);\n }\n\n /**\n * Retrieve contracts issued by or assigned to a character.\n *\n * @param characterId - The ID of the character whose contracts to retrieve\n * @returns A list of contracts with type, status, and pricing information\n * @requires Authentication\n */\n getCharacterContracts(characterId: number): Promise<Contract[]> {\n return this.api.getCharacterContracts(characterId);\n }\n\n /**\n * Retrieve bids placed on an auction contract owned by a character.\n *\n * @param characterId - The ID of the character who owns the contract\n * @param contractId - The ID of the contract whose bids to retrieve\n * @returns A list of bids with bidder, amount, and timestamp\n * @requires Authentication\n */\n getCharacterContractBids(\n characterId: number,\n contractId: number,\n ): Promise<ContractBid[]> {\n return this.api.getCharacterContractBids(characterId, contractId);\n }\n\n /**\n * Retrieve the items included in a contract owned by a character.\n *\n * @param characterId - The ID of the character who owns the contract\n * @param contractId - The ID of the contract whose items to retrieve\n * @returns A list of items in the contract with type, quantity, and included/excluded status\n * @requires Authentication\n */\n getCharacterContractItems(\n characterId: number,\n contractId: number,\n ): Promise<ContractItem[]> {\n return this.api.getCharacterContractItems(characterId, contractId);\n }\n\n /**\n * Retrieve publicly available contracts in a specific region.\n *\n * @param regionId - The ID of the region whose public contracts to retrieve\n * @returns A list of public contracts in the region. ESI sends no status\n * or availability on these: every listed contract is public and outstanding.\n */\n getPublicContracts(regionId: number): Promise<PublicContract[]> {\n return this.api.getPublicContracts(regionId);\n }\n\n /**\n * Retrieve bids placed on a public auction contract.\n *\n * @param contractId - The ID of the public contract whose bids to retrieve\n * @returns A list of bids with amount and timestamp. ESI does not name the\n * bidder on a public contract.\n */\n getPublicContractBids(contractId: number): Promise<PublicContractBid[]> {\n return this.api.getPublicContractBids(contractId);\n }\n\n /**\n * Retrieve the items included in a public contract.\n *\n * @param contractId - The ID of the public contract whose items to retrieve\n * @returns A list of items in the contract with type, quantity, and included/excluded\n * status; blueprint lines also carry item ID, efficiencies and runs\n */\n getPublicContractItems(contractId: number): Promise<PublicContractItem[]> {\n return this.api.getPublicContractItems(contractId);\n }\n\n /**\n * Retrieve contracts issued by or assigned to a corporation.\n *\n * @param corporationId - The ID of the corporation whose contracts to retrieve\n * @returns A list of contracts with type, status, and pricing information\n * @requires Authentication\n */\n getCorporationContracts(corporationId: number): Promise<Contract[]> {\n return this.api.getCorporationContracts(corporationId);\n }\n\n /**\n * Retrieve bids placed on an auction contract owned by a corporation.\n *\n * @param corporationId - The ID of the corporation that owns the contract\n * @param contractId - The ID of the contract whose bids to retrieve\n * @returns A list of bids with bidder, amount, and timestamp\n * @requires Authentication\n */\n getCorporationContractBids(\n corporationId: number,\n contractId: number,\n ): Promise<ContractBid[]> {\n return this.api.getCorporationContractBids(corporationId, contractId);\n }\n\n /**\n * Retrieve the items included in a contract owned by a corporation.\n *\n * @param corporationId - The ID of the corporation that owns the contract\n * @param contractId - The ID of the contract whose items to retrieve\n * @returns A list of items in the contract with type, quantity, and included/excluded status\n * @requires Authentication\n */\n getCorporationContractItems(\n corporationId: number,\n contractId: number,\n ): Promise<ContractItem[]> {\n return this.api.getCorporationContractItems(corporationId, contractId);\n }\n\n fetchAllPublicContracts(\n regionId: number,\n concurrency?: number,\n ): Promise<PublicContract[]> {\n return this.fetchAllEndpoint<PublicContract>(\n 'getPublicContracts',\n [regionId],\n concurrency,\n );\n }\n\n fetchAllCharacterContracts(\n characterId: number,\n concurrency?: number,\n ): Promise<Contract[]> {\n return this.fetchAllEndpoint<Contract>(\n 'getCharacterContracts',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationContracts(\n corporationId: number,\n concurrency?: number,\n ): Promise<Contract[]> {\n return this.fetchAllEndpoint<Contract>(\n 'getCorporationContracts',\n [corporationId],\n concurrency,\n );\n }\n\n streamPublicContracts(\n regionId: number,\n ): AsyncGenerator<PageResult<PublicContract>, void, undefined> {\n return this.streamEndpoint<PublicContract>('getPublicContracts', regionId);\n }\n\n streamCharacterContracts(\n characterId: number,\n ): AsyncGenerator<PageResult<Contract>, void, undefined> {\n return this.streamEndpoint<Contract>('getCharacterContracts', characterId);\n }\n\n streamCorporationContracts(\n corporationId: number,\n ): AsyncGenerator<PageResult<Contract>, void, undefined> {\n return this.streamEndpoint<Contract>(\n 'getCorporationContracts',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CorporationInfoSchema,\n CorporationAllianceHistorySchema,\n ContainerLogSchema,\n CorporationDivisionsSchema,\n CorporationFacilitySchema,\n CorporationMedalSchema,\n CorporationIssuedMedalSchema,\n CorporationMemberTitleSchema,\n CorporationMemberTrackingSchema,\n CorporationMemberRoleSchema,\n CorporationRoleHistorySchema,\n CorporationShareholderSchema,\n CorporationStarbaseSchema,\n CorporationStarbaseDetailSchema,\n CorporationStructureSchema,\n CorporationTitleSchema,\n CorporationIconSchema,\n CorporationStandingSchema,\n CorporationWalletDivisionSchema,\n} from '../../schemas/corporation';\nimport { BlueprintSchema } from '../../schemas/character';\n\nexport const corporationEndpoints = {\n getCorporationInfo: {\n path: 'corporations/{corporationId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: CorporationInfoSchema,\n },\n getCorporationAllianceHistory: {\n path: 'corporations/{corporationId}/alliancehistory',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationAllianceHistorySchema),\n },\n getCorporationBlueprints: {\n path: 'corporations/{corporationId}/blueprints',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(BlueprintSchema),\n },\n getCorporationAlscLogs: {\n path: 'corporations/{corporationId}/containers/logs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContainerLogSchema),\n },\n getCorporationDivisions: {\n path: 'corporations/{corporationId}/divisions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: CorporationDivisionsSchema,\n },\n getCorporationFacilities: {\n path: 'corporations/{corporationId}/facilities',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationFacilitySchema),\n },\n getCorporationIcon: {\n path: 'corporations/{corporationId}/icons',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: CorporationIconSchema,\n },\n getCorporationMedals: {\n path: 'corporations/{corporationId}/medals',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMedalSchema),\n },\n getCorporationIssuedMedals: {\n path: 'corporations/{corporationId}/medals/issued',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationIssuedMedalSchema),\n },\n getCorporationMembers: {\n path: 'corporations/{corporationId}/members',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(z.number()),\n },\n getCorporationMemberLimit: {\n path: 'corporations/{corporationId}/members/limit',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.number(),\n },\n getCorporationMembersTitles: {\n path: 'corporations/{corporationId}/members/titles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMemberTitleSchema),\n },\n getCorporationMemberTracking: {\n path: 'corporations/{corporationId}/membertracking',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMemberTrackingSchema),\n },\n getCorporationMemberRoles: {\n path: 'corporations/{corporationId}/roles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMemberRoleSchema),\n },\n getCorporationMemberRolesHistory: {\n path: 'corporations/{corporationId}/roles/history',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationRoleHistorySchema),\n },\n getCorporationShareholders: {\n path: 'corporations/{corporationId}/shareholders',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationShareholderSchema),\n },\n getCorporationStandings: {\n path: 'corporations/{corporationId}/standings',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationStandingSchema),\n },\n getCorporationStarbases: {\n path: 'corporations/{corporationId}/starbases',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationStarbaseSchema),\n },\n getCorporationStarbaseDetail: {\n path: 'corporations/{corporationId}/starbases/{starbaseId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'starbaseId'],\n responseSchema: CorporationStarbaseDetailSchema,\n },\n getCorporationStructures: {\n path: 'corporations/{corporationId}/structures',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationStructureSchema),\n },\n getCorporationTitles: {\n path: 'corporations/{corporationId}/titles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationTitleSchema),\n },\n getNpcCorporations: {\n path: 'corporations/npccorps',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { corporationEndpoints } from '../core/endpoints/corporationEndpoints';\nimport {\n Blueprint,\n CorporationInfo,\n CorporationAllianceHistory,\n CorporationDivisions,\n CorporationFacility,\n CorporationIssuedMedal,\n CorporationMedal,\n CorporationMemberRole,\n CorporationMemberTitle,\n CorporationMemberTracking,\n CorporationRoleHistory,\n CorporationShareholder,\n CorporationStarbase,\n CorporationStarbaseDetail,\n CorporationStructure,\n CorporationTitle,\n ContainerLog,\n Standing,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CorporationsClient extends BaseEsiClient<\n typeof corporationEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, corporationEndpoints);\n }\n\n /**\n * Retrieve public information about a corporation.\n *\n * @param corporationId - The ID of the corporation to look up\n * @returns Public corporation information including name, ticker, member count, and CEO\n */\n getCorporationInfo(corporationId: number): Promise<CorporationInfo> {\n return this.api.getCorporationInfo(corporationId);\n }\n\n /**\n * Retrieve the alliance membership history of a corporation.\n *\n * @param corporationId - The ID of the corporation whose alliance history to retrieve\n * @returns A chronological list of alliances the corporation has been a member of\n */\n getCorporationAllianceHistory(\n corporationId: number,\n ): Promise<CorporationAllianceHistory[]> {\n return this.api.getCorporationAllianceHistory(corporationId);\n }\n\n /**\n * Retrieve blueprints owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose blueprints to retrieve\n * @returns A list of blueprints with material/time efficiency and run information\n * @requires Authentication\n */\n getCorporationBlueprints(corporationId: number): Promise<Blueprint[]> {\n return this.api.getCorporationBlueprints(corporationId);\n }\n\n /**\n * Retrieve audit log secure container (ALSC) logs for a corporation.\n *\n * @param corporationId - The ID of the corporation whose container logs to retrieve\n * @returns A list of container access logs with action, character, and timestamp details\n * @requires Authentication\n */\n getCorporationAlscLogs(corporationId: number): Promise<ContainerLog[]> {\n return this.api.getCorporationAlscLogs(corporationId);\n }\n\n /**\n * Retrieve the hangar and wallet division names for a corporation.\n *\n * @param corporationId - The ID of the corporation whose divisions to retrieve\n * @returns Hangar and wallet division configurations with custom names\n * @requires Authentication\n */\n getCorporationDivisions(\n corporationId: number,\n ): Promise<CorporationDivisions> {\n return this.api.getCorporationDivisions(corporationId);\n }\n\n /**\n * Retrieve the industrial facilities owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose facilities to retrieve\n * @returns A list of corporation-owned facilities with type and solar system information\n * @requires Authentication\n */\n getCorporationFacilities(\n corporationId: number,\n ): Promise<CorporationFacility[]> {\n return this.api.getCorporationFacilities(corporationId);\n }\n\n /**\n * Retrieve icon URLs for a corporation at various resolutions.\n *\n * @param corporationId - The ID of the corporation whose icons to retrieve\n * @returns Icon URLs at 64x64, 128x128, and 256x256 resolutions\n */\n getCorporationIcon(\n corporationId: number,\n ): Promise<{ px64x64?: string; px128x128?: string; px256x256?: string }> {\n return this.api.getCorporationIcon(corporationId);\n }\n\n /**\n * Retrieve medals created by a corporation.\n *\n * @param corporationId - The ID of the corporation whose medals to retrieve\n * @returns A list of medals defined by the corporation\n * @requires Authentication\n */\n getCorporationMedals(corporationId: number): Promise<CorporationMedal[]> {\n return this.api.getCorporationMedals(corporationId);\n }\n\n /**\n * Retrieve medals that have been issued to members by a corporation.\n *\n * @param corporationId - The ID of the corporation whose issued medals to retrieve\n * @returns A list of medals issued to corporation members with recipient and issuer details\n * @requires Authentication\n */\n getCorporationIssuedMedals(\n corporationId: number,\n ): Promise<CorporationIssuedMedal[]> {\n return this.api.getCorporationIssuedMedals(corporationId);\n }\n\n /**\n * Retrieve the character IDs of all members in a corporation.\n *\n * @param corporationId - The ID of the corporation whose members to retrieve\n * @returns An array of character IDs for all corporation members\n * @requires Authentication\n */\n getCorporationMembers(corporationId: number): Promise<number[]> {\n return this.api.getCorporationMembers(corporationId);\n }\n\n /**\n * Retrieve the maximum number of members a corporation can have based on its current skills.\n *\n * @param corporationId - The ID of the corporation whose member limit to retrieve\n * @returns The maximum member count for the corporation\n * @requires Authentication\n */\n getCorporationMemberLimit(corporationId: number): Promise<number> {\n return this.api.getCorporationMemberLimit(corporationId);\n }\n\n /**\n * Retrieve the titles assigned to each member of a corporation.\n *\n * @param corporationId - The ID of the corporation whose member titles to retrieve\n * @returns A list of members and their assigned title IDs\n * @requires Authentication\n */\n getCorporationMemberTitles(\n corporationId: number,\n ): Promise<CorporationMemberTitle[]> {\n return this.api.getCorporationMembersTitles(corporationId);\n }\n\n /**\n * Retrieve tracking information for corporation members including last login and location.\n *\n * @param corporationId - The ID of the corporation whose member tracking data to retrieve\n * @returns A list of members with login times, ship types, and location details\n * @requires Authentication\n */\n getCorporationMemberTracking(\n corporationId: number,\n ): Promise<CorporationMemberTracking[]> {\n return this.api.getCorporationMemberTracking(corporationId);\n }\n\n /**\n * Retrieve the roles assigned to each member of a corporation.\n *\n * @param corporationId - The ID of the corporation whose member roles to retrieve\n * @returns A list of members and their assigned roles across all role categories\n * @requires Authentication\n */\n getCorporationRoles(corporationId: number): Promise<CorporationMemberRole[]> {\n return this.api.getCorporationMemberRoles(corporationId);\n }\n\n /**\n * Retrieve the history of role changes for members of a corporation.\n *\n * @param corporationId - The ID of the corporation whose role change history to retrieve\n * @returns A chronological list of role changes with before/after states and issuer details\n * @requires Authentication\n */\n getCorporationRolesHistory(\n corporationId: number,\n ): Promise<CorporationRoleHistory[]> {\n return this.api.getCorporationMemberRolesHistory(corporationId);\n }\n\n /**\n * Retrieve the shareholders of a corporation, including characters and corporations holding shares.\n *\n * @param corporationId - The ID of the corporation whose shareholders to retrieve\n * @returns A list of shareholders with share counts and holder types\n * @requires Authentication\n */\n getCorporationShareholders(\n corporationId: number,\n ): Promise<CorporationShareholder[]> {\n return this.api.getCorporationShareholders(corporationId);\n }\n\n /**\n * Retrieve a corporation's standings with NPC factions, corporations, and agents.\n *\n * @param corporationId - The ID of the corporation whose standings to retrieve\n * @returns A list of standings with from_type, from_id, and standing value\n * @requires Authentication\n */\n getCorporationStandings(corporationId: number): Promise<Standing[]> {\n return this.api.getCorporationStandings(corporationId);\n }\n\n /**\n * Retrieve the list of starbases (POSes) owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose starbases to retrieve\n * @returns A list of starbases with type, system, and state information\n * @requires Authentication\n */\n getCorporationStarbases(\n corporationId: number,\n ): Promise<CorporationStarbase[]> {\n return this.api.getCorporationStarbases(corporationId);\n }\n\n /**\n * Retrieve detailed configuration and fuel information for a specific starbase (POS).\n *\n * @param corporationId - The ID of the corporation that owns the starbase\n * @param starbaseId - The ID of the starbase to retrieve details for\n * @returns Detailed starbase information including fuel levels and access settings\n * @requires Authentication\n */\n getCorporationStarbaseDetail(\n corporationId: number,\n starbaseId: number,\n ): Promise<CorporationStarbaseDetail> {\n return this.api.getCorporationStarbaseDetail(corporationId, starbaseId);\n }\n\n /**\n * Retrieve citadel and other upwell structures owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose structures to retrieve\n * @returns A list of structures with type, location, state, and service information\n * @requires Authentication\n */\n getCorporationStructures(\n corporationId: number,\n ): Promise<CorporationStructure[]> {\n return this.api.getCorporationStructures(corporationId);\n }\n\n /**\n * Retrieve the titles defined by a corporation and their associated roles.\n *\n * @param corporationId - The ID of the corporation whose titles to retrieve\n * @returns A list of corporation titles with names and granted roles\n * @requires Authentication\n */\n getCorporationTitles(corporationId: number): Promise<CorporationTitle[]> {\n return this.api.getCorporationTitles(corporationId);\n }\n\n /**\n * Retrieve a list of all NPC corporation IDs in EVE Online.\n *\n * @returns An array of NPC corporation IDs\n */\n getNpcCorporations(): Promise<number[]> {\n return this.api.getNpcCorporations();\n }\n\n fetchAllCorporationAllianceHistory(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationAllianceHistory[]> {\n return this.fetchAllEndpoint<CorporationAllianceHistory>(\n 'getCorporationAllianceHistory',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationBlueprints(\n corporationId: number,\n concurrency?: number,\n ): Promise<Blueprint[]> {\n return this.fetchAllEndpoint<Blueprint>(\n 'getCorporationBlueprints',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationAlscLogs(\n corporationId: number,\n concurrency?: number,\n ): Promise<ContainerLog[]> {\n return this.fetchAllEndpoint<ContainerLog>(\n 'getCorporationAlscLogs',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationFacilities(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationFacility[]> {\n return this.fetchAllEndpoint<CorporationFacility>(\n 'getCorporationFacilities',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMedals(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMedal[]> {\n return this.fetchAllEndpoint<CorporationMedal>(\n 'getCorporationMedals',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationIssuedMedals(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationIssuedMedal[]> {\n return this.fetchAllEndpoint<CorporationIssuedMedal>(\n 'getCorporationIssuedMedals',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMembers(\n corporationId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getCorporationMembers',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMemberTitles(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMemberTitle[]> {\n return this.fetchAllEndpoint<CorporationMemberTitle>(\n 'getCorporationMembersTitles',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMemberTracking(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMemberTracking[]> {\n return this.fetchAllEndpoint<CorporationMemberTracking>(\n 'getCorporationMemberTracking',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationRoles(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMemberRole[]> {\n return this.fetchAllEndpoint<CorporationMemberRole>(\n 'getCorporationMemberRoles',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationRolesHistory(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationRoleHistory[]> {\n return this.fetchAllEndpoint<CorporationRoleHistory>(\n 'getCorporationMemberRolesHistory',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationShareholders(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationShareholder[]> {\n return this.fetchAllEndpoint<CorporationShareholder>(\n 'getCorporationShareholders',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationStandings(\n corporationId: number,\n concurrency?: number,\n ): Promise<Standing[]> {\n return this.fetchAllEndpoint<Standing>(\n 'getCorporationStandings',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationStarbases(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationStarbase[]> {\n return this.fetchAllEndpoint<CorporationStarbase>(\n 'getCorporationStarbases',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationStructures(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationStructure[]> {\n return this.fetchAllEndpoint<CorporationStructure>(\n 'getCorporationStructures',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationTitles(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationTitle[]> {\n return this.fetchAllEndpoint<CorporationTitle>(\n 'getCorporationTitles',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllNpcCorporations(concurrency?: number): Promise<number[]> {\n return this.fetchAllEndpoint<number>('getNpcCorporations', [], concurrency);\n }\n\n streamCorporationAllianceHistory(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationAllianceHistory>, void, undefined> {\n return this.streamEndpoint<CorporationAllianceHistory>(\n 'getCorporationAllianceHistory',\n corporationId,\n );\n }\n\n streamCorporationBlueprints(\n corporationId: number,\n ): AsyncGenerator<PageResult<Blueprint>, void, undefined> {\n return this.streamEndpoint<Blueprint>(\n 'getCorporationBlueprints',\n corporationId,\n );\n }\n\n streamCorporationAlscLogs(\n corporationId: number,\n ): AsyncGenerator<PageResult<ContainerLog>, void, undefined> {\n return this.streamEndpoint<ContainerLog>(\n 'getCorporationAlscLogs',\n corporationId,\n );\n }\n\n streamCorporationFacilities(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationFacility>, void, undefined> {\n return this.streamEndpoint<CorporationFacility>(\n 'getCorporationFacilities',\n corporationId,\n );\n }\n\n streamCorporationMedals(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMedal>, void, undefined> {\n return this.streamEndpoint<CorporationMedal>(\n 'getCorporationMedals',\n corporationId,\n );\n }\n\n streamCorporationIssuedMedals(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationIssuedMedal>, void, undefined> {\n return this.streamEndpoint<CorporationIssuedMedal>(\n 'getCorporationIssuedMedals',\n corporationId,\n );\n }\n\n streamCorporationMembers(\n corporationId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getCorporationMembers', corporationId);\n }\n\n streamCorporationMemberTitles(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMemberTitle>, void, undefined> {\n return this.streamEndpoint<CorporationMemberTitle>(\n 'getCorporationMembersTitles',\n corporationId,\n );\n }\n\n streamCorporationMemberTracking(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMemberTracking>, void, undefined> {\n return this.streamEndpoint<CorporationMemberTracking>(\n 'getCorporationMemberTracking',\n corporationId,\n );\n }\n\n streamCorporationRoles(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMemberRole>, void, undefined> {\n return this.streamEndpoint<CorporationMemberRole>(\n 'getCorporationMemberRoles',\n corporationId,\n );\n }\n\n streamCorporationRolesHistory(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationRoleHistory>, void, undefined> {\n return this.streamEndpoint<CorporationRoleHistory>(\n 'getCorporationMemberRolesHistory',\n corporationId,\n );\n }\n\n streamCorporationShareholders(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationShareholder>, void, undefined> {\n return this.streamEndpoint<CorporationShareholder>(\n 'getCorporationShareholders',\n corporationId,\n );\n }\n\n streamCorporationStandings(\n corporationId: number,\n ): AsyncGenerator<PageResult<Standing>, void, undefined> {\n return this.streamEndpoint<Standing>(\n 'getCorporationStandings',\n corporationId,\n );\n }\n\n streamCorporationStarbases(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationStarbase>, void, undefined> {\n return this.streamEndpoint<CorporationStarbase>(\n 'getCorporationStarbases',\n corporationId,\n );\n }\n\n streamCorporationStructures(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationStructure>, void, undefined> {\n return this.streamEndpoint<CorporationStructure>(\n 'getCorporationStructures',\n corporationId,\n );\n }\n\n streamCorporationTitles(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationTitle>, void, undefined> {\n return this.streamEndpoint<CorporationTitle>(\n 'getCorporationTitles',\n corporationId,\n );\n }\n\n streamNpcCorporations(): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getNpcCorporations');\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n CorporationProjectsListingSchema,\n CorporationProjectSchema,\n CorporationProjectContributionSchema,\n CorporationProjectContributorsListingSchema,\n} from '../../schemas/corporation-projects';\n\nexport const corporationProjectEndpoints = {\n getCorporationProjects: {\n path: 'corporations/{corporationId}/projects',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CorporationProjectsListingSchema,\n },\n getCorporationProject: {\n path: 'corporations/{corporationId}/projects/{projectId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'projectId'],\n responseSchema: CorporationProjectSchema,\n },\n getCorporationProjectContribution: {\n path: 'corporations/{corporationId}/projects/{projectId}/contribution/{characterId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'projectId', 'characterId'],\n responseSchema: CorporationProjectContributionSchema,\n },\n getCorporationProjectContributors: {\n path: 'corporations/{corporationId}/projects/{projectId}/contributors',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'projectId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CorporationProjectContributorsListingSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { corporationProjectEndpoints } from '../core/endpoints/corporationProjectEndpoints';\nimport {\n CorporationProject,\n CorporationProjectContribution,\n CorporationProjectContributorsListing,\n CorporationProjectsListing,\n} from '../types/api-responses';\n\nexport class CorporationProjectsClient extends BaseEsiClient<\n typeof corporationProjectEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, corporationProjectEndpoints);\n }\n\n /**\n * Retrieves one page of a corporation's projects.\n *\n * The list is cursor paginated: pass `cursor.after` from one page as\n * `after` to read the next. Tokens are opaque; an empty `projects` array\n * marks the end of the list.\n *\n * @param corporationId - The ID of the corporation\n * @param before - Optional cursor token to read records before\n * @param after - Optional cursor token to read records after\n * @returns A page of projects and its cursor\n * @requires Authentication\n */\n getCorporationProjects(\n corporationId: number,\n before?: string,\n after?: string,\n ): Promise<CorporationProjectsListing> {\n return this.api.getCorporationProjects(corporationId, before, after);\n }\n\n /**\n * Retrieves details of a specific corporation project.\n *\n * @param corporationId - The ID of the corporation\n * @param projectId - The project's UUID\n * @returns The corporation project details\n * @requires Authentication\n */\n getCorporationProject(\n corporationId: number,\n projectId: string,\n ): Promise<CorporationProject> {\n return this.api.getCorporationProject(corporationId, projectId);\n }\n\n /**\n * Retrieves a character's contribution to a specific corporation project.\n *\n * @param corporationId - The ID of the corporation\n * @param projectId - The project's UUID\n * @param characterId - The ID of the character\n * @returns The character's contribution details\n * @requires Authentication\n */\n getCorporationProjectContribution(\n corporationId: number,\n projectId: string,\n characterId: number,\n ): Promise<CorporationProjectContribution> {\n return this.api.getCorporationProjectContribution(\n corporationId,\n projectId,\n characterId,\n );\n }\n\n /**\n * Retrieves one page of the contributors to a corporation project.\n *\n * Cursor paginated in the same way as {@link getCorporationProjects}.\n *\n * @param corporationId - The ID of the corporation\n * @param projectId - The project's UUID\n * @param before - Optional cursor token to read records before\n * @param after - Optional cursor token to read records after\n * @returns A page of contributors and its cursor\n * @requires Authentication\n */\n getCorporationProjectContributors(\n corporationId: number,\n projectId: string,\n before?: string,\n after?: string,\n ): Promise<CorporationProjectContributorsListing> {\n return this.api.getCorporationProjectContributors(\n corporationId,\n projectId,\n before,\n after,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n DogmaAttributeSchema,\n DogmaEffectSchema,\n DogmaDynamicItemSchema,\n} from '../../schemas/dogma';\n\nexport const dogmaEndpoints = {\n getAttributes: {\n path: 'dogma/attributes',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getAttributeById: {\n path: 'dogma/attributes/{attributeId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['attributeId'],\n responseSchema: DogmaAttributeSchema,\n },\n getEffects: {\n path: 'dogma/effects',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getEffectById: {\n path: 'dogma/effects/{effectId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['effectId'],\n responseSchema: DogmaEffectSchema,\n },\n getDynamicItemInfo: {\n path: 'dogma/dynamic/items/{typeId}/{itemId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['typeId', 'itemId'],\n responseSchema: DogmaDynamicItemSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { dogmaEndpoints } from '../core/endpoints/dogmaEndpoints';\nimport {\n DogmaAttribute,\n DogmaEffect,\n DogmaDynamicItem,\n} from '../types/api-responses';\n\nexport class DogmaClient extends BaseEsiClient<typeof dogmaEndpoints> {\n constructor(client: ApiClient) {\n super(client, dogmaEndpoints);\n }\n\n /**\n * Retrieves a list of all dogma attribute IDs.\n *\n * @returns An array of dogma attribute IDs\n */\n getAttributes(): Promise<number[]> {\n return this.api.getAttributes() as Promise<number[]>;\n }\n\n /**\n * Retrieves detailed information about a specific dogma attribute.\n *\n * @param attributeId - The ID of the dogma attribute to look up\n * @returns Detailed information about the dogma attribute\n */\n getAttributeById(attributeId: number): Promise<DogmaAttribute> {\n return this.api.getAttributeById(attributeId) as Promise<DogmaAttribute>;\n }\n\n /**\n * Retrieves the dynamic dogma information for a specific mutated item, including its modified attributes.\n *\n * @param typeId - The type ID of the item\n * @param itemId - The item ID of the specific dynamic item\n * @returns Dynamic dogma information for the mutated item\n */\n getDynamicItemInfo(\n typeId: number,\n itemId: number,\n ): Promise<DogmaDynamicItem> {\n return this.api.getDynamicItemInfo(\n typeId,\n itemId,\n ) as Promise<DogmaDynamicItem>;\n }\n\n /**\n * Retrieves a list of all dogma effect IDs.\n *\n * @returns An array of dogma effect IDs\n */\n getEffects(): Promise<number[]> {\n return this.api.getEffects() as Promise<number[]>;\n }\n\n /**\n * Retrieves detailed information about a specific dogma effect.\n *\n * @param effectId - The ID of the dogma effect to look up\n * @returns Detailed information about the dogma effect\n */\n getEffectById(effectId: number): Promise<DogmaEffect> {\n return this.api.getEffectById(effectId) as Promise<DogmaEffect>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n FactionWarfareStatsSchema,\n FactionWarfareCharacterStatsSchema,\n FactionWarfareSystemSchema,\n FactionWarfareWarSchema,\n FactionWarfareFactionLeaderboardSchema,\n FactionWarfareCharacterLeaderboardSchema,\n FactionWarfareCorporationLeaderboardSchema,\n FactionWarfareCorporationStatsSchema,\n} from '../../schemas/faction-warfare';\n\nexport const factionEndpoints = {\n getCharacterStats: {\n path: 'characters/{characterId}/fw/stats',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: FactionWarfareCharacterStatsSchema,\n },\n getCorporationStats: {\n path: 'corporations/{corporationId}/fw/stats',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: FactionWarfareCorporationStatsSchema,\n },\n getOverall: {\n path: 'fw/leaderboards',\n method: 'GET',\n requiresAuth: false,\n responseSchema: FactionWarfareFactionLeaderboardSchema,\n },\n getCharacters: {\n path: 'fw/leaderboards/characters',\n method: 'GET',\n requiresAuth: false,\n responseSchema: FactionWarfareCharacterLeaderboardSchema,\n },\n getCorporations: {\n path: 'fw/leaderboards/corporations',\n method: 'GET',\n requiresAuth: false,\n responseSchema: FactionWarfareCorporationLeaderboardSchema,\n },\n getStats: {\n path: 'fw/stats',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionWarfareStatsSchema),\n },\n getSystems: {\n path: 'fw/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionWarfareSystemSchema),\n },\n getWars: {\n path: 'fw/wars',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionWarfareWarSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { factionEndpoints } from '../core/endpoints/factionEndpoints';\nimport {\n FactionWarfareStats,\n FactionWarfareCharacterStats,\n FactionWarfareCorporationStats,\n FactionWarfareCharacterLeaderboard,\n FactionWarfareCorporationLeaderboard,\n FactionWarfareFactionLeaderboard,\n FactionWarfareSystem,\n FactionWarfareWar,\n} from '../types/api-responses';\n\nexport class FactionClient extends BaseEsiClient<typeof factionEndpoints> {\n constructor(client: ApiClient) {\n super(client, factionEndpoints);\n }\n\n /**\n * Retrieves the top characters in faction warfare leaderboards.\n *\n * @returns Faction warfare character leaderboard rankings\n */\n getLeaderboardsCharacters(): Promise<FactionWarfareCharacterLeaderboard> {\n return this.api.getCharacters();\n }\n\n /**\n * Retrieves the top corporations in faction warfare leaderboards.\n *\n * @returns Faction warfare corporation leaderboard rankings\n */\n getLeaderboardsCorporations(): Promise<FactionWarfareCorporationLeaderboard> {\n return this.api.getCorporations();\n }\n\n /**\n * Retrieves the overall faction warfare leaderboards across all factions.\n *\n * @returns Overall faction warfare leaderboard rankings\n */\n getLeaderboardsOverall(): Promise<FactionWarfareFactionLeaderboard> {\n return this.api.getOverall();\n }\n\n /**\n * Retrieves faction warfare statistics for all factions, including kill and victory point totals.\n *\n * @returns An array of per-faction warfare statistics\n */\n getStats(): Promise<FactionWarfareStats[]> {\n return this.api.getStats();\n }\n\n /**\n * Retrieves faction warfare statistics for a specific character, including enlistment info and kill counts.\n *\n * @param characterId - The ID of the character\n * @returns Faction warfare statistics for the character\n * @requires Authentication\n */\n getCharacterStats(\n characterId: number,\n ): Promise<FactionWarfareCharacterStats> {\n return this.api.getCharacterStats(characterId);\n }\n\n /**\n * Retrieves faction warfare statistics for a specific corporation, including kill counts and victory points.\n *\n * @param corporationId - The ID of the corporation\n * @returns Faction warfare statistics for the corporation\n * @requires Authentication\n */\n getCorporationStats(\n corporationId: number,\n ): Promise<FactionWarfareCorporationStats> {\n return this.api.getCorporationStats(corporationId);\n }\n\n /**\n * Retrieves the current ownership and contested status of all faction warfare systems.\n *\n * @returns An array of faction warfare system statuses\n */\n getSystems(): Promise<FactionWarfareSystem[]> {\n return this.api.getSystems();\n }\n\n /**\n * Retrieves the list of active faction warfare wars, showing which factions are fighting each other.\n *\n * @returns An array of active faction warfare wars\n */\n getWars(): Promise<FactionWarfareWar[]> {\n return this.api.getWars();\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { FittingSchema } from '../../schemas/fittings';\n\nexport const fittingEndpoints = {\n getFittings: {\n path: 'characters/{characterId}/fittings',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(FittingSchema),\n },\n createFitting: {\n path: 'characters/{characterId}/fittings',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n },\n deleteFitting: {\n path: 'characters/{characterId}/fittings/{fittingId}',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId', 'fittingId'],\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { fittingEndpoints } from '../core/endpoints/fittingEndpoints';\nimport { Fitting } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class FittingsClient extends BaseEsiClient<typeof fittingEndpoints> {\n constructor(client: ApiClient) {\n super(client, fittingEndpoints);\n }\n\n /**\n * Retrieves all saved ship fittings for a character.\n *\n * @param characterId - The ID of the character\n * @returns An array of the character's saved fittings\n * @requires Authentication\n */\n getFittings(characterId: number): Promise<Fitting[]> {\n return this.api.getFittings(characterId);\n }\n\n /**\n * Creates a new saved ship fitting for a character via POST.\n *\n * @param characterId - The ID of the character\n * @param fittingData - The fitting details including ship type and module layout\n * @returns The ID of the newly created fitting\n * @requires Authentication\n */\n createFitting(\n characterId: number,\n fittingData: object,\n ): Promise<{ fitting_id: number }> {\n return this.api.createFitting(characterId, fittingData) as Promise<{\n fitting_id: number;\n }>;\n }\n\n /**\n * Deletes a saved ship fitting for a character.\n *\n * @param characterId - The ID of the character\n * @param fittingId - The ID of the fitting to delete\n * @requires Authentication\n */\n deleteFitting(characterId: number, fittingId: number): Promise<void> {\n return this.api.deleteFitting(characterId, fittingId) as Promise<void>;\n }\n\n fetchAllFittings(\n characterId: number,\n concurrency?: number,\n ): Promise<Fitting[]> {\n return this.fetchAllEndpoint<Fitting>(\n 'getFittings',\n [characterId],\n concurrency,\n );\n }\n\n streamFittings(\n characterId: number,\n ): AsyncGenerator<PageResult<Fitting>, void, undefined> {\n return this.streamEndpoint<Fitting>('getFittings', characterId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n FleetInfoSchema,\n FleetMemberSchema,\n FleetWingSchema,\n CharacterFleetInfoSchema,\n} from '../../schemas/fleet';\n\nexport const fleetEndpoints = {\n getCharacterFleetInfo: {\n path: 'characters/{characterId}/fleet',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterFleetInfoSchema,\n },\n getFleetInfo: {\n path: 'fleets/{fleetId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['fleetId'],\n responseSchema: FleetInfoSchema,\n },\n updateFleet: {\n path: 'fleets/{fleetId}',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId'],\n hasBody: true,\n requestSchema: z.looseObject({\n is_free_move: z.boolean().optional(),\n motd: z.string().optional(),\n }),\n },\n getFleetMembers: {\n path: 'fleets/{fleetId}/members',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['fleetId'],\n responseSchema: z.array(FleetMemberSchema),\n },\n createFleetInvitation: {\n path: 'fleets/{fleetId}/members/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['fleetId'],\n hasBody: true,\n },\n kickFleetMember: {\n path: 'fleets/{fleetId}/members/{memberId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['fleetId', 'memberId'],\n },\n moveFleetMember: {\n path: 'fleets/{fleetId}/members/{memberId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId', 'memberId'],\n hasBody: true,\n },\n deleteFleetSquad: {\n path: 'fleets/{fleetId}/squads/{squadId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['fleetId', 'squadId'],\n },\n renameFleetSquad: {\n path: 'fleets/{fleetId}/squads/{squadId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId', 'squadId'],\n bodyBuilder: (name: string) => ({ name }),\n },\n getFleetWings: {\n path: 'fleets/{fleetId}/wings/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['fleetId'],\n responseSchema: z.array(FleetWingSchema),\n },\n createFleetWing: {\n path: 'fleets/{fleetId}/wings/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['fleetId'],\n hasBody: true,\n },\n deleteFleetWing: {\n path: 'fleets/{fleetId}/wings/{wingId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['fleetId', 'wingId'],\n },\n renameFleetWing: {\n path: 'fleets/{fleetId}/wings/{wingId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId', 'wingId'],\n bodyBuilder: (name: string) => ({ name }),\n },\n createFleetSquad: {\n path: 'fleets/{fleetId}/wings/{wingId}/squads/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['fleetId', 'wingId'],\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { fleetEndpoints } from '../core/endpoints/fleetEndpoints';\nimport {\n CharacterFleetInfo,\n FleetInfo,\n FleetMember,\n FleetWing,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class FleetClient extends BaseEsiClient<typeof fleetEndpoints> {\n constructor(client: ApiClient) {\n super(client, fleetEndpoints);\n }\n\n /**\n * Retrieves the fleet that a character is currently in, including their role and wing/squad assignment.\n *\n * @param characterId - The ID of the character\n * @returns Fleet membership information for the character\n * @requires Authentication\n */\n getCharacterFleetInfo(characterId: number): Promise<CharacterFleetInfo> {\n return this.api.getCharacterFleetInfo(characterId);\n }\n\n /**\n * Retrieves detailed information about a fleet, including its MOTD and free-move setting.\n *\n * @param fleetId - The ID of the fleet\n * @returns Detailed fleet information\n * @requires Authentication\n */\n getFleetInformation(fleetId: number): Promise<FleetInfo> {\n return this.api.getFleetInfo(fleetId);\n }\n\n /**\n * Updates fleet settings such as the MOTD and free-move toggle via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param body - The fleet settings to update\n * @requires Authentication\n */\n updateFleet(fleetId: number, body: object): Promise<void> {\n return this.api.updateFleet(fleetId, body) as Promise<void>;\n }\n\n /**\n * Retrieves all current members of a fleet, including their ship types and roles.\n *\n * @param fleetId - The ID of the fleet\n * @returns An array of fleet members\n * @requires Authentication\n */\n getFleetMembers(fleetId: number): Promise<FleetMember[]> {\n return this.api.getFleetMembers(fleetId);\n }\n\n /**\n * Sends an invitation to a character to join a fleet via POST.\n *\n * @param fleetId - The ID of the fleet\n * @param body - The invitation details including the character to invite and their role\n * @requires Authentication\n */\n createFleetInvitation(fleetId: number, body: object): Promise<void> {\n return this.api.createFleetInvitation(fleetId, body) as Promise<void>;\n }\n\n /**\n * Kicks a member from a fleet.\n *\n * @param fleetId - The ID of the fleet\n * @param memberId - The character ID of the member to kick\n * @requires Authentication\n */\n kickFleetMember(fleetId: number, memberId: number): Promise<void> {\n return this.api.kickFleetMember(fleetId, memberId) as Promise<void>;\n }\n\n /**\n * Moves a fleet member to a different wing, squad, or role via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param memberId - The character ID of the member to move\n * @param body - The target role, wing, and/or squad assignment\n * @requires Authentication\n */\n moveFleetMember(\n fleetId: number,\n memberId: number,\n body: object,\n ): Promise<void> {\n return this.api.moveFleetMember(fleetId, memberId, body) as Promise<void>;\n }\n\n /**\n * Deletes a squad from a fleet.\n *\n * @param fleetId - The ID of the fleet\n * @param squadId - The ID of the squad to delete\n * @requires Authentication\n */\n deleteFleetSquad(fleetId: number, squadId: number): Promise<void> {\n return this.api.deleteFleetSquad(fleetId, squadId) as Promise<void>;\n }\n\n /**\n * Renames a squad within a fleet via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param squadId - The ID of the squad to rename\n * @param name - The new name for the squad (max 10 characters)\n * @requires Authentication\n */\n renameFleetSquad(\n fleetId: number,\n squadId: number,\n name: string,\n ): Promise<void> {\n if (name.length > 10) {\n return Promise.reject(\n new Error(\n `Fleet squad name \"${name}\" exceeds ESI maximum of 10 characters`,\n ),\n );\n }\n return this.api.renameFleetSquad(fleetId, squadId, name) as Promise<void>;\n }\n\n /**\n * Retrieves all wings and their squads for a fleet.\n *\n * @param fleetId - The ID of the fleet\n * @returns An array of fleet wings with their nested squads\n * @requires Authentication\n */\n getFleetWings(fleetId: number): Promise<FleetWing[]> {\n return this.api.getFleetWings(fleetId);\n }\n\n /**\n * Creates a new wing in a fleet via POST.\n *\n * @param fleetId - The ID of the fleet\n * @param body - The wing creation details\n * @returns The ID of the newly created wing\n * @requires Authentication\n */\n createFleetWing(fleetId: number, body: object): Promise<{ wing_id: number }> {\n return this.api.createFleetWing(fleetId, body) as Promise<{\n wing_id: number;\n }>;\n }\n\n /**\n * Deletes a wing from a fleet, along with all its squads.\n *\n * @param fleetId - The ID of the fleet\n * @param wingId - The ID of the wing to delete\n * @requires Authentication\n */\n deleteFleetWing(fleetId: number, wingId: number): Promise<void> {\n return this.api.deleteFleetWing(fleetId, wingId) as Promise<void>;\n }\n\n /**\n * Renames a wing within a fleet via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param wingId - The ID of the wing to rename\n * @param name - The new name for the wing (max 10 characters)\n * @requires Authentication\n */\n renameFleetWing(\n fleetId: number,\n wingId: number,\n name: string,\n ): Promise<void> {\n if (name.length > 10) {\n return Promise.reject(\n new Error(\n `Fleet wing name \"${name}\" exceeds ESI maximum of 10 characters`,\n ),\n );\n }\n return this.api.renameFleetWing(fleetId, wingId, name) as Promise<void>;\n }\n\n /**\n * Creates a new squad under a wing in a fleet via POST.\n *\n * @param fleetId - The ID of the fleet\n * @param wingId - The ID of the wing to add the squad to\n * @returns The ID of the newly created squad\n * @requires Authentication\n */\n createFleetSquad(\n fleetId: number,\n wingId: number,\n ): Promise<{ squad_id: number }> {\n return this.api.createFleetSquad(fleetId, wingId) as Promise<{\n squad_id: number;\n }>;\n }\n\n fetchAllFleetMembers(\n fleetId: number,\n concurrency?: number,\n ): Promise<FleetMember[]> {\n return this.fetchAllEndpoint<FleetMember>(\n 'getFleetMembers',\n [fleetId],\n concurrency,\n );\n }\n\n fetchAllFleetWings(\n fleetId: number,\n concurrency?: number,\n ): Promise<FleetWing[]> {\n return this.fetchAllEndpoint<FleetWing>(\n 'getFleetWings',\n [fleetId],\n concurrency,\n );\n }\n\n streamFleetMembers(\n fleetId: number,\n ): AsyncGenerator<PageResult<FleetMember>, void, undefined> {\n return this.streamEndpoint<FleetMember>('getFleetMembers', fleetId);\n }\n\n streamFleetWings(\n fleetId: number,\n ): AsyncGenerator<PageResult<FleetWing>, void, undefined> {\n return this.streamEndpoint<FleetWing>('getFleetWings', fleetId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { IncursionSchema } from '../../schemas/incursions';\n\nexport const incursionEndpoints = {\n getIncursions: {\n path: 'incursions',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(IncursionSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { incursionEndpoints } from '../core/endpoints/incursionEndpoints';\nimport { Incursion } from '../types/api-responses';\n\nexport class IncursionsClient extends BaseEsiClient<typeof incursionEndpoints> {\n constructor(client: ApiClient) {\n super(client, incursionEndpoints);\n }\n\n /**\n * Retrieves all currently active incursions, including their staging systems and influence levels.\n *\n * @returns An array of active incursions\n */\n getIncursions(): Promise<Incursion[]> {\n return this.api.getIncursions() as Promise<Incursion[]>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n IndustryJobSchema,\n CorporationIndustryJobSchema,\n MiningLedgerEntrySchema,\n IndustryFacilitySchema,\n IndustrySystemSchema,\n MoonExtractionTimerSchema,\n MiningObserverSchema,\n MiningObserverEntrySchema,\n} from '../../schemas/industry';\n\nexport const industryEndpoints = {\n getCharacterIndustryJobs: {\n path: 'characters/{characterId}/industry/jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(IndustryJobSchema),\n },\n getCharacterMiningLedger: {\n path: 'characters/{characterId}/mining',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MiningLedgerEntrySchema),\n },\n getCorporationIndustryJobs: {\n path: 'corporations/{corporationId}/industry/jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationIndustryJobSchema),\n },\n getMoonExtractionTimers: {\n path: 'corporation/{corporationId}/mining/extractions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(MoonExtractionTimerSchema),\n },\n getCorporationMiningObservers: {\n path: 'corporation/{corporationId}/mining/observers',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(MiningObserverSchema),\n },\n getCorporationMiningObserver: {\n path: 'corporation/{corporationId}/mining/observers/{observerId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'observerId'],\n responseSchema: z.array(MiningObserverEntrySchema),\n },\n getIndustryFacilities: {\n path: 'industry/facilities',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(IndustryFacilitySchema),\n },\n getIndustrySystems: {\n path: 'industry/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(IndustrySystemSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { industryEndpoints } from '../core/endpoints/industryEndpoints';\nimport {\n IndustryJob,\n CorporationIndustryJob,\n MiningLedgerEntry,\n IndustryFacility,\n IndustrySystem,\n MoonExtractionTimer,\n MiningObserver,\n MiningObserverEntry,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class IndustryClient extends BaseEsiClient<typeof industryEndpoints> {\n constructor(client: ApiClient) {\n super(client, industryEndpoints);\n }\n\n /**\n * Retrieves all industry jobs for a character, including manufacturing, research, and invention.\n *\n * @param characterId - The ID of the character\n * @returns An array of the character's industry jobs\n * @requires Authentication\n */\n getCharacterIndustryJobs(characterId: number): Promise<IndustryJob[]> {\n return this.api.getCharacterIndustryJobs(characterId);\n }\n\n /**\n * Retrieves a character's personal mining ledger, showing ore mined per day.\n *\n * @param characterId - The ID of the character\n * @returns An array of mining ledger entries\n * @requires Authentication\n */\n getCharacterMiningLedger(characterId: number): Promise<MiningLedgerEntry[]> {\n return this.api.getCharacterMiningLedger(characterId);\n }\n\n /**\n * Retrieves moon extraction timers for a corporation's refineries.\n *\n * @param corporationId - The ID of the corporation\n * @returns An array of moon extraction timers\n * @requires Authentication\n */\n getMoonExtractionTimers(\n corporationId: number,\n ): Promise<MoonExtractionTimer[]> {\n return this.api.getMoonExtractionTimers(corporationId);\n }\n\n /**\n * Retrieves the list of mining observers (e.g., refineries) owned by a corporation.\n *\n * @param corporationId - The ID of the corporation\n * @returns An array of mining observers\n * @requires Authentication\n */\n getCorporationMiningObservers(\n corporationId: number,\n ): Promise<MiningObserver[]> {\n return this.api.getCorporationMiningObservers(corporationId);\n }\n\n /**\n * Retrieves mining activity recorded by a specific corporation mining observer.\n *\n * @param corporationId - The ID of the corporation\n * @param observerId - The ID of the mining observer\n * @returns An array of mining activity entries for the observer\n * @requires Authentication\n */\n getCorporationMiningObserver(\n corporationId: number,\n observerId: number,\n ): Promise<MiningObserverEntry[]> {\n return this.api.getCorporationMiningObserver(corporationId, observerId);\n }\n\n /**\n * Retrieves all industry jobs for a corporation, including manufacturing, research, and invention.\n *\n * @param corporationId - The ID of the corporation\n * @returns An array of the corporation's industry jobs\n * @requires Authentication\n */\n getCorporationIndustryJobs(\n corporationId: number,\n ): Promise<CorporationIndustryJob[]> {\n return this.api.getCorporationIndustryJobs(corporationId);\n }\n\n /**\n * Retrieves a list of all publicly available industry facilities in the universe.\n *\n * @returns An array of industry facilities\n */\n getIndustryFacilities(): Promise<IndustryFacility[]> {\n return this.api.getIndustryFacilities();\n }\n\n /**\n * Retrieves cost indices for solar systems with industry activity, used to calculate job installation fees.\n *\n * @returns An array of industry system cost indices\n */\n getIndustrySystems(): Promise<IndustrySystem[]> {\n return this.api.getIndustrySystems();\n }\n\n fetchAllCharacterIndustryJobs(\n characterId: number,\n concurrency?: number,\n ): Promise<IndustryJob[]> {\n return this.fetchAllEndpoint<IndustryJob>(\n 'getCharacterIndustryJobs',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterMiningLedger(\n characterId: number,\n concurrency?: number,\n ): Promise<MiningLedgerEntry[]> {\n return this.fetchAllEndpoint<MiningLedgerEntry>(\n 'getCharacterMiningLedger',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationIndustryJobs(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationIndustryJob[]> {\n return this.fetchAllEndpoint<CorporationIndustryJob>(\n 'getCorporationIndustryJobs',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllMoonExtractionTimers(\n corporationId: number,\n concurrency?: number,\n ): Promise<MoonExtractionTimer[]> {\n return this.fetchAllEndpoint<MoonExtractionTimer>(\n 'getMoonExtractionTimers',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMiningObservers(\n corporationId: number,\n concurrency?: number,\n ): Promise<MiningObserver[]> {\n return this.fetchAllEndpoint<MiningObserver>(\n 'getCorporationMiningObservers',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMiningObserver(\n corporationId: number,\n observerId: number,\n concurrency?: number,\n ): Promise<MiningObserverEntry[]> {\n return this.fetchAllEndpoint<MiningObserverEntry>(\n 'getCorporationMiningObserver',\n [corporationId, observerId],\n concurrency,\n );\n }\n\n fetchAllIndustryFacilities(\n concurrency?: number,\n ): Promise<IndustryFacility[]> {\n return this.fetchAllEndpoint<IndustryFacility>(\n 'getIndustryFacilities',\n [],\n concurrency,\n );\n }\n\n fetchAllIndustrySystems(concurrency?: number): Promise<IndustrySystem[]> {\n return this.fetchAllEndpoint<IndustrySystem>(\n 'getIndustrySystems',\n [],\n concurrency,\n );\n }\n\n streamCharacterIndustryJobs(\n characterId: number,\n ): AsyncGenerator<PageResult<IndustryJob>, void, undefined> {\n return this.streamEndpoint<IndustryJob>(\n 'getCharacterIndustryJobs',\n characterId,\n );\n }\n\n streamCharacterMiningLedger(\n characterId: number,\n ): AsyncGenerator<PageResult<MiningLedgerEntry>, void, undefined> {\n return this.streamEndpoint<MiningLedgerEntry>(\n 'getCharacterMiningLedger',\n characterId,\n );\n }\n\n streamCorporationIndustryJobs(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationIndustryJob>, void, undefined> {\n return this.streamEndpoint<CorporationIndustryJob>(\n 'getCorporationIndustryJobs',\n corporationId,\n );\n }\n\n streamMoonExtractionTimers(\n corporationId: number,\n ): AsyncGenerator<PageResult<MoonExtractionTimer>, void, undefined> {\n return this.streamEndpoint<MoonExtractionTimer>(\n 'getMoonExtractionTimers',\n corporationId,\n );\n }\n\n streamCorporationMiningObservers(\n corporationId: number,\n ): AsyncGenerator<PageResult<MiningObserver>, void, undefined> {\n return this.streamEndpoint<MiningObserver>(\n 'getCorporationMiningObservers',\n corporationId,\n );\n }\n\n streamCorporationMiningObserver(\n corporationId: number,\n observerId: number,\n ): AsyncGenerator<PageResult<MiningObserverEntry>, void, undefined> {\n return this.streamEndpoint<MiningObserverEntry>(\n 'getCorporationMiningObserver',\n corporationId,\n observerId,\n );\n }\n\n streamIndustryFacilities(): AsyncGenerator<\n PageResult<IndustryFacility>,\n void,\n undefined\n > {\n return this.streamEndpoint<IndustryFacility>('getIndustryFacilities');\n }\n\n streamIndustrySystems(): AsyncGenerator<\n PageResult<IndustrySystem>,\n void,\n undefined\n > {\n return this.streamEndpoint<IndustrySystem>('getIndustrySystems');\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { InsurancePriceSchema } from '../../schemas/insurance';\n\nexport const insuranceEndpoints = {\n getInsurancePrices: {\n path: 'insurance/prices',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(InsurancePriceSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { insuranceEndpoints } from '../core/endpoints/insuranceEndpoints';\nimport { InsurancePrice } from '../types/api-responses';\n\nexport class InsuranceClient extends BaseEsiClient<typeof insuranceEndpoints> {\n constructor(client: ApiClient) {\n super(client, insuranceEndpoints);\n }\n\n /**\n * Retrieves available insurance levels and their costs for all ship types.\n *\n * @returns An array of insurance price listings per ship type\n */\n getInsurancePrices(): Promise<InsurancePrice[]> {\n return this.api.getInsurancePrices() as Promise<InsurancePrice[]>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { KillmailSummarySchema, KillmailSchema } from '../../schemas/killmails';\n\nexport const killmailEndpoints = {\n getCharacterRecentKillmails: {\n path: 'characters/{characterId}/killmails/recent',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(KillmailSummarySchema),\n },\n getCorporationRecentKillmails: {\n path: 'corporations/{corporationId}/killmails/recent',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(KillmailSummarySchema),\n },\n getKillmail: {\n path: 'killmails/{killmailId}/{killmailHash}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['killmailId', 'killmailHash'],\n responseSchema: KillmailSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { killmailEndpoints } from '../core/endpoints/killmailEndpoints';\nimport { KillmailSummary, Killmail } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class KillmailsClient extends BaseEsiClient<typeof killmailEndpoints> {\n constructor(client: ApiClient) {\n super(client, killmailEndpoints);\n }\n\n /**\n * Retrieves a list of recent killmail summaries for a character.\n *\n * @param characterId - The ID of the character to fetch killmails for\n * @returns A list of recent killmail summaries including killmail IDs and hashes\n * @requires Authentication\n */\n getCharacterRecentKillmails(characterId: number): Promise<KillmailSummary[]> {\n return this.api.getCharacterRecentKillmails(characterId);\n }\n\n /**\n * Retrieves a list of recent killmail summaries for a corporation.\n *\n * @param corporationId - The ID of the corporation to fetch killmails for\n * @returns A list of recent killmail summaries including killmail IDs and hashes\n * @requires Authentication\n */\n getCorporationRecentKillmails(\n corporationId: number,\n ): Promise<KillmailSummary[]> {\n return this.api.getCorporationRecentKillmails(corporationId);\n }\n\n /**\n * Retrieves the full details of a specific killmail by its ID and hash.\n *\n * @param killmailId - The ID of the killmail to retrieve\n * @param killmailHash - The hash of the killmail for verification\n * @returns The full killmail details including victim, attackers, and items\n */\n getKillmail(killmailId: number, killmailHash: string): Promise<Killmail> {\n return this.api.getKillmail(killmailId, killmailHash);\n }\n\n fetchAllCharacterRecentKillmails(\n characterId: number,\n concurrency?: number,\n ): Promise<KillmailSummary[]> {\n return this.fetchAllEndpoint<KillmailSummary>(\n 'getCharacterRecentKillmails',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationRecentKillmails(\n corporationId: number,\n concurrency?: number,\n ): Promise<KillmailSummary[]> {\n return this.fetchAllEndpoint<KillmailSummary>(\n 'getCorporationRecentKillmails',\n [corporationId],\n concurrency,\n );\n }\n\n streamCharacterRecentKillmails(\n characterId: number,\n ): AsyncGenerator<PageResult<KillmailSummary>, void, undefined> {\n return this.streamEndpoint<KillmailSummary>(\n 'getCharacterRecentKillmails',\n characterId,\n );\n }\n\n streamCorporationRecentKillmails(\n corporationId: number,\n ): AsyncGenerator<PageResult<KillmailSummary>, void, undefined> {\n return this.streamEndpoint<KillmailSummary>(\n 'getCorporationRecentKillmails',\n corporationId,\n );\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterLocationSchema,\n CharacterOnlineSchema,\n CharacterShipSchema,\n} from '../../schemas/location';\n\nexport const locationEndpoints = {\n getCharacterLocation: {\n path: 'characters/{characterId}/location',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterLocationSchema,\n },\n getCharacterOnline: {\n path: 'characters/{characterId}/online',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterOnlineSchema,\n },\n getCharacterShip: {\n path: 'characters/{characterId}/ship',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterShipSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { locationEndpoints } from '../core/endpoints/locationEndpoints';\nimport {\n CharacterLocation,\n CharacterOnline,\n CharacterShip,\n} from '../types/api-responses';\n\nexport class LocationClient extends BaseEsiClient<typeof locationEndpoints> {\n constructor(client: ApiClient) {\n super(client, locationEndpoints);\n }\n\n /**\n * Retrieves the current solar system, station, and structure location of a character.\n *\n * @param characterId - The ID of the character to locate\n * @returns The character's current location including solar system and optional station or structure\n * @requires Authentication\n */\n getCharacterLocation(characterId: number): Promise<CharacterLocation> {\n return this.api.getCharacterLocation(\n characterId,\n ) as Promise<CharacterLocation>;\n }\n\n /**\n * Checks whether a character is currently online and retrieves login/logout timestamps.\n *\n * @param characterId - The ID of the character to check\n * @returns The character's online status and last login/logout times\n * @requires Authentication\n */\n getCharacterOnline(characterId: number): Promise<CharacterOnline> {\n return this.api.getCharacterOnline(characterId) as Promise<CharacterOnline>;\n }\n\n /**\n * Retrieves the type, name, and item ID of the ship a character is currently flying.\n *\n * @param characterId - The ID of the character whose ship to retrieve\n * @returns The character's current ship details including type ID and ship name\n * @requires Authentication\n */\n getCharacterShip(characterId: number): Promise<CharacterShip> {\n return this.api.getCharacterShip(characterId) as Promise<CharacterShip>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n LoyaltyPointsSchema,\n LoyaltyStoreOfferSchema,\n} from '../../schemas/loyalty';\n\nexport const loyaltyEndpoints = {\n getLoyaltyPoints: {\n path: 'characters/{characterId}/loyalty/points',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(LoyaltyPointsSchema),\n },\n getLoyaltyStoreOffers: {\n path: 'loyalty/stores/{corporationId}/offers',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: z.array(LoyaltyStoreOfferSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { loyaltyEndpoints } from '../core/endpoints/loyaltyEndpoints';\nimport { LoyaltyPoints, LoyaltyStoreOffer } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class LoyaltyClient extends BaseEsiClient<typeof loyaltyEndpoints> {\n constructor(client: ApiClient) {\n super(client, loyaltyEndpoints);\n }\n\n /**\n * Retrieves the loyalty points a character has earned with each NPC corporation.\n *\n * @param characterId - The ID of the character to fetch loyalty points for\n * @returns A list of loyalty point balances per corporation\n * @requires Authentication\n */\n getLoyaltyPoints(characterId: number): Promise<LoyaltyPoints[]> {\n return this.api.getLoyaltyPoints(characterId);\n }\n\n /**\n * Retrieves the list of items available in an NPC corporation's loyalty point store.\n *\n * @param corporationId - The ID of the NPC corporation whose LP store to query\n * @returns A list of offers available in the loyalty store\n */\n getLoyaltyStoreOffers(corporationId: number): Promise<LoyaltyStoreOffer[]> {\n return this.api.getLoyaltyStoreOffers(corporationId);\n }\n\n fetchAllLoyaltyPoints(\n characterId: number,\n concurrency?: number,\n ): Promise<LoyaltyPoints[]> {\n return this.fetchAllEndpoint<LoyaltyPoints>(\n 'getLoyaltyPoints',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllLoyaltyStoreOffers(\n corporationId: number,\n concurrency?: number,\n ): Promise<LoyaltyStoreOffer[]> {\n return this.fetchAllEndpoint<LoyaltyStoreOffer>(\n 'getLoyaltyStoreOffers',\n [corporationId],\n concurrency,\n );\n }\n\n streamLoyaltyPoints(\n characterId: number,\n ): AsyncGenerator<PageResult<LoyaltyPoints>, void, undefined> {\n return this.streamEndpoint<LoyaltyPoints>('getLoyaltyPoints', characterId);\n }\n\n streamLoyaltyStoreOffers(\n corporationId: number,\n ): AsyncGenerator<PageResult<LoyaltyStoreOffer>, void, undefined> {\n return this.streamEndpoint<LoyaltyStoreOffer>(\n 'getLoyaltyStoreOffers',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MailHeaderSchema,\n MailMessageSchema,\n MailLabelSchema,\n MailLabelsResponseSchema,\n MailingListSchema,\n} from '../../schemas/mail';\n\nexport const mailEndpoints = {\n getCharacterMailHeaders: {\n path: 'characters/{characterId}/mail/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MailHeaderSchema),\n },\n sendMail: {\n path: 'characters/{characterId}/mail/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n requestSchema: z.looseObject({\n recipients: z.array(\n z.looseObject({\n recipient_id: z.number().int(),\n recipient_type: z.enum([\n 'alliance',\n 'character',\n 'corporation',\n 'mailing_list',\n ]),\n }),\n ),\n subject: z.string().min(1),\n body: z.string().min(1),\n }),\n },\n getMail: {\n path: 'characters/{characterId}/mail/{mailId}/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'mailId'],\n responseSchema: MailMessageSchema,\n },\n deleteMail: {\n path: 'characters/{characterId}/mail/{mailId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId', 'mailId'],\n },\n updateMailMetadata: {\n path: 'characters/{characterId}/mail/{mailId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['characterId', 'mailId'],\n hasBody: true,\n },\n getMailLabels: {\n path: 'characters/{characterId}/mail/labels/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: MailLabelsResponseSchema,\n },\n createMailLabel: {\n path: 'characters/{characterId}/mail/labels/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n },\n deleteMailLabel: {\n path: 'characters/{characterId}/mail/labels/{labelId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId', 'labelId'],\n },\n getMailingLists: {\n path: 'characters/{characterId}/mail/lists/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MailingListSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { mailEndpoints } from '../core/endpoints/mailEndpoints';\nimport { MailHeader, MailMessage, MailLabel } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class MailClient extends BaseEsiClient<typeof mailEndpoints> {\n constructor(client: ApiClient) {\n super(client, mailEndpoints);\n }\n\n /**\n * Retrieves the mail headers (subject, sender, timestamp) for a character's inbox.\n *\n * @param characterId - The ID of the character whose mail headers to fetch\n * @returns A list of mail message headers\n * @requires Authentication\n */\n getMailHeaders(characterId: number): Promise<MailHeader[]> {\n return this.api.getCharacterMailHeaders(characterId);\n }\n\n /**\n * Sends a new mail on behalf of a character via POST.\n *\n * @param characterId - The ID of the character sending the mail\n * @param body - The mail content including recipients, subject, and body text\n * @returns The ID of the newly created mail\n * @requires Authentication\n */\n sendMail(characterId: number, body: object): Promise<number> {\n return this.api.sendMail(characterId, body) as Promise<number>;\n }\n\n /**\n * Deletes a specific mail from a character's mailbox.\n *\n * @param characterId - The ID of the character who owns the mail\n * @param mailId - The ID of the mail to delete\n * @returns void\n * @requires Authentication\n */\n deleteMail(characterId: number, mailId: number): Promise<void> {\n return this.api.deleteMail(characterId, mailId) as Promise<void>;\n }\n\n /**\n * Retrieves the full contents of a specific mail including its body text.\n *\n * @param characterId - The ID of the character who owns the mail\n * @param mailId - The ID of the mail to retrieve\n * @returns The full mail message including body, sender, and recipients\n * @requires Authentication\n */\n getMail(characterId: number, mailId: number): Promise<MailMessage> {\n return this.api.getMail(characterId, mailId);\n }\n\n /**\n * Updates the metadata of a mail, such as read status or labels, via PUT.\n *\n * @param characterId - The ID of the character who owns the mail\n * @param mailId - The ID of the mail to update\n * @param body - The metadata fields to update (e.g., labels, read status)\n * @returns void\n * @requires Authentication\n */\n updateMailMetadata(\n characterId: number,\n mailId: number,\n body: object,\n ): Promise<void> {\n return this.api.updateMailMetadata(\n characterId,\n mailId,\n body,\n ) as Promise<void>;\n }\n\n /**\n * Retrieves the mail labels and total unread count for a character.\n *\n * @param characterId - The ID of the character whose labels to fetch\n * @returns The character's mail labels and total unread mail count\n * @requires Authentication\n */\n getMailLabels(\n characterId: number,\n ): Promise<{ total_unread_count?: number; labels?: MailLabel[] }> {\n return this.api.getMailLabels(characterId);\n }\n\n /**\n * Creates a new custom mail label for a character via POST.\n *\n * @param characterId - The ID of the character to create the label for\n * @param body - The label definition including name and optional color\n * @returns The ID of the newly created label\n * @requires Authentication\n */\n createMailLabel(characterId: number, body: object): Promise<number> {\n return this.api.createMailLabel(characterId, body) as Promise<number>;\n }\n\n /**\n * Deletes a custom mail label from a character's mailbox.\n *\n * @param characterId - The ID of the character who owns the label\n * @param labelId - The ID of the label to delete\n * @returns void\n * @requires Authentication\n */\n deleteMailLabel(characterId: number, labelId: number): Promise<void> {\n return this.api.deleteMailLabel(characterId, labelId) as Promise<void>;\n }\n\n /**\n * Retrieves the mailing lists that a character is subscribed to.\n *\n * @param characterId - The ID of the character whose mailing lists to fetch\n * @returns A list of mailing lists with their IDs and names\n * @requires Authentication\n */\n getMailingLists(\n characterId: number,\n ): Promise<{ mailing_list_id: number; name: string }[]> {\n return this.api.getMailingLists(characterId);\n }\n\n fetchAllMailHeaders(\n characterId: number,\n concurrency?: number,\n ): Promise<MailHeader[]> {\n return this.fetchAllEndpoint<MailHeader>(\n 'getCharacterMailHeaders',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllMailingLists(\n characterId: number,\n concurrency?: number,\n ): Promise<{ mailing_list_id: number; name: string }[]> {\n return this.fetchAllEndpoint<{ mailing_list_id: number; name: string }>(\n 'getMailingLists',\n [characterId],\n concurrency,\n );\n }\n\n streamMailHeaders(\n characterId: number,\n ): AsyncGenerator<PageResult<MailHeader>, void, undefined> {\n return this.streamEndpoint<MailHeader>(\n 'getCharacterMailHeaders',\n characterId,\n );\n }\n\n streamMailingLists(\n characterId: number,\n ): AsyncGenerator<\n PageResult<{ mailing_list_id: number; name: string }>,\n void,\n undefined\n > {\n return this.streamEndpoint<{ mailing_list_id: number; name: string }>(\n 'getMailingLists',\n characterId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MarketOrderSchema,\n CharacterMarketOrderSchema,\n CharacterMarketOrderHistorySchema,\n CorporationMarketOrderSchema,\n CorporationMarketOrderHistorySchema,\n StructureMarketOrderSchema,\n MarketHistorySchema,\n MarketGroupSchema,\n MarketPriceSchema,\n} from '../../schemas/market';\n\nexport const marketEndpoints = {\n getCharacterOrders: {\n path: 'characters/{characterId}/orders/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterMarketOrderSchema),\n },\n getCharacterOrderHistory: {\n path: 'characters/{characterId}/orders/history/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterMarketOrderHistorySchema),\n },\n getCorporationOrders: {\n path: 'corporations/{corporationId}/orders/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMarketOrderSchema),\n },\n getCorporationOrderHistory: {\n path: 'corporations/{corporationId}/orders/history/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMarketOrderHistorySchema),\n },\n getMarketGroups: {\n path: 'markets/groups/',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getMarketGroupInformation: {\n path: 'markets/groups/{marketGroupId}/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['marketGroupId'],\n responseSchema: MarketGroupSchema,\n },\n getMarketPrices: {\n path: 'markets/prices/',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(MarketPriceSchema),\n },\n getMarketOrdersInStructure: {\n path: 'markets/structures/{structureId}/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['structureId'],\n responseSchema: z.array(StructureMarketOrderSchema),\n },\n getMarketHistory: {\n path: 'markets/{regionId}/history/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n queryParams: { typeId: 'type_id' },\n responseSchema: z.array(MarketHistorySchema),\n },\n getMarketOrders: {\n path: 'markets/{regionId}/orders/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n queryParams: { orderType: 'order_type' },\n responseSchema: z.array(MarketOrderSchema),\n },\n getMarketTypes: {\n path: 'markets/{regionId}/types/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { marketEndpoints } from '../core/endpoints/marketEndpoints';\nimport {\n MarketOrder,\n CharacterMarketOrder,\n CharacterMarketOrderHistory,\n CorporationMarketOrder,\n CorporationMarketOrderHistory,\n StructureMarketOrder,\n MarketHistory,\n MarketGroup,\n MarketPrice,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class MarketClient extends BaseEsiClient<typeof marketEndpoints> {\n constructor(client: ApiClient) {\n super(client, marketEndpoints);\n }\n\n /**\n * Retrieves all active market orders placed by a character.\n *\n * @param characterId - The ID of the character whose orders to fetch\n * @returns A list of the character's open market orders\n * @requires Authentication\n */\n getCharacterOrders(characterId: number): Promise<CharacterMarketOrder[]> {\n return this.api.getCharacterOrders(characterId);\n }\n\n /**\n * Retrieves the history of expired and cancelled market orders for a character.\n *\n * @param characterId - The ID of the character whose order history to fetch\n * @returns A list of the character's historical market orders\n * @requires Authentication\n */\n getCharacterOrderHistory(\n characterId: number,\n ): Promise<CharacterMarketOrderHistory[]> {\n return this.api.getCharacterOrderHistory(characterId);\n }\n\n /**\n * Retrieves all active market orders placed by members of a corporation.\n *\n * @param corporationId - The ID of the corporation whose orders to fetch\n * @returns A list of the corporation's open market orders\n * @requires Authentication\n */\n getCorporationOrders(\n corporationId: number,\n ): Promise<CorporationMarketOrder[]> {\n return this.api.getCorporationOrders(corporationId);\n }\n\n /**\n * Retrieves the history of expired and cancelled market orders for a corporation.\n *\n * @param corporationId - The ID of the corporation whose order history to fetch\n * @returns A list of the corporation's historical market orders\n * @requires Authentication\n */\n getCorporationOrderHistory(\n corporationId: number,\n ): Promise<CorporationMarketOrderHistory[]> {\n return this.api.getCorporationOrderHistory(corporationId);\n }\n\n /**\n * Retrieves the daily price and volume history for a specific item type in a region.\n *\n * @param regionId - The ID of the region to fetch market history for\n * @param typeId - The type ID of the item to get history for\n * @returns A list of daily market history entries with price and volume data\n */\n getMarketHistory(regionId: number, typeId: number): Promise<MarketHistory[]> {\n return this.api.getMarketHistory(regionId, typeId);\n }\n\n /**\n * Retrieves all active market orders in a region for all item types.\n *\n * @param regionId - The ID of the region to fetch orders for\n * @returns A list of all active market orders in the region\n */\n getMarketOrders(regionId: number): Promise<MarketOrder[]> {\n return this.api.getMarketOrders(regionId, 'all');\n }\n\n /**\n * Retrieves the list of type IDs that have active market orders in a region.\n *\n * @param regionId - The ID of the region to check for active types\n * @returns A list of type IDs with active orders in the region\n */\n getMarketTypes(regionId: number): Promise<number[]> {\n return this.api.getMarketTypes(regionId);\n }\n\n /**\n * Retrieves the list of all market group IDs used to categorize items on the market.\n *\n * @returns A list of all market group IDs\n */\n getMarketGroups(): Promise<number[]> {\n return this.api.getMarketGroups();\n }\n\n /**\n * Retrieves detailed information about a specific market group, including its name, description, and contained types.\n *\n * @param marketGroupId - The ID of the market group to look up\n * @returns The market group details including name, description, types, and optional parent group\n */\n getMarketGroupInformation(marketGroupId: number): Promise<MarketGroup> {\n return this.api.getMarketGroupInformation(marketGroupId);\n }\n\n /**\n * Retrieves the global average and adjusted prices for all tradeable item types.\n *\n * @returns A list of item types with their average and adjusted market prices\n */\n getMarketPrices(): Promise<MarketPrice[]> {\n return this.api.getMarketPrices();\n }\n\n /**\n * Retrieves all active market orders listed in a specific player-owned structure.\n *\n * @param structureId - The ID of the structure to fetch orders for\n * @returns A list of active market orders in the structure\n * @requires Authentication\n */\n getMarketOrdersInStructure(\n structureId: number,\n ): Promise<StructureMarketOrder[]> {\n return this.api.getMarketOrdersInStructure(structureId);\n }\n\n fetchAllMarketOrders(\n regionId: number,\n concurrency?: number,\n ): Promise<MarketOrder[]> {\n return this.fetchAllEndpoint<MarketOrder>(\n 'getMarketOrders',\n [regionId, 'all'],\n concurrency,\n );\n }\n\n fetchAllMarketTypes(\n regionId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getMarketTypes',\n [regionId],\n concurrency,\n );\n }\n\n fetchAllCharacterOrderHistory(\n characterId: number,\n concurrency?: number,\n ): Promise<CharacterMarketOrderHistory[]> {\n return this.fetchAllEndpoint<CharacterMarketOrderHistory>(\n 'getCharacterOrderHistory',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationOrders(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMarketOrder[]> {\n return this.fetchAllEndpoint<CorporationMarketOrder>(\n 'getCorporationOrders',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationOrderHistory(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMarketOrderHistory[]> {\n return this.fetchAllEndpoint<CorporationMarketOrderHistory>(\n 'getCorporationOrderHistory',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllMarketOrdersInStructure(\n structureId: number,\n concurrency?: number,\n ): Promise<StructureMarketOrder[]> {\n return this.fetchAllEndpoint<StructureMarketOrder>(\n 'getMarketOrdersInStructure',\n [structureId],\n concurrency,\n );\n }\n\n streamMarketOrders(\n regionId: number,\n ): AsyncGenerator<PageResult<MarketOrder>, void, undefined> {\n return this.streamEndpoint<MarketOrder>('getMarketOrders', regionId, 'all');\n }\n\n streamMarketTypes(\n regionId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getMarketTypes', regionId);\n }\n\n streamCharacterOrderHistory(\n characterId: number,\n ): AsyncGenerator<PageResult<CharacterMarketOrderHistory>, void, undefined> {\n return this.streamEndpoint<CharacterMarketOrderHistory>(\n 'getCharacterOrderHistory',\n characterId,\n );\n }\n\n streamCorporationOrders(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMarketOrder>, void, undefined> {\n return this.streamEndpoint<CorporationMarketOrder>(\n 'getCorporationOrders',\n corporationId,\n );\n }\n\n streamCorporationOrderHistory(\n corporationId: number,\n ): AsyncGenerator<\n PageResult<CorporationMarketOrderHistory>,\n void,\n undefined\n > {\n return this.streamEndpoint<CorporationMarketOrderHistory>(\n 'getCorporationOrderHistory',\n corporationId,\n );\n }\n\n streamMarketOrdersInStructure(\n structureId: number,\n ): AsyncGenerator<PageResult<StructureMarketOrder>, void, undefined> {\n return this.streamEndpoint<StructureMarketOrder>(\n 'getMarketOrdersInStructure',\n structureId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n PlanetaryColonySchema,\n CustomsOfficeSchema,\n ColonyLayoutSchema,\n} from '../../schemas/pi';\nimport { SchematicInfoSchema } from '../../schemas/universe';\n\nexport const piEndpoints = {\n getColonies: {\n path: 'characters/{characterId}/planets',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(PlanetaryColonySchema),\n },\n getColonyLayout: {\n path: 'characters/{characterId}/planets/{planetId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'planetId'],\n responseSchema: ColonyLayoutSchema,\n },\n getCorporationCustomsOffices: {\n path: 'corporations/{corporationId}/customs_offices',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CustomsOfficeSchema),\n },\n getSchematicInformation: {\n path: 'universe/schematics/{schematicId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['schematicId'],\n responseSchema: SchematicInfoSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { piEndpoints } from '../core/endpoints/piEndpoints';\nimport {\n PlanetaryColony,\n CustomsOffice,\n ColonyLayout,\n SchematicInfo,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class PiClient extends BaseEsiClient<typeof piEndpoints> {\n constructor(client: ApiClient) {\n super(client, piEndpoints);\n }\n\n /**\n * Retrieves the list of planetary interaction colonies owned by a character.\n *\n * @param characterId - The ID of the character whose colonies to fetch\n * @returns A list of the character's planetary colonies\n * @requires Authentication\n */\n getColonies(characterId: number): Promise<PlanetaryColony[]> {\n return this.api.getColonies(characterId);\n }\n\n /**\n * Retrieves the full layout of a planetary colony including pins, links, and routes.\n *\n * @param characterId - The ID of the character who owns the colony\n * @param planetId - The ID of the planet to get the colony layout for\n * @returns The colony layout with pins, links, and routes\n * @requires Authentication\n */\n getColonyLayout(\n characterId: number,\n planetId: number,\n ): Promise<ColonyLayout> {\n return this.api.getColonyLayout(characterId, planetId);\n }\n\n /**\n * Retrieves the list of customs offices owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose customs offices to fetch\n * @returns A list of the corporation's customs offices with their settings\n * @requires Authentication\n */\n getCorporationCustomsOffices(\n corporationId: number,\n ): Promise<CustomsOffice[]> {\n return this.api.getCorporationCustomsOffices(corporationId);\n }\n\n /**\n * Retrieves information about a planetary interaction schematic, including its inputs and outputs.\n *\n * @param schematicId - The ID of the schematic to look up\n * @returns The schematic details including cycle time, inputs, and outputs\n */\n getSchematicInformation(schematicId: number): Promise<SchematicInfo> {\n return this.api.getSchematicInformation(schematicId);\n }\n\n fetchAllColonies(\n characterId: number,\n concurrency?: number,\n ): Promise<PlanetaryColony[]> {\n return this.fetchAllEndpoint<PlanetaryColony>(\n 'getColonies',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationCustomsOffices(\n corporationId: number,\n concurrency?: number,\n ): Promise<CustomsOffice[]> {\n return this.fetchAllEndpoint<CustomsOffice>(\n 'getCorporationCustomsOffices',\n [corporationId],\n concurrency,\n );\n }\n\n streamColonies(\n characterId: number,\n ): AsyncGenerator<PageResult<PlanetaryColony>, void, undefined> {\n return this.streamEndpoint<PlanetaryColony>('getColonies', characterId);\n }\n\n streamCorporationCustomsOffices(\n corporationId: number,\n ): AsyncGenerator<PageResult<CustomsOffice>, void, undefined> {\n return this.streamEndpoint<CustomsOffice>(\n 'getCorporationCustomsOffices',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\n\nexport const routeEndpoints = {\n getRoute: {\n path: 'route/{origin}/{destination}',\n method: 'POST',\n requiresAuth: false,\n pathParams: ['origin', 'destination'],\n hasBody: true,\n responseSchema: z.looseObject({ route: z.array(z.number()) }),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { routeEndpoints } from '../core/endpoints/routeEndpoints';\n\nexport interface RouteOptions {\n preference?: 'Shorter' | 'Safer' | 'LessSecure';\n avoid_systems?: number[];\n connections?: { from: number; to: number }[];\n security_penalty?: number;\n}\n\nexport class RouteClient extends BaseEsiClient<typeof routeEndpoints> {\n constructor(client: ApiClient) {\n super(client, routeEndpoints);\n }\n\n /**\n * Calculates a route between two solar systems, returning the list of system IDs along the path via POST.\n *\n * @param origin - The solar system ID to start the route from\n * @param destination - The solar system ID to route to\n * @param options - Optional routing preferences such as route type, avoided systems, and custom connections\n * @returns An ordered list of solar system IDs representing the route\n */\n async getRoute(\n origin: number,\n destination: number,\n options?: RouteOptions,\n ): Promise<number[]> {\n const body = options ?? {};\n const result = (await this.api.getRoute(origin, destination, body)) as {\n route: number[];\n };\n return result.route;\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport { SearchResultSchema } from '../../schemas/universe';\n\nexport const searchEndpoints = {\n searchCharacter: {\n path: 'characters/{characterId}/search/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { searchString: 'search', categories: 'categories' },\n responseSchema: SearchResultSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { searchEndpoints } from '../core/endpoints/searchEndpoints';\nimport { SearchResult } from '../types/api-responses';\n\nexport class SearchClient extends BaseEsiClient<typeof searchEndpoints> {\n constructor(client: ApiClient) {\n super(client, searchEndpoints);\n }\n\n /**\n * Searches for entities matching a query string on behalf of a character.\n *\n * @param characterId - The ID of the character performing the search\n * @param searchString - The search query string to match against\n * @returns Search results grouped by entity category\n * @requires Authentication\n */\n characterSearch(\n characterId: number,\n searchString: string,\n categories: string[],\n ): Promise<SearchResult> {\n return this.api.searchCharacter(\n characterId,\n searchString,\n categories.join(','),\n ) as Promise<SearchResult>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n SkillQueueSchema,\n CharacterSkillsResponseSchema,\n} from '../../schemas/skills';\nimport { CharacterAttributesSchema } from '../../schemas/character';\n\nexport const skillEndpoints = {\n getCharacterAttributes: {\n path: 'characters/{characterId}/attributes',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterAttributesSchema,\n },\n getCharacterSkillQueue: {\n path: 'characters/{characterId}/skillqueue',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(SkillQueueSchema),\n },\n getCharacterSkills: {\n path: 'characters/{characterId}/skills',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterSkillsResponseSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { skillEndpoints } from '../core/endpoints/skillEndpoints';\nimport {\n CharacterAttributes,\n CharacterSkill,\n SkillQueue,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CharacterSkillsClient extends BaseEsiClient<\n typeof skillEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, skillEndpoints);\n }\n\n /**\n * Retrieves a character's neural remap attribute values (intelligence, memory, charisma, perception, willpower).\n *\n * @param characterId - The ID of the character\n * @returns The character's current attribute values and bonus remap information\n * @requires Authentication\n */\n getCharacterAttributes(characterId: number): Promise<CharacterAttributes> {\n return this.api.getCharacterAttributes(characterId);\n }\n\n /**\n * Retrieves the skill training queue for a character.\n *\n * @param characterId - The ID of the character\n * @returns An ordered list of skills currently in the character's training queue\n * @requires Authentication\n */\n getCharacterSkillQueue(characterId: number): Promise<SkillQueue[]> {\n return this.api.getCharacterSkillQueue(characterId);\n }\n\n /**\n * Retrieves all trained skills for a character, including total and unallocated skill points.\n *\n * @param characterId - The ID of the character\n * @returns The character's trained skills, total SP, and optionally unallocated SP\n * @requires Authentication\n */\n getCharacterSkills(characterId: number): Promise<{\n skills: CharacterSkill[];\n total_sp: number;\n unallocated_sp?: number;\n }> {\n return this.api.getCharacterSkills(characterId);\n }\n\n fetchAllCharacterSkillQueue(\n characterId: number,\n concurrency?: number,\n ): Promise<SkillQueue[]> {\n return this.fetchAllEndpoint<SkillQueue>(\n 'getCharacterSkillQueue',\n [characterId],\n concurrency,\n );\n }\n\n streamCharacterSkillQueue(\n characterId: number,\n ): AsyncGenerator<PageResult<SkillQueue>, void, undefined> {\n return this.streamEndpoint<SkillQueue>(\n 'getCharacterSkillQueue',\n characterId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n SovereigntyCampaignSchema,\n SovereigntySystemSchema,\n} from '../../schemas/sovereignty';\n\nexport const sovereigntyEndpoints = {\n getSovereigntyCampaigns: {\n path: 'sovereignty/campaigns',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(SovereigntyCampaignSchema),\n },\n getSovereigntySystems: {\n path: 'sovereignty/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: SovereigntySystemSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { sovereigntyEndpoints } from '../core/endpoints/sovereigntyEndpoints';\nimport { SovereigntyCampaign, SovereigntySystem } from '../types/api-responses';\n\nexport class SovereigntyClient extends BaseEsiClient<\n typeof sovereigntyEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, sovereigntyEndpoints);\n }\n\n /**\n * Retrieves all active sovereignty campaigns, including command node contests and station freeports.\n *\n * @returns A list of active sovereignty campaigns\n */\n getSovereigntyCampaigns(): Promise<SovereigntyCampaign[]> {\n return this.api.getSovereigntyCampaigns() as Promise<SovereigntyCampaign[]>;\n }\n\n /**\n * Retrieves the combined sovereignty systems data including occupancy, structures, and separate ADM indices (military, industry, strategic).\n *\n * @returns A list of sovereignty systems with ownership, ADM indices, and anchored structures\n */\n getSovereigntySystems(): Promise<SovereigntySystem> {\n return this.api.getSovereigntySystems() as Promise<SovereigntySystem>;\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport { ServerStatusSchema } from '../../schemas/status';\n\nexport const statusEndpoints = {\n getStatus: {\n path: 'status',\n method: 'GET',\n requiresAuth: false,\n responseSchema: ServerStatusSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { statusEndpoints } from '../core/endpoints/statusEndpoints';\nimport { ServerStatus } from '../types/api-responses';\n\nexport class StatusClient extends BaseEsiClient<typeof statusEndpoints> {\n constructor(client: ApiClient) {\n super(client, statusEndpoints);\n }\n\n /**\n * Retrieves the current Tranquility server status, including player count and server version.\n *\n * @returns The current server status information\n */\n getStatus(): Promise<ServerStatus> {\n return this.api.getStatus() as Promise<ServerStatus>;\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\n\nexport const uiEndpoints = {\n setAutopilotWaypoint: {\n path: 'ui/autopilot/waypoint',\n method: 'POST',\n requiresAuth: true,\n queryParams: {\n destinationId: 'destination_id',\n addToBeginning: 'add_to_beginning',\n clearOtherWaypoints: 'clear_other_waypoints',\n },\n },\n openContractWindow: {\n path: 'ui/openwindow/contract',\n method: 'POST',\n requiresAuth: true,\n queryParams: { contractId: 'contract_id' },\n },\n openInformationWindow: {\n path: 'ui/openwindow/information',\n method: 'POST',\n requiresAuth: true,\n queryParams: { targetId: 'target_id' },\n },\n openMarketDetailsWindow: {\n path: 'ui/openwindow/marketdetails',\n method: 'POST',\n requiresAuth: true,\n queryParams: { typeId: 'type_id' },\n },\n openNewMailWindow: {\n path: 'ui/openwindow/newmail',\n method: 'POST',\n requiresAuth: true,\n hasBody: true,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { uiEndpoints } from '../core/endpoints/uiEndpoints';\n\nexport class UiClient extends BaseEsiClient<typeof uiEndpoints> {\n constructor(client: ApiClient) {\n super(client, uiEndpoints);\n }\n\n /**\n * Sets a solar system as an autopilot waypoint in the EVE client.\n *\n * @param destinationId - The solar system, station, or structure ID to set as waypoint\n * @param addToBeginning - Whether to add the waypoint to the beginning of the route\n * @param clearOtherWaypoints - Whether to clear existing waypoints first\n * @requires Authentication\n */\n setAutopilotWaypoint(\n destinationId: number,\n addToBeginning: boolean,\n clearOtherWaypoints: boolean,\n ): Promise<void> {\n return this.api.setAutopilotWaypoint(\n destinationId,\n addToBeginning,\n clearOtherWaypoints,\n ) as Promise<void>;\n }\n\n /**\n * Opens the contract window for a specific contract in the EVE client.\n *\n * @param contractId - The contract ID to display\n * @requires Authentication\n */\n openContractWindow(contractId: number): Promise<void> {\n return this.api.openContractWindow(contractId) as Promise<void>;\n }\n\n /**\n * Opens the information window for a specific entity in the EVE client.\n *\n * @param targetId - The character, corporation, alliance, or type ID to display\n * @requires Authentication\n */\n openInformationWindow(targetId: number): Promise<void> {\n return this.api.openInformationWindow(targetId) as Promise<void>;\n }\n\n /**\n * Opens the market details window for a specific type in the EVE client.\n *\n * @param typeId - The inventory type ID to display market details for\n * @requires Authentication\n */\n openMarketDetailsWindow(typeId: number): Promise<void> {\n return this.api.openMarketDetailsWindow(typeId) as Promise<void>;\n }\n\n /**\n * Opens the new mail composition window in the EVE client with pre-filled fields.\n *\n * @param body - The mail details including recipients (integer array), subject, and body text\n * @requires Authentication\n */\n openNewMailWindow(body: object): Promise<void> {\n return this.api.openNewMailWindow(body) as Promise<void>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n AncestrySchema,\n AsteroidBeltInfoSchema,\n BloodlineSchema,\n BulkIdResultSchema,\n ConstellationInfoSchema,\n FactionSchema,\n GraphicInfoSchema,\n ItemCategorySchema,\n ItemGroupSchema,\n MoonInfoSchema,\n NameAndCategorySchema,\n PlanetInfoSchema,\n RaceSchema,\n RegionInfoSchema,\n SchematicInfoSchema,\n SolarSystemInfoSchema,\n StarInfoSchema,\n StargateInfoSchema,\n StationInfoSchema,\n StructureInfoSchema,\n SystemJumpSchema,\n SystemKillSchema,\n TypeInfoSchema,\n} from '../../schemas/universe';\n\nexport const universeEndpoints = {\n getAncestries: {\n path: 'universe/ancestries',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(AncestrySchema),\n },\n getAsteroidBeltInfo: {\n path: 'universe/asteroid_belts/{asteroidBeltId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['asteroidBeltId'],\n responseSchema: AsteroidBeltInfoSchema,\n },\n getBloodlines: {\n path: 'universe/bloodlines',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(BloodlineSchema),\n },\n getCategories: {\n path: 'universe/categories',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getCategoryById: {\n path: 'universe/categories/{categoryId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['categoryId'],\n responseSchema: ItemCategorySchema,\n },\n getConstellations: {\n path: 'universe/constellations',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getConstellationById: {\n path: 'universe/constellations/{constellationId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['constellationId'],\n responseSchema: ConstellationInfoSchema,\n },\n getFactions: {\n path: 'universe/factions',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionSchema),\n },\n getGraphics: {\n path: 'universe/graphics',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getGraphicById: {\n path: 'universe/graphics/{graphicId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['graphicId'],\n responseSchema: GraphicInfoSchema,\n },\n getItemGroups: {\n path: 'universe/groups',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getItemGroupById: {\n path: 'universe/groups/{groupId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['groupId'],\n responseSchema: ItemGroupSchema,\n },\n postBulkNamesToIds: {\n path: 'universe/ids',\n method: 'POST',\n requiresAuth: false,\n bodyBuilder: (names: string[]) => names,\n responseSchema: BulkIdResultSchema,\n requestSchema: z.array(z.string().min(1)),\n },\n getMoonById: {\n path: 'universe/moons/{moonId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['moonId'],\n responseSchema: MoonInfoSchema,\n },\n postNamesAndCategories: {\n path: 'universe/names',\n method: 'POST',\n requiresAuth: false,\n bodyBuilder: (ids: number[]) => ids,\n responseSchema: z.array(NameAndCategorySchema),\n requestSchema: z.array(z.number().int()),\n },\n getPlanetById: {\n path: 'universe/planets/{planetId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['planetId'],\n responseSchema: PlanetInfoSchema,\n },\n getRaces: {\n path: 'universe/races',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(RaceSchema),\n },\n getRegions: {\n path: 'universe/regions',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getRegionById: {\n path: 'universe/regions/{regionId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n responseSchema: RegionInfoSchema,\n },\n getSchematicById: {\n path: 'universe/schematics/{schematicId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['schematicId'],\n responseSchema: SchematicInfoSchema,\n },\n getStargateById: {\n path: 'universe/stargates/{stargateId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['stargateId'],\n responseSchema: StargateInfoSchema,\n },\n getStarById: {\n path: 'universe/stars/{starId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['starId'],\n responseSchema: StarInfoSchema,\n },\n getStationById: {\n path: 'universe/stations/{stationId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['stationId'],\n responseSchema: StationInfoSchema,\n },\n getStructures: {\n path: 'universe/structures',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getStructureById: {\n path: 'universe/structures/{structureId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['structureId'],\n responseSchema: StructureInfoSchema,\n },\n getSystemJumps: {\n path: 'universe/system_jumps',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(SystemJumpSchema),\n },\n getSystemKills: {\n path: 'universe/system_kills',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(SystemKillSchema),\n },\n getSystems: {\n path: 'universe/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getSystemById: {\n path: 'universe/systems/{systemId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['systemId'],\n responseSchema: SolarSystemInfoSchema,\n },\n getTypes: {\n path: 'universe/types',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getTypeById: {\n path: 'universe/types/{typeId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['typeId'],\n responseSchema: TypeInfoSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { universeEndpoints } from '../core/endpoints/universeEndpoints';\nimport {\n Ancestry,\n AsteroidBeltInfo,\n Bloodline,\n BulkIdResult,\n ConstellationInfo,\n Faction,\n GraphicInfo,\n ItemCategory,\n ItemGroup,\n MoonInfo,\n NameAndCategory,\n PlanetInfo,\n Race,\n RegionInfo,\n SchematicInfo,\n SolarSystemInfo,\n StarInfo,\n StargateInfo,\n StationInfo,\n StructureInfo,\n SystemJump,\n SystemKill,\n TypeInfo,\n} from '../types/api-responses';\n\nexport class UniverseClient extends BaseEsiClient<typeof universeEndpoints> {\n constructor(client: ApiClient) {\n super(client, universeEndpoints);\n }\n\n /**\n * Retrieves all available character ancestries for character creation.\n *\n * @returns A list of character ancestries\n */\n getAncestries(): Promise<Ancestry[]> {\n return this.api.getAncestries() as Promise<Ancestry[]>;\n }\n\n /**\n * Retrieves information about an asteroid belt, including its position in space.\n *\n * @param asteroidBeltId - The ID of the asteroid belt\n * @returns Details about the asteroid belt\n */\n getAsteroidBeltInfo(asteroidBeltId: number): Promise<AsteroidBeltInfo> {\n return this.api.getAsteroidBeltInfo(\n asteroidBeltId,\n ) as Promise<AsteroidBeltInfo>;\n }\n\n /**\n * Retrieves all available character bloodlines for character creation.\n *\n * @returns A list of character bloodlines\n */\n getBloodlines(): Promise<Bloodline[]> {\n return this.api.getBloodlines() as Promise<Bloodline[]>;\n }\n\n /**\n * Retrieves information about a constellation, including its systems and position.\n *\n * @param constellationId - The ID of the constellation\n * @returns Detailed constellation information\n */\n getConstellationById(constellationId: number): Promise<ConstellationInfo> {\n return this.api.getConstellationById(\n constellationId,\n ) as Promise<ConstellationInfo>;\n }\n\n /**\n * Retrieves a list of all constellation IDs in the EVE universe.\n *\n * @returns A list of constellation IDs\n */\n getConstellations(): Promise<number[]> {\n return this.api.getConstellations() as Promise<number[]>;\n }\n\n /**\n * Retrieves all NPC factions in the EVE universe.\n *\n * @returns A list of NPC factions\n */\n getFactions(): Promise<Faction[]> {\n return this.api.getFactions() as Promise<Faction[]>;\n }\n\n /**\n * Retrieves information about a specific graphic asset used in the EVE client.\n *\n * @param graphicId - The ID of the graphic\n * @returns Detailed graphic information\n */\n getGraphicById(graphicId: number): Promise<GraphicInfo> {\n return this.api.getGraphicById(graphicId) as Promise<GraphicInfo>;\n }\n\n /**\n * Retrieves a list of all graphic asset IDs.\n *\n * @returns A list of graphic IDs\n */\n getGraphics(): Promise<number[]> {\n return this.api.getGraphics() as Promise<number[]>;\n }\n\n /**\n * Retrieves a list of all item category IDs in the EVE universe.\n *\n * @returns A list of item category IDs\n */\n getItemCategories(): Promise<number[]> {\n return this.api.getCategories() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a specific item category, including its groups.\n *\n * @param categoryId - The ID of the item category\n * @returns Detailed item category information\n */\n getItemCategoryById(categoryId: number): Promise<ItemCategory> {\n return this.api.getCategoryById(categoryId) as Promise<ItemCategory>;\n }\n\n /**\n * Retrieves information about a specific item group, including its types.\n *\n * @param groupId - The ID of the item group\n * @returns Detailed item group information\n */\n getItemGroupById(groupId: number): Promise<ItemGroup> {\n return this.api.getItemGroupById(groupId) as Promise<ItemGroup>;\n }\n\n /**\n * Retrieves a list of all item group IDs in the EVE universe.\n *\n * @returns A list of item group IDs\n */\n getItemGroups(): Promise<number[]> {\n return this.api.getItemGroups() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a moon, including its name and position.\n *\n * @param moonId - The ID of the moon\n * @returns Detailed moon information\n */\n getMoonById(moonId: number): Promise<MoonInfo> {\n return this.api.getMoonById(moonId) as Promise<MoonInfo>;\n }\n\n /**\n * Retrieves information about a planet, including its name, type, and position.\n *\n * @param planetId - The ID of the planet\n * @returns Detailed planet information\n */\n getPlanetById(planetId: number): Promise<PlanetInfo> {\n return this.api.getPlanetById(planetId) as Promise<PlanetInfo>;\n }\n\n /**\n * Retrieves all playable races in the EVE universe.\n *\n * @returns A list of playable races\n */\n getRaces(): Promise<Race[]> {\n return this.api.getRaces() as Promise<Race[]>;\n }\n\n /**\n * Retrieves information about a region, including its constellations and name.\n *\n * @param regionId - The ID of the region\n * @returns Detailed region information\n */\n getRegionById(regionId: number): Promise<RegionInfo> {\n return this.api.getRegionById(regionId) as Promise<RegionInfo>;\n }\n\n /**\n * Retrieves information about a star, including its spectral class and luminosity.\n *\n * @param starId - The ID of the star\n * @returns Detailed star information\n */\n getStarById(starId: number): Promise<StarInfo> {\n return this.api.getStarById(starId) as Promise<StarInfo>;\n }\n\n /**\n * Retrieves information about a stargate, including its destination and position.\n *\n * @param stargateId - The ID of the stargate\n * @returns Detailed stargate information\n */\n getStargateById(stargateId: number): Promise<StargateInfo> {\n return this.api.getStargateById(stargateId) as Promise<StargateInfo>;\n }\n\n /**\n * Retrieves public information about a station, including its services and location.\n *\n * @param stationId - The ID of the station\n * @returns Detailed station information\n */\n getStationById(stationId: number): Promise<StationInfo> {\n return this.api.getStationById(stationId) as Promise<StationInfo>;\n }\n\n /**\n * Retrieves information about a player-owned structure by its ID.\n *\n * @param structureId - The ID of the structure\n * @returns Detailed structure information\n * @requires Authentication\n */\n getStructureById(structureId: number): Promise<StructureInfo> {\n return this.api.getStructureById(structureId) as Promise<StructureInfo>;\n }\n\n /**\n * Retrieves a list of all publicly visible player-owned structure IDs.\n *\n * @returns A list of structure IDs\n */\n getStructures(): Promise<number[]> {\n return this.api.getStructures() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a solar system, including its planets, stargates, and security status.\n *\n * @param systemId - The ID of the solar system\n * @returns Detailed solar system information\n */\n getSystemById(systemId: number): Promise<SolarSystemInfo> {\n return this.api.getSystemById(systemId) as Promise<SolarSystemInfo>;\n }\n\n /**\n * Retrieves the number of ship jumps per solar system within the last hour.\n *\n * @returns A list of solar systems with their jump counts\n */\n getSystemJumps(): Promise<SystemJump[]> {\n return this.api.getSystemJumps() as Promise<SystemJump[]>;\n }\n\n /**\n * Retrieves the number of NPC and player ship kills per solar system within the last hour.\n *\n * @returns A list of solar systems with their kill counts\n */\n getSystemKills(): Promise<SystemKill[]> {\n return this.api.getSystemKills() as Promise<SystemKill[]>;\n }\n\n /**\n * Retrieves a list of all solar system IDs in the EVE universe.\n *\n * @returns A list of solar system IDs\n */\n getSystems(): Promise<number[]> {\n return this.api.getSystems() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a specific item type, including its description and attributes.\n *\n * @param typeId - The ID of the item type\n * @returns Detailed item type information\n */\n getTypeById(typeId: number): Promise<TypeInfo> {\n return this.api.getTypeById(typeId) as Promise<TypeInfo>;\n }\n\n /**\n * Retrieves a list of all item type IDs in the EVE universe.\n *\n * @returns A list of item type IDs\n */\n getTypes(): Promise<number[]> {\n return this.api.getTypes() as Promise<number[]>;\n }\n\n /**\n * Resolves a list of names to their corresponding IDs via a bulk POST operation.\n *\n * @param names - An array of names to resolve to IDs\n * @returns The resolved IDs grouped by entity category\n */\n postBulkNamesToIds(names: string[]): Promise<BulkIdResult> {\n return this.api.postBulkNamesToIds(names) as Promise<BulkIdResult>;\n }\n\n /**\n * Resolves a list of IDs to their names and categories via a bulk POST operation.\n *\n * @param ids - An array of entity IDs to resolve\n * @returns A list of names with their corresponding categories\n */\n postNamesAndCategories(ids: number[]): Promise<NameAndCategory[]> {\n return this.api.postNamesAndCategories(ids) as Promise<NameAndCategory[]>;\n }\n\n /**\n * Retrieves information about a planetary interaction schematic.\n *\n * @param schematicId - The ID of the PI schematic\n * @returns Detailed schematic information including inputs and outputs\n */\n getSchematicById(schematicId: number): Promise<SchematicInfo> {\n return this.api.getSchematicById(schematicId) as Promise<SchematicInfo>;\n }\n\n /**\n * Retrieves a list of all region IDs in the EVE universe.\n *\n * @returns A list of region IDs\n */\n getRegions(): Promise<number[]> {\n return this.api.getRegions() as Promise<number[]>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n WalletJournalSchema,\n WalletTransactionSchema,\n CorporationWalletTransactionSchema,\n} from '../../schemas/wallet';\nimport { CorporationWalletDivisionSchema } from '../../schemas/corporation';\n\nexport const walletEndpoints = {\n getCharacterWallet: {\n path: 'characters/{characterId}/wallet',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.number(),\n },\n getCharacterWalletJournal: {\n path: 'characters/{characterId}/wallet/journal',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(WalletJournalSchema),\n },\n getCharacterWalletTransactions: {\n path: 'characters/{characterId}/wallet/transactions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(WalletTransactionSchema),\n },\n getCorporationWallets: {\n path: 'corporations/{corporationId}/wallets',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationWalletDivisionSchema),\n },\n getCorporationWalletJournal: {\n path: 'corporations/{corporationId}/wallets/{division}/journal',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'division'],\n responseSchema: z.array(WalletJournalSchema),\n },\n getCorporationWalletTransactions: {\n path: 'corporations/{corporationId}/wallets/{division}/transactions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'division'],\n responseSchema: z.array(CorporationWalletTransactionSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { walletEndpoints } from '../core/endpoints/walletEndpoints';\nimport {\n CorporationWalletTransaction,\n WalletJournal,\n WalletTransaction,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class WalletClient extends BaseEsiClient<typeof walletEndpoints> {\n constructor(client: ApiClient) {\n super(client, walletEndpoints);\n }\n\n /**\n * Retrieves the current ISK balance of a character's wallet.\n *\n * @param characterId - The ID of the character\n * @returns The character's wallet balance in ISK\n * @requires Authentication\n */\n getCharacterWallet(characterId: number): Promise<number> {\n return this.api.getCharacterWallet(characterId);\n }\n\n /**\n * Retrieves the wallet journal entries for a character, showing ISK transactions and their reasons.\n *\n * @param characterId - The ID of the character\n * @returns A list of wallet journal entries\n * @requires Authentication\n */\n getCharacterWalletJournal(characterId: number): Promise<WalletJournal[]> {\n return this.api.getCharacterWalletJournal(characterId);\n }\n\n /**\n * Retrieves the market transaction history for a character's wallet.\n *\n * @param characterId - The ID of the character\n * @returns A list of market buy and sell transactions\n * @requires Authentication\n */\n getCharacterWalletTransactions(\n characterId: number,\n ): Promise<WalletTransaction[]> {\n return this.api.getCharacterWalletTransactions(characterId);\n }\n\n /**\n * Retrieves the balances for all wallet divisions of a corporation.\n *\n * @param corporationId - The ID of the corporation\n * @returns A list of wallet divisions with their balances\n * @requires Authentication\n */\n getCorporationWallets(\n corporationId: number,\n ): Promise<{ division: number; balance: number }[]> {\n return this.api.getCorporationWallets(corporationId);\n }\n\n /**\n * Retrieves the wallet journal entries for a specific division of a corporation wallet.\n *\n * @param corporationId - The ID of the corporation\n * @param division - The wallet division number (1-7)\n * @returns A list of wallet journal entries for the specified division\n * @requires Authentication\n */\n getCorporationWalletJournal(\n corporationId: number,\n division: number,\n ): Promise<WalletJournal[]> {\n return this.api.getCorporationWalletJournal(corporationId, division);\n }\n\n /**\n * Retrieves the market transaction history for a specific division of a corporation wallet.\n *\n * @param corporationId - The ID of the corporation\n * @param division - The wallet division number (1-7)\n * @returns A list of market buy and sell transactions for the specified division\n * @requires Authentication\n */\n getCorporationWalletTransactions(\n corporationId: number,\n division: number,\n ): Promise<CorporationWalletTransaction[]> {\n return this.api.getCorporationWalletTransactions(corporationId, division);\n }\n\n fetchAllCharacterWalletJournal(\n characterId: number,\n concurrency?: number,\n ): Promise<WalletJournal[]> {\n return this.fetchAllEndpoint<WalletJournal>(\n 'getCharacterWalletJournal',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationWalletJournal(\n corporationId: number,\n division: number,\n concurrency?: number,\n ): Promise<WalletJournal[]> {\n return this.fetchAllEndpoint<WalletJournal>(\n 'getCorporationWalletJournal',\n [corporationId, division],\n concurrency,\n );\n }\n\n fetchAllCharacterWalletTransactions(\n characterId: number,\n concurrency?: number,\n ): Promise<WalletTransaction[]> {\n return this.fetchAllEndpoint<WalletTransaction>(\n 'getCharacterWalletTransactions',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationWalletTransactions(\n corporationId: number,\n division: number,\n concurrency?: number,\n ): Promise<CorporationWalletTransaction[]> {\n return this.fetchAllEndpoint<CorporationWalletTransaction>(\n 'getCorporationWalletTransactions',\n [corporationId, division],\n concurrency,\n );\n }\n\n streamCharacterWalletJournal(\n characterId: number,\n ): AsyncGenerator<PageResult<WalletJournal>, void, undefined> {\n return this.streamEndpoint<WalletJournal>(\n 'getCharacterWalletJournal',\n characterId,\n );\n }\n\n streamCorporationWalletJournal(\n corporationId: number,\n division: number,\n ): AsyncGenerator<PageResult<WalletJournal>, void, undefined> {\n return this.streamEndpoint<WalletJournal>(\n 'getCorporationWalletJournal',\n corporationId,\n division,\n );\n }\n\n streamCharacterWalletTransactions(\n characterId: number,\n ): AsyncGenerator<PageResult<WalletTransaction>, void, undefined> {\n return this.streamEndpoint<WalletTransaction>(\n 'getCharacterWalletTransactions',\n characterId,\n );\n }\n\n streamCorporationWalletTransactions(\n corporationId: number,\n division: number,\n ): AsyncGenerator<PageResult<CorporationWalletTransaction>, void, undefined> {\n return this.streamEndpoint<CorporationWalletTransaction>(\n 'getCorporationWalletTransactions',\n corporationId,\n division,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { WarSchema } from '../../schemas/wars';\nimport { KillmailSummarySchema } from '../../schemas/killmails';\n\nexport const warEndpoints = {\n getWars: {\n path: 'wars',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getWarById: {\n path: 'wars/{warId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['warId'],\n responseSchema: WarSchema,\n },\n getWarKillmails: {\n path: 'wars/{warId}/killmails',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['warId'],\n responseSchema: z.array(KillmailSummarySchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { warEndpoints } from '../core/endpoints/warEndpoints';\nimport { War, KillmailSummary } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class WarsClient extends BaseEsiClient<typeof warEndpoints> {\n constructor(client: ApiClient) {\n super(client, warEndpoints);\n }\n\n /**\n * Retrieves a list of all war IDs, ordered by war ID descending.\n *\n * @returns A list of war IDs\n */\n getWars(): Promise<number[]> {\n return this.api.getWars();\n }\n\n /**\n * Retrieves detailed information about a specific war, including aggressors, defenders, and status.\n *\n * @param warId - The ID of the war\n * @returns Detailed war information\n */\n getWarById(warId: number): Promise<War> {\n return this.api.getWarById(warId);\n }\n\n /**\n * Retrieves the killmail summaries associated with a specific war.\n *\n * @param warId - The ID of the war\n * @returns A list of killmail summaries for the war\n */\n getWarKillmails(warId: number): Promise<KillmailSummary[]> {\n return this.api.getWarKillmails(warId);\n }\n\n fetchAllWars(concurrency?: number): Promise<number[]> {\n return this.fetchAllEndpoint<number>('getWars', [], concurrency);\n }\n\n fetchAllWarKillmails(\n warId: number,\n concurrency?: number,\n ): Promise<KillmailSummary[]> {\n return this.fetchAllEndpoint<KillmailSummary>(\n 'getWarKillmails',\n [warId],\n concurrency,\n );\n }\n\n streamWars(): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getWars');\n }\n\n streamWarKillmails(\n warId: number,\n ): AsyncGenerator<PageResult<KillmailSummary>, void, undefined> {\n return this.streamEndpoint<KillmailSummary>('getWarKillmails', warId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MetaChangelogSchema,\n MetaCompatibilityDatesSchema,\n MetaNameSchema,\n MetaStatusSchema,\n} from '../../schemas/meta';\n\nexport const metaEndpoints = {\n getOpenApiJson: {\n path: 'meta/openapi.json',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.record(z.string(), z.unknown()),\n },\n getChangelog: {\n path: 'meta/changelog',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaChangelogSchema,\n },\n getCompatibilityDates: {\n path: 'meta/compatibility-dates',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaCompatibilityDatesSchema,\n },\n getName: {\n path: 'meta/name',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaNameSchema,\n },\n getStatus: {\n path: 'meta/status',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaStatusSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { metaEndpoints } from '../core/endpoints/metaEndpoints';\nimport { logInfo, logError } from '../core/logger/clientLog';\nimport { USER_AGENT, COMPATIBILITY_DATE } from '../core/constants';\nimport {\n MetaChangelog,\n MetaCompatibilityDates,\n MetaName,\n MetaStatus,\n} from '../types/api-responses';\n\nexport class MetaClient extends BaseEsiClient<typeof metaEndpoints> {\n constructor(client: ApiClient) {\n super(client, metaEndpoints);\n }\n\n /**\n * Retrieves the ESI OpenAPI specification in JSON format.\n *\n * @returns The full ESI OpenAPI specification as a JSON object\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n getOpenApiJson(): Promise<Record<string, any>> {\n return this.api.getOpenApiJson() as Promise<Record<string, any>>;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n /**\n * Retrieves the ESI OpenAPI specification in YAML format.\n *\n * @returns The full ESI OpenAPI specification as a YAML string\n */\n async getOpenApiYaml(): Promise<string> {\n const url = `${this._client.getLink()}/meta/openapi.yaml`;\n\n logInfo(this._client, `Hitting endpoint: ${url}`, { method: 'GET' });\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n accept: 'text/yaml, application/x-yaml, text/plain',\n 'User-Agent': USER_AGENT,\n 'X-Compatibility-Date': COMPATIBILITY_DATE,\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return await response.text();\n } catch (error) {\n if (error instanceof Error) {\n logError(this._client, `Error fetching YAML: ${error.message}`, {\n url,\n });\n throw error;\n } else {\n logError(this._client, `Unexpected error: ${String(error)}`, { url });\n throw new Error(String(error));\n }\n }\n }\n\n /**\n * Retrieves the ESI changelog data.\n *\n * @returns The changelog keyed by compatibility date\n */\n getChangelog(): Promise<MetaChangelog> {\n return this.api.getChangelog();\n }\n\n /**\n * Retrieves the list of ESI compatibility dates.\n *\n * @returns An object containing the list of compatibility dates\n */\n getCompatibilityDates(): Promise<MetaCompatibilityDates> {\n return this.api.getCompatibilityDates();\n }\n\n /**\n * Retrieves the ESI name.\n *\n * @returns An object containing the ESI name\n */\n getName(): Promise<MetaName> {\n return this.api.getName();\n }\n\n /**\n * Retrieves the health of each ESI route.\n *\n * @returns `{ routes }`, one entry per route with its method, path and\n * status ('OK', 'Degraded', 'Down', ...)\n */\n getStatus(): Promise<MetaStatus> {\n return this.api.getStatus();\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n FreelanceJobsListingSchema,\n FreelanceJobDetailSchema,\n CharacterFreelanceJobsListingSchema,\n FreelanceJobParticipationSchema,\n CorporationFreelanceJobsListingSchema,\n FreelanceJobParticipantsListingSchema,\n} from '../../schemas/freelance-jobs';\n\nexport const freelanceJobsEndpoints = {\n getFreelanceJobs: {\n path: 'freelance-jobs',\n method: 'GET',\n requiresAuth: false,\n queryParams: { before: 'before', after: 'after' },\n responseSchema: FreelanceJobsListingSchema,\n },\n getFreelanceJobById: {\n path: 'freelance-jobs/{jobId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['jobId'],\n responseSchema: FreelanceJobDetailSchema,\n },\n getCharacterFreelanceJobs: {\n path: 'characters/{characterId}/freelance-jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CharacterFreelanceJobsListingSchema,\n },\n getCharacterFreelanceJobParticipation: {\n path: 'characters/{characterId}/freelance-jobs/{jobId}/participation',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'jobId'],\n responseSchema: FreelanceJobParticipationSchema,\n },\n getCorporationFreelanceJobs: {\n path: 'corporations/{corporationId}/freelance-jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CorporationFreelanceJobsListingSchema,\n },\n getCorporationFreelanceJobParticipants: {\n path: 'corporations/{corporationId}/freelance-jobs/{jobId}/participants',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'jobId'],\n responseSchema: FreelanceJobParticipantsListingSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { freelanceJobsEndpoints } from '../core/endpoints/freelanceJobsEndpoints';\nimport {\n FreelanceJobsListing,\n FreelanceJobDetail,\n CharacterFreelanceJobsListing,\n FreelanceJobParticipation,\n CorporationFreelanceJobsListing,\n FreelanceJobParticipantsListing,\n} from '../types/api-responses';\n\nexport class FreelanceJobsClient extends BaseEsiClient<\n typeof freelanceJobsEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, freelanceJobsEndpoints);\n }\n\n /**\n * Retrieves a paginated listing of all publicly available freelance jobs.\n *\n * @param before - Optional cursor token for fetching the previous page of results\n * @param after - Optional cursor token for fetching the next page of results\n * @returns A listing of freelance jobs with cursor pagination metadata\n */\n getFreelanceJobs(\n before?: string,\n after?: string,\n ): Promise<FreelanceJobsListing> {\n return this.api.getFreelanceJobs(before, after);\n }\n\n /**\n * Retrieves detailed information about a specific freelance job.\n *\n * @param jobId - The unique identifier of the freelance job\n * @returns Detailed information about the freelance job\n */\n getFreelanceJobById(jobId: string): Promise<FreelanceJobDetail> {\n return this.api.getFreelanceJobById(jobId);\n }\n\n /**\n * Retrieves a paginated listing of freelance jobs associated with a specific character.\n *\n * @param characterId - The ID of the character\n * @param before - Optional cursor token for fetching the previous page of results\n * @param after - Optional cursor token for fetching the next page of results\n * @returns A listing of the character's freelance jobs with cursor pagination metadata\n * @requires Authentication\n */\n getCharacterFreelanceJobs(\n characterId: number,\n before?: string,\n after?: string,\n ): Promise<CharacterFreelanceJobsListing> {\n return this.api.getCharacterFreelanceJobs(characterId, before, after);\n }\n\n /**\n * Retrieves a character's participation details for a specific freelance job.\n *\n * @param characterId - The ID of the character\n * @param jobId - The unique identifier of the freelance job\n * @returns The character's participation details for the job\n * @requires Authentication\n */\n getCharacterFreelanceJobParticipation(\n characterId: number,\n jobId: string,\n ): Promise<FreelanceJobParticipation> {\n return this.api.getCharacterFreelanceJobParticipation(characterId, jobId);\n }\n\n /**\n * Retrieves a paginated listing of freelance jobs associated with a specific corporation.\n *\n * @param corporationId - The ID of the corporation\n * @param before - Optional cursor token for fetching the previous page of results\n * @param after - Optional cursor token for fetching the next page of results\n * @returns A listing of the corporation's freelance jobs with cursor pagination metadata\n * @requires Authentication\n */\n getCorporationFreelanceJobs(\n corporationId: number,\n before?: string,\n after?: string,\n ): Promise<CorporationFreelanceJobsListing> {\n return this.api.getCorporationFreelanceJobs(corporationId, before, after);\n }\n\n /**\n * Retrieves the list of participants from a corporation in a specific freelance job.\n *\n * @param corporationId - The ID of the corporation\n * @param jobId - The unique identifier of the freelance job\n * @returns A page holding the job's participants, with an optional cursor\n * @requires Authentication\n */\n getCorporationFreelanceJobParticipants(\n corporationId: number,\n jobId: string,\n ): Promise<FreelanceJobParticipantsListing> {\n return this.api.getCorporationFreelanceJobParticipants(\n corporationId,\n jobId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n SovereigntyHubSchema,\n OrbitalSkyhookSchema,\n RaidableSkyhookSchema,\n SkyhookDetailSchema,\n SovereigntyHubDetailSchema,\n} from '../../schemas/skyhooks';\n\nexport const skyhookEndpoints = {\n getSovereigntyHubs: {\n path: 'corporations/{corporationId}/structures/sovereignty-hubs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(SovereigntyHubSchema),\n },\n getOrbitalSkyhooks: {\n path: 'corporations/{corporationId}/structures/skyhooks',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(OrbitalSkyhookSchema),\n },\n getRaidableSkyhooks: {\n path: 'skyhooks/raidable',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(RaidableSkyhookSchema),\n },\n getSkyhookDetail: {\n path: 'corporations/{corporationId}/structures/skyhooks/{skyhookId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'skyhookId'],\n responseSchema: SkyhookDetailSchema,\n },\n getSovereigntyHubDetail: {\n path: 'corporations/{corporationId}/structures/sovereignty-hubs/{sovereigntyHubId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'sovereigntyHubId'],\n responseSchema: SovereigntyHubDetailSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { skyhookEndpoints } from '../core/endpoints/skyhookEndpoints';\nimport {\n SovereigntyHub,\n OrbitalSkyhook,\n RaidableSkyhook,\n SkyhookDetail,\n SovereigntyHubDetail,\n} from '../types/api-responses';\n\nexport class SkyhooksClient extends BaseEsiClient<typeof skyhookEndpoints> {\n constructor(client: ApiClient) {\n super(client, skyhookEndpoints);\n }\n\n /**\n * Retrieves all sovereignty hubs exposed as Upwell structures, including online status and installed upgrades.\n *\n * @param corporationId - The ID of the corporation to query sovereignty hubs for\n * @returns A list of sovereignty hubs\n * @requires Authentication\n */\n getSovereigntyHubs(corporationId: number): Promise<SovereigntyHub[]> {\n return this.api.getSovereigntyHubs(corporationId);\n }\n\n /**\n * Retrieves all orbital skyhooks with their silo capacity and levels.\n *\n * @param corporationId - The ID of the corporation to query skyhooks for\n * @returns A list of orbital skyhooks\n * @requires Authentication\n */\n getOrbitalSkyhooks(corporationId: number): Promise<OrbitalSkyhook[]> {\n return this.api.getOrbitalSkyhooks(corporationId);\n }\n\n /**\n * Retrieves the rolling list of skyhooks that are currently or becoming raidable across New Eden.\n *\n * @returns A list of raidable skyhooks\n */\n getRaidableSkyhooks(): Promise<RaidableSkyhook[]> {\n return this.api.getRaidableSkyhooks();\n }\n\n /**\n * Retrieves detail for a specific skyhook including reagents, reinforcement timer, and theft vulnerability.\n *\n * @param corporationId - The ID of the corporation\n * @param skyhookId - The ID of the skyhook\n * @returns Skyhook detail\n * @requires Authentication\n */\n getSkyhookDetail(\n corporationId: number,\n skyhookId: number,\n ): Promise<SkyhookDetail> {\n return this.api.getSkyhookDetail(corporationId, skyhookId);\n }\n\n /**\n * Retrieves detail for a specific sovereignty hub including reagent bay, resources, upgrades, and vulnerability window.\n *\n * @param corporationId - The ID of the corporation\n * @param sovereigntyHubId - The ID of the sovereignty hub\n * @returns Sovereignty hub detail\n * @requires Authentication\n */\n getSovereigntyHubDetail(\n corporationId: number,\n sovereigntyHubId: number,\n ): Promise<SovereigntyHubDetail> {\n return this.api.getSovereigntyHubDetail(corporationId, sovereigntyHubId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MercenaryDenSchema,\n MercenaryTacticalOperationSchema,\n MercenaryDenDetailSchema,\n MercenaryTacticalOperationDetailSchema,\n} from '../../schemas/mercenary';\n\nexport const mercenaryEndpoints = {\n getMercenaryDens: {\n path: 'characters/{characterId}/structures/mercenary-dens',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MercenaryDenSchema),\n },\n getMercenaryTacticalOperations: {\n path: 'characters/{characterId}/mercenary-tactical-operations',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MercenaryTacticalOperationSchema),\n },\n getMercenaryDenDetail: {\n path: 'characters/{characterId}/structures/mercenary-dens/{mercenaryDenId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'mercenaryDenId'],\n responseSchema: MercenaryDenDetailSchema,\n },\n getMercenaryTacticalOperationDetail: {\n path: 'characters/{characterId}/mercenary-tactical-operations/{operationId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'operationId'],\n responseSchema: MercenaryTacticalOperationDetailSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { mercenaryEndpoints } from '../core/endpoints/mercenaryEndpoints';\nimport {\n MercenaryDen,\n MercenaryTacticalOperation,\n MercenaryDenDetail,\n MercenaryTacticalOperationDetail,\n} from '../types/api-responses';\n\nexport class MercenaryClient extends BaseEsiClient<typeof mercenaryEndpoints> {\n constructor(client: ApiClient) {\n super(client, mercenaryEndpoints);\n }\n\n /**\n * Retrieves all mercenary dens with their development and anarchy parameters.\n *\n * @param characterId - The ID of the character to query mercenary dens for\n * @returns A list of mercenary dens\n * @requires Authentication\n */\n getMercenaryDens(characterId: number): Promise<MercenaryDen[]> {\n return this.api.getMercenaryDens(characterId);\n }\n\n /**\n * Retrieves all mercenary tactical operations (MTOs) spawned from mercenary dens.\n *\n * @param characterId - The ID of the character to query tactical operations for\n * @returns A list of mercenary tactical operations\n * @requires Authentication\n */\n getMercenaryTacticalOperations(\n characterId: number,\n ): Promise<MercenaryTacticalOperation[]> {\n return this.api.getMercenaryTacticalOperations(characterId);\n }\n\n /**\n * Retrieves detail for a specific mercenary den including evolution, infomorphs, and skyhook attachment.\n *\n * @param characterId - The ID of the character\n * @param mercenaryDenId - The ID of the mercenary den\n * @returns Mercenary den detail\n * @requires Authentication\n */\n getMercenaryDenDetail(\n characterId: number,\n mercenaryDenId: number,\n ): Promise<MercenaryDenDetail> {\n return this.api.getMercenaryDenDetail(characterId, mercenaryDenId);\n }\n\n /**\n * Retrieves detail for a specific mercenary tactical operation.\n *\n * @param characterId - The ID of the character\n * @param operationId - The UUID of the tactical operation\n * @returns Mercenary tactical operation detail\n * @requires Authentication\n */\n getMercenaryTacticalOperationDetail(\n characterId: number,\n operationId: string,\n ): Promise<MercenaryTacticalOperationDetail> {\n return this.api.getMercenaryTacticalOperationDetail(\n characterId,\n operationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { AccessListSchema } from '../../schemas/access-lists';\n\nexport const accessListEndpoints = {\n getAccessList: {\n path: 'characters/{characterId}/access-lists/{accessListId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'accessListId'],\n responseSchema: AccessListSchema,\n },\n getCharacterAccessLists: {\n path: 'characters/{characterId}/access-lists',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(AccessListSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { accessListEndpoints } from '../core/endpoints/accessListEndpoints';\nimport { AccessList } from '../types/api-responses';\n\nexport class AccessListsClient extends BaseEsiClient<\n typeof accessListEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, accessListEndpoints);\n }\n\n /**\n * Retrieves the contents of an access list (ACL) including all character, corporation, and alliance entries.\n *\n * @param characterId - The ID of the character who owns the access list\n * @param accessListId - The ID of the access list to retrieve\n * @returns The access list with its entries\n * @requires Authentication\n */\n getAccessList(\n characterId: number,\n accessListId: number,\n ): Promise<AccessList> {\n return this.api.getAccessList(characterId, accessListId);\n }\n\n /**\n * Retrieves all access lists for a character.\n *\n * @param characterId - The ID of the character\n * @returns An array of the character's access lists\n * @requires Authentication\n */\n getCharacterAccessLists(characterId: number): Promise<AccessList[]> {\n return this.api.getCharacterAccessLists(characterId);\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterSkinrSchema,\n CharacterSkinrComponentsSchema,\n SkinrSchema,\n} from '../../schemas/cosmetics';\n\nexport const cosmeticsEndpoints = {\n getCharacterSkinr: {\n path: 'characters/{characterId}/cosmetics/skinr',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterSkinrSchema,\n },\n getCharacterSkinrComponents: {\n path: 'characters/{characterId}/cosmetics/skinr/components',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterSkinrComponentsSchema,\n },\n getSkinr: {\n path: 'cosmetics/skinr/{skinrId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['skinrId'],\n responseSchema: SkinrSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { cosmeticsEndpoints } from '../core/endpoints/cosmeticsEndpoints';\nimport {\n CharacterSkinr,\n CharacterSkinrComponents,\n Skinr,\n} from '../types/api-responses';\n\nexport class CosmeticsClient extends BaseEsiClient<typeof cosmeticsEndpoints> {\n constructor(client: ApiClient) {\n super(client, cosmeticsEndpoints);\n }\n\n getCharacterSkinr(characterId: number): Promise<CharacterSkinr> {\n return this.api.getCharacterSkinr(characterId);\n }\n\n getCharacterSkinrComponents(\n characterId: number,\n ): Promise<CharacterSkinrComponents> {\n return this.api.getCharacterSkinrComponents(characterId);\n }\n\n getSkinr(skinrId: string): Promise<Skinr> {\n return this.api.getSkinr(skinrId);\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n ParagonHubSkinrResponseSchema,\n ParagonHubCharacterSkinrResponseSchema,\n} from '../../schemas/paragon-hub';\n\nexport const paragonHubEndpoints = {\n getPublicListings: {\n path: 'paragon-hub/skinr',\n method: 'GET',\n requiresAuth: false,\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n getCharacterListings: {\n path: 'characters/{characterId}/paragon-hub/skinr',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubCharacterSkinrResponseSchema,\n },\n getAllianceListings: {\n path: 'paragon-hub/skinr/alliances/{allianceId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['allianceId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n getCharacterTargetedListings: {\n path: 'paragon-hub/skinr/characters/{characterId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n getCorporationListings: {\n path: 'paragon-hub/skinr/corporations/{corporationId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { paragonHubEndpoints } from '../core/endpoints/paragonHubEndpoints';\nimport {\n ParagonHubSkinrResponse,\n ParagonHubCharacterSkinrResponse,\n} from '../types/api-responses';\n\nexport class ParagonHubClient extends BaseEsiClient<\n typeof paragonHubEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, paragonHubEndpoints);\n }\n\n getPublicListings(\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getPublicListings(after, before, limit);\n }\n\n getCharacterListings(\n characterId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubCharacterSkinrResponse> {\n return this.api.getCharacterListings(characterId, after, before, limit);\n }\n\n getAllianceListings(\n allianceId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getAllianceListings(allianceId, after, before, limit);\n }\n\n getCharacterTargetedListings(\n characterId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getCharacterTargetedListings(\n characterId,\n after,\n before,\n limit,\n );\n }\n\n getCorporationListings(\n corporationId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getCorporationListings(corporationId, after, before, limit);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MilitaryCampaignSchema,\n MilitaryCampaignObjectiveSchema,\n CharacterMilitaryCampaignObjectiveSchema,\n} from '../../schemas/military-campaigns';\n\nexport const militaryCampaignEndpoints = {\n getMilitaryCampaigns: {\n path: 'military-campaigns',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(MilitaryCampaignSchema),\n },\n getMilitaryCampaign: {\n path: 'military-campaigns/{campaignId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['campaignId'],\n responseSchema: MilitaryCampaignSchema,\n },\n getMilitaryCampaignObjectives: {\n path: 'military-campaigns/{campaignId}/objectives',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['campaignId'],\n responseSchema: z.array(MilitaryCampaignObjectiveSchema),\n },\n getMilitaryCampaignObjective: {\n path: 'military-campaigns/{campaignId}/objectives/{objectiveId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['campaignId', 'objectiveId'],\n responseSchema: MilitaryCampaignObjectiveSchema,\n },\n getCharacterMilitaryCampaignObjectives: {\n path: 'characters/{characterId}/military-campaigns/objectives',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterMilitaryCampaignObjectiveSchema),\n },\n getCharacterMilitaryCampaignObjective: {\n path: 'characters/{characterId}/military-campaigns/objectives/{objectiveId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'objectiveId'],\n responseSchema: CharacterMilitaryCampaignObjectiveSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { militaryCampaignEndpoints } from '../core/endpoints/militaryCampaignEndpoints';\nimport {\n MilitaryCampaign,\n MilitaryCampaignObjective,\n CharacterMilitaryCampaignObjective,\n} from '../types/api-responses';\n\nexport class MilitaryCampaignsClient extends BaseEsiClient<\n typeof militaryCampaignEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, militaryCampaignEndpoints);\n }\n\n /**\n * Retrieves a list of all active, completed, and expired military campaigns.\n *\n * @returns An array of military campaigns\n */\n getMilitaryCampaigns(): Promise<MilitaryCampaign[]> {\n return this.api.getMilitaryCampaigns();\n }\n\n /**\n * Retrieves detailed information about a specific military campaign.\n *\n * @param campaignId - The UUID of the military campaign\n * @returns Detailed information about the campaign\n */\n getMilitaryCampaign(campaignId: string): Promise<MilitaryCampaign> {\n return this.api.getMilitaryCampaign(campaignId);\n }\n\n /**\n * Retrieves all objectives for a specific military campaign.\n *\n * @param campaignId - The UUID of the military campaign\n * @returns An array of objectives for the campaign\n */\n getMilitaryCampaignObjectives(\n campaignId: string,\n ): Promise<MilitaryCampaignObjective[]> {\n return this.api.getMilitaryCampaignObjectives(campaignId);\n }\n\n /**\n * Retrieves detailed information about a specific objective in a military campaign.\n *\n * @param campaignId - The UUID of the military campaign\n * @param objectiveId - The UUID of the objective\n * @returns Detailed information about the objective\n */\n getMilitaryCampaignObjective(\n campaignId: string,\n objectiveId: string,\n ): Promise<MilitaryCampaignObjective> {\n return this.api.getMilitaryCampaignObjective(campaignId, objectiveId);\n }\n\n /**\n * Retrieves a character's participated objectives across military campaigns.\n *\n * @param characterId - The ID of the character\n * @returns An array of the character's campaign objective participations\n * @requires Authentication with scope esi.activity.char:read\n */\n getCharacterMilitaryCampaignObjectives(\n characterId: number,\n ): Promise<CharacterMilitaryCampaignObjective[]> {\n return this.api.getCharacterMilitaryCampaignObjectives(characterId);\n }\n\n /**\n * Retrieves a character's participation details for a specific campaign objective.\n *\n * @param characterId - The ID of the character\n * @param objectiveId - The UUID of the objective\n * @returns The character's participation details for the objective\n * @requires Authentication with scope esi.activity.char:read\n */\n getCharacterMilitaryCampaignObjective(\n characterId: number,\n objectiveId: string,\n ): Promise<CharacterMilitaryCampaignObjective> {\n return this.api.getCharacterMilitaryCampaignObjective(\n characterId,\n objectiveId,\n );\n }\n}\n","import { ApiClient } from './ApiClient';\nimport { AllianceClient } from '../clients/AllianceClient';\nimport { AssetsClient } from '../clients/AssetsClient';\nimport { CalendarClient } from '../clients/CalendarClient';\nimport { CharacterClient } from '../clients/CharacterClient';\nimport { ClonesClient } from '../clients/ClonesClient';\nimport { ContactsClient } from '../clients/ContactsClient';\nimport { ContractsClient } from '../clients/ContractsClient';\nimport { CorporationsClient } from '../clients/CorporationsClient';\nimport { CorporationProjectsClient } from '../clients/CorporationProjectsClient';\nimport { DogmaClient } from '../clients/DogmaClient';\nimport { FactionClient } from '../clients/FactionClient';\nimport { FittingsClient } from '../clients/FittingsClient';\nimport { FleetClient } from '../clients/FleetClient';\nimport { IncursionsClient } from '../clients/IncursionsClient';\nimport { IndustryClient } from '../clients/IndustryClient';\nimport { InsuranceClient } from '../clients/InsuranceClient';\nimport { KillmailsClient } from '../clients/KillmailsClient';\nimport { LocationClient } from '../clients/LocationClient';\nimport { LoyaltyClient } from '../clients/LoyaltyClient';\nimport { MailClient } from '../clients/MailClient';\nimport { MarketClient } from '../clients/MarketClient';\nimport { PiClient } from '../clients/PiClient';\nimport { RouteClient } from '../clients/RouteClient';\nimport { SearchClient } from '../clients/SearchClient';\nimport { CharacterSkillsClient } from '../clients/SkillsClient';\nimport { SovereigntyClient } from '../clients/SovereigntyClient';\nimport { StatusClient } from '../clients/StatusClient';\nimport { UiClient } from '../clients/UiClient';\nimport { UniverseClient } from '../clients/UniverseClient';\nimport { WalletClient } from '../clients/WalletClient';\nimport { WarsClient } from '../clients/WarsClient';\nimport { MetaClient } from '../clients/MetaClient';\nimport { FreelanceJobsClient } from '../clients/FreelanceJobsClient';\nimport { SkyhooksClient } from '../clients/SkyhooksClient';\nimport { MercenaryClient } from '../clients/MercenaryClient';\nimport { AccessListsClient } from '../clients/AccessListsClient';\nimport { CosmeticsClient } from '../clients/CosmeticsClient';\nimport { ParagonHubClient } from '../clients/ParagonHubClient';\nimport { MilitaryCampaignsClient } from '../clients/MilitaryCampaignsClient';\n\nexport type ApiClientType =\n | 'alliance'\n | 'assets'\n | 'calendar'\n | 'characters'\n | 'clones'\n | 'contacts'\n | 'contracts'\n | 'corporations'\n | 'corporationProjects'\n | 'dogma'\n | 'factions'\n | 'fittings'\n | 'fleets'\n | 'incursions'\n | 'industry'\n | 'insurance'\n | 'killmails'\n | 'location'\n | 'loyalty'\n | 'mail'\n | 'market'\n | 'pi'\n | 'route'\n | 'search'\n | 'skills'\n | 'sovereignty'\n | 'status'\n | 'ui'\n | 'universe'\n | 'wallet'\n | 'wars'\n | 'meta'\n | 'freelanceJobs'\n | 'skyhooks'\n | 'cosmetics'\n | 'paragonHub'\n | 'mercenary'\n | 'militaryCampaigns'\n | 'accessLists';\n\nexport type ClientInstance =\n | AllianceClient\n | AssetsClient\n | CalendarClient\n | CharacterClient\n | ClonesClient\n | ContactsClient\n | ContractsClient\n | CorporationsClient\n | CorporationProjectsClient\n | DogmaClient\n | FactionClient\n | FittingsClient\n | FleetClient\n | IncursionsClient\n | IndustryClient\n | InsuranceClient\n | KillmailsClient\n | LocationClient\n | LoyaltyClient\n | MailClient\n | MarketClient\n | PiClient\n | RouteClient\n | SearchClient\n | CharacterSkillsClient\n | SovereigntyClient\n | StatusClient\n | UiClient\n | UniverseClient\n | WalletClient\n | WarsClient\n | MetaClient\n | FreelanceJobsClient\n | SkyhooksClient\n | CosmeticsClient\n | ParagonHubClient\n | MercenaryClient\n | MilitaryCampaignsClient\n | AccessListsClient;\n\nconst clientFactories: Record<\n ApiClientType,\n new (apiClient: ApiClient) => ClientInstance\n> = {\n alliance: AllianceClient,\n assets: AssetsClient,\n calendar: CalendarClient,\n characters: CharacterClient,\n clones: ClonesClient,\n contacts: ContactsClient,\n contracts: ContractsClient,\n corporations: CorporationsClient,\n corporationProjects: CorporationProjectsClient,\n dogma: DogmaClient,\n factions: FactionClient,\n fittings: FittingsClient,\n fleets: FleetClient,\n incursions: IncursionsClient,\n industry: IndustryClient,\n insurance: InsuranceClient,\n killmails: KillmailsClient,\n location: LocationClient,\n loyalty: LoyaltyClient,\n mail: MailClient,\n market: MarketClient,\n pi: PiClient,\n route: RouteClient,\n search: SearchClient,\n skills: CharacterSkillsClient,\n sovereignty: SovereigntyClient,\n status: StatusClient,\n ui: UiClient,\n universe: UniverseClient,\n wallet: WalletClient,\n wars: WarsClient,\n meta: MetaClient,\n freelanceJobs: FreelanceJobsClient,\n skyhooks: SkyhooksClient,\n cosmetics: CosmeticsClient,\n paragonHub: ParagonHubClient,\n mercenary: MercenaryClient,\n militaryCampaigns: MilitaryCampaignsClient,\n accessLists: AccessListsClient,\n};\n\nexport function createClientInstance(\n name: ApiClientType,\n apiClient: ApiClient,\n): ClientInstance {\n // eslint-disable-next-line security/detect-object-injection\n return new clientFactories[name](apiClient);\n}\n\nconst allClientTypes: ApiClientType[] = Object.keys(\n clientFactories,\n) as ApiClientType[];\n\n// Re-export client classes for direct use\nexport {\n AllianceClient,\n AssetsClient,\n CalendarClient,\n CharacterClient,\n ClonesClient,\n ContactsClient,\n ContractsClient,\n CorporationsClient,\n CorporationProjectsClient,\n DogmaClient,\n FactionClient,\n FittingsClient,\n FleetClient,\n IncursionsClient,\n IndustryClient,\n InsuranceClient,\n KillmailsClient,\n LocationClient,\n LoyaltyClient,\n MailClient,\n MarketClient,\n PiClient,\n RouteClient,\n SearchClient,\n CharacterSkillsClient,\n SovereigntyClient,\n StatusClient,\n UiClient,\n UniverseClient,\n WalletClient,\n WarsClient,\n MetaClient,\n FreelanceJobsClient,\n SkyhooksClient,\n CosmeticsClient,\n ParagonHubClient,\n MercenaryClient,\n MilitaryCampaignsClient,\n AccessListsClient,\n};\n","import { ApiClient } from './ApiClient';\nimport { ETagCacheManager, ETagCacheConfig } from './cache/ETagCacheManager';\nimport { RequestDeduplicator } from './RequestDeduplicator';\n\nexport interface CacheStats {\n totalEntries: number;\n maxEntries: number;\n hits: number;\n misses: number;\n hitRate: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n}\n\nexport interface CircuitBreakerStats {\n totalCircuits: number;\n openCircuits: number;\n circuits: Record<\n string,\n { state: 'closed' | 'open' | 'half-open'; failures: number }\n >;\n}\n\nexport class EsiDiagnostics {\n constructor(\n private apiClient: ApiClient,\n private etagCacheEnabled: boolean,\n private deduplicator: RequestDeduplicator | null,\n ) {}\n\n getCacheStats(): CacheStats | null {\n if (!this.etagCacheEnabled) return null;\n const cache = this.apiClient.getCache();\n return cache ? (cache as ETagCacheManager).getStats() : null;\n }\n\n clearCache(): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).clear();\n }\n }\n\n updateCacheConfig(newConfig: Partial<ETagCacheConfig>): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).updateConfig(newConfig);\n }\n }\n\n getCircuitBreakerStats(): CircuitBreakerStats | null {\n const cb = this.apiClient.getCircuitBreaker();\n return cb ? cb.getStats() : null;\n }\n\n resetCircuitBreaker(endpoint?: string): void {\n const cb = this.apiClient.getCircuitBreaker();\n if (cb) {\n cb.reset(endpoint);\n }\n }\n\n getDeduplicatorStats(): { pendingRequests: number } | null {\n return this.deduplicator\n ? { pendingRequests: this.deduplicator.pending }\n : null;\n }\n}\n","import { EsiError } from './util/error';\nimport { logDebug, logInfo } from './logger/clientLog';\n\nexport interface BatchOptions {\n concurrency?: number;\n onProgress?: (completed: number, total: number) => void;\n}\n\nexport interface BatchResult<K, T> {\n results: Map<K, T>;\n errors: Map<K, EsiError | Error>;\n}\n\nexport async function batchFetch<K, T>(\n keys: K[],\n fetcher: (key: K) => Promise<T>,\n options: BatchOptions = {},\n): Promise<BatchResult<K, T>> {\n const concurrency = options.concurrency ?? 20;\n const results = new Map<K, T>();\n const errors = new Map<K, EsiError | Error>();\n let completed = 0;\n let running = 0;\n let index = 0;\n\n logInfo(\n null,\n `Batch fetch: ${keys.length} items, concurrency=${concurrency}`,\n {\n total: keys.length,\n concurrency,\n },\n );\n\n return new Promise((resolve) => {\n function next(): void {\n while (running < concurrency && index < keys.length) {\n const currentIndex = index++;\n const key = keys[currentIndex]!;\n running++;\n\n fetcher(key)\n .then((result) => {\n results.set(key, result);\n })\n .catch((err: unknown) => {\n const error =\n err instanceof EsiError || err instanceof Error\n ? err\n : new Error(String(err));\n errors.set(key, error);\n })\n .finally(() => {\n running--;\n completed++;\n if (options.onProgress) {\n options.onProgress(completed, keys.length);\n }\n if (completed === keys.length) {\n logDebug(\n null,\n `Batch complete: ${results.size} succeeded, ${errors.size} failed`,\n { succeeded: results.size, failed: errors.size },\n );\n resolve({ results, errors });\n } else {\n next();\n }\n });\n }\n }\n\n if (keys.length === 0) {\n resolve({ results, errors });\n return;\n }\n\n next();\n });\n}\n\nexport async function batchPost<T>(\n ids: number[],\n poster: (chunk: number[]) => Promise<T[]>,\n chunkSize: number = 1000,\n): Promise<T[]> {\n const chunks: number[][] = [];\n for (let i = 0; i < ids.length; i += chunkSize) {\n chunks.push(ids.slice(i, i + chunkSize));\n }\n\n logInfo(\n null,\n `Batch POST: ${ids.length} IDs in ${chunks.length} chunks of ${chunkSize}`,\n { total: ids.length, chunks: chunks.length, chunkSize },\n );\n\n const results: T[] = [];\n for (const chunk of chunks) {\n const chunkResult = await poster(chunk);\n results.push(...chunkResult);\n }\n\n return results;\n}\n","import { ApiClient } from '../ApiClient';\nimport { logInfo, logDebug } from '../logger/clientLog';\nimport { ICache, CacheEntry } from './ICache';\n\nexport type { CacheEntry } from './ICache';\n\nexport interface ETagCacheConfig {\n maxEntries?: number;\n defaultTtl?: number;\n cleanupInterval?: number;\n}\n\nexport class ETagCacheManager implements ICache {\n private cache: Map<string, CacheEntry> = new Map();\n private config: Required<ETagCacheConfig>;\n private cleanupTimer?: NodeJS.Timeout;\n private hits: number = 0;\n private misses: number = 0;\n private client: ApiClient | null = null;\n\n setClient(client: ApiClient | null): void {\n this.client = client;\n }\n\n private log(\n level: 'info' | 'debug',\n message: string,\n context?: Record<string, unknown>,\n ): void {\n const ctx =\n context && Object.keys(context).length > 0 ? context : undefined;\n const emit = level === 'info' ? logInfo : logDebug;\n emit(this.client, message, ctx);\n }\n\n constructor(config: ETagCacheConfig = {}) {\n this.config = {\n maxEntries: config.maxEntries ?? 1000,\n defaultTtl: config.defaultTtl ?? 5 * 60 * 1000, // 5 minutes default\n cleanupInterval: config.cleanupInterval ?? 60 * 1000, // 1 minute cleanup\n };\n\n this.startCleanupTimer();\n this.log(\n 'info',\n `ETag cache manager initialized with ${this.config.maxEntries} max entries`,\n { maxEntries: this.config.maxEntries },\n );\n }\n\n /**\n * Get cached data if ETag matches\n */\n get(url: string): CacheEntry | null {\n const entry = this.cache.get(url);\n\n if (!entry) {\n this.misses++;\n return null;\n }\n\n if (this.isExpired(entry)) {\n this.cache.delete(url);\n this.misses++;\n this.log('debug', `Cache entry expired for ${url}`, { url });\n return null;\n }\n\n this.hits++;\n this.log('debug', `Cache hit for ${url} with ETag ${entry.etag}`, { url });\n return entry;\n }\n\n /**\n * Get ETag for a URL (for If-None-Match header)\n */\n getETag(url: string): string | null {\n const entry = this.get(url);\n return entry ? entry.etag : null;\n }\n\n /**\n * Set cache entry\n */\n set(\n url: string,\n etag: string,\n data: unknown,\n headers: Record<string, string>,\n customTtl?: number,\n ): void {\n // Remove the oldest entry if the cache is full. Replacing an entry that is\n // already stored does not grow the cache, so it evicts nothing.\n if (!this.cache.has(url) && this.cache.size >= this.config.maxEntries) {\n this.evictOldest();\n }\n\n const entry: CacheEntry = {\n etag,\n data,\n headers,\n timestamp: Date.now(),\n ttl: customTtl ?? this.config.defaultTtl,\n };\n\n this.cache.set(url, entry);\n this.log('debug', `Cached response for ${url} with ETag ${etag}`, { url });\n }\n\n /**\n * Check if cached data exists and is valid\n */\n has(url: string): boolean {\n const entry = this.cache.get(url);\n return entry !== undefined && !this.isExpired(entry);\n }\n\n /**\n * Clear specific cache entry\n */\n delete(url: string): boolean {\n return this.cache.delete(url);\n }\n\n /**\n * Delete all cache entries whose URL contains the given path segment\n */\n deleteByPath(pathSegment: string): number {\n let count = 0;\n for (const key of this.cache.keys()) {\n if (key.includes(pathSegment)) {\n this.cache.delete(key);\n count++;\n }\n }\n if (count > 0) {\n this.log(\n 'debug',\n `Invalidated ${count} cache entries matching ${pathSegment}`,\n {\n count,\n },\n );\n }\n return count;\n }\n\n /**\n * Clear all cache entries\n */\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n this.log('info', 'ETag cache cleared');\n }\n\n /**\n * Get cache statistics\n */\n getStats(): {\n totalEntries: number;\n maxEntries: number;\n hits: number;\n misses: number;\n hitRate: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n } {\n let oldest = Infinity;\n let newest = -Infinity;\n for (const entry of this.cache.values()) {\n if (entry.timestamp < oldest) oldest = entry.timestamp;\n if (entry.timestamp > newest) newest = entry.timestamp;\n }\n const total = this.hits + this.misses;\n\n return {\n totalEntries: this.cache.size,\n maxEntries: this.config.maxEntries,\n hits: this.hits,\n misses: this.misses,\n hitRate: total > 0 ? this.hits / total : 0,\n oldestEntry: this.cache.size > 0 ? oldest : null,\n newestEntry: this.cache.size > 0 ? newest : null,\n };\n }\n\n /**\n * Update cache configuration\n */\n updateConfig(newConfig: Partial<ETagCacheConfig>): void {\n this.config = { ...this.config, ...newConfig };\n this.log('info', 'ETag cache configuration updated', {\n maxEntries: this.config.maxEntries,\n });\n }\n\n /**\n * Cleanup expired entries\n */\n cleanup(): number {\n const beforeSize = this.cache.size;\n\n for (const [url, entry] of this.cache.entries()) {\n if (this.isExpired(entry)) {\n this.cache.delete(url);\n }\n }\n\n const cleanedCount = beforeSize - this.cache.size;\n if (cleanedCount > 0) {\n this.log('debug', `Cleaned up ${cleanedCount} expired cache entries`, {\n cleanedCount,\n });\n }\n\n return cleanedCount;\n }\n\n /**\n * Shutdown cache manager\n */\n shutdown(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n }\n this.log('info', 'ETag cache manager shut down');\n }\n\n private isExpired(entry: CacheEntry): boolean {\n if (!entry.ttl) return false;\n return Date.now() - entry.timestamp > entry.ttl;\n }\n\n private evictOldest(): void {\n let oldestKey: string | null = null;\n let oldestTime = Infinity;\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.timestamp < oldestTime) {\n oldestTime = entry.timestamp;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.cache.delete(oldestKey);\n this.log('debug', `Evicted oldest cache entry: ${oldestKey}`, {\n url: oldestKey,\n });\n }\n }\n\n private startCleanupTimer(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanup();\n }, this.config.cleanupInterval);\n // Don't prevent process exit (important for test runners and CLI tools)\n this.cleanupTimer.unref();\n }\n}\n","// Auto-generated from ESI OpenAPI spec — do not edit manually\n// Compatibility date: 2026-05-19\n// Endpoints with rate limit groups: 156\n\nexport interface RateLimitGroupSpec {\n group: string;\n maxTokens: number;\n windowSizeMs: number;\n}\n\nexport const esiRateLimitGroups: Record<string, RateLimitGroupSpec> = {\n 'GET:alliances/{alliance_id}/contacts': { group: 'alliance-social', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:alliances/{alliance_id}/contacts/labels': { group: 'alliance-social', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/access-lists': { group: 'char-access', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/access-lists/{access_list_id}': { group: 'char-access', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/agents_research': { group: 'char-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/assets': { group: 'char-asset', maxTokens: 1800, windowSizeMs: 900000 },\n 'POST:characters/{character_id}/assets/locations': { group: 'char-asset', maxTokens: 1800, windowSizeMs: 900000 },\n 'POST:characters/{character_id}/assets/names': { group: 'char-asset', maxTokens: 1800, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/attributes': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/blueprints': { group: 'char-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/calendar': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/calendar/{event_id}': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'PUT:characters/{character_id}/calendar/{event_id}': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/calendar/{event_id}/attendees': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/clones': { group: 'char-location', maxTokens: 1200, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/contacts': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'POST:characters/{character_id}/contacts': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'PUT:characters/{character_id}/contacts': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'DELETE:characters/{character_id}/contacts': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/contacts/labels': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/contracts': { group: 'char-contract', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/contracts/{contract_id}/bids': { group: 'char-contract', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/contracts/{contract_id}/items': { group: 'char-contract', maxTokens: 600, windowSizeMs: 900000 },\n 'POST:characters/{character_id}/cspa': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/fatigue': { group: 'char-location', maxTokens: 1200, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/fittings': { group: 'fitting', maxTokens: 150, windowSizeMs: 900000 },\n 'POST:characters/{character_id}/fittings': { group: 'fitting', maxTokens: 150, windowSizeMs: 900000 },\n 'DELETE:characters/{character_id}/fittings/{fitting_id}': { group: 'fitting', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/fleet': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/freelance-jobs': { group: 'char-freelance-job', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/freelance-jobs/{job_id}/participation': { group: 'char-freelance-job', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/fw/stats': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/implants': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/industry/jobs': { group: 'char-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/killmails/recent': { group: 'char-killmail', maxTokens: 30, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/location': { group: 'char-location', maxTokens: 1200, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/loyalty/points': { group: 'char-wallet', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/mail': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'POST:characters/{character_id}/mail': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/mail/{mail_id}': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'PUT:characters/{character_id}/mail/{mail_id}': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'DELETE:characters/{character_id}/mail/{mail_id}': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/mail/labels': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'POST:characters/{character_id}/mail/labels': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'DELETE:characters/{character_id}/mail/labels/{label_id}': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/mail/lists': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/medals': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/mercenary-tactical-operations': { group: 'char-activity', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/mercenary-tactical-operations/{operation_id}': { group: 'char-activity', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/mining': { group: 'char-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/notifications': { group: 'char-notification', maxTokens: 15, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/notifications/contacts': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/online': { group: 'char-location', maxTokens: 1200, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/planets': { group: 'char-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/planets/{planet_id}': { group: 'char-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/portrait': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/roles': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/ship': { group: 'char-location', maxTokens: 1200, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/skillqueue': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/skills': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/standings': { group: 'char-social', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/structures/mercenary-dens': { group: 'char-structure', maxTokens: 30, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/structures/mercenary-dens/{mercenary_den_id}': { group: 'char-structure', maxTokens: 30, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/titles': { group: 'char-detail', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/wallet': { group: 'char-wallet', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/wallet/journal': { group: 'char-wallet', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:characters/{character_id}/wallet/transactions': { group: 'char-wallet', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:corporation/{corporation_id}/mining/extractions': { group: 'corp-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporation/{corporation_id}/mining/observers': { group: 'corp-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporation/{corporation_id}/mining/observers/{observer_id}': { group: 'corp-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/assets': { group: 'corp-asset', maxTokens: 1800, windowSizeMs: 900000 },\n 'POST:corporations/{corporation_id}/assets/locations': { group: 'corp-asset', maxTokens: 1800, windowSizeMs: 900000 },\n 'POST:corporations/{corporation_id}/assets/names': { group: 'corp-asset', maxTokens: 1800, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/blueprints': { group: 'corp-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/contacts': { group: 'corp-social', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/contacts/labels': { group: 'corp-social', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/containers/logs': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/contracts': { group: 'corp-contract', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/bids': { group: 'corp-contract', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/items': { group: 'corp-contract', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/customs_offices': { group: 'corp-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/divisions': { group: 'corp-wallet', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/facilities': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/freelance-jobs': { group: 'corp-freelance-job', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/freelance-jobs/{job_id}/participants': { group: 'corp-freelance-job', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/fw/stats': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/industry/jobs': { group: 'corp-industry', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/killmails/recent': { group: 'corp-killmail', maxTokens: 30, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/medals': { group: 'corp-detail', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/medals/issued': { group: 'corp-detail', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/members': { group: 'corp-member', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/members/limit': { group: 'corp-member', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/members/titles': { group: 'corp-member', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/membertracking': { group: 'corp-member', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/projects': { group: 'corp-project', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/projects/{project_id}': { group: 'corp-project', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/projects/{project_id}/contribution/{character_id}': { group: 'corp-project', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/projects/{project_id}/contributors': { group: 'corp-project', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/roles': { group: 'corp-member', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/roles/history': { group: 'corp-member', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/shareholders': { group: 'corp-detail', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/standings': { group: 'corp-member', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/starbases': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/starbases/{starbase_id}': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/structures': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/structures/skyhooks': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/structures/skyhooks/{skyhook_id}': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs/{sovereignty_hub_id}': { group: 'corp-structure', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/titles': { group: 'corp-detail', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/wallets': { group: 'corp-wallet', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/wallets/{division}/journal': { group: 'corp-wallet', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:corporations/{corporation_id}/wallets/{division}/transactions': { group: 'corp-wallet', maxTokens: 300, windowSizeMs: 900000 },\n 'GET:fleets/{fleet_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'PUT:fleets/{fleet_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'GET:fleets/{fleet_id}/members': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'POST:fleets/{fleet_id}/members': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'PUT:fleets/{fleet_id}/members/{member_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'DELETE:fleets/{fleet_id}/members/{member_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'PUT:fleets/{fleet_id}/squads/{squad_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'DELETE:fleets/{fleet_id}/squads/{squad_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'GET:fleets/{fleet_id}/wings': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'POST:fleets/{fleet_id}/wings': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'PUT:fleets/{fleet_id}/wings/{wing_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'DELETE:fleets/{fleet_id}/wings/{wing_id}': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'POST:fleets/{fleet_id}/wings/{wing_id}/squads': { group: 'fleet', maxTokens: 1800, windowSizeMs: 900000 },\n 'GET:freelance-jobs': { group: 'freelance-job', maxTokens: 12000, windowSizeMs: 900000 },\n 'GET:freelance-jobs/{job_id}': { group: 'freelance-job', maxTokens: 12000, windowSizeMs: 900000 },\n 'GET:fw/leaderboards': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:fw/leaderboards/characters': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:fw/leaderboards/corporations': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:fw/stats': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:fw/systems': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:fw/wars': { group: 'factional-warfare', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:incursions': { group: 'incursion', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:industry/facilities': { group: 'industry', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:industry/systems': { group: 'industry', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:insurance/prices': { group: 'insurance', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:killmails/{killmail_id}/{killmail_hash}': { group: 'killmail', maxTokens: 3600, windowSizeMs: 900000 },\n 'GET:markets/{region_id}/orders': { group: 'market-order', maxTokens: 12000, windowSizeMs: 900000 },\n 'GET:meta/changelog': { group: 'meta', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:meta/compatibility-dates': { group: 'meta', maxTokens: 150, windowSizeMs: 900000 },\n 'GET:meta/status': { group: 'meta', maxTokens: 150, windowSizeMs: 900000 },\n 'POST:route/{origin_system_id}/{destination_system_id}': { group: 'routes', maxTokens: 3600, windowSizeMs: 900000 },\n 'GET:skyhooks/raidable': { group: 'activity', maxTokens: 30, windowSizeMs: 900000 },\n 'GET:sovereignty/campaigns': { group: 'sovereignty', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:sovereignty/systems': { group: 'sovereignty', maxTokens: 600, windowSizeMs: 900000 },\n 'GET:status': { group: 'status', maxTokens: 600, windowSizeMs: 900000 },\n 'POST:ui/autopilot/waypoint': { group: 'ui', maxTokens: 900, windowSizeMs: 900000 },\n 'POST:ui/openwindow/contract': { group: 'ui', maxTokens: 900, windowSizeMs: 900000 },\n 'POST:ui/openwindow/information': { group: 'ui', maxTokens: 900, windowSizeMs: 900000 },\n 'POST:ui/openwindow/marketdetails': { group: 'ui', maxTokens: 900, windowSizeMs: 900000 },\n 'POST:ui/openwindow/newmail': { group: 'ui', maxTokens: 900, windowSizeMs: 900000 },\n 'GET:wars': { group: 'killmail', maxTokens: 3600, windowSizeMs: 900000 },\n 'GET:wars/{war_id}': { group: 'killmail', maxTokens: 3600, windowSizeMs: 900000 },\n 'GET:wars/{war_id}/killmails': { group: 'killmail', maxTokens: 3600, windowSizeMs: 900000 },\n};\n","import { IRateLimiter, RateLimitGroupStatus } from './IRateLimiter';\nimport {\n esiRateLimitGroups,\n RateLimitGroupSpec,\n} from '../endpoints/esi-rate-limit-groups.generated';\nimport { camelToSnake } from '../util/stringUtil';\nimport { logWarn } from '../logger/clientLog';\nimport { sleep } from '../util/sleep';\nimport { EsiError } from '../util/error';\n\nexport interface RateLimitInfo {\n remaining: number;\n limit: number;\n used: number;\n group: string | null;\n errorLimitRemain: number;\n errorLimitReset: number;\n retryAfter: number | null;\n blockedUntil: number;\n}\n\nfunction getTokenCost(statusCode: number): number {\n if (statusCode >= 200 && statusCode < 300) return 2;\n if (statusCode >= 300 && statusCode < 400) return 1;\n if (statusCode >= 400 && statusCode < 500) return 5;\n if (statusCode >= 500 && statusCode < 600) return 0;\n return 2;\n}\n\n/**\n * When a Retry-After header lets requests resume, as epoch milliseconds.\n * RFC 9110 allows delay-seconds or an HTTP date. Undefined for anything else,\n * so an unreadable header never sets a block that cannot end.\n */\nfunction retryAfterDeadline(value: string, now: number): number | undefined {\n const trimmed = value.trim();\n if (/^\\d+$/.test(trimmed)) return now + parseInt(trimmed, 10) * 1000;\n if (!/[A-Za-z]/.test(trimmed)) return undefined;\n const date = Date.parse(trimmed);\n return Number.isNaN(date) ? undefined : date;\n}\n\nexport interface RateLimitEndpointOverride {\n maxTokens: number;\n windowSizeMs: number;\n}\n\nexport interface RateLimiterConfig {\n minDelayMs?: number;\n decelerationThreshold?: number;\n userKeyExtractor?: (headers: Record<string, string>) => string;\n endpointOverrides?: Record<string, RateLimitEndpointOverride>;\n}\n\ninterface GroupBucket {\n group: string;\n remaining: number;\n limit: number;\n used: number;\n windowSizeMs: number;\n blockedUntil: number;\n lastUpdated: number;\n}\n\ninterface ErrorLimitState {\n remain: number;\n reset: number;\n /** When the window of a budget reported as exhausted ends (epoch ms). */\n exhaustedUntil: number;\n}\n\ninterface UserBucketSet {\n groups: Map<string, GroupBucket>;\n errorLimit: ErrorLimitState;\n lastAccessed: number;\n}\n\nconst DEFAULT_WINDOW_MS = 900_000;\nconst DEFAULT_ERROR_LIMIT: ErrorLimitState = {\n remain: 100,\n reset: 0,\n exhaustedUntil: 0,\n};\n\nexport class RateLimiter implements IRateLimiter {\n private readonly minDelayMs: number;\n private readonly decelerationThreshold: number;\n private readonly userKeyExtractor?: (\n headers: Record<string, string>,\n ) => string;\n private readonly endpointOverrides: Record<string, RateLimitEndpointOverride>;\n\n private lastRequestTime: number = 0;\n private minDelayChain: Promise<void> = Promise.resolve();\n private isTestMode: boolean = false;\n\n private globalErrorLimit: ErrorLimitState = { ...DEFAULT_ERROR_LIMIT };\n\n private defaultBuckets: Map<string, GroupBucket> = new Map();\n private userBuckets: Map<string, UserBucketSet> | null = null;\n private fallbackBucket: GroupBucket;\n\n private lastCleanup: number = 0;\n private static readonly CLEANUP_INTERVAL_MS = 60_000;\n\n constructor(config?: RateLimiterConfig) {\n this.minDelayMs = config?.minDelayMs ?? 50;\n this.decelerationThreshold = config?.decelerationThreshold ?? 0.2;\n this.userKeyExtractor = config?.userKeyExtractor;\n this.endpointOverrides = config?.endpointOverrides ?? {};\n if (this.userKeyExtractor) {\n this.userBuckets = new Map();\n }\n this.fallbackBucket = this.createFallbackBucket();\n }\n\n private createFallbackBucket(): GroupBucket {\n return {\n group: '__fallback__',\n remaining: -1,\n limit: 0,\n used: 0,\n windowSizeMs: DEFAULT_WINDOW_MS,\n blockedUntil: 0,\n lastUpdated: 0,\n };\n }\n\n private createBucketFromSpec(spec: RateLimitGroupSpec): GroupBucket {\n return {\n group: spec.group,\n remaining: spec.maxTokens,\n limit: spec.maxTokens,\n used: 0,\n windowSizeMs: spec.windowSizeMs,\n blockedUntil: 0,\n lastUpdated: 0,\n };\n }\n\n private createBucketForGroup(groupName: string): GroupBucket {\n return {\n group: groupName,\n remaining: -1,\n limit: 0,\n used: 0,\n windowSizeMs: DEFAULT_WINDOW_MS,\n blockedUntil: 0,\n lastUpdated: 0,\n };\n }\n\n private lookupGroupSpec(\n method?: string,\n templatePath?: string,\n ): RateLimitGroupSpec | undefined {\n if (!templatePath || !method) return undefined;\n const normalized = templatePath\n .replace(/\\/$/, '')\n .replace(/\\{(\\w+)\\}/g, (_, name: string) => `{${camelToSnake(name)}}`);\n const key = `${method}:${normalized}`;\n\n const override = this.endpointOverrides[key];\n if (override) {\n return {\n group: `endpoint:${key}`,\n maxTokens: override.maxTokens,\n windowSizeMs: override.windowSizeMs,\n };\n }\n\n return esiRateLimitGroups[key];\n }\n\n private resolveUserSet(\n requestHeaders?: Record<string, string>,\n ): UserBucketSet | null {\n if (!this.userBuckets || !this.userKeyExtractor || !requestHeaders) {\n return null;\n }\n\n const userKey = this.userKeyExtractor(requestHeaders);\n let userSet = this.userBuckets.get(userKey);\n if (!userSet) {\n userSet = {\n groups: new Map(),\n errorLimit: { ...DEFAULT_ERROR_LIMIT },\n lastAccessed: Date.now(),\n };\n this.userBuckets.set(userKey, userSet);\n }\n userSet.lastAccessed = Date.now();\n return userSet;\n }\n\n private resolveBucketMap(\n requestHeaders?: Record<string, string>,\n ): Map<string, GroupBucket> {\n const userSet = this.resolveUserSet(requestHeaders);\n return userSet ? userSet.groups : this.defaultBuckets;\n }\n\n private resolveErrorLimit(\n requestHeaders?: Record<string, string>,\n ): ErrorLimitState {\n const userSet = this.resolveUserSet(requestHeaders);\n return userSet ? userSet.errorLimit : this.globalErrorLimit;\n }\n\n private getBucket(\n templatePath?: string,\n method?: string,\n requestHeaders?: Record<string, string>,\n groupNameOverride?: string,\n ): GroupBucket {\n const bucketMap = this.resolveBucketMap(requestHeaders);\n\n const spec = this.lookupGroupSpec(method, templatePath);\n const groupName = groupNameOverride ?? spec?.group;\n\n if (!groupName) return this.fallbackBucket;\n\n let bucket = bucketMap.get(groupName);\n if (!bucket) {\n bucket = spec\n ? this.createBucketFromSpec(spec)\n : this.createBucketForGroup(groupName);\n bucketMap.set(groupName, bucket);\n }\n return bucket;\n }\n\n private cleanupStaleUsers(): void {\n if (!this.userBuckets) return;\n const now = Date.now();\n if (now - this.lastCleanup < RateLimiter.CLEANUP_INTERVAL_MS) return;\n this.lastCleanup = now;\n\n for (const [userKey, userSet] of this.userBuckets) {\n if (now - userSet.lastAccessed > DEFAULT_WINDOW_MS) {\n this.userBuckets.delete(userKey);\n }\n }\n }\n\n updateFromResponse(\n headers: Record<string, string>,\n statusCode: number,\n templatePath?: string,\n method?: string,\n requestHeaders?: Record<string, string>,\n ): void {\n if (this.isTestMode) return;\n\n const now = Date.now();\n const responseGroup = headers['x-ratelimit-group'] || undefined;\n const bucket = this.getBucket(\n templatePath,\n method,\n requestHeaders,\n responseGroup,\n );\n\n if ('x-ratelimit-remaining' in headers) {\n bucket.remaining = parseInt(headers['x-ratelimit-remaining'], 10);\n }\n if ('x-ratelimit-limit' in headers) {\n bucket.limit = parseInt(headers['x-ratelimit-limit'], 10);\n }\n if ('x-ratelimit-used' in headers) {\n bucket.used = parseInt(headers['x-ratelimit-used'], 10);\n }\n bucket.lastUpdated = now;\n\n if ('retry-after' in headers) {\n const until = retryAfterDeadline(headers['retry-after'], now);\n if (until !== undefined) bucket.blockedUntil = until;\n }\n\n if (statusCode === 420 || statusCode === 429) {\n if (bucket.blockedUntil <= now) {\n bucket.blockedUntil = now + 60_000;\n }\n }\n\n const errorLimit = this.resolveErrorLimit(requestHeaders);\n const reportedRemain =\n 'x-esi-error-limit-remain' in headers\n ? parseInt(headers['x-esi-error-limit-remain'], 10)\n : undefined;\n // Inside the window of a budget already reported as exhausted, a response\n // reporting budget left was processed before the one that exhausted it\n // and arrived late. Believing it would lift the back-off for every\n // endpoint while ESI still counts errors against the spent budget.\n if (\n reportedRemain !== undefined &&\n reportedRemain > 0 &&\n errorLimit.remain <= 0 &&\n now < errorLimit.exhaustedUntil\n ) {\n return;\n }\n if (reportedRemain !== undefined) {\n errorLimit.remain = reportedRemain;\n }\n if ('x-esi-error-limit-reset' in headers) {\n errorLimit.reset = parseInt(headers['x-esi-error-limit-reset'], 10);\n }\n if (reportedRemain !== undefined && reportedRemain <= 0) {\n errorLimit.exhaustedUntil = now + errorLimit.reset * 1000;\n }\n }\n\n updateRateLimitInfo(headers: Record<string, string>): void {\n this.updateFromResponse(headers, 200);\n }\n\n async checkRateLimit(\n templatePath?: string,\n method?: string,\n requestHeaders?: Record<string, string>,\n ): Promise<void> {\n if (this.isTestMode) return;\n\n this.cleanupStaleUsers();\n\n // Re-check after sleeping on a block so a concurrent response that\n // re-blocked the group is respected (bounded to avoid infinite waits).\n let stillBlockedBucket: GroupBucket | undefined;\n for (let i = 0; i < 10; i++) {\n const bucket = this.getBucket(templatePath, method, requestHeaders);\n const now = Date.now();\n if (bucket.blockedUntil <= now) {\n stillBlockedBucket = undefined;\n break;\n }\n stillBlockedBucket = bucket;\n const waitedUntil = bucket.blockedUntil;\n const waitTime = waitedUntil - now;\n logWarn(\n null,\n `[ESI Rate Limit] Group '${bucket.group}' blocked for ${Math.ceil(waitTime / 1000)}s (420/429 received)`,\n { group: bucket.group, waitMs: waitTime },\n );\n await sleep(waitTime);\n // Clear the block we waited for; leave intact if another response extended it\n if (bucket.blockedUntil <= waitedUntil) {\n bucket.blockedUntil = 0;\n }\n }\n // Never proceed while still blocked: if concurrent responses kept\n // re-extending blockedUntil past the retry budget above, fail fast\n // with a retryable rate-limit error rather than sending the request.\n if (stillBlockedBucket && stillBlockedBucket.blockedUntil > Date.now()) {\n const waitTime = stillBlockedBucket.blockedUntil - Date.now();\n logWarn(\n null,\n `[ESI Rate Limit] Group '${stillBlockedBucket.group}' still blocked after retry budget exhausted; aborting request instead of sending while blocked`,\n { group: stillBlockedBucket.group },\n );\n throw new EsiError(\n 429,\n `Rate limit group '${stillBlockedBucket.group}' still blocked for ${Math.ceil(waitTime / 1000)}s`,\n );\n }\n\n const errorLimit = this.resolveErrorLimit(requestHeaders);\n if (errorLimit.remain <= 10 && errorLimit.remain > 0) {\n const resetMs = errorLimit.reset * 1000;\n const delay = Math.min(resetMs, 5000);\n if (delay > 0) {\n logWarn(\n null,\n `[ESI Rate Limit] Legacy error limit low (${errorLimit.remain}), waiting ${delay}ms`,\n { errorLimitRemain: errorLimit.remain },\n );\n await sleep(delay);\n }\n } else if (errorLimit.remain <= 0 && errorLimit.reset > 0) {\n const waitTime = errorLimit.reset * 1000;\n logWarn(\n null,\n `[ESI Rate Limit] Legacy error limit exhausted, waiting ${Math.ceil(waitTime / 1000)}s`,\n { errorLimitReset: errorLimit.reset },\n );\n await sleep(waitTime);\n }\n\n const bucket = this.getBucket(templatePath, method, requestHeaders);\n if (bucket.remaining >= 0 && bucket.limit > 0) {\n const ratio = bucket.remaining / bucket.limit;\n\n if (bucket.remaining <= 0) {\n logWarn(\n null,\n `[ESI Rate Limit] Group '${bucket.group}' token bucket empty, waiting 1s`,\n { group: bucket.group },\n );\n await sleep(1000);\n } else if (ratio <= this.decelerationThreshold) {\n const extraDelay = Math.ceil(\n (1 - ratio / this.decelerationThreshold) * 1000,\n );\n await sleep(extraDelay);\n }\n }\n\n await this.enforceMinDelay();\n }\n\n /**\n * Serializes min-delay waits so concurrent callers cannot all read the same\n * lastRequestTime and fire together after sleeping.\n */\n private async enforceMinDelay(): Promise<void> {\n if (this.isTestMode) {\n this.lastRequestTime = Date.now();\n return;\n }\n\n const run = async (): Promise<void> => {\n const now = Date.now();\n const timeSinceLastRequest = now - this.lastRequestTime;\n if (timeSinceLastRequest < this.minDelayMs) {\n await sleep(this.minDelayMs - timeSinceLastRequest);\n }\n this.lastRequestTime = Date.now();\n };\n\n const scheduled = this.minDelayChain.then(run, run);\n this.minDelayChain = scheduled.then(\n () => undefined,\n () => undefined,\n );\n await scheduled;\n }\n\n getStatus(): RateLimitInfo {\n let worstBucket = this.fallbackBucket;\n let worstRatio = Infinity;\n\n const checkBucket = (bucket: GroupBucket): void => {\n if (bucket.limit > 0) {\n const ratio = bucket.remaining / bucket.limit;\n if (ratio < worstRatio) {\n worstRatio = ratio;\n worstBucket = bucket;\n }\n }\n };\n\n for (const bucket of this.defaultBuckets.values()) {\n checkBucket(bucket);\n }\n\n if (this.userBuckets) {\n for (const userSet of this.userBuckets.values()) {\n for (const bucket of userSet.groups.values()) {\n checkBucket(bucket);\n }\n }\n }\n\n return {\n remaining: worstBucket.remaining,\n limit: worstBucket.limit,\n used: worstBucket.used,\n group: worstBucket.group === '__fallback__' ? null : worstBucket.group,\n errorLimitRemain: this.globalErrorLimit.remain,\n errorLimitReset: this.globalErrorLimit.reset,\n retryAfter:\n worstBucket.blockedUntil > Date.now()\n ? Math.ceil((worstBucket.blockedUntil - Date.now()) / 1000)\n : null,\n blockedUntil: worstBucket.blockedUntil,\n };\n }\n\n getGroupStatus(group: string): RateLimitGroupStatus | undefined {\n const bucket = this.defaultBuckets.get(group);\n if (!bucket) return undefined;\n return {\n group: bucket.group,\n remaining: bucket.remaining,\n limit: bucket.limit,\n used: bucket.used,\n windowSizeMs: bucket.windowSizeMs,\n blockedUntil: bucket.blockedUntil,\n };\n }\n\n getAllGroupStatuses(): Map<string, RateLimitGroupStatus> {\n const result = new Map<string, RateLimitGroupStatus>();\n for (const [name, bucket] of this.defaultBuckets) {\n result.set(name, {\n group: bucket.group,\n remaining: bucket.remaining,\n limit: bucket.limit,\n used: bucket.used,\n windowSizeMs: bucket.windowSizeMs,\n blockedUntil: bucket.blockedUntil,\n });\n }\n return result;\n }\n\n static getTokenCost(statusCode: number): number {\n return getTokenCost(statusCode);\n }\n\n isBlocked(group?: string): boolean {\n const now = Date.now();\n\n if (group) {\n const bucket = this.defaultBuckets.get(group);\n return bucket ? bucket.blockedUntil > now : false;\n }\n\n if (this.fallbackBucket.blockedUntil > now) return true;\n for (const bucket of this.defaultBuckets.values()) {\n if (bucket.blockedUntil > now) return true;\n }\n return false;\n }\n\n setTestMode(enabled: boolean): void {\n this.isTestMode = enabled;\n }\n\n reset(): void {\n this.defaultBuckets.clear();\n if (this.userBuckets) this.userBuckets.clear();\n this.fallbackBucket = this.createFallbackBucket();\n this.globalErrorLimit = { ...DEFAULT_ERROR_LIMIT };\n this.lastRequestTime = 0;\n this.minDelayChain = Promise.resolve();\n this.lastCleanup = 0;\n }\n}\n","import { logDebug } from './logger/clientLog';\nimport { IDeduplicator } from './IDeduplicator';\n\nexport class RequestDeduplicator implements IDeduplicator {\n private inflight = new Map<string, Promise<unknown>>();\n private client: import('./ApiClient').ApiClient | null = null;\n\n setClient(client: import('./ApiClient').ApiClient | null): void {\n this.client = client;\n }\n\n async dedupe<T>(key: string, execute: () => Promise<T>): Promise<T> {\n const existing = this.inflight.get(key);\n if (existing) {\n if (this.client) {\n logDebug(this.client, `[Dedup] Coalescing request: ${key}`);\n }\n return existing as Promise<T>;\n }\n\n const promise = execute().finally(() => {\n this.inflight.delete(key);\n });\n\n this.inflight.set(key, promise);\n return promise;\n }\n\n /**\n * Drop the in-flight entries whose key contains `pathSegment`, so a call\n * made after a write cannot join a request sent before it.\n *\n * The requests themselves keep running and whoever already joined them still\n * gets their answer. Only the map entry goes, which is what new callers look\n * in. Matching is `includes`, the same rule ETagCacheManager.deleteByPath\n * uses, so one written path invalidates the cache and detaches the reads of\n * it by the same test.\n */\n detachByPath(pathSegment: string): number {\n let count = 0;\n for (const key of this.inflight.keys()) {\n if (key.includes(pathSegment)) {\n this.inflight.delete(key);\n count += 1;\n }\n }\n if (count > 0 && this.client) {\n logDebug(\n this.client,\n `[Dedup] Detached ${count} in-flight request(s) matching ${pathSegment} after a write`,\n );\n }\n return count;\n }\n\n get pending(): number {\n return this.inflight.size;\n }\n\n clear(): void {\n this.inflight.clear();\n }\n}\n","import { ApiClient } from './ApiClient';\nimport { ETagCacheManager } from './cache/ETagCacheManager';\nimport { CircuitBreaker } from './circuitBreaker/CircuitBreaker';\nimport { RateLimiter } from './rateLimiter/RateLimiter';\nimport { RequestDeduplicator } from './RequestDeduplicator';\nimport { createDefaultLogger } from './logger/DefaultLogger';\nimport type { EsiClientConfig } from '../EsiClient';\n\nexport interface ConfigureApiClientResult {\n deduplicator: RequestDeduplicator | null;\n}\n\n/**\n * Configures an existing ApiClient with the full middleware stack\n * based on an EsiClientConfig. This is the single source of truth\n * for how config maps to middleware — used by EsiClient,\n * CustomEsiClient, and EsiApiFactory.\n *\n * The caller is responsible for creating the ApiClient (with baseUrl,\n * clientId, accessToken) and setting datasource/language/tokenProvider\n * before calling this function, since those vary by construction surface.\n */\nexport function configureApiClient(\n client: ApiClient,\n config?: EsiClientConfig,\n): ConfigureApiClientResult {\n let deduplicator: RequestDeduplicator | null = null;\n\n // Rate limiter (always)\n client.setRateLimiter(new RateLimiter(config?.rateLimiterConfig));\n\n // Request deduplication (on by default)\n if (config?.enableRequestDeduplication !== false) {\n deduplicator = new RequestDeduplicator();\n deduplicator.setClient(client);\n client.setDeduplicator(deduplicator);\n }\n\n // ETag cache (on by default)\n if (config?.enableETagCache !== false) {\n const cache = new ETagCacheManager(config?.etagCacheConfig);\n cache.setClient(client);\n client.setCache(cache);\n }\n\n // Circuit breaker (off by default, opt-in)\n if (config?.enableCircuitBreaker) {\n const cb = new CircuitBreaker(config.circuitBreakerConfig);\n cb.setClient(client);\n client.setCircuitBreaker(cb);\n }\n\n // Retry config — default to 3 retries with exponential backoff so that\n // transient ESI failures (502/503/504) are handled automatically.\n if (config?.retryConfig) {\n client.setRetryConfig(config.retryConfig);\n } else if (config?.retryAttempts !== undefined) {\n client.setRetryConfig({ maxRetries: config.retryAttempts });\n } else {\n client.setRetryConfig({\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n });\n }\n\n // Retry strategy\n if (config?.retryStrategy) {\n client.setRetryStrategy(config.retryStrategy);\n }\n\n // Interceptors\n if (config?.requestInterceptors) {\n for (const interceptor of config.requestInterceptors) {\n client.addRequestInterceptor(interceptor);\n }\n }\n if (config?.responseInterceptors) {\n for (const interceptor of config.responseInterceptors) {\n client.addResponseInterceptor(interceptor);\n }\n }\n\n // Validate response\n if (config?.validateResponse !== undefined) {\n client.setValidateResponse(config.validateResponse);\n }\n\n // Validate request (opt-in, default false)\n if (config?.validateRequest !== undefined) {\n client.setValidateRequest(config.validateRequest);\n }\n\n // Timeout\n if (config?.timeout !== undefined) {\n client.setTimeout(config.timeout);\n }\n\n // Per-client logger only when explicitly configured. Otherwise the pipeline\n // resolves to the global setLogger() logger, then the built-in pino default\n // (level from ESI_LOG_LEVEL), so existing global-logger setups keep working.\n if (config?.logger) {\n client.setLogger(config.logger);\n } else if (config?.logLevel) {\n client.setLogger(createDefaultLogger(config.logLevel));\n }\n\n return { deduplicator };\n}\n","import { ApiClient, TokenProvider } from './core/ApiClient';\nimport {\n RequestInterceptor,\n ResponseInterceptor,\n} from './core/middleware/Middleware';\nimport { createClientInstance, ApiClientType } from './core/ClientRegistry';\nimport { AllianceClient } from './clients/AllianceClient';\nimport { AssetsClient } from './clients/AssetsClient';\nimport { CalendarClient } from './clients/CalendarClient';\nimport { CharacterClient } from './clients/CharacterClient';\nimport { ClonesClient } from './clients/ClonesClient';\nimport { ContactsClient } from './clients/ContactsClient';\nimport { ContractsClient } from './clients/ContractsClient';\nimport { CorporationsClient } from './clients/CorporationsClient';\nimport { CorporationProjectsClient } from './clients/CorporationProjectsClient';\nimport { DogmaClient } from './clients/DogmaClient';\nimport { FactionClient } from './clients/FactionClient';\nimport { FittingsClient } from './clients/FittingsClient';\nimport { FleetClient } from './clients/FleetClient';\nimport { IncursionsClient } from './clients/IncursionsClient';\nimport { IndustryClient } from './clients/IndustryClient';\nimport { InsuranceClient } from './clients/InsuranceClient';\nimport { KillmailsClient } from './clients/KillmailsClient';\nimport { LocationClient } from './clients/LocationClient';\nimport { LoyaltyClient } from './clients/LoyaltyClient';\nimport { MailClient } from './clients/MailClient';\nimport { MarketClient } from './clients/MarketClient';\nimport { PiClient } from './clients/PiClient';\nimport { RouteClient } from './clients/RouteClient';\nimport { SearchClient } from './clients/SearchClient';\nimport { CharacterSkillsClient } from './clients/SkillsClient';\nimport { SovereigntyClient } from './clients/SovereigntyClient';\nimport { StatusClient } from './clients/StatusClient';\nimport { UiClient } from './clients/UiClient';\nimport { UniverseClient } from './clients/UniverseClient';\nimport { WalletClient } from './clients/WalletClient';\nimport { WarsClient } from './clients/WarsClient';\nimport { MetaClient } from './clients/MetaClient';\nimport { FreelanceJobsClient } from './clients/FreelanceJobsClient';\nimport { CosmeticsClient } from './clients/CosmeticsClient';\nimport { ParagonHubClient } from './clients/ParagonHubClient';\nimport { SkyhooksClient } from './clients/SkyhooksClient';\nimport { MercenaryClient } from './clients/MercenaryClient';\nimport { AccessListsClient } from './clients/AccessListsClient';\nimport { MilitaryCampaignsClient } from './clients/MilitaryCampaignsClient';\nimport { validateBaseUrl } from './core/util/validation';\nimport {\n ETagCacheManager,\n ETagCacheConfig,\n} from './core/cache/ETagCacheManager';\nimport { CircuitBreakerConfig } from './core/circuitBreaker/CircuitBreaker';\nimport { RateLimiterConfig } from './core/rateLimiter/RateLimiter';\nimport { RequestDeduplicator } from './core/RequestDeduplicator';\nimport { RetryConfig } from './core/util/retry';\nimport { IRetryStrategy } from './core/IRetryStrategy';\nimport { EsiDiagnostics } from './core/EsiDiagnostics';\nimport {\n batchFetch,\n batchPost,\n BatchOptions,\n BatchResult,\n} from './core/BatchRequestHandler';\nimport { configureApiClient } from './core/configureApiClient';\nimport { getLogger } from './core/logger/loggerUtil';\nimport type { ILogger } from './core/logger/ILogger';\n\nexport type EsiDatasource = 'tranquility' | 'singularity';\n\nexport interface EsiClientConfig {\n clientId?: string;\n baseUrl?: string;\n accessToken?: string;\n datasource?: EsiDatasource;\n onTokenRefresh?: TokenProvider;\n timeout?: number;\n retryAttempts?: number;\n retryConfig?: RetryConfig;\n retryStrategy?: IRetryStrategy;\n enableETagCache?: boolean;\n etagCacheConfig?: ETagCacheConfig;\n enableCircuitBreaker?: boolean;\n circuitBreakerConfig?: CircuitBreakerConfig;\n unsafeAllowCustomHost?: boolean;\n enableRequestDeduplication?: boolean;\n language?: string;\n compatibilityDate?: string;\n rateLimiterConfig?: RateLimiterConfig;\n requestInterceptors?: RequestInterceptor[];\n responseInterceptors?: ResponseInterceptor[];\n validateResponse?: boolean;\n validateRequest?: boolean;\n /** Custom logger for this client. Falls back to the global logger, then pino. */\n logger?: import('./core/logger/ILogger').ILogger;\n /** Log level for the default pino logger (`error|warn|info|debug|trace`). Overrides `ESI_LOG_LEVEL`. */\n logLevel?: import('./core/logger/DefaultLogger').LogLevel;\n}\n\nexport class EsiClient {\n private apiClient: ApiClient;\n private clients: Map<string, unknown> = new Map();\n private etagCacheEnabled: boolean;\n private _diagnostics: EsiDiagnostics | null = null;\n private deduplicator: RequestDeduplicator | null = null;\n\n constructor(config?: EsiClientConfig) {\n const token = config?.accessToken || process.env.ESI_ACCESS_TOKEN;\n const baseUrl = validateBaseUrl(\n config?.baseUrl || process.env.ESI_BASE_URL || 'https://esi.evetech.net',\n config?.unsafeAllowCustomHost,\n );\n this.apiClient = new ApiClient(\n config?.clientId || process.env.ESI_CLIENT_ID || 'esi-client',\n baseUrl,\n token,\n );\n\n const datasource =\n config?.datasource ||\n (process.env.ESI_DATASOURCE as EsiDatasource | undefined);\n if (datasource) {\n this.apiClient.setDatasource(datasource);\n }\n\n if (config?.language) {\n this.apiClient.setLanguage(config.language);\n }\n\n if (config?.compatibilityDate) {\n this.apiClient.setCompatibilityDate(config.compatibilityDate);\n }\n\n if (config?.onTokenRefresh) {\n this.apiClient.setTokenProvider(config.onTokenRefresh);\n }\n\n const result = configureApiClient(this.apiClient, config);\n this.deduplicator = result.deduplicator;\n this.etagCacheEnabled = config?.enableETagCache !== false;\n\n const clientLogger: ILogger = this.apiClient.getLogger() ?? getLogger();\n clientLogger.info('EsiClient initialized successfully', {\n baseUrl,\n clientId: config?.clientId,\n });\n }\n\n private getClient<T>(name: ApiClientType): T {\n if (!this.clients.has(name)) {\n this.clients.set(name, createClientInstance(name, this.apiClient));\n }\n return this.clients.get(name) as T;\n }\n\n // Domain client accessors\n get alliance(): AllianceClient {\n return this.getClient('alliance');\n }\n get assets(): AssetsClient {\n return this.getClient('assets');\n }\n get calendar(): CalendarClient {\n return this.getClient('calendar');\n }\n get characters(): CharacterClient {\n return this.getClient('characters');\n }\n get clones(): ClonesClient {\n return this.getClient('clones');\n }\n get contacts(): ContactsClient {\n return this.getClient('contacts');\n }\n get contracts(): ContractsClient {\n return this.getClient('contracts');\n }\n get corporations(): CorporationsClient {\n return this.getClient('corporations');\n }\n get corporationProjects(): CorporationProjectsClient {\n return this.getClient('corporationProjects');\n }\n get dogma(): DogmaClient {\n return this.getClient('dogma');\n }\n get factions(): FactionClient {\n return this.getClient('factions');\n }\n get fittings(): FittingsClient {\n return this.getClient('fittings');\n }\n get fleets(): FleetClient {\n return this.getClient('fleets');\n }\n get incursions(): IncursionsClient {\n return this.getClient('incursions');\n }\n get industry(): IndustryClient {\n return this.getClient('industry');\n }\n get insurance(): InsuranceClient {\n return this.getClient('insurance');\n }\n get killmails(): KillmailsClient {\n return this.getClient('killmails');\n }\n get location(): LocationClient {\n return this.getClient('location');\n }\n get loyalty(): LoyaltyClient {\n return this.getClient('loyalty');\n }\n get mail(): MailClient {\n return this.getClient('mail');\n }\n get market(): MarketClient {\n return this.getClient('market');\n }\n get pi(): PiClient {\n return this.getClient('pi');\n }\n get route(): RouteClient {\n return this.getClient('route');\n }\n get search(): SearchClient {\n return this.getClient('search');\n }\n get skills(): CharacterSkillsClient {\n return this.getClient('skills');\n }\n get sovereignty(): SovereigntyClient {\n return this.getClient('sovereignty');\n }\n get status(): StatusClient {\n return this.getClient('status');\n }\n get ui(): UiClient {\n return this.getClient('ui');\n }\n get universe(): UniverseClient {\n return this.getClient('universe');\n }\n get wallet(): WalletClient {\n return this.getClient('wallet');\n }\n get wars(): WarsClient {\n return this.getClient('wars');\n }\n get meta(): MetaClient {\n return this.getClient('meta');\n }\n get freelanceJobs(): FreelanceJobsClient {\n return this.getClient('freelanceJobs');\n }\n get cosmetics(): CosmeticsClient {\n return this.getClient('cosmetics');\n }\n get paragonHub(): ParagonHubClient {\n return this.getClient('paragonHub');\n }\n get skyhooks(): SkyhooksClient {\n return this.getClient('skyhooks');\n }\n get mercenary(): MercenaryClient {\n return this.getClient('mercenary');\n }\n get militaryCampaigns(): MilitaryCampaignsClient {\n return this.getClient('militaryCampaigns');\n }\n get accessLists(): AccessListsClient {\n return this.getClient('accessLists');\n }\n\n addRequestInterceptor(fn: RequestInterceptor): () => void {\n return this.apiClient.addRequestInterceptor(fn);\n }\n\n addResponseInterceptor(fn: ResponseInterceptor): () => void {\n return this.apiClient.addResponseInterceptor(fn);\n }\n\n setAccessToken(token: string): void {\n this.apiClient.setAccessToken(token);\n (this.apiClient.getLogger() ?? getLogger()).info('Access token updated');\n }\n\n setTokenProvider(provider: TokenProvider | undefined): void {\n this.apiClient.setTokenProvider(provider);\n (this.apiClient.getLogger() ?? getLogger()).info(\n provider ? 'Token provider configured' : 'Token provider removed',\n );\n }\n\n get diagnostics(): EsiDiagnostics {\n if (!this._diagnostics) {\n this._diagnostics = new EsiDiagnostics(\n this.apiClient,\n this.etagCacheEnabled,\n this.deduplicator,\n );\n }\n return this._diagnostics;\n }\n\n getCacheStats() {\n return this.diagnostics.getCacheStats();\n }\n\n clearCache(): void {\n this.diagnostics.clearCache();\n }\n\n updateCacheConfig(newConfig: Partial<ETagCacheConfig>): void {\n this.diagnostics.updateCacheConfig(newConfig);\n }\n\n getCircuitBreakerStats() {\n return this.diagnostics.getCircuitBreakerStats();\n }\n\n resetCircuitBreaker(endpoint?: string): void {\n this.diagnostics.resetCircuitBreaker(endpoint);\n }\n\n async batch<K, T>(\n keys: K[],\n fetcher: (key: K) => Promise<T>,\n options?: BatchOptions,\n ): Promise<BatchResult<K, T>> {\n return batchFetch(keys, fetcher, options);\n }\n\n async batchPost<T>(\n ids: number[],\n poster: (chunk: number[]) => Promise<T[]>,\n chunkSize?: number,\n ): Promise<T[]> {\n return batchPost(ids, poster, chunkSize);\n }\n\n shutdown(): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).shutdown();\n }\n const cb = this.apiClient.getCircuitBreaker();\n if (cb) {\n cb.shutdown();\n }\n if (this.deduplicator) {\n this.deduplicator.clear();\n }\n this.clients.clear();\n (this.apiClient.getLogger() ?? getLogger()).info(\n 'EsiClient shutdown completed',\n );\n }\n}\n\nlet _defaultClient: EsiClient | null = null;\nexport function getDefaultClient(): EsiClient {\n if (!_defaultClient) {\n _defaultClient = new EsiClient();\n }\n return _defaultClient;\n}\n","import { ApiClient } from './core/ApiClient';\nimport { validateBaseUrl } from './core/util/validation';\nimport {\n ApiClientType,\n ClientInstance,\n createClientInstance,\n AllianceClient,\n AssetsClient,\n CalendarClient,\n CharacterClient,\n ClonesClient,\n ContactsClient,\n ContractsClient,\n CorporationsClient,\n DogmaClient,\n FactionClient,\n FittingsClient,\n FleetClient,\n IncursionsClient,\n IndustryClient,\n InsuranceClient,\n KillmailsClient,\n LocationClient,\n LoyaltyClient,\n MailClient,\n MarketClient,\n PiClient,\n RouteClient,\n SearchClient,\n CharacterSkillsClient,\n SovereigntyClient,\n StatusClient,\n UiClient,\n UniverseClient,\n WalletClient,\n WarsClient,\n MetaClient,\n FreelanceJobsClient,\n SkyhooksClient,\n MercenaryClient,\n AccessListsClient,\n} from './core/ClientRegistry';\nimport { EsiClientConfig } from './EsiClient';\nimport { configureApiClient } from './core/configureApiClient';\nimport { ETagCacheManager } from './core/cache/ETagCacheManager';\nimport { RequestDeduplicator } from './core/RequestDeduplicator';\nimport { getLogger } from './core/logger/loggerUtil';\n\nexport { ApiClientType, ClientInstance };\n\nexport class CustomEsiClient {\n private apiClient: ApiClient;\n private clients: Map<string, ClientInstance> = new Map();\n private enabledClients: Set<ApiClientType>;\n private deduplicator: RequestDeduplicator | null = null;\n\n constructor(config: EsiClientConfig & { clients: ApiClientType[] }) {\n this.enabledClients = new Set(config.clients);\n const baseUrl = validateBaseUrl(\n config.baseUrl || process.env.ESI_BASE_URL || 'https://esi.evetech.net',\n config.unsafeAllowCustomHost,\n );\n this.apiClient = new ApiClient(\n config.clientId || process.env.ESI_CLIENT_ID || 'esi-custom-client',\n baseUrl,\n config.accessToken || process.env.ESI_ACCESS_TOKEN,\n );\n\n if (config.language) {\n this.apiClient.setLanguage(config.language);\n }\n\n if (config.compatibilityDate) {\n this.apiClient.setCompatibilityDate(config.compatibilityDate);\n }\n\n if (config.onTokenRefresh) {\n this.apiClient.setTokenProvider(config.onTokenRefresh);\n }\n\n const datasource = config.datasource;\n if (datasource) {\n this.apiClient.setDatasource(datasource);\n }\n\n const result = configureApiClient(this.apiClient, config);\n this.deduplicator = result.deduplicator;\n\n for (const name of this.enabledClients) {\n this.clients.set(name, createClientInstance(name, this.apiClient));\n }\n\n (this.apiClient.getLogger() ?? getLogger()).info(\n `CustomEsiClient initialized with clients: ${config.clients.join(', ')}`,\n { clients: config.clients },\n );\n }\n\n getClient(clientType: ApiClientType): ClientInstance | undefined {\n return this.clients.get(clientType);\n }\n\n hasClient(clientType: ApiClientType): boolean {\n return this.clients.has(clientType);\n }\n\n getEnabledClients(): ApiClientType[] {\n return Array.from(this.enabledClients);\n }\n\n get alliance(): AllianceClient | undefined {\n return this.getClient('alliance') as AllianceClient;\n }\n get assets(): AssetsClient | undefined {\n return this.getClient('assets') as AssetsClient;\n }\n get calendar(): CalendarClient | undefined {\n return this.getClient('calendar') as CalendarClient;\n }\n get characters(): CharacterClient | undefined {\n return this.getClient('characters') as CharacterClient;\n }\n get clones(): ClonesClient | undefined {\n return this.getClient('clones') as ClonesClient;\n }\n get contacts(): ContactsClient | undefined {\n return this.getClient('contacts') as ContactsClient;\n }\n get contracts(): ContractsClient | undefined {\n return this.getClient('contracts') as ContractsClient;\n }\n get corporations(): CorporationsClient | undefined {\n return this.getClient('corporations') as CorporationsClient;\n }\n get dogma(): DogmaClient | undefined {\n return this.getClient('dogma') as DogmaClient;\n }\n get factions(): FactionClient | undefined {\n return this.getClient('factions') as FactionClient;\n }\n get fittings(): FittingsClient | undefined {\n return this.getClient('fittings') as FittingsClient;\n }\n get fleets(): FleetClient | undefined {\n return this.getClient('fleets') as FleetClient;\n }\n get incursions(): IncursionsClient | undefined {\n return this.getClient('incursions') as IncursionsClient;\n }\n get industry(): IndustryClient | undefined {\n return this.getClient('industry') as IndustryClient;\n }\n get insurance(): InsuranceClient | undefined {\n return this.getClient('insurance') as InsuranceClient;\n }\n get killmails(): KillmailsClient | undefined {\n return this.getClient('killmails') as KillmailsClient;\n }\n get location(): LocationClient | undefined {\n return this.getClient('location') as LocationClient;\n }\n get loyalty(): LoyaltyClient | undefined {\n return this.getClient('loyalty') as LoyaltyClient;\n }\n get mail(): MailClient | undefined {\n return this.getClient('mail') as MailClient;\n }\n get market(): MarketClient | undefined {\n return this.getClient('market') as MarketClient;\n }\n get pi(): PiClient | undefined {\n return this.getClient('pi') as PiClient;\n }\n get route(): RouteClient | undefined {\n return this.getClient('route') as RouteClient;\n }\n get search(): SearchClient | undefined {\n return this.getClient('search') as SearchClient;\n }\n get skills(): CharacterSkillsClient | undefined {\n return this.getClient('skills') as CharacterSkillsClient;\n }\n get sovereignty(): SovereigntyClient | undefined {\n return this.getClient('sovereignty') as SovereigntyClient;\n }\n get status(): StatusClient | undefined {\n return this.getClient('status') as StatusClient;\n }\n get ui(): UiClient | undefined {\n return this.getClient('ui') as UiClient;\n }\n get universe(): UniverseClient | undefined {\n return this.getClient('universe') as UniverseClient;\n }\n get wallet(): WalletClient | undefined {\n return this.getClient('wallet') as WalletClient;\n }\n get wars(): WarsClient | undefined {\n return this.getClient('wars') as WarsClient;\n }\n get meta(): MetaClient | undefined {\n return this.getClient('meta') as MetaClient;\n }\n get freelanceJobs(): FreelanceJobsClient | undefined {\n return this.getClient('freelanceJobs') as FreelanceJobsClient;\n }\n get skyhooks(): SkyhooksClient | undefined {\n return this.getClient('skyhooks') as SkyhooksClient;\n }\n get mercenary(): MercenaryClient | undefined {\n return this.getClient('mercenary') as MercenaryClient;\n }\n get accessLists(): AccessListsClient | undefined {\n return this.getClient('accessLists') as AccessListsClient;\n }\n\n shutdown(): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).shutdown();\n }\n const cb = this.apiClient.getCircuitBreaker();\n if (cb) {\n cb.shutdown();\n }\n if (this.deduplicator) {\n this.deduplicator.clear();\n }\n this.clients.clear();\n (this.apiClient.getLogger() ?? getLogger()).info(\n 'CustomEsiClient shutdown completed',\n );\n }\n}\n\nexport class EsiApiFactory {\n static createAllianceClient(config?: EsiClientConfig): AllianceClient {\n return createClientInstance(\n 'alliance',\n this.buildApiClient(config),\n ) as AllianceClient;\n }\n\n static createCharacterClient(config?: EsiClientConfig): CharacterClient {\n return createClientInstance(\n 'characters',\n this.buildApiClient(config),\n ) as CharacterClient;\n }\n\n static createCorporationClient(config?: EsiClientConfig): CorporationsClient {\n return createClientInstance(\n 'corporations',\n this.buildApiClient(config),\n ) as CorporationsClient;\n }\n\n static createMarketClient(config?: EsiClientConfig): MarketClient {\n return createClientInstance(\n 'market',\n this.buildApiClient(config),\n ) as MarketClient;\n }\n\n static createUniverseClient(config?: EsiClientConfig): UniverseClient {\n return createClientInstance(\n 'universe',\n this.buildApiClient(config),\n ) as UniverseClient;\n }\n\n static createFleetClient(config?: EsiClientConfig): FleetClient {\n return createClientInstance(\n 'fleets',\n this.buildApiClient(config),\n ) as FleetClient;\n }\n\n static createAssetsClient(config?: EsiClientConfig): AssetsClient {\n return createClientInstance(\n 'assets',\n this.buildApiClient(config),\n ) as AssetsClient;\n }\n\n static createWalletClient(config?: EsiClientConfig): WalletClient {\n return createClientInstance(\n 'wallet',\n this.buildApiClient(config),\n ) as WalletClient;\n }\n\n static createMailClient(config?: EsiClientConfig): MailClient {\n return createClientInstance(\n 'mail',\n this.buildApiClient(config),\n ) as MailClient;\n }\n\n static createClient(\n clientType: ApiClientType,\n config?: EsiClientConfig,\n ): ClientInstance {\n return createClientInstance(clientType, this.buildApiClient(config));\n }\n\n private static buildApiClient(config?: EsiClientConfig): ApiClient {\n const baseUrl = validateBaseUrl(\n config?.baseUrl || process.env.ESI_BASE_URL || 'https://esi.evetech.net',\n config?.unsafeAllowCustomHost,\n );\n const client = new ApiClient(\n config?.clientId || process.env.ESI_CLIENT_ID || 'esi-standalone-client',\n baseUrl,\n config?.accessToken || process.env.ESI_ACCESS_TOKEN,\n );\n\n if (config?.language) {\n client.setLanguage(config.language);\n }\n\n if (config?.onTokenRefresh) {\n client.setTokenProvider(config.onTokenRefresh);\n }\n\n const datasource = config?.datasource;\n if (datasource) {\n client.setDatasource(datasource);\n }\n\n configureApiClient(client, config);\n return client;\n }\n}\n\nexport class EsiClientBuilder {\n private clients: ApiClientType[] = [];\n private config: EsiClientConfig = {};\n\n addClient(clientType: ApiClientType): this {\n if (!this.clients.includes(clientType)) {\n this.clients.push(clientType);\n }\n return this;\n }\n\n addClients(clientTypes: ApiClientType[]): this {\n clientTypes.forEach((type) => this.addClient(type));\n return this;\n }\n\n withConfig(config: EsiClientConfig): this {\n this.config = { ...this.config, ...config };\n return this;\n }\n\n withClientId(clientId: string): this {\n this.config.clientId = clientId;\n return this;\n }\n\n withAccessToken(accessToken: string): this {\n this.config.accessToken = accessToken;\n return this;\n }\n\n build(): CustomEsiClient {\n if (this.clients.length === 0) {\n throw new Error('At least one client type must be specified');\n }\n return new CustomEsiClient({ ...this.config, clients: this.clients });\n }\n}\n","import { ApiClient, FetchLike } from './ApiClient';\nimport { IRateLimiter } from './rateLimiter/IRateLimiter';\nimport { RateLimiter } from './rateLimiter/RateLimiter';\nimport { ICache } from './cache/ICache';\nimport { CircuitBreaker } from './circuitBreaker/CircuitBreaker';\n\nexport class ApiClientBuilder {\n private clientId!: string;\n private link!: string;\n private accessToken?: string;\n private rateLimiter?: IRateLimiter;\n private cache?: ICache;\n private circuitBreaker?: CircuitBreaker;\n private _timeout?: number;\n private _fetch?: FetchLike;\n\n setClientId(clientId: string): ApiClientBuilder {\n this.clientId = clientId;\n return this;\n }\n\n setLink(link: string): ApiClientBuilder {\n this.link = link;\n return this;\n }\n\n setAccessToken(accessToken?: string): ApiClientBuilder {\n this.accessToken = accessToken;\n return this;\n }\n\n setRateLimiter(limiter: IRateLimiter): ApiClientBuilder {\n this.rateLimiter = limiter;\n return this;\n }\n\n setCache(cache: ICache): ApiClientBuilder {\n this.cache = cache;\n return this;\n }\n\n setCircuitBreaker(cb: CircuitBreaker): ApiClientBuilder {\n this.circuitBreaker = cb;\n return this;\n }\n\n setTimeout(timeout: number): ApiClientBuilder {\n this._timeout = timeout;\n return this;\n }\n\n setFetch(fn: FetchLike): ApiClientBuilder {\n this._fetch = fn;\n return this;\n }\n\n build(): ApiClient {\n const client = new ApiClient(this.clientId, this.link, this.accessToken);\n client.setRateLimiter(this.rateLimiter ?? new RateLimiter());\n if (this.cache) client.setCache(this.cache);\n if (this.circuitBreaker) client.setCircuitBreaker(this.circuitBreaker);\n if (this._timeout !== undefined) client.setTimeout(this._timeout);\n if (this._fetch) client.setFetch(this._fetch);\n return client;\n }\n}\n","// Auto-generated from ESI OpenAPI spec — do not edit manually\n// Compatibility date: 2026-05-19\n// Total scopes: 72\n// Endpoints requiring scopes: 137\n\nexport type EsiScope =\n | 'esi-access.read_lists.v1'\n | 'esi-activities.read_character.v1'\n | 'esi-alliances.read_contacts.v1'\n | 'esi-assets.read_assets.v1'\n | 'esi-assets.read_corporation_assets.v1'\n | 'esi-calendar.read_calendar_events.v1'\n | 'esi-calendar.respond_calendar_events.v1'\n | 'esi-characters.read_agents_research.v1'\n | 'esi-characters.read_blueprints.v1'\n | 'esi-characters.read_contacts.v1'\n | 'esi-characters.read_corporation_roles.v1'\n | 'esi-characters.read_fatigue.v1'\n | 'esi-characters.read_freelance_jobs.v1'\n | 'esi-characters.read_fw_stats.v1'\n | 'esi-characters.read_loyalty.v1'\n | 'esi-characters.read_medals.v1'\n | 'esi-characters.read_notifications.v1'\n | 'esi-characters.read_standings.v1'\n | 'esi-characters.read_titles.v1'\n | 'esi-characters.write_contacts.v1'\n | 'esi-clones.read_clones.v1'\n | 'esi-clones.read_implants.v1'\n | 'esi-contracts.read_character_contracts.v1'\n | 'esi-contracts.read_corporation_contracts.v1'\n | 'esi-corporations.read_blueprints.v1'\n | 'esi-corporations.read_contacts.v1'\n | 'esi-corporations.read_container_logs.v1'\n | 'esi-corporations.read_corporation_membership.v1'\n | 'esi-corporations.read_divisions.v1'\n | 'esi-corporations.read_facilities.v1'\n | 'esi-corporations.read_freelance_jobs.v1'\n | 'esi-corporations.read_fw_stats.v1'\n | 'esi-corporations.read_medals.v1'\n | 'esi-corporations.read_projects.v1'\n | 'esi-corporations.read_standings.v1'\n | 'esi-corporations.read_starbases.v1'\n | 'esi-corporations.read_structures.v1'\n | 'esi-corporations.read_titles.v1'\n | 'esi-corporations.track_members.v1'\n | 'esi-fittings.read_fittings.v1'\n | 'esi-fittings.write_fittings.v1'\n | 'esi-fleets.read_fleet.v1'\n | 'esi-fleets.write_fleet.v1'\n | 'esi-industry.read_character_jobs.v1'\n | 'esi-industry.read_character_mining.v1'\n | 'esi-industry.read_corporation_jobs.v1'\n | 'esi-industry.read_corporation_mining.v1'\n | 'esi-killmails.read_corporation_killmails.v1'\n | 'esi-killmails.read_killmails.v1'\n | 'esi-location.read_location.v1'\n | 'esi-location.read_online.v1'\n | 'esi-location.read_ship_type.v1'\n | 'esi-mail.organize_mail.v1'\n | 'esi-mail.read_mail.v1'\n | 'esi-mail.send_mail.v1'\n | 'esi-markets.read_character_orders.v1'\n | 'esi-markets.read_corporation_orders.v1'\n | 'esi-markets.structure_markets.v1'\n | 'esi-planets.manage_planets.v1'\n | 'esi-planets.read_customs_offices.v1'\n | 'esi-search.search_structures.v1'\n | 'esi-skills.read_skillqueue.v1'\n | 'esi-skills.read_skills.v1'\n | 'esi-structures.read_character.v1'\n | 'esi-structures.read_corporation.v1'\n | 'esi-ui.open_window.v1'\n | 'esi-ui.write_waypoint.v1'\n | 'esi-universe.read_structures.v1'\n | 'esi-wallet.read_character_wallet.v1'\n | 'esi-wallet.read_corporation_wallets.v1'\n | 'esi.activity.char:read'\n | 'esi.cosmetic.char:read';\n\nexport const esiEndpointScopes: Record<string, EsiScope[]> = {\n 'GET:alliances/{alliance_id}/contacts': ['esi-alliances.read_contacts.v1'],\n 'GET:alliances/{alliance_id}/contacts/labels': ['esi-alliances.read_contacts.v1'],\n 'GET:characters/{character_id}/access-lists': ['esi-access.read_lists.v1'],\n 'GET:characters/{character_id}/access-lists/{access_list_id}': ['esi-access.read_lists.v1'],\n 'GET:characters/{character_id}/agents_research': ['esi-characters.read_agents_research.v1'],\n 'GET:characters/{character_id}/assets': ['esi-assets.read_assets.v1'],\n 'POST:characters/{character_id}/assets/locations': ['esi-assets.read_assets.v1'],\n 'POST:characters/{character_id}/assets/names': ['esi-assets.read_assets.v1'],\n 'GET:characters/{character_id}/attributes': ['esi-skills.read_skills.v1'],\n 'GET:characters/{character_id}/blueprints': ['esi-characters.read_blueprints.v1'],\n 'GET:characters/{character_id}/calendar': ['esi-calendar.read_calendar_events.v1'],\n 'GET:characters/{character_id}/calendar/{event_id}': ['esi-calendar.read_calendar_events.v1'],\n 'PUT:characters/{character_id}/calendar/{event_id}': ['esi-calendar.respond_calendar_events.v1'],\n 'GET:characters/{character_id}/calendar/{event_id}/attendees': ['esi-calendar.read_calendar_events.v1'],\n 'GET:characters/{character_id}/clones': ['esi-clones.read_clones.v1'],\n 'GET:characters/{character_id}/contacts': ['esi-characters.read_contacts.v1'],\n 'POST:characters/{character_id}/contacts': ['esi-characters.write_contacts.v1'],\n 'PUT:characters/{character_id}/contacts': ['esi-characters.write_contacts.v1'],\n 'DELETE:characters/{character_id}/contacts': ['esi-characters.write_contacts.v1'],\n 'GET:characters/{character_id}/contacts/labels': ['esi-characters.read_contacts.v1'],\n 'GET:characters/{character_id}/contracts': ['esi-contracts.read_character_contracts.v1'],\n 'GET:characters/{character_id}/contracts/{contract_id}/bids': ['esi-contracts.read_character_contracts.v1'],\n 'GET:characters/{character_id}/contracts/{contract_id}/items': ['esi-contracts.read_character_contracts.v1'],\n 'POST:characters/{character_id}/cspa': ['esi-characters.read_contacts.v1'],\n 'GET:characters/{character_id}/fatigue': ['esi-characters.read_fatigue.v1'],\n 'GET:characters/{character_id}/fittings': ['esi-fittings.read_fittings.v1'],\n 'POST:characters/{character_id}/fittings': ['esi-fittings.write_fittings.v1'],\n 'DELETE:characters/{character_id}/fittings/{fitting_id}': ['esi-fittings.write_fittings.v1'],\n 'GET:characters/{character_id}/fleet': ['esi-fleets.read_fleet.v1'],\n 'GET:characters/{character_id}/freelance-jobs': ['esi-characters.read_freelance_jobs.v1'],\n 'GET:characters/{character_id}/freelance-jobs/{job_id}/participation': ['esi-characters.read_freelance_jobs.v1'],\n 'GET:characters/{character_id}/fw/stats': ['esi-characters.read_fw_stats.v1'],\n 'GET:characters/{character_id}/implants': ['esi-clones.read_implants.v1'],\n 'GET:characters/{character_id}/industry/jobs': ['esi-industry.read_character_jobs.v1'],\n 'GET:characters/{character_id}/killmails/recent': ['esi-killmails.read_killmails.v1'],\n 'GET:characters/{character_id}/location': ['esi-location.read_location.v1'],\n 'GET:characters/{character_id}/loyalty/points': ['esi-characters.read_loyalty.v1'],\n 'GET:characters/{character_id}/mail': ['esi-mail.read_mail.v1'],\n 'POST:characters/{character_id}/mail': ['esi-mail.send_mail.v1'],\n 'GET:characters/{character_id}/mail/{mail_id}': ['esi-mail.read_mail.v1'],\n 'PUT:characters/{character_id}/mail/{mail_id}': ['esi-mail.organize_mail.v1'],\n 'DELETE:characters/{character_id}/mail/{mail_id}': ['esi-mail.organize_mail.v1'],\n 'GET:characters/{character_id}/mail/labels': ['esi-mail.read_mail.v1'],\n 'POST:characters/{character_id}/mail/labels': ['esi-mail.organize_mail.v1'],\n 'DELETE:characters/{character_id}/mail/labels/{label_id}': ['esi-mail.organize_mail.v1'],\n 'GET:characters/{character_id}/mail/lists': ['esi-mail.read_mail.v1'],\n 'GET:characters/{character_id}/medals': ['esi-characters.read_medals.v1'],\n 'GET:characters/{character_id}/mercenary-tactical-operations': ['esi-activities.read_character.v1'],\n 'GET:characters/{character_id}/mercenary-tactical-operations/{operation_id}': ['esi-activities.read_character.v1'],\n 'GET:characters/{character_id}/mining': ['esi-industry.read_character_mining.v1'],\n 'GET:characters/{character_id}/notifications': ['esi-characters.read_notifications.v1'],\n 'GET:characters/{character_id}/notifications/contacts': ['esi-characters.read_notifications.v1'],\n 'GET:characters/{character_id}/online': ['esi-location.read_online.v1'],\n 'GET:characters/{character_id}/orders': ['esi-markets.read_character_orders.v1'],\n 'GET:characters/{character_id}/orders/history': ['esi-markets.read_character_orders.v1'],\n 'GET:characters/{character_id}/planets': ['esi-planets.manage_planets.v1'],\n 'GET:characters/{character_id}/planets/{planet_id}': ['esi-planets.manage_planets.v1'],\n 'GET:characters/{character_id}/roles': ['esi-characters.read_corporation_roles.v1'],\n 'GET:characters/{character_id}/search': ['esi-search.search_structures.v1'],\n 'GET:characters/{character_id}/ship': ['esi-location.read_ship_type.v1'],\n 'GET:characters/{character_id}/skillqueue': ['esi-skills.read_skillqueue.v1'],\n 'GET:characters/{character_id}/skills': ['esi-skills.read_skills.v1'],\n 'GET:characters/{character_id}/standings': ['esi-characters.read_standings.v1'],\n 'GET:characters/{character_id}/structures/mercenary-dens': ['esi-structures.read_character.v1'],\n 'GET:characters/{character_id}/structures/mercenary-dens/{mercenary_den_id}': ['esi-structures.read_character.v1'],\n 'GET:characters/{character_id}/titles': ['esi-characters.read_titles.v1'],\n 'GET:characters/{character_id}/wallet': ['esi-wallet.read_character_wallet.v1'],\n 'GET:characters/{character_id}/wallet/journal': ['esi-wallet.read_character_wallet.v1'],\n 'GET:characters/{character_id}/wallet/transactions': ['esi-wallet.read_character_wallet.v1'],\n 'GET:corporation/{corporation_id}/mining/extractions': ['esi-industry.read_corporation_mining.v1'],\n 'GET:corporation/{corporation_id}/mining/observers': ['esi-industry.read_corporation_mining.v1'],\n 'GET:corporation/{corporation_id}/mining/observers/{observer_id}': ['esi-industry.read_corporation_mining.v1'],\n 'GET:corporations/{corporation_id}/assets': ['esi-assets.read_corporation_assets.v1'],\n 'POST:corporations/{corporation_id}/assets/locations': ['esi-assets.read_corporation_assets.v1'],\n 'POST:corporations/{corporation_id}/assets/names': ['esi-assets.read_corporation_assets.v1'],\n 'GET:corporations/{corporation_id}/blueprints': ['esi-corporations.read_blueprints.v1'],\n 'GET:corporations/{corporation_id}/contacts': ['esi-corporations.read_contacts.v1'],\n 'GET:corporations/{corporation_id}/contacts/labels': ['esi-corporations.read_contacts.v1'],\n 'GET:corporations/{corporation_id}/containers/logs': ['esi-corporations.read_container_logs.v1'],\n 'GET:corporations/{corporation_id}/contracts': ['esi-contracts.read_corporation_contracts.v1'],\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/bids': ['esi-contracts.read_corporation_contracts.v1'],\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/items': ['esi-contracts.read_corporation_contracts.v1'],\n 'GET:corporations/{corporation_id}/customs_offices': ['esi-planets.read_customs_offices.v1'],\n 'GET:corporations/{corporation_id}/divisions': ['esi-corporations.read_divisions.v1'],\n 'GET:corporations/{corporation_id}/facilities': ['esi-corporations.read_facilities.v1'],\n 'GET:corporations/{corporation_id}/freelance-jobs': ['esi-corporations.read_freelance_jobs.v1'],\n 'GET:corporations/{corporation_id}/freelance-jobs/{job_id}/participants': ['esi-corporations.read_freelance_jobs.v1'],\n 'GET:corporations/{corporation_id}/fw/stats': ['esi-corporations.read_fw_stats.v1'],\n 'GET:corporations/{corporation_id}/industry/jobs': ['esi-industry.read_corporation_jobs.v1'],\n 'GET:corporations/{corporation_id}/killmails/recent': ['esi-killmails.read_corporation_killmails.v1'],\n 'GET:corporations/{corporation_id}/medals': ['esi-corporations.read_medals.v1'],\n 'GET:corporations/{corporation_id}/medals/issued': ['esi-corporations.read_medals.v1'],\n 'GET:corporations/{corporation_id}/members': ['esi-corporations.read_corporation_membership.v1'],\n 'GET:corporations/{corporation_id}/members/limit': ['esi-corporations.track_members.v1'],\n 'GET:corporations/{corporation_id}/members/titles': ['esi-corporations.read_titles.v1'],\n 'GET:corporations/{corporation_id}/membertracking': ['esi-corporations.track_members.v1'],\n 'GET:corporations/{corporation_id}/orders': ['esi-markets.read_corporation_orders.v1'],\n 'GET:corporations/{corporation_id}/orders/history': ['esi-markets.read_corporation_orders.v1'],\n 'GET:corporations/{corporation_id}/projects': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/projects/{project_id}': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/projects/{project_id}/contribution/{character_id}': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/projects/{project_id}/contributors': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/roles': ['esi-corporations.read_corporation_membership.v1'],\n 'GET:corporations/{corporation_id}/roles/history': ['esi-corporations.read_corporation_membership.v1'],\n 'GET:corporations/{corporation_id}/shareholders': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:corporations/{corporation_id}/standings': ['esi-corporations.read_standings.v1'],\n 'GET:corporations/{corporation_id}/starbases': ['esi-corporations.read_starbases.v1'],\n 'GET:corporations/{corporation_id}/starbases/{starbase_id}': ['esi-corporations.read_starbases.v1'],\n 'GET:corporations/{corporation_id}/structures': ['esi-corporations.read_structures.v1'],\n 'GET:corporations/{corporation_id}/structures/skyhooks': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/structures/skyhooks/{skyhook_id}': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs/{sovereignty_hub_id}': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/titles': ['esi-corporations.read_titles.v1'],\n 'GET:corporations/{corporation_id}/wallets': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:corporations/{corporation_id}/wallets/{division}/journal': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:corporations/{corporation_id}/wallets/{division}/transactions': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:fleets/{fleet_id}': ['esi-fleets.read_fleet.v1'],\n 'PUT:fleets/{fleet_id}': ['esi-fleets.write_fleet.v1'],\n 'GET:fleets/{fleet_id}/members': ['esi-fleets.read_fleet.v1'],\n 'POST:fleets/{fleet_id}/members': ['esi-fleets.write_fleet.v1'],\n 'PUT:fleets/{fleet_id}/members/{member_id}': ['esi-fleets.write_fleet.v1'],\n 'DELETE:fleets/{fleet_id}/members/{member_id}': ['esi-fleets.write_fleet.v1'],\n 'PUT:fleets/{fleet_id}/squads/{squad_id}': ['esi-fleets.write_fleet.v1'],\n 'DELETE:fleets/{fleet_id}/squads/{squad_id}': ['esi-fleets.write_fleet.v1'],\n 'GET:fleets/{fleet_id}/wings': ['esi-fleets.read_fleet.v1'],\n 'POST:fleets/{fleet_id}/wings': ['esi-fleets.write_fleet.v1'],\n 'PUT:fleets/{fleet_id}/wings/{wing_id}': ['esi-fleets.write_fleet.v1'],\n 'DELETE:fleets/{fleet_id}/wings/{wing_id}': ['esi-fleets.write_fleet.v1'],\n 'POST:fleets/{fleet_id}/wings/{wing_id}/squads': ['esi-fleets.write_fleet.v1'],\n 'GET:markets/structures/{structure_id}': ['esi-markets.structure_markets.v1'],\n 'POST:ui/autopilot/waypoint': ['esi-ui.write_waypoint.v1'],\n 'POST:ui/openwindow/contract': ['esi-ui.open_window.v1'],\n 'POST:ui/openwindow/information': ['esi-ui.open_window.v1'],\n 'POST:ui/openwindow/marketdetails': ['esi-ui.open_window.v1'],\n 'POST:ui/openwindow/newmail': ['esi-ui.open_window.v1'],\n 'GET:universe/structures/{structure_id}': ['esi-universe.read_structures.v1'],\n};\n","import type { ILogger } from './ILogger';\n\nconst noop = (_message: string, _context?: unknown): void => {};\n\nconst noopLogger: ILogger = {\n fatal: noop,\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n};\n\n/**\n * A logger that discards all events. Useful in tests, benchmarks, and\n * embedded contexts where library log output is noise.\n */\nexport function createNoopLogger(): ILogger {\n return noopLogger;\n}\n","declare const __brand: unique symbol;\n\ntype Brand<T, B extends string> = T & { readonly [__brand]: B };\n\nexport type CharacterId = Brand<number, 'CharacterId'>;\nexport type CorporationId = Brand<number, 'CorporationId'>;\nexport type AllianceId = Brand<number, 'AllianceId'>;\nexport type TypeId = Brand<number, 'TypeId'>;\nexport type RegionId = Brand<number, 'RegionId'>;\nexport type SystemId = Brand<number, 'SystemId'>;\nexport type StationId = Brand<number, 'StationId'>;\nexport type StructureId = Brand<number, 'StructureId'>;\nexport type OrderId = Brand<number, 'OrderId'>;\nexport type ContractId = Brand<number, 'ContractId'>;\nexport type KillmailId = Brand<number, 'KillmailId'>;\nexport type FactionId = Brand<number, 'FactionId'>;\nexport type CorporationAllianceId = Brand<number, 'CorporationAllianceId'>;\nexport type FleetId = Brand<number, 'FleetId'>;\nexport type PlanetId = Brand<number, 'PlanetId'>;\nexport type WarId = Brand<number, 'WarId'>;\n\nexport function brand<T>(value: number): T {\n return value as unknown as T;\n}\n","/* eslint-disable */\n// Auto-generated from ESI OpenAPI spec — do not edit manually\n// Compatibility date: 2026-05-19\n// Spec hash: 858bd24cd22f\n// Total interfaces: 171\n\n// --- Access List ---\n\nexport interface CharactersAccessListsDetail {\n description: string;\n id: number;\n membership: {\n alliances: ({\n access: 'Unspecified' | 'Allowed' | 'Blocked' | 'Manager' | 'Admin';\n alliance_id: number;\n })[];\n allow_everyone: boolean;\n characters: ({\n access: 'Unspecified' | 'Allowed' | 'Blocked' | 'Manager' | 'Admin';\n character_id: number;\n })[];\n corporations: ({\n access: 'Unspecified' | 'Allowed' | 'Blocked' | 'Manager' | 'Admin';\n corporation_id: number;\n })[];\n };\n name: string;\n}\n\nexport interface CharactersAccessListsListing {\n access_lists: ({\n id: number;\n })[];\n}\n\n// --- Activities ---\n\nexport interface CharactersMercenaryTacticalOperationsDetail {\n dungeon_type_id: number;\n expires: string;\n id: string;\n mercenary_den_id: number;\n state: 'Unspecified' | 'Available' | 'Started' | 'Completed' | 'Expired' | 'Removed';\n}\n\nexport interface CharactersMercenaryTacticalOperationsListing {\n operations: ({\n id: string;\n mercenary_den_id: number;\n })[];\n}\n\nexport interface SkyhooksRaidable {\n skyhooks: ({\n planet_id: number;\n solar_system_id: number;\n theft_vulnerability: {\n end: string;\n start: string;\n };\n })[];\n}\n\n// --- Alliance ---\n\nexport interface AlliancesAllianceIdIconsGet {\n px128x128?: string;\n px64x64?: string;\n}\n\nexport interface AlliancesDetail {\n creator_corporation_id: number;\n creator_id: number;\n date_founded: string;\n executor_corporation_id?: number;\n faction_id?: number;\n name: string;\n ticker: string;\n}\n\n// --- Assets ---\n\nexport interface CharactersCharacterIdAssetsGet {\n is_blueprint_copy?: boolean;\n is_singleton: boolean;\n item_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'BoosterBay' | 'CapsuleerDeliveries' | 'Cargo' | 'CorporationGoalDeliveries' | 'CorpseBay' | 'Deliveries' | 'DroneBay' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'InfrastructureHangar' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'QuafeBay' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'ShipHangar' | 'Skill' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureDeedBay' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wardrobe';\n location_id: number;\n location_type: 'station' | 'solar_system' | 'item' | 'other';\n quantity: number;\n type_id: number;\n}\n\nexport interface CharactersCharacterIdAssetsLocationsPost {\n item_id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n}\n\nexport interface CharactersCharacterIdAssetsNamesPost {\n item_id: number;\n name: string;\n}\n\nexport interface CorporationsCorporationIdAssetsGet {\n is_blueprint_copy?: boolean;\n is_singleton: boolean;\n item_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'Bonus' | 'Booster' | 'BoosterBay' | 'Capsule' | 'CapsuleerDeliveries' | 'Cargo' | 'CorpDeliveries' | 'CorpSAG1' | 'CorpSAG2' | 'CorpSAG3' | 'CorpSAG4' | 'CorpSAG5' | 'CorpSAG6' | 'CorpSAG7' | 'CorporationGoalDeliveries' | 'CrateLoot' | 'Deliveries' | 'DroneBay' | 'DustBattle' | 'DustDatabank' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'Impounded' | 'InfrastructureHangar' | 'JunkyardReprocessed' | 'JunkyardTrashed' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'OfficeFolder' | 'Pilot' | 'PlanetSurface' | 'QuafeBay' | 'QuantumCoreRoom' | 'Reward' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'SecondaryStorage' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'ShipHangar' | 'ShipOffline' | 'Skill' | 'SkillInTraining' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureActive' | 'StructureFuel' | 'StructureInactive' | 'StructureOffline' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wallet' | 'Wardrobe';\n location_id: number;\n location_type: 'station' | 'solar_system' | 'item' | 'other';\n quantity: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdAssetsLocationsPost {\n item_id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n}\n\nexport interface CorporationsCorporationIdAssetsNamesPost {\n item_id: number;\n name: string;\n}\n\n// --- Calendar ---\n\nexport interface CharactersCharacterIdCalendarEventIdAttendeesGet {\n character_id?: number;\n event_response?: 'declined' | 'not_responded' | 'accepted' | 'tentative';\n}\n\nexport interface CharactersCharacterIdCalendarEventIdGet {\n date: string;\n duration: number;\n event_id: number;\n importance: number;\n owner_id: number;\n owner_name: string;\n owner_type: 'eve_server' | 'corporation' | 'faction' | 'character' | 'alliance';\n response: string;\n text: string;\n title: string;\n}\n\nexport interface CharactersCharacterIdCalendarGet {\n event_date?: string;\n event_id?: number;\n event_response?: 'declined' | 'not_responded' | 'accepted' | 'tentative';\n importance?: number;\n title?: string;\n}\n\n// --- Character ---\n\nexport interface CharactersAffiliationPost {\n alliance_id?: number;\n character_id: number;\n corporation_id: number;\n faction_id?: number;\n}\n\nexport interface CharactersCharacterIdAgentsResearchGet {\n agent_id: number;\n points_per_day: number;\n remainder_points: number;\n skill_type_id: number;\n started_at: string;\n}\n\nexport interface CharactersCharacterIdBlueprintsGet {\n item_id: number;\n location_flag: 'AutoFit' | 'Cargo' | 'CorpseBay' | 'DroneBay' | 'FleetHangar' | 'Deliveries' | 'HiddenModifiers' | 'Hangar' | 'HangarAll' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'AssetSafety' | 'Locked' | 'Unlocked' | 'Implant' | 'QuafeBay' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'ShipHangar' | 'SpecializedFuelBay' | 'SpecializedOreHold' | 'SpecializedGasHold' | 'SpecializedMineralHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'SpecializedMediumShipHold' | 'SpecializedLargeShipHold' | 'SpecializedIndustrialShipHold' | 'SpecializedAmmoHold' | 'SpecializedCommandCenterHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedMaterialBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'Module';\n location_id: number;\n material_efficiency: number;\n quantity: number;\n runs: number;\n time_efficiency: number;\n type_id: number;\n}\n\nexport interface CharactersCharacterIdCorporationhistoryGet {\n corporation_id: number;\n is_deleted?: boolean;\n record_id: number;\n start_date: string;\n}\n\nexport interface CharactersCharacterIdFatigueGet {\n jump_fatigue_expire_date?: string;\n last_jump_date?: string;\n last_update_date?: string;\n}\n\nexport interface CharactersCharacterIdMedalsGet {\n corporation_id: number;\n date: string;\n description: string;\n graphics: ({\n color?: number;\n graphic: string;\n layer: number;\n part: number;\n })[];\n issuer_id: number;\n medal_id: number;\n reason: string;\n status: 'public' | 'private';\n title: string;\n}\n\nexport interface CharactersCharacterIdNotificationsContactsGet {\n message: string;\n notification_id: number;\n send_date: string;\n sender_character_id: number;\n standing_level: number;\n}\n\nexport interface CharactersCharacterIdNotificationsGet {\n is_read?: boolean;\n notification_id: number;\n sender_id: number;\n sender_type: 'character' | 'corporation' | 'alliance' | 'faction' | 'other';\n text?: string;\n timestamp: string;\n type: 'AcceptedAlly' | 'AcceptedSurrender' | 'AgentRetiredTrigravian' | 'AllAnchoringMsg' | 'AllMaintenanceBillMsg' | 'AllStrucInvulnerableMsg' | 'AllStructVulnerableMsg' | 'AllWarCorpJoinedAllianceMsg' | 'AllWarDeclaredMsg' | 'AllWarInvalidatedMsg' | 'AllWarRetractedMsg' | 'AllWarSurrenderMsg' | 'AllianceCapitalChanged' | 'AllianceWarDeclaredV2' | 'AllyContractCancelled' | 'AllyJoinedWarAggressorMsg' | 'AllyJoinedWarAllyMsg' | 'AllyJoinedWarDefenderMsg' | 'BattlePunishFriendlyFire' | 'BillOutOfMoneyMsg' | 'BillPaidCorpAllMsg' | 'BountyClaimMsg' | 'BountyESSShared' | 'BountyESSTaken' | 'BountyPlacedAlliance' | 'BountyPlacedChar' | 'BountyPlacedCorp' | 'BountyYourBountyClaimed' | 'BuddyConnectContactAdd' | 'CharAppAcceptMsg' | 'CharAppRejectMsg' | 'CharAppWithdrawMsg' | 'CharLeftCorpMsg' | 'CharMedalMsg' | 'CharTerminationMsg' | 'CloneActivationMsg' | 'CloneActivationMsg2' | 'CloneMovedMsg' | 'CloneRevokedMsg1' | 'CloneRevokedMsg2' | 'CombatOperationFinished' | 'ContactAdd' | 'ContactEdit' | 'ContainerPasswordMsg' | 'ContractRegionChangedToPochven' | 'CorpAllBillMsg' | 'CorpAppAcceptMsg' | 'CorpAppInvitedMsg' | 'CorpAppNewMsg' | 'CorpAppRejectCustomMsg' | 'CorpAppRejectMsg' | 'CorpBecameWarEligible' | 'CorpDividendMsg' | 'CorpFriendlyFireDisableTimerCompleted' | 'CorpFriendlyFireDisableTimerStarted' | 'CorpFriendlyFireEnableTimerCompleted' | 'CorpFriendlyFireEnableTimerStarted' | 'CorpKicked' | 'CorpLiquidationMsg' | 'CorpNewCEOMsg' | 'CorpNewsMsg' | 'CorpNoLongerWarEligible' | 'CorpOfficeExpirationMsg' | 'CorpStructLostMsg' | 'CorpTaxChangeMsg' | 'CorpVoteCEORevokedMsg' | 'CorpVoteMsg' | 'CorpWarDeclaredMsg' | 'CorpWarDeclaredV2' | 'CorpWarFightingLegalMsg' | 'CorpWarInvalidatedMsg' | 'CorpWarRetractedMsg' | 'CorpWarSurrenderMsg' | 'CorporationGoalClosed' | 'CorporationGoalCompleted' | 'CorporationGoalCreated' | 'CorporationGoalExpired' | 'CorporationGoalLimitReached' | 'CorporationGoalNameChange' | 'CorporationLeft' | 'CustomsMsg' | 'DailyItemRewardAutoClaimed' | 'DeclareWar' | 'DistrictAttacked' | 'DustAppAcceptedMsg' | 'ESSMainBankLink' | 'EntosisCaptureStarted' | 'ExpertSystemExpired' | 'ExpertSystemExpiryImminent' | 'FWAllianceKickCeoIndividualStandingWarning' | 'FWAllianceKickMsg' | 'FWAllianceKickedCeoIndividualStanding' | 'FWAllianceWarningMsg' | 'FWCharKickMsg' | 'FWCharRankGainMsg' | 'FWCharRankLossMsg' | 'FWCharWarningMsg' | 'FWCharacterKickFromCorpIndividualStandingWarning' | 'FWCharacterKickedFromCorpIndividualStanding' | 'FWCorpJoinMsg' | 'FWCorpKickMsg' | 'FWCorpLeaveMsg' | 'FWCorpWarningMsg' | 'FWCorporationKickCeoIndividualStandingWarning' | 'FWCorporationKickedCeoIndividualStanding' | 'FacWarCorpJoinRequestMsg' | 'FacWarCorpJoinWithdrawMsg' | 'FacWarCorpLeaveRequestMsg' | 'FacWarCorpLeaveWithdrawMsg' | 'FacWarDirectEnlistmentRevoked' | 'FacWarLPDisqualifiedEvent' | 'FacWarLPDisqualifiedKill' | 'FacWarLPPayoutEvent' | 'FacWarLPPayoutKill' | 'FreelanceProjectACLDeleted' | 'FreelanceProjectClosed' | 'FreelanceProjectCompleted' | 'FreelanceProjectCreated' | 'FreelanceProjectExpired' | 'FreelanceProjectLimitReached' | 'FreelanceProjectParticipantKicked' | 'GameTimeAdded' | 'GameTimeReceived' | 'GameTimeSent' | 'GiftReceived' | 'IHubDestroyedByBillFailure' | 'IncursionCompletedMsg' | 'IndustryOperationFinished' | 'IndustryTeamAuctionLost' | 'IndustryTeamAuctionWon' | 'InfrastructureHubBillAboutToExpire' | 'InsuranceExpirationMsg' | 'InsuranceFirstShipMsg' | 'InsuranceInvalidatedMsg' | 'InsuranceIssuedMsg' | 'InsurancePayoutMsg' | 'InvasionCompletedMsg' | 'InvasionSystemLogin' | 'InvasionSystemStart' | 'JumpCloneDeletedMsg1' | 'JumpCloneDeletedMsg2' | 'KillReportFinalBlow' | 'KillReportVictim' | 'KillRightAvailable' | 'KillRightAvailableOpen' | 'KillRightEarned' | 'KillRightUnavailable' | 'KillRightUnavailableOpen' | 'KillRightUsed' | 'LPAutoRedeemed' | 'LocateCharMsg' | 'MadeWarMutual' | 'MercOfferRetractedMsg' | 'MercOfferedNegotiationMsg' | 'MercenaryDenAttacked' | 'MercenaryDenNewMTO' | 'MercenaryDenReinforced' | 'MissionCanceledTriglavian' | 'MissionOfferExpirationMsg' | 'MissionTimeoutMsg' | 'MoonminingAutomaticFracture' | 'MoonminingExtractionCancelled' | 'MoonminingExtractionFinished' | 'MoonminingExtractionStarted' | 'MoonminingLaserFired' | 'MutualWarExpired' | 'MutualWarInviteAccepted' | 'MutualWarInviteRejected' | 'MutualWarInviteSent' | 'NPCStandingsGained' | 'NPCStandingsLost' | 'OfferToAllyRetracted' | 'OfferedSurrender' | 'OfferedToAlly' | 'OfficeLeaseCanceledInsufficientStandings' | 'OldLscMessages' | 'OperationFinished' | 'OrbitalAttacked' | 'OrbitalReinforced' | 'OwnershipTransferred' | 'RaffleCreated' | 'RaffleExpired' | 'RaffleFinished' | 'ReimbursementMsg' | 'ResearchMissionAvailableMsg' | 'RetractsWar' | 'SPAutoRedeemed' | 'SeasonalChallengeCompleted' | 'SkinSequencingCompleted' | 'SkyhookDeployed' | 'SkyhookDestroyed' | 'SkyhookLostShields' | 'SkyhookOnline' | 'SkyhookUnderAttack' | 'SovAllClaimAquiredMsg' | 'SovAllClaimLostMsg' | 'SovCommandNodeEventStarted' | 'SovCorpBillLateMsg' | 'SovCorpClaimFailMsg' | 'SovDisruptorMsg' | 'SovStationEnteredFreeport' | 'SovStructureDestroyed' | 'SovStructureReinforced' | 'SovStructureSelfDestructCancel' | 'SovStructureSelfDestructFinished' | 'SovStructureSelfDestructRequested' | 'SovereigntyIHDamageMsg' | 'SovereigntySBUDamageMsg' | 'SovereigntyTCUDamageMsg' | 'StationAggressionMsg1' | 'StationAggressionMsg2' | 'StationConquerMsg' | 'StationServiceDisabled' | 'StationServiceEnabled' | 'StationStateChangeMsg' | 'StoryLineMissionAvailableMsg' | 'StructureAnchoring' | 'StructureCourierContractChanged' | 'StructureDestroyed' | 'StructureFuelAlert' | 'StructureImpendingAbandonmentAssetsAtRisk' | 'StructureItemsDelivered' | 'StructureItemsMovedToSafety' | 'StructureLostArmor' | 'StructureLostShields' | 'StructureLowReagentsAlert' | 'StructureNoReagentsAlert' | 'StructureOnline' | 'StructurePaintPurchased' | 'StructureServicesOffline' | 'StructureUnanchoring' | 'StructureUnderAttack' | 'StructureWentHighPower' | 'StructureWentLowPower' | 'StructuresJobsCancelled' | 'StructuresJobsPaused' | 'StructuresReinforcementChanged' | 'TowerAlertMsg' | 'TowerResourceAlertMsg' | 'TransactionReversalMsg' | 'TutorialMsg' | 'WarAdopted ' | 'WarAllyInherited' | 'WarAllyOfferDeclinedMsg' | 'WarConcordInvalidates' | 'WarDeclared' | 'WarEndedHqSecurityDrop' | 'WarHQRemovedFromSpace' | 'WarInherited' | 'WarInvalid' | 'WarRetracted' | 'WarRetractedByConcord' | 'WarSurrenderDeclinedMsg' | 'WarSurrenderOfferMsg';\n}\n\nexport interface CharactersCharacterIdPortraitGet {\n px128x128?: string;\n px256x256?: string;\n px512x512?: string;\n px64x64?: string;\n}\n\nexport interface CharactersCharacterIdRolesGet {\n roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n}\n\nexport interface CharactersCharacterIdStandingsGet {\n from_id: number;\n from_type: 'agent' | 'npc_corp' | 'faction';\n standing: number;\n}\n\nexport interface CharactersCharacterIdTitlesGet {\n name?: string;\n title_id?: number;\n}\n\nexport interface CharactersDetail {\n alliance_id?: number;\n birthday: string;\n bloodline_id: number;\n corporation_id: number;\n description?: string;\n faction_id?: number;\n gender: 'male' | 'female';\n name: string;\n race_id: number;\n security_status?: number;\n title?: string;\n}\n\n// --- Clones ---\n\nexport interface CharactersCharacterIdClonesGet {\n home_location?: {\n location_id?: number;\n location_type?: 'station' | 'structure';\n };\n jump_clones: ({\n implants: number[];\n jump_clone_id: number;\n location_id: number;\n location_type: 'station' | 'structure';\n name?: string;\n })[];\n last_clone_jump_date?: string;\n last_station_change_date?: string;\n}\n\n// --- Contacts ---\n\nexport interface AlliancesAllianceIdContactsGet {\n contact_id: number;\n contact_type: 'character' | 'corporation' | 'alliance' | 'faction';\n label_ids?: number[];\n standing: number;\n}\n\nexport interface AlliancesAllianceIdContactsLabelsGet {\n label_id: number;\n label_name: string;\n}\n\nexport interface CharactersCharacterIdContactsGet {\n contact_id: number;\n contact_type: 'character' | 'corporation' | 'alliance' | 'faction';\n is_blocked?: boolean;\n is_watched?: boolean;\n label_ids?: number[];\n standing: number;\n}\n\nexport interface CharactersCharacterIdContactsLabelsGet {\n label_id: number;\n label_name: string;\n}\n\nexport interface CorporationsCorporationIdContactsGet {\n contact_id: number;\n contact_type: 'character' | 'corporation' | 'alliance' | 'faction';\n is_watched?: boolean;\n label_ids?: number[];\n standing: number;\n}\n\nexport interface CorporationsCorporationIdContactsLabelsGet {\n label_id: number;\n label_name: string;\n}\n\n// --- Contracts ---\n\nexport interface CharactersCharacterIdContractsContractIdBidsGet {\n amount: number;\n bid_id: number;\n bidder_id: number;\n date_bid: string;\n}\n\nexport interface CharactersCharacterIdContractsContractIdItemsGet {\n is_included: boolean;\n is_singleton: boolean;\n quantity: number;\n raw_quantity?: number;\n record_id: number;\n type_id: number;\n}\n\nexport interface CharactersCharacterIdContractsGet {\n acceptor_id: number;\n assignee_id: number;\n availability: 'public' | 'personal' | 'corporation' | 'alliance';\n buyout?: number;\n collateral?: number;\n contract_id: number;\n date_accepted?: string;\n date_completed?: string;\n date_expired: string;\n date_issued: string;\n days_to_complete?: number;\n end_location_id?: number;\n for_corporation: boolean;\n issuer_corporation_id: number;\n issuer_id: number;\n price?: number;\n reward?: number;\n start_location_id?: number;\n status: 'outstanding' | 'in_progress' | 'finished_issuer' | 'finished_contractor' | 'finished' | 'cancelled' | 'rejected' | 'failed' | 'deleted' | 'reversed';\n title?: string;\n type: 'unknown' | 'item_exchange' | 'auction' | 'courier' | 'loan';\n volume?: number;\n}\n\nexport interface ContractsPublicBidsContractIdGet {\n amount: number;\n bid_id: number;\n date_bid: string;\n}\n\nexport interface ContractsPublicItemsContractIdGet {\n is_blueprint_copy?: boolean;\n is_included: boolean;\n item_id?: number;\n material_efficiency?: number;\n quantity: number;\n record_id: number;\n runs?: number;\n time_efficiency?: number;\n type_id: number;\n}\n\nexport interface ContractsPublicRegionIdGet {\n buyout?: number;\n collateral?: number;\n contract_id: number;\n date_expired: string;\n date_issued: string;\n days_to_complete?: number;\n end_location_id?: number;\n for_corporation?: boolean;\n issuer_corporation_id: number;\n issuer_id: number;\n price?: number;\n reward?: number;\n start_location_id?: number;\n title?: string;\n type: 'unknown' | 'item_exchange' | 'auction' | 'courier' | 'loan';\n volume?: number;\n}\n\nexport interface CorporationsCorporationIdContractsContractIdBidsGet {\n amount: number;\n bid_id: number;\n bidder_id: number;\n date_bid: string;\n}\n\nexport interface CorporationsCorporationIdContractsContractIdItemsGet {\n is_included: boolean;\n is_singleton: boolean;\n quantity: number;\n raw_quantity?: number;\n record_id: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdContractsGet {\n acceptor_id: number;\n assignee_id: number;\n availability: 'public' | 'personal' | 'corporation' | 'alliance';\n buyout?: number;\n collateral?: number;\n contract_id: number;\n date_accepted?: string;\n date_completed?: string;\n date_expired: string;\n date_issued: string;\n days_to_complete?: number;\n end_location_id?: number;\n for_corporation: boolean;\n issuer_corporation_id: number;\n issuer_id: number;\n price?: number;\n reward?: number;\n start_location_id?: number;\n status: 'outstanding' | 'in_progress' | 'finished_issuer' | 'finished_contractor' | 'finished' | 'cancelled' | 'rejected' | 'failed' | 'deleted' | 'reversed';\n title?: string;\n type: 'unknown' | 'item_exchange' | 'auction' | 'courier' | 'loan';\n volume?: number;\n}\n\n// --- Corporation ---\n\nexport interface CorporationsCorporationIdAlliancehistoryGet {\n alliance_id?: number;\n is_deleted?: boolean;\n record_id: number;\n start_date: string;\n}\n\nexport interface CorporationsCorporationIdBlueprintsGet {\n item_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'Bonus' | 'Booster' | 'BoosterBay' | 'Capsule' | 'CapsuleerDeliveries' | 'Cargo' | 'CorpDeliveries' | 'CorpSAG1' | 'CorpSAG2' | 'CorpSAG3' | 'CorpSAG4' | 'CorpSAG5' | 'CorpSAG6' | 'CorpSAG7' | 'CorporationGoalDeliveries' | 'CrateLoot' | 'Deliveries' | 'DroneBay' | 'DustBattle' | 'DustDatabank' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'Impounded' | 'InfrastructureHangar' | 'JunkyardReprocessed' | 'JunkyardTrashed' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'OfficeFolder' | 'Pilot' | 'PlanetSurface' | 'QuafeBay' | 'QuantumCoreRoom' | 'Reward' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'SecondaryStorage' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'ShipHangar' | 'ShipOffline' | 'Skill' | 'SkillInTraining' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureActive' | 'StructureFuel' | 'StructureInactive' | 'StructureOffline' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wallet' | 'Wardrobe';\n location_id: number;\n material_efficiency: number;\n quantity: number;\n runs: number;\n time_efficiency: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdContainersLogsGet {\n action: 'add' | 'assemble' | 'configure' | 'enter_password' | 'lock' | 'move' | 'repackage' | 'set_name' | 'set_password' | 'unlock';\n character_id: number;\n container_id: number;\n container_type_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'Bonus' | 'Booster' | 'BoosterBay' | 'Capsule' | 'CapsuleerDeliveries' | 'Cargo' | 'CorpDeliveries' | 'CorpSAG1' | 'CorpSAG2' | 'CorpSAG3' | 'CorpSAG4' | 'CorpSAG5' | 'CorpSAG6' | 'CorpSAG7' | 'CorporationGoalDeliveries' | 'CrateLoot' | 'Deliveries' | 'DroneBay' | 'DustBattle' | 'DustDatabank' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'Impounded' | 'InfrastructureHangar' | 'JunkyardReprocessed' | 'JunkyardTrashed' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'OfficeFolder' | 'Pilot' | 'PlanetSurface' | 'QuafeBay' | 'QuantumCoreRoom' | 'Reward' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'SecondaryStorage' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'ShipHangar' | 'ShipOffline' | 'Skill' | 'SkillInTraining' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureActive' | 'StructureFuel' | 'StructureInactive' | 'StructureOffline' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wallet' | 'Wardrobe';\n location_id: number;\n logged_at: string;\n new_config_bitmask?: number;\n old_config_bitmask?: number;\n password_type?: 'config' | 'general';\n quantity?: number;\n type_id?: number;\n}\n\nexport interface CorporationsCorporationIdDivisionsGet {\n hangar?: ({\n division?: number;\n name?: string;\n })[];\n wallet?: ({\n division?: number;\n name?: string;\n })[];\n}\n\nexport interface CorporationsCorporationIdFacilitiesGet {\n facility_id: number;\n system_id: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdIconsGet {\n px128x128?: string;\n px256x256?: string;\n px64x64?: string;\n}\n\nexport interface CorporationsCorporationIdMedalsGet {\n created_at: string;\n creator_id: number;\n description: string;\n medal_id: number;\n title: string;\n}\n\nexport interface CorporationsCorporationIdMedalsIssuedGet {\n character_id: number;\n issued_at: string;\n issuer_id: number;\n medal_id: number;\n reason: string;\n status: 'private' | 'public';\n}\n\nexport interface CorporationsCorporationIdMembersTitlesGet {\n character_id: number;\n titles: number[];\n}\n\nexport interface CorporationsCorporationIdMembertrackingGet {\n base_id?: number;\n character_id: number;\n location_id?: number;\n logoff_date?: string;\n logon_date?: string;\n ship_type_id?: number;\n start_date?: string;\n}\n\nexport interface CorporationsCorporationIdRolesGet {\n character_id: number;\n grantable_roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n}\n\nexport interface CorporationsCorporationIdRolesHistoryGet {\n changed_at: string;\n character_id: number;\n issuer_id: number;\n new_roles: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n old_roles: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n role_type: 'grantable_roles' | 'grantable_roles_at_base' | 'grantable_roles_at_hq' | 'grantable_roles_at_other' | 'roles' | 'roles_at_base' | 'roles_at_hq' | 'roles_at_other';\n}\n\nexport interface CorporationsCorporationIdShareholdersGet {\n share_count: number;\n shareholder_id: number;\n shareholder_type: 'character' | 'corporation';\n}\n\nexport interface CorporationsCorporationIdStandingsGet {\n from_id: number;\n from_type: 'agent' | 'npc_corp' | 'faction';\n standing: number;\n}\n\nexport interface CorporationsCorporationIdStarbasesGet {\n moon_id?: number;\n onlined_since?: string;\n reinforced_until?: string;\n starbase_id: number;\n state?: 'offline' | 'online' | 'onlining' | 'reinforced' | 'unanchoring';\n system_id: number;\n type_id: number;\n unanchor_at?: string;\n}\n\nexport interface CorporationsCorporationIdStarbasesStarbaseIdGet {\n allow_alliance_members: boolean;\n allow_corporation_members: boolean;\n anchor: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n attack_if_at_war: boolean;\n attack_if_other_security_status_dropping: boolean;\n attack_security_status_threshold?: number;\n attack_standing_threshold?: number;\n fuel_bay_take: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n fuel_bay_view: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n fuels?: ({\n quantity: number;\n type_id: number;\n })[];\n offline: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n online: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n unanchor: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n use_alliance_standings: boolean;\n}\n\nexport interface CorporationsCorporationIdStructuresGet {\n corporation_id: number;\n fuel_expires?: string;\n name?: string;\n next_reinforce_apply?: string;\n next_reinforce_hour?: number;\n profile_id: number;\n reinforce_hour?: number;\n services?: ({\n name: string;\n state: 'online' | 'offline' | 'cleanup';\n })[];\n state: 'anchor_vulnerable' | 'anchoring' | 'armor_reinforce' | 'armor_vulnerable' | 'deploy_vulnerable' | 'fitting_invulnerable' | 'hull_reinforce' | 'hull_vulnerable' | 'online_deprecated' | 'onlining_vulnerable' | 'shield_vulnerable' | 'unanchored' | 'unknown';\n state_timer_end?: string;\n state_timer_start?: string;\n structure_id: number;\n system_id: number;\n type_id: number;\n unanchors_at?: string;\n}\n\nexport interface CorporationsCorporationIdTitlesGet {\n grantable_roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n name?: string;\n roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n title_id?: number;\n}\n\nexport interface CorporationsDetail {\n alliance_id?: number;\n ceo_id: number;\n creator_id: number;\n date_founded?: string;\n description?: string;\n faction_id?: number;\n home_station_id?: number;\n member_count: number;\n name: string;\n shares?: number;\n tax_rate: number;\n ticker: string;\n url?: string;\n war_eligible?: boolean;\n}\n\n// --- Corporation Projects ---\n\nexport interface CorporationsProjectsContribution {\n contributed: number;\n last_modified?: string;\n}\n\nexport interface CorporationsProjectsContributors {\n contributors: ({\n contributed: number;\n id: number;\n name: string;\n })[];\n cursor?: {\n after?: string;\n before?: string;\n };\n}\n\nexport interface CorporationsProjectsDetail {\n configuration: unknown;\n contribution?: {\n participation_limit?: number;\n reward_per_contribution?: number;\n submission_limit?: number;\n submission_multiplier?: number;\n };\n creator: {\n id: number;\n name: string;\n };\n details: {\n career: 'Unspecified' | 'Explorer' | 'Industrialist' | 'Enforcer' | 'Soldier of Fortune';\n created: string;\n description: string;\n expires?: string;\n finished?: string;\n };\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n}\n\nexport interface CorporationsProjectsListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n projects: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\n// --- Dogma ---\n\nexport interface DogmaAttributesAttributeIdGet {\n attribute_id: number;\n default_value?: number;\n description?: string;\n display_name?: string;\n high_is_good?: boolean;\n icon_id?: number;\n name?: string;\n published?: boolean;\n stackable?: boolean;\n unit_id?: number;\n}\n\nexport interface DogmaDynamicItemsTypeIdItemIdGet {\n created_by: number;\n dogma_attributes: ({\n attribute_id: number;\n value: number;\n })[];\n dogma_effects: ({\n effect_id: number;\n is_default: boolean;\n })[];\n mutator_type_id: number;\n source_type_id: number;\n}\n\nexport interface DogmaEffectsEffectIdGet {\n description?: string;\n disallow_auto_repeat?: boolean;\n discharge_attribute_id?: number;\n display_name?: string;\n duration_attribute_id?: number;\n effect_category?: number;\n effect_id: number;\n electronic_chance?: boolean;\n falloff_attribute_id?: number;\n icon_id?: number;\n is_assistance?: boolean;\n is_offensive?: boolean;\n is_warp_safe?: boolean;\n modifiers?: ({\n domain?: string;\n effect_id?: number;\n func: string;\n modified_attribute_id?: number;\n modifying_attribute_id?: number;\n operator?: number;\n })[];\n name?: string;\n post_expression?: number;\n pre_expression?: number;\n published?: boolean;\n range_attribute_id?: number;\n range_chance?: boolean;\n tracking_speed_attribute_id?: number;\n}\n\n// --- Faction Warfare ---\n\nexport interface CharactersCharacterIdFwStatsGet {\n current_rank?: number;\n enlisted_on?: string;\n faction_id?: number;\n highest_rank?: number;\n kills: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n victory_points: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n}\n\nexport interface CorporationsCorporationIdFwStatsGet {\n enlisted_on?: string;\n faction_id?: number;\n kills: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n pilots?: number;\n victory_points: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n}\n\nexport interface FwLeaderboardsCharactersGet {\n kills: {\n active_total: ({\n amount?: number;\n character_id?: number;\n })[];\n last_week: ({\n amount?: number;\n character_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n character_id?: number;\n })[];\n };\n victory_points: {\n active_total: ({\n amount?: number;\n character_id?: number;\n })[];\n last_week: ({\n amount?: number;\n character_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n character_id?: number;\n })[];\n };\n}\n\nexport interface FwLeaderboardsCorporationsGet {\n kills: {\n active_total: ({\n amount?: number;\n corporation_id?: number;\n })[];\n last_week: ({\n amount?: number;\n corporation_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n corporation_id?: number;\n })[];\n };\n victory_points: {\n active_total: ({\n amount?: number;\n corporation_id?: number;\n })[];\n last_week: ({\n amount?: number;\n corporation_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n corporation_id?: number;\n })[];\n };\n}\n\nexport interface FwLeaderboardsGet {\n kills: {\n active_total: ({\n amount?: number;\n faction_id?: number;\n })[];\n last_week: ({\n amount?: number;\n faction_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n faction_id?: number;\n })[];\n };\n victory_points: {\n active_total: ({\n amount?: number;\n faction_id?: number;\n })[];\n last_week: ({\n amount?: number;\n faction_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n faction_id?: number;\n })[];\n };\n}\n\nexport interface FwStatsGet {\n faction_id: number;\n kills: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n pilots: number;\n systems_controlled: number;\n victory_points: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n}\n\nexport interface FwSystemsGet {\n contested: 'captured' | 'contested' | 'uncontested' | 'vulnerable';\n occupier_faction_id: number;\n owner_faction_id: number;\n solar_system_id: number;\n victory_points: number;\n victory_points_threshold: number;\n}\n\nexport interface FwWarsGet {\n against_id: number;\n faction_id: number;\n}\n\n// --- Fittings ---\n\nexport interface CharactersCharacterIdFittingsGet {\n description: string;\n fitting_id: number;\n items: ({\n flag: 'Cargo' | 'DroneBay' | 'FighterBay' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'Invalid' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3';\n quantity: number;\n type_id: number;\n })[];\n name: string;\n ship_type_id: number;\n}\n\n// --- Fleets ---\n\nexport interface CharactersCharacterIdFleetGet {\n fleet_boss_id: number;\n fleet_id: number;\n role: 'fleet_commander' | 'squad_commander' | 'squad_member' | 'wing_commander';\n squad_id: number;\n wing_id: number;\n}\n\nexport interface FleetsFleetIdGet {\n is_free_move: boolean;\n is_registered: boolean;\n is_voice_enabled: boolean;\n motd: string;\n}\n\nexport interface FleetsFleetIdMembersGet {\n character_id: number;\n join_time: string;\n role: 'fleet_commander' | 'wing_commander' | 'squad_commander' | 'squad_member';\n role_name: string;\n ship_type_id: number;\n solar_system_id: number;\n squad_id: number;\n station_id?: number;\n takes_fleet_warp: boolean;\n wing_id: number;\n}\n\nexport interface FleetsFleetIdWingsGet {\n id: number;\n name: string;\n squads: ({\n id: number;\n name: string;\n })[];\n}\n\n// --- Freelance Jobs ---\n\nexport interface CharactersFreelanceJobsListing {\n freelance_jobs: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\nexport interface CharactersFreelanceJobsParticipation {\n contributed: number;\n last_modified: string;\n state: 'Unspecified' | 'Committed' | 'Kicked' | 'Resigned';\n}\n\nexport interface CorporationsFreelanceJobsListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n freelance_jobs: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\nexport interface CorporationsFreelanceJobsParticipants {\n cursor?: {\n after?: string;\n before?: string;\n };\n participants: ({\n contributed: number;\n id: number;\n name: string;\n state: 'Unspecified' | 'Committed' | 'Kicked' | 'Resigned';\n })[];\n}\n\nexport interface FreelanceJobsDetail {\n access_and_visibility: {\n acl_protected: boolean;\n broadcast_locations?: ({\n id: number;\n name: string;\n })[];\n restrictions?: {\n maximum_age?: number;\n minimum_age?: number;\n };\n };\n configuration: {\n method: string;\n parameters: Record<string, unknown>;\n version: number;\n };\n contribution?: {\n contribution_per_participant_limit?: number;\n max_committed_participants: number;\n reward_per_contribution?: number;\n submission_limit?: number;\n submission_multiplier?: number;\n };\n details: {\n career: 'Unspecified' | 'Explorer' | 'Industrialist' | 'Enforcer' | 'Soldier of Fortune';\n created: string;\n creator: {\n character: {\n id: number;\n name: string;\n };\n corporation: {\n id: number;\n name: string;\n };\n };\n description: string;\n expires?: string;\n finished?: string;\n };\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n}\n\nexport interface FreelanceJobsListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n freelance_jobs: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\n// --- Incursions ---\n\nexport interface IncursionsGet {\n constellation_id: number;\n faction_id: number;\n has_boss: boolean;\n infested_solar_systems: number[];\n influence: number;\n staging_solar_system_id: number;\n state: 'withdrawing' | 'mobilizing' | 'established';\n type: string;\n}\n\n// --- Industry ---\n\nexport interface CharactersCharacterIdIndustryJobsGet {\n activity_id: number;\n blueprint_id: number;\n blueprint_location_id: number;\n blueprint_type_id: number;\n completed_character_id?: number;\n completed_date?: string;\n cost?: number;\n duration: number;\n end_date: string;\n facility_id: number;\n installer_id: number;\n job_id: number;\n licensed_runs?: number;\n output_location_id: number;\n pause_date?: string;\n probability?: number;\n product_type_id?: number;\n runs: number;\n start_date: string;\n station_id: number;\n status: 'active' | 'cancelled' | 'delivered' | 'paused' | 'ready' | 'reverted';\n successful_runs?: number;\n}\n\nexport interface CharactersCharacterIdMiningGet {\n date: string;\n quantity: number;\n solar_system_id: number;\n type_id: number;\n}\n\nexport interface CorporationCorporationIdMiningExtractionsGet {\n chunk_arrival_time: string;\n extraction_start_time: string;\n moon_id: number;\n natural_decay_time: string;\n structure_id: number;\n}\n\nexport interface CorporationCorporationIdMiningObserversGet {\n last_updated: string;\n observer_id: number;\n observer_type: 'structure';\n}\n\nexport interface CorporationCorporationIdMiningObserversObserverIdGet {\n character_id: number;\n last_updated: string;\n quantity: number;\n recorded_corporation_id: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdIndustryJobsGet {\n activity_id: number;\n blueprint_id: number;\n blueprint_location_id: number;\n blueprint_type_id: number;\n completed_character_id?: number;\n completed_date?: string;\n cost?: number;\n duration: number;\n end_date: string;\n facility_id: number;\n installer_id: number;\n job_id: number;\n licensed_runs?: number;\n location_id: number;\n output_location_id: number;\n pause_date?: string;\n probability?: number;\n product_type_id?: number;\n runs: number;\n start_date: string;\n status: 'active' | 'cancelled' | 'delivered' | 'paused' | 'ready' | 'reverted';\n successful_runs?: number;\n}\n\nexport interface IndustryFacilitiesGet {\n facility_id: number;\n owner_id: number;\n region_id: number;\n solar_system_id: number;\n tax?: number;\n type_id: number;\n}\n\nexport interface IndustrySystemsGet {\n cost_indices: ({\n activity: 'copying' | 'duplicating' | 'invention' | 'manufacturing' | 'none' | 'reaction' | 'researching_material_efficiency' | 'researching_technology' | 'researching_time_efficiency' | 'reverse_engineering';\n cost_index: number;\n })[];\n solar_system_id: number;\n}\n\n// --- Insurance ---\n\nexport interface InsurancePricesGet {\n levels: ({\n cost: number;\n name: string;\n payout: number;\n })[];\n type_id: number;\n}\n\n// --- Killmails ---\n\nexport interface CharactersCharacterIdKillmailsRecentGet {\n killmail_hash: string;\n killmail_id: number;\n}\n\nexport interface CorporationsCorporationIdKillmailsRecentGet {\n killmail_hash: string;\n killmail_id: number;\n}\n\nexport interface KillmailsKillmailIdKillmailHashGet {\n attackers: ({\n alliance_id?: number;\n character_id?: number;\n corporation_id?: number;\n damage_done: number;\n faction_id?: number;\n final_blow: boolean;\n security_status: number;\n ship_type_id?: number;\n weapon_type_id?: number;\n })[];\n killmail_id: number;\n killmail_time: string;\n moon_id?: number;\n solar_system_id: number;\n victim: {\n alliance_id?: number;\n character_id?: number;\n corporation_id?: number;\n damage_taken: number;\n faction_id?: number;\n items?: ({\n flag: number;\n item_type_id: number;\n items?: ({\n flag: number;\n item_type_id: number;\n quantity_destroyed?: number;\n quantity_dropped?: number;\n singleton: number;\n })[];\n quantity_destroyed?: number;\n quantity_dropped?: number;\n singleton: number;\n })[];\n position?: {\n x: number;\n y: number;\n z: number;\n };\n ship_type_id: number;\n };\n war_id?: number;\n}\n\n// --- Location ---\n\nexport interface CharactersLocation {\n solar_system_id: number;\n station_id?: number;\n structure_id?: number;\n}\n\nexport interface CharactersOnline {\n last_login?: string;\n last_logout?: string;\n logins?: number;\n online: boolean;\n}\n\nexport interface CharactersShip {\n ship_item_id: number;\n ship_name: string;\n ship_type_id: number;\n}\n\n// --- Loyalty ---\n\nexport interface CharactersCharacterIdLoyaltyPointsGet {\n corporation_id: number;\n loyalty_points: number;\n}\n\nexport interface LoyaltyStoresCorporationIdOffersGet {\n ak_cost?: number;\n isk_cost: number;\n lp_cost: number;\n offer_id: number;\n quantity: number;\n required_items: ({\n quantity: number;\n type_id: number;\n })[];\n type_id: number;\n}\n\n// --- Mail ---\n\nexport interface CharactersCharacterIdMailGet {\n from?: number;\n is_read?: boolean;\n labels?: number[];\n mail_id?: number;\n recipients?: ({\n recipient_id: number;\n recipient_type: 'alliance' | 'character' | 'corporation' | 'mailing_list';\n })[];\n subject?: string;\n timestamp?: string;\n}\n\nexport interface CharactersCharacterIdMailLabelsGet {\n labels?: ({\n color?: '#0000fe' | '#006634' | '#0099ff' | '#00ff33' | '#01ffff' | '#349800' | '#660066' | '#666666' | '#999999' | '#99ffff' | '#9a0000' | '#ccff9a' | '#e6e6e6' | '#fe0000' | '#ff6600' | '#ffff01' | '#ffffcd' | '#ffffff';\n label_id?: number;\n name?: string;\n unread_count?: number;\n })[];\n total_unread_count?: number;\n}\n\nexport interface CharactersCharacterIdMailListsGet {\n mailing_list_id: number;\n name: string;\n}\n\nexport interface CharactersCharacterIdMailMailIdGet {\n body?: string;\n from?: number;\n labels?: number[];\n read?: boolean;\n recipients?: ({\n recipient_id: number;\n recipient_type: 'alliance' | 'character' | 'corporation' | 'mailing_list';\n })[];\n subject?: string;\n timestamp?: string;\n}\n\n// --- Market ---\n\nexport interface CharactersCharacterIdOrdersGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n is_corporation: boolean;\n issued: string;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\nexport interface CharactersCharacterIdOrdersHistoryGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n is_corporation: boolean;\n issued: string;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n state: 'cancelled' | 'expired';\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\nexport interface CorporationsCorporationIdOrdersGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n issued: string;\n issued_by: number;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n type_id: number;\n volume_remain: number;\n volume_total: number;\n wallet_division: number;\n}\n\nexport interface CorporationsCorporationIdOrdersHistoryGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n issued: string;\n issued_by?: number;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n state: 'cancelled' | 'expired';\n type_id: number;\n volume_remain: number;\n volume_total: number;\n wallet_division: number;\n}\n\nexport interface MarketsGroupsMarketGroupIdGet {\n description: string;\n market_group_id: number;\n name: string;\n parent_group_id?: number;\n types: number[];\n}\n\nexport interface MarketsPricesGet {\n adjusted_price?: number;\n average_price?: number;\n type_id: number;\n}\n\nexport interface MarketsRegionIdHistoryGet {\n average: number;\n date: string;\n highest: number;\n lowest: number;\n order_count: number;\n volume: number;\n}\n\nexport interface MarketsRegionIdOrdersGet {\n duration: number;\n is_buy_order: boolean;\n issued: string;\n location_id: number;\n min_volume: number;\n order_id: number;\n price: number;\n range: 'station' | 'region' | 'solarsystem' | '1' | '2' | '3' | '4' | '5' | '10' | '20' | '30' | '40';\n system_id: number;\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\nexport interface MarketsStructuresStructureIdGet {\n duration: number;\n is_buy_order: boolean;\n issued: string;\n location_id: number;\n min_volume: number;\n order_id: number;\n price: number;\n range: 'station' | 'region' | 'solarsystem' | '1' | '2' | '3' | '4' | '5' | '10' | '20' | '30' | '40';\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\n// --- Meta ---\n\nexport interface MetaChangelog {\n changelog: Record<string, unknown>;\n}\n\nexport interface MetaCompatibilityDates {\n compatibility_dates: string[];\n}\n\nexport interface MetaStatus {\n routes: ({\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n status: 'Unknown' | 'OK' | 'Degraded' | 'Down' | 'Recovering';\n })[];\n}\n\n// --- Planetary Interaction ---\n\nexport interface CharactersCharacterIdPlanetsGet {\n last_update: string;\n num_pins: number;\n owner_id: number;\n planet_id: number;\n planet_type: 'temperate' | 'barren' | 'oceanic' | 'ice' | 'gas' | 'lava' | 'storm' | 'plasma';\n solar_system_id: number;\n upgrade_level: number;\n}\n\nexport interface CharactersCharacterIdPlanetsPlanetIdGet {\n links: ({\n destination_pin_id: number;\n link_level: number;\n source_pin_id: number;\n })[];\n pins: ({\n contents?: ({\n amount: number;\n type_id: number;\n })[];\n expiry_time?: string;\n extractor_details?: {\n cycle_time?: number;\n head_radius?: number;\n heads: ({\n head_id: number;\n latitude: number;\n longitude: number;\n })[];\n product_type_id?: number;\n qty_per_cycle?: number;\n };\n factory_details?: {\n schematic_id: number;\n };\n install_time?: string;\n last_cycle_start?: string;\n latitude: number;\n longitude: number;\n pin_id: number;\n schematic_id?: number;\n type_id: number;\n })[];\n routes: ({\n content_type_id: number;\n destination_pin_id: number;\n quantity: number;\n route_id: number;\n source_pin_id: number;\n waypoints?: number[];\n })[];\n}\n\nexport interface CorporationsCorporationIdCustomsOfficesGet {\n alliance_tax_rate?: number;\n allow_access_with_standings: boolean;\n allow_alliance_access: boolean;\n bad_standing_tax_rate?: number;\n corporation_tax_rate?: number;\n excellent_standing_tax_rate?: number;\n good_standing_tax_rate?: number;\n neutral_standing_tax_rate?: number;\n office_id: number;\n reinforce_exit_end: number;\n reinforce_exit_start: number;\n standing_level?: 'bad' | 'excellent' | 'good' | 'neutral' | 'terrible';\n system_id: number;\n terrible_standing_tax_rate?: number;\n type_id?: number;\n}\n\nexport interface UniverseSchematicsSchematicIdGet {\n cycle_time: number;\n schematic_name: string;\n}\n\n// --- Routes ---\n\nexport interface Route {\n route: number[];\n}\n\n// --- Search ---\n\nexport interface CharactersCharacterIdSearchGet {\n agent?: number[];\n alliance?: number[];\n character?: number[];\n constellation?: number[];\n corporation?: number[];\n faction?: number[];\n inventory_type?: number[];\n region?: number[];\n solar_system?: number[];\n station?: number[];\n structure?: number[];\n}\n\n// --- Skills ---\n\nexport interface CharactersCharacterIdAttributesGet {\n accrued_remap_cooldown_date?: string;\n bonus_remaps?: number;\n charisma: number;\n intelligence: number;\n last_remap_date?: string;\n memory: number;\n perception: number;\n willpower: number;\n}\n\nexport interface CharactersSkillqueueSkill {\n finish_date?: string;\n finished_level: number;\n level_end_sp?: number;\n level_start_sp?: number;\n queue_position: number;\n skill_id: number;\n start_date?: string;\n training_start_sp?: number;\n}\n\nexport interface CharactersSkills {\n skills: ({\n active_skill_level: number;\n skill_id: number;\n skillpoints_in_skill: number;\n trained_skill_level: number;\n })[];\n total_sp: number;\n unallocated_sp?: number;\n}\n\n// --- Sovereignty ---\n\nexport interface SovereigntyCampaignsGet {\n attackers_score?: number;\n campaign_id: number;\n constellation_id: number;\n defender_id?: number;\n defender_score?: number;\n event_type: 'tcu_defense' | 'ihub_defense' | 'station_defense' | 'station_freeport';\n participants?: ({\n alliance_id: number;\n score: number;\n })[];\n solar_system_id: number;\n start_time: string;\n structure_id: number;\n}\n\nexport interface SovereigntySystems {\n solar_systems: ({\n claim: unknown;\n solar_system_id: number;\n })[];\n}\n\n// --- Status ---\n\nexport interface Status {\n players: number;\n server_version: string;\n start_time: string;\n vip: boolean;\n}\n\n// --- Structures ---\n\nexport interface CharactersStructuresMercenaryDensDetail {\n evolution: {\n anarchy: {\n amount: number;\n level: 'Unspecified' | 'Level0' | 'Level1' | 'Level2' | 'Level3' | 'Level4';\n };\n development: {\n amount: number;\n level: 'Unspecified' | 'Level0' | 'Level1' | 'Level2' | 'Level3' | 'Level4';\n };\n };\n id: number;\n infomorphs: {\n amount: number;\n };\n reinforcement_timer?: {\n end: string;\n };\n skyhook: {\n corporation_id: number;\n id: number;\n planet_id: number;\n };\n state: 'Unspecified' | 'Running' | 'Paused' | 'Disabled';\n type_id: number;\n}\n\nexport interface CharactersStructuresMercenaryDensListing {\n mercenary_dens: ({\n id: number;\n planet_id: number;\n })[];\n}\n\nexport interface CorporationsStructuresSkyhooksDetail {\n effective_workforce?: number;\n id: number;\n is_active: boolean;\n planet_id: number;\n reagents?: ({\n last_cycle: string;\n secured_stock: number;\n type_id: number;\n unsecured_stock: number;\n })[];\n reinforcement_timer?: {\n end: string;\n };\n state: 'Unspecified' | 'ShieldVulnerable' | 'ArmorReinforced' | 'ArmorVulnerable' | 'HullReinforced' | 'HullVulnerable';\n theft_vulnerability?: {\n end: string;\n start: string;\n };\n}\n\nexport interface CorporationsStructuresSkyhooksListing {\n skyhooks: ({\n id: number;\n planet_id: number;\n })[];\n}\n\nexport interface CorporationsStructuresSovereigntyHubsDetail {\n fuel_access_list_id?: number;\n id: number;\n reagent_bay: {\n last_updated: string;\n reagents: ({\n amount: number;\n burning_per_hour: number;\n type_id: number;\n })[];\n };\n resources: {\n power: {\n allocated: number;\n available: number;\n };\n workforce: {\n allocated: number;\n available: number;\n };\n };\n solar_system_id: number;\n upgrades: ({\n power_state: 'Unspecified' | 'Online' | 'Offline' | 'Low' | 'Pending';\n type_id: number;\n })[];\n vulnerability_window?: {\n end: string;\n start: string;\n };\n workforce_transport: {\n configuration: unknown;\n state: unknown;\n };\n}\n\nexport interface CorporationsStructuresSovereigntyHubsListing {\n sovereignty_hubs: ({\n id: number;\n solar_system_id: number;\n })[];\n}\n\n// --- Universe ---\n\nexport interface UniverseAncestriesGet {\n bloodline_id: number;\n description: string;\n icon_id?: number;\n id: number;\n name: string;\n short_description?: string;\n}\n\nexport interface UniverseAsteroidBeltsAsteroidBeltIdGet {\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n system_id: number;\n}\n\nexport interface UniverseBloodlinesGet {\n bloodline_id: number;\n charisma: number;\n corporation_id: number;\n description: string;\n intelligence: number;\n memory: number;\n name: string;\n perception: number;\n race_id: number;\n ship_type_id: number;\n willpower: number;\n}\n\nexport interface UniverseCategoriesCategoryIdGet {\n category_id: number;\n groups: number[];\n name: string;\n published: boolean;\n}\n\nexport interface UniverseConstellationsConstellationIdGet {\n constellation_id: number;\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n region_id: number;\n systems: number[];\n}\n\nexport interface UniverseFactionsGet {\n corporation_id?: number;\n description: string;\n faction_id: number;\n is_unique: boolean;\n militia_corporation_id?: number;\n name: string;\n size_factor: number;\n solar_system_id?: number;\n station_count: number;\n station_system_count: number;\n}\n\nexport interface UniverseGraphicsGraphicIdGet {\n collision_file?: string;\n graphic_file?: string;\n graphic_id: number;\n icon_folder?: string;\n sof_dna?: string;\n sof_fation_name?: string;\n sof_hull_name?: string;\n sof_race_name?: string;\n}\n\nexport interface UniverseGroupsGroupIdGet {\n category_id: number;\n group_id: number;\n name: string;\n published: boolean;\n types: number[];\n}\n\nexport interface UniverseIdsPost {\n agents?: ({\n id?: number;\n name?: string;\n })[];\n alliances?: ({\n id?: number;\n name?: string;\n })[];\n characters?: ({\n id?: number;\n name?: string;\n })[];\n constellations?: ({\n id?: number;\n name?: string;\n })[];\n corporations?: ({\n id?: number;\n name?: string;\n })[];\n factions?: ({\n id?: number;\n name?: string;\n })[];\n inventory_types?: ({\n id?: number;\n name?: string;\n })[];\n regions?: ({\n id?: number;\n name?: string;\n })[];\n stations?: ({\n id?: number;\n name?: string;\n })[];\n systems?: ({\n id?: number;\n name?: string;\n })[];\n}\n\nexport interface UniverseMoonsMoonIdGet {\n moon_id: number;\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n system_id: number;\n}\n\nexport interface UniverseNamesPost {\n category: 'alliance' | 'character' | 'constellation' | 'corporation' | 'inventory_type' | 'region' | 'solar_system' | 'station' | 'faction';\n id: number;\n name: string;\n}\n\nexport interface UniversePlanetsPlanetIdGet {\n name: string;\n planet_id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n system_id: number;\n type_id: number;\n}\n\nexport interface UniverseRacesGet {\n alliance_id: number;\n description: string;\n name: string;\n race_id: number;\n}\n\nexport interface UniverseRegionsRegionIdGet {\n constellations: number[];\n description?: string;\n name: string;\n region_id: number;\n}\n\nexport interface UniverseStargatesStargateIdGet {\n destination: {\n stargate_id: number;\n system_id: number;\n };\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n stargate_id: number;\n system_id: number;\n type_id: number;\n}\n\nexport interface UniverseStarsStarIdGet {\n age: number;\n luminosity: number;\n name: string;\n radius: number;\n solar_system_id: number;\n spectral_class: 'K2 V' | 'K4 V' | 'G2 V' | 'G8 V' | 'M7 V' | 'K7 V' | 'M2 V' | 'K5 V' | 'M3 V' | 'G0 V' | 'G7 V' | 'G3 V' | 'F9 V' | 'G5 V' | 'F6 V' | 'K8 V' | 'K9 V' | 'K6 V' | 'G9 V' | 'G6 V' | 'G4 VI' | 'G4 V' | 'F8 V' | 'F2 V' | 'F1 V' | 'K3 V' | 'F0 VI' | 'G1 VI' | 'G0 VI' | 'K1 V' | 'M4 V' | 'M1 V' | 'M6 V' | 'M0 V' | 'K2 IV' | 'G2 VI' | 'K0 V' | 'K5 IV' | 'F5 VI' | 'G6 VI' | 'F6 VI' | 'F2 IV' | 'G3 VI' | 'M8 V' | 'F1 VI' | 'K1 IV' | 'F7 V' | 'G5 VI' | 'M5 V' | 'G7 VI' | 'F5 V' | 'F4 VI' | 'F8 VI' | 'K3 IV' | 'F4 IV' | 'F0 V' | 'G7 IV' | 'G8 VI' | 'F2 VI' | 'F4 V' | 'F7 VI' | 'F3 V' | 'G1 V' | 'G9 VI' | 'F3 IV' | 'F9 VI' | 'M9 V' | 'K0 IV' | 'F1 IV' | 'G4 IV' | 'F3 VI' | 'K4 IV' | 'G5 IV' | 'G3 IV' | 'G1 IV' | 'K7 IV' | 'G0 IV' | 'K6 IV' | 'K9 IV' | 'G2 IV' | 'F9 IV' | 'F0 IV' | 'K8 IV' | 'G8 IV' | 'F6 IV' | 'F5 IV' | 'A0' | 'A0IV' | 'A0IV2';\n temperature: number;\n type_id: number;\n}\n\nexport interface UniverseStationsStationIdGet {\n max_dockable_ship_volume: number;\n name: string;\n office_rental_cost: number;\n owner?: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n race_id?: number;\n reprocessing_efficiency: number;\n reprocessing_stations_take: number;\n services: 'bounty-missions' | 'assasination-missions' | 'courier-missions' | 'interbus' | 'reprocessing-plant' | 'refinery' | 'market' | 'black-market' | 'stock-exchange' | 'cloning' | 'surgery' | 'dna-therapy' | 'repair-facilities' | 'factory' | 'labratory' | 'gambling' | 'fitting' | 'paintshop' | 'news' | 'storage' | 'insurance' | 'docking' | 'office-rental' | 'jump-clone-facility' | 'loyalty-point-store' | 'navy-offices' | 'security-offices'[];\n station_id: number;\n system_id: number;\n type_id: number;\n}\n\nexport interface UniverseStructuresStructureIdGet {\n name: string;\n owner_id: number;\n position?: {\n x: number;\n y: number;\n z: number;\n };\n solar_system_id: number;\n type_id?: number;\n}\n\nexport interface UniverseSystemJumpsGet {\n ship_jumps: number;\n system_id: number;\n}\n\nexport interface UniverseSystemKillsGet {\n npc_kills: number;\n pod_kills: number;\n ship_kills: number;\n system_id: number;\n}\n\nexport interface UniverseSystemsSystemIdGet {\n constellation_id: number;\n name: string;\n planets?: ({\n asteroid_belts?: number[];\n moons?: number[];\n planet_id: number;\n })[];\n position: {\n x: number;\n y: number;\n z: number;\n };\n security_class?: string;\n security_status: number;\n star_id?: number;\n stargates?: number[];\n stations?: number[];\n system_id: number;\n}\n\nexport interface UniverseTypesTypeIdGet {\n capacity?: number;\n description: string;\n dogma_attributes?: ({\n attribute_id: number;\n value: number;\n })[];\n dogma_effects?: ({\n effect_id: number;\n is_default: boolean;\n })[];\n graphic_id?: number;\n group_id: number;\n icon_id?: number;\n market_group_id?: number;\n mass?: number;\n name: string;\n packaged_volume?: number;\n portion_size?: number;\n published: boolean;\n radius?: number;\n type_id: number;\n volume?: number;\n}\n\n// --- Wallet ---\n\nexport interface CharactersCharacterIdWalletJournalGet {\n amount?: number;\n balance?: number;\n context_id?: number;\n context_id_type?: 'structure_id' | 'station_id' | 'market_transaction_id' | 'character_id' | 'corporation_id' | 'alliance_id' | 'eve_system' | 'industry_job_id' | 'contract_id' | 'planet_id' | 'system_id' | 'type_id';\n date: string;\n description: string;\n first_party_id?: number;\n id: number;\n reason?: string;\n ref_type: 'acceleration_gate_fee' | 'achievement_category_milestone_reward' | 'achievement_milestone_reward' | 'advertisement_listing_fee' | 'agent_donation' | 'agent_location_services' | 'agent_miscellaneous' | 'agent_mission_collateral_paid' | 'agent_mission_collateral_refunded' | 'agent_mission_reward' | 'agent_mission_reward_corporation_tax' | 'agent_mission_security_tax' | 'agent_mission_time_bonus_reward' | 'agent_mission_time_bonus_reward_corporation_tax' | 'agent_security_services' | 'agent_services_rendered' | 'agents_preward' | 'air_career_program_reward' | 'alliance_maintainance_fee' | 'alliance_registration_fee' | 'allignment_based_gate_toll' | 'asset_safety_recovery_tax' | 'bounty' | 'bounty_prize' | 'bounty_prize_corporation_tax' | 'bounty_prizes' | 'bounty_reimbursement' | 'bounty_surcharge' | 'brokers_fee' | 'campaign_objective_isk_reward' | 'clone_activation' | 'clone_transfer' | 'contraband_fine' | 'contract_auction_bid' | 'contract_auction_bid_corp' | 'contract_auction_bid_refund' | 'contract_auction_sold' | 'contract_brokers_fee' | 'contract_brokers_fee_corp' | 'contract_collateral' | 'contract_collateral_deposited_corp' | 'contract_collateral_payout' | 'contract_collateral_refund' | 'contract_deposit' | 'contract_deposit_corp' | 'contract_deposit_refund' | 'contract_deposit_sales_tax' | 'contract_price' | 'contract_price_payment_corp' | 'contract_reversal' | 'contract_reward' | 'contract_reward_deposited' | 'contract_reward_deposited_corp' | 'contract_reward_refund' | 'contract_sales_tax' | 'copying' | 'corporate_reward_payout' | 'corporate_reward_tax' | 'corporation_account_withdrawal' | 'corporation_bulk_payment' | 'corporation_dividend_payment' | 'corporation_liquidation' | 'corporation_logo_change_cost' | 'corporation_payment' | 'corporation_registration_fee' | 'cosmetic_market_component_item_purchase' | 'cosmetic_market_skin_purchase' | 'cosmetic_market_skin_sale' | 'cosmetic_market_skin_sale_broker_fee' | 'cosmetic_market_skin_sale_tax' | 'cosmetic_market_skin_transaction' | 'courier_mission_escrow' | 'cspa' | 'cspaofflinerefund' | 'daily_challenge_reward' | 'daily_goal_payouts' | 'daily_goal_payouts_tax' | 'datacore_fee' | 'dna_modification_fee' | 'docking_fee' | 'duel_wager_escrow' | 'duel_wager_payment' | 'duel_wager_refund' | 'ess_escrow_transfer' | 'external_trade_delivery' | 'external_trade_freeze' | 'external_trade_thaw' | 'factory_slot_rental_fee' | 'flux_payout' | 'flux_tax' | 'flux_ticket_repayment' | 'flux_ticket_sale' | 'freelance_jobs_broadcasting_fee' | 'freelance_jobs_duration_fee' | 'freelance_jobs_escrow_refund' | 'freelance_jobs_reward' | 'freelance_jobs_reward_corporation_tax' | 'freelance_jobs_reward_escrow' | 'gm_cash_transfer' | 'gm_plex_fee_refund' | 'industry_job_tax' | 'industry_security_tax' | 'infrastructure_hub_maintenance' | 'inheritance' | 'insurance' | 'insurgency_corruption_contribution_reward' | 'insurgency_suppression_contribution_reward' | 'item_trader_payment' | 'jump_clone_activation_fee' | 'jump_clone_installation_fee' | 'kill_right_fee' | 'lp_store' | 'manufacturing' | 'market_escrow' | 'market_fine_paid' | 'market_provider_tax' | 'market_security_tax' | 'market_transaction' | 'medal_creation' | 'medal_issued' | 'milestone_reward_payment' | 'mission_completion' | 'mission_cost' | 'mission_expiration' | 'mission_reward' | 'npc_bounty_security_tax' | 'office_rental_fee' | 'operation_bonus' | 'opportunity_reward' | 'planetary_construction' | 'planetary_export_tax' | 'planetary_import_tax' | 'player_donation' | 'player_trading' | 'project_discovery_reward' | 'project_discovery_tax' | 'project_payouts' | 'reaction' | 'redeemed_isk_token' | 'release_of_impounded_property' | 'repair_bill' | 'reprocessing_tax' | 'researching_material_productivity' | 'researching_technology' | 'researching_time_productivity' | 'resource_wars_reward' | 'reverse_engineering' | 'season_challenge_reward' | 'security_processing_fee' | 'shares' | 'skill_purchase' | 'skyhook_claim_fee' | 'sovereignity_bill' | 'store_purchase' | 'store_purchase_refund' | 'structure_gate_jump' | 'transaction_tax' | 'under_construction' | 'upkeep_adjustment_fee' | 'war_ally_contract' | 'war_fee' | 'war_fee_surrender';\n second_party_id?: number;\n tax?: number;\n tax_receiver_id?: number;\n}\n\nexport interface CharactersCharacterIdWalletTransactionsGet {\n client_id: number;\n date: string;\n is_buy: boolean;\n is_personal: boolean;\n journal_ref_id: number;\n location_id: number;\n quantity: number;\n transaction_id: number;\n type_id: number;\n unit_price: number;\n}\n\nexport interface CorporationsCorporationIdWalletsDivisionJournalGet {\n amount?: number;\n balance?: number;\n context_id?: number;\n context_id_type?: 'structure_id' | 'station_id' | 'market_transaction_id' | 'character_id' | 'corporation_id' | 'alliance_id' | 'eve_system' | 'industry_job_id' | 'contract_id' | 'planet_id' | 'system_id' | 'type_id';\n date: string;\n description: string;\n first_party_id?: number;\n id: number;\n reason?: string;\n ref_type: 'acceleration_gate_fee' | 'achievement_category_milestone_reward' | 'achievement_milestone_reward' | 'advertisement_listing_fee' | 'agent_donation' | 'agent_location_services' | 'agent_miscellaneous' | 'agent_mission_collateral_paid' | 'agent_mission_collateral_refunded' | 'agent_mission_reward' | 'agent_mission_reward_corporation_tax' | 'agent_mission_security_tax' | 'agent_mission_time_bonus_reward' | 'agent_mission_time_bonus_reward_corporation_tax' | 'agent_security_services' | 'agent_services_rendered' | 'agents_preward' | 'air_career_program_reward' | 'alliance_maintainance_fee' | 'alliance_registration_fee' | 'allignment_based_gate_toll' | 'asset_safety_recovery_tax' | 'bounty' | 'bounty_prize' | 'bounty_prize_corporation_tax' | 'bounty_prizes' | 'bounty_reimbursement' | 'bounty_surcharge' | 'brokers_fee' | 'campaign_objective_isk_reward' | 'clone_activation' | 'clone_transfer' | 'contraband_fine' | 'contract_auction_bid' | 'contract_auction_bid_corp' | 'contract_auction_bid_refund' | 'contract_auction_sold' | 'contract_brokers_fee' | 'contract_brokers_fee_corp' | 'contract_collateral' | 'contract_collateral_deposited_corp' | 'contract_collateral_payout' | 'contract_collateral_refund' | 'contract_deposit' | 'contract_deposit_corp' | 'contract_deposit_refund' | 'contract_deposit_sales_tax' | 'contract_price' | 'contract_price_payment_corp' | 'contract_reversal' | 'contract_reward' | 'contract_reward_deposited' | 'contract_reward_deposited_corp' | 'contract_reward_refund' | 'contract_sales_tax' | 'copying' | 'corporate_reward_payout' | 'corporate_reward_tax' | 'corporation_account_withdrawal' | 'corporation_bulk_payment' | 'corporation_dividend_payment' | 'corporation_liquidation' | 'corporation_logo_change_cost' | 'corporation_payment' | 'corporation_registration_fee' | 'cosmetic_market_component_item_purchase' | 'cosmetic_market_skin_purchase' | 'cosmetic_market_skin_sale' | 'cosmetic_market_skin_sale_broker_fee' | 'cosmetic_market_skin_sale_tax' | 'cosmetic_market_skin_transaction' | 'courier_mission_escrow' | 'cspa' | 'cspaofflinerefund' | 'daily_challenge_reward' | 'daily_goal_payouts' | 'daily_goal_payouts_tax' | 'datacore_fee' | 'dna_modification_fee' | 'docking_fee' | 'duel_wager_escrow' | 'duel_wager_payment' | 'duel_wager_refund' | 'ess_escrow_transfer' | 'external_trade_delivery' | 'external_trade_freeze' | 'external_trade_thaw' | 'factory_slot_rental_fee' | 'flux_payout' | 'flux_tax' | 'flux_ticket_repayment' | 'flux_ticket_sale' | 'freelance_jobs_broadcasting_fee' | 'freelance_jobs_duration_fee' | 'freelance_jobs_escrow_refund' | 'freelance_jobs_reward' | 'freelance_jobs_reward_corporation_tax' | 'freelance_jobs_reward_escrow' | 'gm_cash_transfer' | 'gm_plex_fee_refund' | 'industry_job_tax' | 'industry_security_tax' | 'infrastructure_hub_maintenance' | 'inheritance' | 'insurance' | 'insurgency_corruption_contribution_reward' | 'insurgency_suppression_contribution_reward' | 'item_trader_payment' | 'jump_clone_activation_fee' | 'jump_clone_installation_fee' | 'kill_right_fee' | 'lp_store' | 'manufacturing' | 'market_escrow' | 'market_fine_paid' | 'market_provider_tax' | 'market_security_tax' | 'market_transaction' | 'medal_creation' | 'medal_issued' | 'milestone_reward_payment' | 'mission_completion' | 'mission_cost' | 'mission_expiration' | 'mission_reward' | 'npc_bounty_security_tax' | 'office_rental_fee' | 'operation_bonus' | 'opportunity_reward' | 'planetary_construction' | 'planetary_export_tax' | 'planetary_import_tax' | 'player_donation' | 'player_trading' | 'project_discovery_reward' | 'project_discovery_tax' | 'project_payouts' | 'reaction' | 'redeemed_isk_token' | 'release_of_impounded_property' | 'repair_bill' | 'reprocessing_tax' | 'researching_material_productivity' | 'researching_technology' | 'researching_time_productivity' | 'resource_wars_reward' | 'reverse_engineering' | 'season_challenge_reward' | 'security_processing_fee' | 'shares' | 'skill_purchase' | 'skyhook_claim_fee' | 'sovereignity_bill' | 'store_purchase' | 'store_purchase_refund' | 'structure_gate_jump' | 'transaction_tax' | 'under_construction' | 'upkeep_adjustment_fee' | 'war_ally_contract' | 'war_fee' | 'war_fee_surrender';\n second_party_id?: number;\n tax?: number;\n tax_receiver_id?: number;\n}\n\nexport interface CorporationsCorporationIdWalletsDivisionTransactionsGet {\n client_id: number;\n date: string;\n is_buy: boolean;\n journal_ref_id: number;\n location_id: number;\n quantity: number;\n transaction_id: number;\n type_id: number;\n unit_price: number;\n}\n\nexport interface CorporationsCorporationIdWalletsGet {\n balance: number;\n division: number;\n}\n\n// --- Wars ---\n\nexport interface WarsWarIdGet {\n aggressor: {\n alliance_id?: number;\n corporation_id?: number;\n isk_destroyed: number;\n ships_killed: number;\n };\n allies?: ({\n alliance_id?: number;\n corporation_id?: number;\n })[];\n declared: string;\n defender: {\n alliance_id?: number;\n corporation_id?: number;\n isk_destroyed: number;\n ships_killed: number;\n };\n finished?: string;\n id: number;\n mutual: boolean;\n open_for_allies: boolean;\n retracted?: string;\n started?: string;\n}\n\nexport interface WarsWarIdKillmailsGet {\n killmail_hash: string;\n killmail_id: number;\n}\n\n// Operation ID → Response type mapping\nexport interface EsiOperationTypes {\n 'GetAlliancesAllianceId': AlliancesDetail;\n 'GetAlliancesAllianceIdContacts': AlliancesAllianceIdContactsGet[];\n 'GetAlliancesAllianceIdContactsLabels': AlliancesAllianceIdContactsLabelsGet[];\n 'GetAlliancesAllianceIdIcons': AlliancesAllianceIdIconsGet;\n 'GetCharactersAccessListsDetail': CharactersAccessListsDetail;\n 'GetCharactersAccessListsListing': CharactersAccessListsListing;\n 'GetCharactersCharacterId': CharactersDetail;\n 'GetCharactersCharacterIdAgentsResearch': CharactersCharacterIdAgentsResearchGet[];\n 'GetCharactersCharacterIdAssets': CharactersCharacterIdAssetsGet[];\n 'GetCharactersCharacterIdAttributes': CharactersCharacterIdAttributesGet;\n 'GetCharactersCharacterIdBlueprints': CharactersCharacterIdBlueprintsGet[];\n 'GetCharactersCharacterIdCalendar': CharactersCharacterIdCalendarGet[];\n 'GetCharactersCharacterIdCalendarEventId': CharactersCharacterIdCalendarEventIdGet;\n 'GetCharactersCharacterIdCalendarEventIdAttendees': CharactersCharacterIdCalendarEventIdAttendeesGet[];\n 'GetCharactersCharacterIdClones': CharactersCharacterIdClonesGet;\n 'GetCharactersCharacterIdContacts': CharactersCharacterIdContactsGet[];\n 'GetCharactersCharacterIdContactsLabels': CharactersCharacterIdContactsLabelsGet[];\n 'GetCharactersCharacterIdContracts': CharactersCharacterIdContractsGet[];\n 'GetCharactersCharacterIdContractsContractIdBids': CharactersCharacterIdContractsContractIdBidsGet[];\n 'GetCharactersCharacterIdContractsContractIdItems': CharactersCharacterIdContractsContractIdItemsGet[];\n 'GetCharactersCharacterIdCorporationhistory': CharactersCharacterIdCorporationhistoryGet[];\n 'GetCharactersCharacterIdFatigue': CharactersCharacterIdFatigueGet;\n 'GetCharactersCharacterIdFittings': CharactersCharacterIdFittingsGet[];\n 'GetCharactersCharacterIdFleet': CharactersCharacterIdFleetGet;\n 'GetCharactersCharacterIdFwStats': CharactersCharacterIdFwStatsGet;\n 'GetCharactersCharacterIdIndustryJobs': CharactersCharacterIdIndustryJobsGet[];\n 'GetCharactersCharacterIdKillmailsRecent': CharactersCharacterIdKillmailsRecentGet[];\n 'GetCharactersCharacterIdLocation': CharactersLocation;\n 'GetCharactersCharacterIdLoyaltyPoints': CharactersCharacterIdLoyaltyPointsGet[];\n 'GetCharactersCharacterIdMail': CharactersCharacterIdMailGet[];\n 'GetCharactersCharacterIdMailLabels': CharactersCharacterIdMailLabelsGet;\n 'GetCharactersCharacterIdMailLists': CharactersCharacterIdMailListsGet[];\n 'GetCharactersCharacterIdMailMailId': CharactersCharacterIdMailMailIdGet;\n 'GetCharactersCharacterIdMedals': CharactersCharacterIdMedalsGet[];\n 'GetCharactersCharacterIdMining': CharactersCharacterIdMiningGet[];\n 'GetCharactersCharacterIdNotifications': CharactersCharacterIdNotificationsGet[];\n 'GetCharactersCharacterIdNotificationsContacts': CharactersCharacterIdNotificationsContactsGet[];\n 'GetCharactersCharacterIdOnline': CharactersOnline;\n 'GetCharactersCharacterIdOrders': CharactersCharacterIdOrdersGet[];\n 'GetCharactersCharacterIdOrdersHistory': CharactersCharacterIdOrdersHistoryGet[];\n 'GetCharactersCharacterIdPlanets': CharactersCharacterIdPlanetsGet[];\n 'GetCharactersCharacterIdPlanetsPlanetId': CharactersCharacterIdPlanetsPlanetIdGet;\n 'GetCharactersCharacterIdPortrait': CharactersCharacterIdPortraitGet;\n 'GetCharactersCharacterIdRoles': CharactersCharacterIdRolesGet;\n 'GetCharactersCharacterIdSearch': CharactersCharacterIdSearchGet;\n 'GetCharactersCharacterIdShip': CharactersShip;\n 'GetCharactersCharacterIdSkillqueue': CharactersSkillqueueSkill[];\n 'GetCharactersCharacterIdSkills': CharactersSkills;\n 'GetCharactersCharacterIdStandings': CharactersCharacterIdStandingsGet[];\n 'GetCharactersCharacterIdTitles': CharactersCharacterIdTitlesGet[];\n 'GetCharactersCharacterIdWalletJournal': CharactersCharacterIdWalletJournalGet[];\n 'GetCharactersCharacterIdWalletTransactions': CharactersCharacterIdWalletTransactionsGet[];\n 'GetCharactersFreelanceJobsListing': CharactersFreelanceJobsListing;\n 'GetCharactersFreelanceJobsParticipation': CharactersFreelanceJobsParticipation;\n 'GetCharactersMercenaryTacticalOperationsDetail': CharactersMercenaryTacticalOperationsDetail;\n 'GetCharactersMercenaryTacticalOperationsListing': CharactersMercenaryTacticalOperationsListing;\n 'GetCharactersStructuresMercenaryDensDetail': CharactersStructuresMercenaryDensDetail;\n 'GetCharactersStructuresMercenaryDensListing': CharactersStructuresMercenaryDensListing;\n 'GetContractsPublicBidsContractId': ContractsPublicBidsContractIdGet[];\n 'GetContractsPublicItemsContractId': ContractsPublicItemsContractIdGet[];\n 'GetContractsPublicRegionId': ContractsPublicRegionIdGet[];\n 'GetCorporationCorporationIdMiningExtractions': CorporationCorporationIdMiningExtractionsGet[];\n 'GetCorporationCorporationIdMiningObservers': CorporationCorporationIdMiningObserversGet[];\n 'GetCorporationCorporationIdMiningObserversObserverId': CorporationCorporationIdMiningObserversObserverIdGet[];\n 'GetCorporationsCorporationId': CorporationsDetail;\n 'GetCorporationsCorporationIdAlliancehistory': CorporationsCorporationIdAlliancehistoryGet[];\n 'GetCorporationsCorporationIdAssets': CorporationsCorporationIdAssetsGet[];\n 'GetCorporationsCorporationIdBlueprints': CorporationsCorporationIdBlueprintsGet[];\n 'GetCorporationsCorporationIdContacts': CorporationsCorporationIdContactsGet[];\n 'GetCorporationsCorporationIdContactsLabels': CorporationsCorporationIdContactsLabelsGet[];\n 'GetCorporationsCorporationIdContainersLogs': CorporationsCorporationIdContainersLogsGet[];\n 'GetCorporationsCorporationIdContracts': CorporationsCorporationIdContractsGet[];\n 'GetCorporationsCorporationIdContractsContractIdBids': CorporationsCorporationIdContractsContractIdBidsGet[];\n 'GetCorporationsCorporationIdContractsContractIdItems': CorporationsCorporationIdContractsContractIdItemsGet[];\n 'GetCorporationsCorporationIdCustomsOffices': CorporationsCorporationIdCustomsOfficesGet[];\n 'GetCorporationsCorporationIdDivisions': CorporationsCorporationIdDivisionsGet;\n 'GetCorporationsCorporationIdFacilities': CorporationsCorporationIdFacilitiesGet[];\n 'GetCorporationsCorporationIdFwStats': CorporationsCorporationIdFwStatsGet;\n 'GetCorporationsCorporationIdIcons': CorporationsCorporationIdIconsGet;\n 'GetCorporationsCorporationIdIndustryJobs': CorporationsCorporationIdIndustryJobsGet[];\n 'GetCorporationsCorporationIdKillmailsRecent': CorporationsCorporationIdKillmailsRecentGet[];\n 'GetCorporationsCorporationIdMedals': CorporationsCorporationIdMedalsGet[];\n 'GetCorporationsCorporationIdMedalsIssued': CorporationsCorporationIdMedalsIssuedGet[];\n 'GetCorporationsCorporationIdMembersTitles': CorporationsCorporationIdMembersTitlesGet[];\n 'GetCorporationsCorporationIdMembertracking': CorporationsCorporationIdMembertrackingGet[];\n 'GetCorporationsCorporationIdOrders': CorporationsCorporationIdOrdersGet[];\n 'GetCorporationsCorporationIdOrdersHistory': CorporationsCorporationIdOrdersHistoryGet[];\n 'GetCorporationsCorporationIdRoles': CorporationsCorporationIdRolesGet[];\n 'GetCorporationsCorporationIdRolesHistory': CorporationsCorporationIdRolesHistoryGet[];\n 'GetCorporationsCorporationIdShareholders': CorporationsCorporationIdShareholdersGet[];\n 'GetCorporationsCorporationIdStandings': CorporationsCorporationIdStandingsGet[];\n 'GetCorporationsCorporationIdStarbases': CorporationsCorporationIdStarbasesGet[];\n 'GetCorporationsCorporationIdStarbasesStarbaseId': CorporationsCorporationIdStarbasesStarbaseIdGet;\n 'GetCorporationsCorporationIdStructures': CorporationsCorporationIdStructuresGet[];\n 'GetCorporationsCorporationIdTitles': CorporationsCorporationIdTitlesGet[];\n 'GetCorporationsCorporationIdWallets': CorporationsCorporationIdWalletsGet[];\n 'GetCorporationsCorporationIdWalletsDivisionJournal': CorporationsCorporationIdWalletsDivisionJournalGet[];\n 'GetCorporationsCorporationIdWalletsDivisionTransactions': CorporationsCorporationIdWalletsDivisionTransactionsGet[];\n 'GetCorporationsFreelanceJobsListing': CorporationsFreelanceJobsListing;\n 'GetCorporationsFreelanceJobsParticipants': CorporationsFreelanceJobsParticipants;\n 'GetCorporationsProjectsContribution': CorporationsProjectsContribution;\n 'GetCorporationsProjectsContributors': CorporationsProjectsContributors;\n 'GetCorporationsProjectsDetail': CorporationsProjectsDetail;\n 'GetCorporationsProjectsListing': CorporationsProjectsListing;\n 'GetCorporationsStructuresSkyhooksDetail': CorporationsStructuresSkyhooksDetail;\n 'GetCorporationsStructuresSkyhooksListing': CorporationsStructuresSkyhooksListing;\n 'GetCorporationsStructuresSovereigntyHubsDetail': CorporationsStructuresSovereigntyHubsDetail;\n 'GetCorporationsStructuresSovereigntyHubsListing': CorporationsStructuresSovereigntyHubsListing;\n 'GetDogmaAttributesAttributeId': DogmaAttributesAttributeIdGet;\n 'GetDogmaDynamicItemsTypeIdItemId': DogmaDynamicItemsTypeIdItemIdGet;\n 'GetDogmaEffectsEffectId': DogmaEffectsEffectIdGet;\n 'GetFleetsFleetId': FleetsFleetIdGet;\n 'GetFleetsFleetIdMembers': FleetsFleetIdMembersGet[];\n 'GetFleetsFleetIdWings': FleetsFleetIdWingsGet[];\n 'GetFreelanceJobsDetail': FreelanceJobsDetail;\n 'GetFreelanceJobsListing': FreelanceJobsListing;\n 'GetFwLeaderboards': FwLeaderboardsGet;\n 'GetFwLeaderboardsCharacters': FwLeaderboardsCharactersGet;\n 'GetFwLeaderboardsCorporations': FwLeaderboardsCorporationsGet;\n 'GetFwStats': FwStatsGet[];\n 'GetFwSystems': FwSystemsGet[];\n 'GetFwWars': FwWarsGet[];\n 'GetIncursions': IncursionsGet[];\n 'GetIndustryFacilities': IndustryFacilitiesGet[];\n 'GetIndustrySystems': IndustrySystemsGet[];\n 'GetInsurancePrices': InsurancePricesGet[];\n 'GetKillmailsKillmailIdKillmailHash': KillmailsKillmailIdKillmailHashGet;\n 'GetLoyaltyStoresCorporationIdOffers': LoyaltyStoresCorporationIdOffersGet[];\n 'GetMarketsGroupsMarketGroupId': MarketsGroupsMarketGroupIdGet;\n 'GetMarketsPrices': MarketsPricesGet[];\n 'GetMarketsRegionIdHistory': MarketsRegionIdHistoryGet[];\n 'GetMarketsRegionIdOrders': MarketsRegionIdOrdersGet[];\n 'GetMarketsStructuresStructureId': MarketsStructuresStructureIdGet[];\n 'GetMetaChangelog': MetaChangelog;\n 'GetMetaCompatibilityDates': MetaCompatibilityDates;\n 'GetMetaStatus': MetaStatus;\n 'GetSkyhooksRaidable': SkyhooksRaidable;\n 'GetSovereigntyCampaigns': SovereigntyCampaignsGet[];\n 'GetSovereigntySystems': SovereigntySystems;\n 'GetStatus': Status;\n 'GetUniverseAncestries': UniverseAncestriesGet[];\n 'GetUniverseAsteroidBeltsAsteroidBeltId': UniverseAsteroidBeltsAsteroidBeltIdGet;\n 'GetUniverseBloodlines': UniverseBloodlinesGet[];\n 'GetUniverseCategoriesCategoryId': UniverseCategoriesCategoryIdGet;\n 'GetUniverseConstellationsConstellationId': UniverseConstellationsConstellationIdGet;\n 'GetUniverseFactions': UniverseFactionsGet[];\n 'GetUniverseGraphicsGraphicId': UniverseGraphicsGraphicIdGet;\n 'GetUniverseGroupsGroupId': UniverseGroupsGroupIdGet;\n 'GetUniverseMoonsMoonId': UniverseMoonsMoonIdGet;\n 'GetUniversePlanetsPlanetId': UniversePlanetsPlanetIdGet;\n 'GetUniverseRaces': UniverseRacesGet[];\n 'GetUniverseRegionsRegionId': UniverseRegionsRegionIdGet;\n 'GetUniverseSchematicsSchematicId': UniverseSchematicsSchematicIdGet;\n 'GetUniverseStargatesStargateId': UniverseStargatesStargateIdGet;\n 'GetUniverseStarsStarId': UniverseStarsStarIdGet;\n 'GetUniverseStationsStationId': UniverseStationsStationIdGet;\n 'GetUniverseStructuresStructureId': UniverseStructuresStructureIdGet;\n 'GetUniverseSystemJumps': UniverseSystemJumpsGet[];\n 'GetUniverseSystemKills': UniverseSystemKillsGet[];\n 'GetUniverseSystemsSystemId': UniverseSystemsSystemIdGet;\n 'GetUniverseTypesTypeId': UniverseTypesTypeIdGet;\n 'GetWarsWarId': WarsWarIdGet;\n 'GetWarsWarIdKillmails': WarsWarIdKillmailsGet[];\n 'PostCharactersAffiliation': CharactersAffiliationPost[];\n 'PostCharactersCharacterIdAssetsLocations': CharactersCharacterIdAssetsLocationsPost[];\n 'PostCharactersCharacterIdAssetsNames': CharactersCharacterIdAssetsNamesPost[];\n 'PostCorporationsCorporationIdAssetsLocations': CorporationsCorporationIdAssetsLocationsPost[];\n 'PostCorporationsCorporationIdAssetsNames': CorporationsCorporationIdAssetsNamesPost[];\n 'PostRoute': Route;\n 'PostUniverseIds': UniverseIdsPost;\n 'PostUniverseNames': UniverseNamesPost[];\n}\n","import type { FetchLike } from '../core/ApiClient';\nimport { USER_AGENT } from '../core/constants';\nimport { SsoError, TokenRevokedError } from './errors';\n\nexport const DEFAULT_SSO_BASE_URL = 'https://login.eveonline.com';\n\nexport interface EveSsoClientConfig {\n /** The application's client id from developers.eveonline.com. */\n clientId: string;\n /**\n * The application's client secret. Omit for a public (PKCE) client; token\n * requests then identify the application by `client_id` in the form body.\n */\n clientSecret?: string;\n /** Redirect URI registered for the application. Used by {@link EveSsoClient.getAuthorizationUrl}. */\n callbackUrl?: string;\n /** Override the SSO host, for tests or a proxy. Defaults to https://login.eveonline.com. */\n ssoBaseUrl?: string;\n /** Custom fetch implementation. Defaults to `globalThis.fetch` resolved at call time. */\n fetch?: FetchLike;\n}\n\n/** A successful response from the SSO token endpoint. */\nexport interface SsoTokenResponse {\n accessToken: string;\n refreshToken: string;\n /** Lifetime of `accessToken` in seconds, as reported by SSO. */\n expiresIn: number;\n tokenType: string;\n}\n\nexport interface AuthorizationUrlOptions {\n /** Scopes to request. */\n scopes: readonly string[];\n /** Opaque value echoed back on the callback; use {@link generateState}. */\n state: string;\n /** PKCE challenge for public clients; see {@link generatePkcePair}. */\n codeChallenge?: string;\n /** Overrides `callbackUrl` from the config. */\n redirectUri?: string;\n}\n\nexport interface ExchangeCodeOptions {\n /** PKCE verifier that produced the challenge sent in the authorization URL. */\n codeVerifier?: string;\n /**\n * The redirect URI that was sent in the authorization request. Defaults to\n * the configured `callbackUrl`; when neither is set the field is omitted.\n */\n redirectUri?: string;\n}\n\nexport interface RefreshOptions {\n /** Request a subset of the originally granted scopes. */\n scopes?: readonly string[];\n}\n\ninterface SsoTokenJson {\n access_token?: unknown;\n refresh_token?: unknown;\n expires_in?: unknown;\n token_type?: unknown;\n}\n\ninterface SsoErrorJson {\n error?: unknown;\n error_description?: unknown;\n}\n\n/** Which OAuth2 grant a token request carried; decides how `invalid_grant` is classified. */\ntype GrantType = 'authorization_code' | 'refresh_token';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Minimal client for the EVE SSO OAuth2 endpoints: building the login URL,\n * exchanging an authorization code, refreshing, and revoking.\n *\n * Supports confidential clients (HTTP Basic with the client secret) and\n * public clients (PKCE with `client_id` in the body). No JWT signature\n * verification is performed; tokens are trusted because they arrive directly\n * from SSO over TLS.\n */\nexport class EveSsoClient {\n private readonly clientId: string;\n private readonly clientSecret?: string;\n private readonly callbackUrl?: string;\n private readonly baseUrl: string;\n private readonly fetchFn?: FetchLike;\n\n constructor(config: EveSsoClientConfig) {\n if (!config.clientId) {\n throw new Error('EveSsoClient requires a clientId');\n }\n this.clientId = config.clientId;\n this.clientSecret = config.clientSecret;\n this.callbackUrl = config.callbackUrl;\n this.baseUrl = (config.ssoBaseUrl ?? DEFAULT_SSO_BASE_URL).replace(\n /\\/$/,\n '',\n );\n this.fetchFn = config.fetch;\n }\n\n /** True when a client secret is configured (confidential client). */\n isConfidential(): boolean {\n return this.clientSecret !== undefined && this.clientSecret !== '';\n }\n\n get tokenUrl(): string {\n return `${this.baseUrl}/v2/oauth/token`;\n }\n\n get authorizeUrl(): string {\n return `${this.baseUrl}/v2/oauth/authorize`;\n }\n\n get revokeUrl(): string {\n return `${this.baseUrl}/v2/oauth/revoke`;\n }\n\n /** Build the URL to send a player to for login. */\n getAuthorizationUrl(options: AuthorizationUrlOptions): string {\n const redirectUri = options.redirectUri ?? this.callbackUrl;\n if (!redirectUri) {\n throw new Error(\n 'getAuthorizationUrl requires a redirectUri or a configured callbackUrl',\n );\n }\n const url = new URL(this.authorizeUrl);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('redirect_uri', redirectUri);\n url.searchParams.set('client_id', this.clientId);\n url.searchParams.set('scope', options.scopes.join(' '));\n url.searchParams.set('state', options.state);\n if (options.codeChallenge) {\n url.searchParams.set('code_challenge', options.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n }\n return url.toString();\n }\n\n /** Exchange the authorization code from the callback for tokens. */\n async exchangeCode(\n code: string,\n options: ExchangeCodeOptions = {},\n ): Promise<SsoTokenResponse> {\n const form = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n });\n // OAuth2 (RFC 6749 §4.1.3) requires the token request to repeat the\n // redirect_uri that was sent in the authorization request.\n const redirectUri = options.redirectUri ?? this.callbackUrl;\n if (redirectUri) {\n form.set('redirect_uri', redirectUri);\n }\n if (options.codeVerifier) {\n form.set('code_verifier', options.codeVerifier);\n }\n return this.tokenRequest(form, 'authorization_code');\n }\n\n /** Obtain a new access token (and rotated refresh token) from a refresh token. */\n async refresh(\n refreshToken: string,\n options: RefreshOptions = {},\n ): Promise<SsoTokenResponse> {\n const form = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n });\n if (options.scopes && options.scopes.length > 0) {\n form.set('scope', options.scopes.join(' '));\n }\n return this.tokenRequest(form, 'refresh_token');\n }\n\n /** Revoke a refresh token so it can no longer be used. */\n async revoke(\n token: string,\n tokenTypeHint: 'refresh_token' | 'access_token' = 'refresh_token',\n ): Promise<void> {\n const form = new URLSearchParams({\n token_type_hint: tokenTypeHint,\n token,\n });\n const response = await this.post(this.revokeUrl, form);\n if (!response.ok) {\n throw await this.errorFromResponse(response);\n }\n }\n\n private async tokenRequest(\n form: URLSearchParams,\n grant: GrantType,\n ): Promise<SsoTokenResponse> {\n const response = await this.post(this.tokenUrl, form);\n if (!response.ok) {\n throw await this.errorFromResponse(response, grant);\n }\n // A proxy or outage page can answer 2xx with HTML, an empty body, or a\n // JSON value that is not an object. All of those are SSO faults to the\n // caller, so they surface as SsoError rather than a raw parser error.\n let parsed: unknown;\n try {\n parsed = await response.json();\n } catch {\n throw new SsoError(\n response.status,\n 'invalid_response',\n 'Token response body was not valid JSON',\n );\n }\n if (!isRecord(parsed)) {\n throw new SsoError(\n response.status,\n 'invalid_response',\n 'Token response body was not a JSON object',\n );\n }\n const json = parsed as SsoTokenJson;\n if (\n typeof json.access_token !== 'string' ||\n typeof json.refresh_token !== 'string'\n ) {\n throw new SsoError(\n response.status,\n 'invalid_response',\n 'Token response did not include access_token and refresh_token',\n );\n }\n return {\n accessToken: json.access_token,\n refreshToken: json.refresh_token,\n expiresIn: typeof json.expires_in === 'number' ? json.expires_in : 0,\n tokenType:\n typeof json.token_type === 'string' ? json.token_type : 'Bearer',\n };\n }\n\n private async post(url: string, form: URLSearchParams): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n 'User-Agent': USER_AGENT,\n };\n if (this.isConfidential()) {\n const credentials = Buffer.from(\n `${this.clientId}:${this.clientSecret}`,\n ).toString('base64');\n headers['Authorization'] = `Basic ${credentials}`;\n } else {\n form.set('client_id', this.clientId);\n }\n const fetchFn = this.fetchFn ?? globalThis.fetch;\n return fetchFn(url, { method: 'POST', headers, body: form.toString() });\n }\n\n /**\n * Map a non-2xx SSO response to an error. `invalid_grant` means \"the\n * refresh token is dead\" only for a refresh grant; on a code exchange (or\n * a revoke) it describes the login code or request, so it stays an\n * `SsoError` and does not trigger the re-authentication path.\n */\n private async errorFromResponse(\n response: Response,\n grant?: GrantType,\n ): Promise<Error> {\n let errorCode = 'unknown';\n let description: string | undefined;\n try {\n const json: unknown = await response.json();\n if (isRecord(json)) {\n const body = json as SsoErrorJson;\n if (typeof body.error === 'string') errorCode = body.error;\n if (typeof body.error_description === 'string') {\n description = body.error_description;\n }\n }\n } catch {\n // Non-JSON body; keep the defaults.\n }\n if (errorCode === 'invalid_grant' && grant === 'refresh_token') {\n return new TokenRevokedError(\n `EVE SSO rejected the refresh token (invalid_grant)${\n description ? `: ${description}` : ''\n }`,\n );\n }\n return new SsoError(response.status, errorCode, description);\n }\n}\n","export const DEFAULT_CONCURRENCY = 5;\n\nexport interface ConcurrencyOptions {\n /**\n * Maximum number of workers running at once. Defaults to 5. A value that\n * is not a finite number falls back to the default; fractions are floored\n * and anything below one runs a single worker.\n */\n concurrency?: number;\n /**\n * Called after each item settles with the running completed count. An\n * exception thrown by the callback is discarded so it cannot stop the run\n * or leave later items without a result.\n */\n onProgress?: (completed: number, total: number) => void;\n}\n\nfunction resolveLimit(requested: number | undefined): number {\n if (typeof requested !== 'number' || !Number.isFinite(requested)) {\n return DEFAULT_CONCURRENCY;\n }\n return Math.max(1, Math.floor(requested));\n}\n\nexport type SettledResult<T> =\n { status: 'fulfilled'; value: T } | { status: 'rejected'; reason: unknown };\n\n/**\n * Run `worker` over every item with at most `concurrency` invocations in\n * flight at once. Results are returned in input order and every item settles\n * independently: a rejection is captured, never thrown.\n */\nexport async function runWithConcurrency<T, R>(\n items: readonly T[],\n worker: (item: T, index: number) => Promise<R>,\n options: ConcurrencyOptions = {},\n): Promise<SettledResult<R>[]> {\n const limit = resolveLimit(options.concurrency);\n const results: SettledResult<R>[] = new Array<SettledResult<R>>(items.length);\n let nextIndex = 0;\n let completed = 0;\n\n async function runOne(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n const item = items[index] as T;\n try {\n const value = await worker(item, index);\n results[index] = { status: 'fulfilled', value };\n } catch (reason: unknown) {\n results[index] = { status: 'rejected', reason };\n }\n completed++;\n if (options.onProgress) {\n try {\n options.onProgress(completed, items.length);\n } catch {\n // Progress reporting is advisory; see ConcurrencyOptions.onProgress.\n }\n }\n }\n }\n\n const workers = Array.from({ length: Math.min(limit, items.length) }, () =>\n runOne(),\n );\n await Promise.all(workers);\n return results;\n}\n","import { TokenDecodeError } from './errors';\n\n/** Claims EVE SSO places in an access token. Only the ones the manager reads are typed. */\nexport interface EveJwtClaims {\n /** `CHARACTER:EVE:<characterId>` */\n sub: string;\n /** Character name. */\n name?: string;\n /** Granted scopes: a single string, or an array when more than one. */\n scp?: string | string[];\n /** Expiry as epoch seconds. */\n exp?: number;\n /** Issued-at as epoch seconds. */\n iat?: number;\n /** Owner hash; changes on character transfer. */\n owner?: string;\n iss?: string;\n aud?: string | string[];\n [claim: string]: unknown;\n}\n\n/** Identity and lifetime information extracted from an EVE SSO access token. */\nexport interface DecodedAccessToken {\n characterId: number;\n characterName: string;\n scopes: string[];\n /** Epoch milliseconds, or undefined when the token carries no `exp`. */\n expiresAt?: number;\n ownerHash?: string;\n claims: EveJwtClaims;\n}\n\nfunction base64UrlDecode(segment: string): string {\n return Buffer.from(segment, 'base64url').toString('utf8');\n}\n\n/**\n * Decode the payload of a JWT without verifying its signature.\n *\n * Tokens reach the manager directly from SSO over TLS, so the payload is\n * trusted for the purpose of learning which character it belongs to. Do not\n * use this to authenticate tokens presented by third parties.\n */\nexport function decodeJwtPayload(token: string): EveJwtClaims {\n const parts = token.split('.');\n if (parts.length !== 3 || !parts[1]) {\n throw new TokenDecodeError(\n 'Access token is not a JWT (expected three dot-separated segments)',\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(base64UrlDecode(parts[1]));\n } catch {\n throw new TokenDecodeError('Access token payload is not valid JSON');\n }\n if (typeof parsed !== 'object' || parsed === null) {\n throw new TokenDecodeError('Access token payload is not an object');\n }\n return parsed as EveJwtClaims;\n}\n\n/** Parse the character id out of an SSO `sub` claim (`CHARACTER:EVE:123`). */\nexport function parseCharacterId(sub: unknown): number {\n if (typeof sub !== 'string') {\n throw new TokenDecodeError('Access token has no sub claim');\n }\n const match = /^CHARACTER:EVE:(\\d+)$/.exec(sub);\n if (!match) {\n throw new TokenDecodeError(\n `Access token sub claim is not a character subject: ${sub}`,\n );\n }\n return Number(match[1]);\n}\n\n/** Normalise the `scp` claim, which SSO emits as a string for one scope and an array otherwise. */\nexport function parseScopes(scp: unknown): string[] {\n if (Array.isArray(scp)) {\n return scp.filter((s): s is string => typeof s === 'string');\n }\n if (typeof scp === 'string') {\n return scp.split(' ').filter((s) => s.length > 0);\n }\n return [];\n}\n\n/** Decode an EVE SSO access token into the fields the token manager stores. */\nexport function decodeAccessToken(token: string): DecodedAccessToken {\n const claims = decodeJwtPayload(token);\n const characterId = parseCharacterId(claims.sub);\n return {\n characterId,\n characterName: typeof claims.name === 'string' ? claims.name : '',\n scopes: parseScopes(claims.scp),\n expiresAt: typeof claims.exp === 'number' ? claims.exp * 1000 : undefined,\n ownerHash: typeof claims.owner === 'string' ? claims.owner : undefined,\n claims,\n };\n}\n","import type { ITokenStorage, StoredToken } from '../types';\n\n/**\n * In-memory {@link ITokenStorage}. Tokens live only as long as the process.\n * Useful for tests, CLIs that log in on every run, and as a cache in front of\n * a durable store.\n */\nexport class MemoryTokenStorage implements ITokenStorage {\n private readonly tokens = new Map<number, StoredToken>();\n\n constructor(initial: readonly StoredToken[] = []) {\n for (const token of initial) {\n this.tokens.set(token.characterId, {\n ...token,\n scopes: [...token.scopes],\n });\n }\n }\n\n get(characterId: number): Promise<StoredToken | null> {\n const token = this.tokens.get(characterId);\n return Promise.resolve(\n token ? { ...token, scopes: [...token.scopes] } : null,\n );\n }\n\n set(characterId: number, token: StoredToken): Promise<void> {\n this.tokens.set(characterId, { ...token, scopes: [...token.scopes] });\n return Promise.resolve();\n }\n\n delete(characterId: number): Promise<void> {\n this.tokens.delete(characterId);\n return Promise.resolve();\n }\n\n list(): Promise<StoredToken[]> {\n return Promise.resolve(\n Array.from(this.tokens.values(), (token) => ({\n ...token,\n scopes: [...token.scopes],\n })),\n );\n }\n\n /** Remove every token. */\n clear(): void {\n this.tokens.clear();\n }\n\n get size(): number {\n return this.tokens.size;\n }\n}\n","import { EsiClient, EsiClientConfig } from '../EsiClient';\nimport type { FetchLike, TokenProvider } from '../core/ApiClient';\nimport type { ILogger } from '../core/logger/ILogger';\nimport { getLogger } from '../core/logger/loggerUtil';\nimport { runWithConcurrency } from '../core/util/concurrency';\nimport {\n EveSsoClient,\n SsoTokenResponse,\n AuthorizationUrlOptions,\n ExchangeCodeOptions,\n} from './EveSsoClient';\nimport { CharacterNotFoundError, SsoError, TokenRevokedError } from './errors';\nimport { decodeAccessToken, DecodedAccessToken } from './jwt';\nimport { MemoryTokenStorage } from './storage/MemoryTokenStorage';\nimport type { ITokenStorage, StoredToken } from './types';\n\nexport interface EsiTokenManagerConfig {\n /** The application's SSO client id. */\n clientId: string;\n /** The application's SSO client secret. Omit for a public (PKCE) client. */\n clientSecret?: string;\n /** Redirect URI registered for the application. */\n callbackUrl?: string;\n /** Where tokens are persisted. Defaults to {@link MemoryTokenStorage}. */\n storage?: ITokenStorage;\n /** Pre-built SSO client. When given, `clientId`, `clientSecret`, `callbackUrl` and `fetch` are ignored for SSO calls. */\n ssoClient?: EveSsoClient;\n /** Custom fetch for SSO calls. Defaults to `globalThis.fetch`. */\n fetch?: FetchLike;\n /**\n * How long before expiry a token counts as stale, in milliseconds.\n * Defaults to 60 000 (one minute).\n */\n refreshSkewMs?: number;\n /**\n * When true (the default), {@link EsiTokenManager.getToken} refreshes a\n * stale token before returning it. When false it returns the stored token\n * as-is and refresh only happens through {@link EsiTokenManager.refresh},\n * {@link EsiTokenManager.refreshAll}, or the 401 path of a created client.\n */\n autoRefresh?: boolean;\n /** Called after a token is refreshed and persisted. */\n onRefresh?: (token: StoredToken) => void;\n /** Called when a refresh fails for a reason other than revocation. */\n onRefreshError?: (characterId: number, error: Error) => void;\n /** Called when SSO reports a character's refresh token as invalid. */\n onRevoked?: (characterId: number) => void;\n /** Logger for refresh activity. Defaults to the library logger. */\n logger?: ILogger;\n /** Clock override for tests. */\n now?: () => number;\n}\n\nexport interface AddCharacterOptions extends ExchangeCodeOptions {\n /**\n * When the character already has a stored token, revoke its refresh token\n * at SSO before replacing it. Defaults to false.\n */\n revokeReplaced?: boolean;\n}\n\nexport interface RemoveCharacterOptions {\n /** Revoke the refresh token at SSO before deleting it. Defaults to false. */\n revoke?: boolean;\n}\n\nexport interface RefreshAllOptions {\n /** Maximum simultaneous SSO requests. Defaults to 5. */\n concurrency?: number;\n /**\n * Only refresh tokens that expire within this many milliseconds (after\n * applying the refresh skew). Omit to refresh every token.\n */\n expiringWithinMs?: number;\n /** Abort the run; remaining tokens are reported as skipped. */\n signal?: AbortSignal;\n /**\n * Progress callback, invoked after each token settles. A callback that\n * throws does not stop the run; the exception is discarded.\n */\n onProgress?: (completed: number, total: number) => void;\n}\n\nexport type RefreshStatus = 'refreshed' | 'skipped' | 'failed' | 'revoked';\n\nexport interface RefreshResult {\n characterId: number;\n status: RefreshStatus;\n /** New expiry in epoch milliseconds, when refreshed. */\n expiresAt?: number;\n /** The error, when failed or revoked. */\n error?: Error;\n /** True when the failure was an SSO 429 or 5xx and can be retried later. */\n retryable?: boolean;\n /** Why the token was skipped. */\n reason?: 'not-stale' | 'aborted';\n}\n\n/** Lightweight view of a stored character, without the secrets. */\nexport interface CharacterSummary {\n characterId: number;\n characterName: string;\n scopes: string[];\n expiresAt: number;\n revoked: boolean;\n}\n\n/** EsiClient options a manager-created client accepts; token fields are supplied by the manager. */\nexport type ManagedClientConfig = Omit<\n EsiClientConfig,\n 'accessToken' | 'onTokenRefresh'\n>;\n\n/**\n * Keeps one valid SSO token per character on top of a pluggable\n * {@link ITokenStorage}, refreshing ahead of expiry, coalescing concurrent\n * refreshes, persisting rotated refresh tokens, and recording revocations so\n * SSO is not hammered with a dead refresh token.\n */\nexport class EsiTokenManager {\n private readonly storage: ITokenStorage;\n private readonly sso: EveSsoClient;\n private readonly refreshSkewMs: number;\n private readonly autoRefresh: boolean;\n private readonly logger: ILogger;\n private readonly now: () => number;\n private readonly hooks: Pick<\n EsiTokenManagerConfig,\n 'onRefresh' | 'onRefreshError' | 'onRevoked'\n >;\n private readonly inFlight = new Map<number, Promise<StoredToken>>();\n /**\n * Per-character write generation. Bumped whenever a record is replaced or\n * removed so a refresh that was already waiting on SSO can tell its result\n * is stale and must not be persisted over the newer state.\n */\n private readonly generations = new Map<number, number>();\n\n constructor(config: EsiTokenManagerConfig) {\n this.storage = config.storage ?? new MemoryTokenStorage();\n this.sso =\n config.ssoClient ??\n new EveSsoClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n callbackUrl: config.callbackUrl,\n fetch: config.fetch,\n });\n this.refreshSkewMs = config.refreshSkewMs ?? 60_000;\n this.autoRefresh = config.autoRefresh ?? true;\n this.logger = config.logger ?? getLogger();\n this.now = config.now ?? (() => Date.now());\n this.hooks = {\n onRefresh: config.onRefresh,\n onRefreshError: config.onRefreshError,\n onRevoked: config.onRevoked,\n };\n }\n\n /** The SSO client used for all token traffic. */\n getSsoClient(): EveSsoClient {\n return this.sso;\n }\n\n /** The storage adapter backing this manager. */\n getStorage(): ITokenStorage {\n return this.storage;\n }\n\n /** Build the SSO login URL. See {@link EveSsoClient.getAuthorizationUrl}. */\n getAuthorizationUrl(options: AuthorizationUrlOptions): string {\n return this.sso.getAuthorizationUrl(options);\n }\n\n /**\n * Exchange an authorization code and store the resulting token under the\n * character it belongs to. An existing token for that character is\n * replaced; storage never holds two entries for one character.\n */\n async addCharacter(\n code: string,\n options: AddCharacterOptions = {},\n ): Promise<StoredToken> {\n const response = await this.sso.exchangeCode(code, {\n codeVerifier: options.codeVerifier,\n redirectUri: options.redirectUri,\n });\n return this.storeResponse(response, {\n revokeReplaced: options.revokeReplaced,\n });\n }\n\n /**\n * Import tokens obtained elsewhere (a previous library version, another\n * tool, a migration). The character identity is decoded from the access\n * token; `expiresIn` is in seconds and defaults to the JWT `exp` claim.\n */\n async importToken(token: {\n accessToken: string;\n refreshToken: string;\n expiresIn?: number;\n }): Promise<StoredToken> {\n return this.storeResponse({\n accessToken: token.accessToken,\n refreshToken: token.refreshToken,\n expiresIn: token.expiresIn ?? 0,\n tokenType: 'Bearer',\n });\n }\n\n /** Delete a character's token, optionally revoking it at SSO first. */\n async removeCharacter(\n characterId: number,\n options: RemoveCharacterOptions = {},\n ): Promise<void> {\n const stored = await this.storage.get(characterId);\n if (!stored) return;\n if (options.revoke && !stored.revokedAt) {\n await this.sso.revoke(stored.refreshToken);\n }\n await this.storage.delete(characterId);\n this.bumpGeneration(characterId);\n this.inFlight.delete(characterId);\n }\n\n /** The stored record for a character, or null. */\n async getStoredToken(characterId: number): Promise<StoredToken | null> {\n return this.storage.get(characterId);\n }\n\n /** Every stored token. */\n async listTokens(): Promise<StoredToken[]> {\n return this.storage.list();\n }\n\n /** Every stored character without its secrets. */\n async listCharacters(): Promise<CharacterSummary[]> {\n const tokens = await this.storage.list();\n return tokens.map((t) => ({\n characterId: t.characterId,\n characterName: t.characterName,\n scopes: [...t.scopes],\n expiresAt: t.expiresAt,\n revoked: t.revokedAt !== undefined,\n }));\n }\n\n /** True when the stored token grants every listed scope. */\n async hasScopes(\n characterId: number,\n scopes: readonly string[],\n ): Promise<boolean> {\n const stored = await this.storage.get(characterId);\n if (!stored) return false;\n const granted = new Set(stored.scopes);\n return scopes.every((s) => granted.has(s));\n }\n\n /**\n * A usable access token for the character. With `autoRefresh` on, a token\n * inside the refresh skew is refreshed first.\n *\n * @throws CharacterNotFoundError when no token is stored\n * @throws TokenRevokedError when the character's refresh token is revoked\n */\n async getToken(characterId: number): Promise<string> {\n const stored = await this.requireStored(characterId);\n if (stored.revokedAt !== undefined) {\n throw new TokenRevokedError(\n `Refresh token for character ${characterId} was revoked; add the character again`,\n characterId,\n );\n }\n if (this.autoRefresh && this.isStale(stored)) {\n const refreshed = await this.refresh(characterId);\n return refreshed.accessToken;\n }\n return stored.accessToken;\n }\n\n /**\n * Refresh a character's token through SSO regardless of expiry. Concurrent\n * calls for the same character share one SSO request.\n */\n refresh(characterId: number): Promise<StoredToken> {\n const pending = this.inFlight.get(characterId);\n if (pending) return pending;\n\n const run: Promise<StoredToken> = this.doRefresh(characterId).finally(\n () => {\n // Only clear our own slot: a newer refresh may have replaced it.\n if (this.inFlight.get(characterId) === run) {\n this.inFlight.delete(characterId);\n }\n },\n );\n this.inFlight.set(characterId, run);\n return run;\n }\n\n /**\n * Refresh stored tokens with bounded concurrency. Per-character failures\n * never reject: each character gets its own {@link RefreshResult}. The one\n * rejection is a failing `storage.list()`, because with no records there\n * is no character to attribute the fault to and a silent empty run would\n * hide a broken store from a scheduler.\n */\n async refreshAll(options: RefreshAllOptions = {}): Promise<RefreshResult[]> {\n const tokens = await this.storage.list();\n const settled = await runWithConcurrency(\n tokens,\n (token) => this.refreshOne(token, options),\n { concurrency: options.concurrency, onProgress: options.onProgress },\n );\n return settled.map((entry, index) =>\n entry.status === 'fulfilled'\n ? entry.value\n : {\n characterId: tokens[index]!.characterId,\n status: 'failed',\n error: toError(entry.reason),\n retryable: false,\n },\n );\n }\n\n /**\n * A {@link TokenProvider} bound to a character, for `onTokenRefresh`. Every\n * invocation refreshes through SSO (coalesced), because the client only\n * calls it after ESI has rejected the current token.\n */\n tokenProviderFor(characterId: number): TokenProvider {\n return async () => {\n const refreshed = await this.refresh(characterId);\n return refreshed.accessToken;\n };\n }\n\n /**\n * An {@link EsiClient} whose access token and refresh provider are bound to\n * the character. The token is validated (and refreshed if stale) first.\n */\n async createClient(\n characterId: number,\n config: ManagedClientConfig = {},\n ): Promise<EsiClient> {\n const accessToken = await this.getToken(characterId);\n return new EsiClient({\n ...config,\n accessToken,\n onTokenRefresh: this.tokenProviderFor(characterId),\n });\n }\n\n // ── internals ───────────────────────────────────────────────────────\n\n private isStale(token: StoredToken, withinMs: number = 0): boolean {\n return token.expiresAt - this.refreshSkewMs <= this.now() + withinMs;\n }\n\n private async requireStored(characterId: number): Promise<StoredToken> {\n const stored = await this.storage.get(characterId);\n if (!stored) throw new CharacterNotFoundError(characterId);\n return stored;\n }\n\n private generationOf(characterId: number): number {\n return this.generations.get(characterId) ?? 0;\n }\n\n private bumpGeneration(characterId: number): void {\n this.generations.set(characterId, this.generationOf(characterId) + 1);\n }\n\n /**\n * After an SSO round trip, decide whether the refresh still owns the\n * character's record. Returns null when it does. When the record was\n * replaced meanwhile, returns the current record so the caller hands out\n * the newer credentials; when it was removed, throws CharacterNotFoundError.\n */\n private async supersededBy(\n characterId: number,\n generation: number,\n ): Promise<StoredToken | null> {\n if (this.generationOf(characterId) === generation) return null;\n const current = await this.storage.get(characterId);\n if (!current) throw new CharacterNotFoundError(characterId);\n this.logger.debug(\n `Discarding stale refresh for character ${characterId}; token was replaced while the refresh was in flight`,\n );\n return current;\n }\n\n private async doRefresh(characterId: number): Promise<StoredToken> {\n const stored = await this.requireStored(characterId);\n if (stored.revokedAt !== undefined) {\n throw new TokenRevokedError(\n `Refresh token for character ${characterId} was revoked; add the character again`,\n characterId,\n );\n }\n const generation = this.generationOf(characterId);\n let response: SsoTokenResponse;\n try {\n response = await this.sso.refresh(stored.refreshToken);\n } catch (err: unknown) {\n if (err instanceof TokenRevokedError) {\n // A revocation of a token that has since been replaced says nothing\n // about the replacement; a removed character has nothing to mark.\n const superseded = await this.supersededBy(characterId, generation);\n if (superseded) return superseded;\n const revoked = {\n ...stored,\n revokedAt: this.now(),\n updatedAt: this.now(),\n };\n await this.storage.set(characterId, revoked);\n this.logger.warn(\n `SSO revoked refresh token for character ${characterId}`,\n );\n this.hooks.onRevoked?.(characterId);\n throw new TokenRevokedError(err.message, characterId);\n }\n const error = toError(err);\n this.logger.error(\n `Token refresh failed for character ${characterId}: ${error.message}`,\n );\n this.hooks.onRefreshError?.(characterId, error);\n throw error;\n }\n const superseded = await this.supersededBy(characterId, generation);\n if (superseded) return superseded;\n const updated = this.buildStoredToken(response, stored);\n await this.storage.set(characterId, updated);\n this.logger.debug(`Refreshed token for character ${characterId}`);\n this.hooks.onRefresh?.(updated);\n return updated;\n }\n\n private async refreshOne(\n token: StoredToken,\n options: RefreshAllOptions,\n ): Promise<RefreshResult> {\n const { characterId } = token;\n if (options.signal?.aborted) {\n return { characterId, status: 'skipped', reason: 'aborted' };\n }\n if (token.revokedAt !== undefined) {\n return {\n characterId,\n status: 'revoked',\n error: new TokenRevokedError(\n `Refresh token for character ${characterId} was revoked`,\n characterId,\n ),\n retryable: false,\n };\n }\n if (\n options.expiringWithinMs !== undefined &&\n !this.isStale(token, options.expiringWithinMs)\n ) {\n return { characterId, status: 'skipped', reason: 'not-stale' };\n }\n try {\n const refreshed = await this.refresh(characterId);\n return {\n characterId,\n status: 'refreshed',\n expiresAt: refreshed.expiresAt,\n };\n } catch (err: unknown) {\n const error = toError(err);\n if (error instanceof TokenRevokedError) {\n return { characterId, status: 'revoked', error, retryable: false };\n }\n return {\n characterId,\n status: 'failed',\n error,\n retryable: error instanceof SsoError && error.isRetryable(),\n };\n }\n }\n\n private async storeResponse(\n response: SsoTokenResponse,\n options: { revokeReplaced?: boolean } = {},\n ): Promise<StoredToken> {\n const token = this.buildStoredToken(response);\n const existing = await this.storage.get(token.characterId);\n if (existing) {\n const missing = existing.scopes.filter((s) => !token.scopes.includes(s));\n if (missing.length > 0) {\n this.logger.warn(\n `Replacing token for character ${token.characterId} drops scopes: ${missing.join(' ')}`,\n );\n }\n if (options.revokeReplaced && !existing.revokedAt) {\n await this.sso.revoke(existing.refreshToken);\n }\n }\n await this.storage.set(token.characterId, token);\n this.bumpGeneration(token.characterId);\n this.inFlight.delete(token.characterId);\n return token;\n }\n\n /**\n * Build the record to persist. When adding a character the access token\n * must decode, because it is the only source of the character id. On a\n * refresh the identity is already known, so a token that does not decode\n * (a proxy, a future SSO format) keeps the previous record's identity.\n */\n private buildStoredToken(\n response: SsoTokenResponse,\n previous?: StoredToken,\n ): StoredToken {\n let decoded: Partial<DecodedAccessToken> = {};\n try {\n decoded = decodeAccessToken(response.accessToken);\n } catch (err: unknown) {\n if (!previous) throw err;\n this.logger.debug(\n `Refreshed access token for character ${previous.characterId} did not decode as a JWT; keeping stored identity`,\n );\n }\n const now = this.now();\n const expiresAt =\n response.expiresIn > 0\n ? now + response.expiresIn * 1000\n : (decoded.expiresAt ?? now);\n const scopes =\n decoded.scopes && decoded.scopes.length > 0\n ? decoded.scopes\n : (previous?.scopes ?? []);\n const token: StoredToken = {\n characterId: decoded.characterId ?? previous!.characterId,\n characterName: decoded.characterName || previous?.characterName || '',\n accessToken: response.accessToken,\n refreshToken: response.refreshToken,\n expiresAt,\n scopes,\n updatedAt: now,\n };\n const ownerHash = decoded.ownerHash ?? previous?.ownerHash;\n if (ownerHash !== undefined) token.ownerHash = ownerHash;\n return token;\n }\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport type { ITokenStorage, StoredToken } from '../types';\n\nconst FILE_FORMAT_VERSION = 1;\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\n/**\n * Accept a persisted entry only when it has the full StoredToken shape. A\n * partially corrupt record (a numeric id but no scopes, say) would otherwise\n * be cached and crash the first get() or list() that copies it.\n */\nfunction isStoredToken(value: unknown): value is StoredToken {\n if (typeof value !== 'object' || value === null) return false;\n const t = value as Record<string, unknown>;\n return (\n typeof t.characterId === 'number' &&\n typeof t.characterName === 'string' &&\n typeof t.accessToken === 'string' &&\n typeof t.refreshToken === 'string' &&\n typeof t.expiresAt === 'number' &&\n typeof t.updatedAt === 'number' &&\n isStringArray(t.scopes) &&\n (t.ownerHash === undefined || typeof t.ownerHash === 'string') &&\n (t.revokedAt === undefined || typeof t.revokedAt === 'number')\n );\n}\n\ninterface TokenFile {\n version: number;\n tokens: Record<string, StoredToken>;\n}\n\nexport interface FileTokenStorageOptions {\n /**\n * POSIX permission bits for the token file. Defaults to `0o600` (owner\n * read/write only). Ignored on platforms without POSIX modes.\n */\n mode?: number;\n}\n\n/**\n * JSON-file {@link ITokenStorage} for single-process applications.\n *\n * Writes go to a sibling temporary file that is renamed over the target, so a\n * crash mid-write leaves the previous file intact. Writes are serialised\n * within the process. Two processes sharing one file are not supported: each\n * would rotate refresh tokens the other cannot see.\n */\nexport class FileTokenStorage implements ITokenStorage {\n private readonly filePath: string;\n private readonly mode: number;\n private cache: Map<number, StoredToken> | null = null;\n private loading: Promise<Map<number, StoredToken>> | null = null;\n /** Bumped by invalidate() so a read that began earlier cannot repopulate the cache. */\n private loadGeneration = 0;\n private writeChain: Promise<void> = Promise.resolve();\n\n constructor(filePath: string, options: FileTokenStorageOptions = {}) {\n this.filePath = path.resolve(filePath);\n this.mode = options.mode ?? 0o600;\n }\n\n /** Absolute path of the backing file. */\n get path(): string {\n return this.filePath;\n }\n\n async get(characterId: number): Promise<StoredToken | null> {\n const tokens = await this.load();\n const token = tokens.get(characterId);\n return token ? { ...token, scopes: [...token.scopes] } : null;\n }\n\n async set(characterId: number, token: StoredToken): Promise<void> {\n const tokens = await this.load();\n tokens.set(characterId, { ...token, scopes: [...token.scopes] });\n await this.persist(tokens);\n }\n\n async delete(characterId: number): Promise<void> {\n const tokens = await this.load();\n if (tokens.delete(characterId)) {\n await this.persist(tokens);\n }\n }\n\n async list(): Promise<StoredToken[]> {\n const tokens = await this.load();\n return Array.from(tokens.values(), (token) => ({\n ...token,\n scopes: [...token.scopes],\n }));\n }\n\n /** Drop the in-memory copy so the next call re-reads the file. */\n invalidate(): void {\n this.loadGeneration++;\n this.cache = null;\n this.loading = null;\n }\n\n /**\n * Load once; overlapping first calls share the same read so none of them\n * clobbers another's map. A read that started before invalidate() still\n * resolves for its own callers but neither becomes the cache nor clears a\n * newer in-flight read.\n */\n private load(): Promise<Map<number, StoredToken>> {\n if (this.cache) return Promise.resolve(this.cache);\n if (!this.loading) {\n const generation = this.loadGeneration;\n const pending: Promise<Map<number, StoredToken>> = this.readFile()\n .then((map) => {\n if (this.loadGeneration === generation) this.cache = map;\n return map;\n })\n .finally(() => {\n if (this.loading === pending) this.loading = null;\n });\n this.loading = pending;\n }\n return this.loading;\n }\n\n private async readFile(): Promise<Map<number, StoredToken>> {\n let raw: string;\n try {\n raw = await fs.readFile(this.filePath, 'utf8');\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return new Map();\n }\n throw err;\n }\n const parsed = JSON.parse(raw) as Partial<TokenFile>;\n const map = new Map<number, StoredToken>();\n const entries: Record<string, unknown> = parsed.tokens ?? {};\n for (const token of Object.values(entries)) {\n if (isStoredToken(token)) {\n map.set(token.characterId, token);\n }\n }\n return map;\n }\n\n private persist(tokens: Map<number, StoredToken>): Promise<void> {\n const snapshot: TokenFile = {\n version: FILE_FORMAT_VERSION,\n tokens: {},\n };\n for (const [id, token] of tokens) {\n snapshot.tokens[String(id)] = token;\n }\n const run = async (): Promise<void> => {\n const dir = path.dirname(this.filePath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = `${this.filePath}.${process.pid}.${Date.now()}.tmp`;\n await fs.writeFile(tmp, JSON.stringify(snapshot, null, 2), {\n encoding: 'utf8',\n mode: this.mode,\n });\n await fs.rename(tmp, this.filePath);\n };\n this.writeChain = this.writeChain.then(run, run);\n return this.writeChain;\n }\n}\n","import { createHash, randomBytes } from 'crypto';\n\n/**\n * A PKCE verifier/challenge pair for the authorization-code flow of a public\n * client (one that cannot hold a client secret).\n */\nexport interface PkcePair {\n /** Random secret sent with the token request as `code_verifier`. */\n codeVerifier: string;\n /** `BASE64URL(SHA256(codeVerifier))`, sent in the authorization URL. */\n codeChallenge: string;\n /** Always `S256`; EVE SSO does not accept the plain method. */\n codeChallengeMethod: 'S256';\n}\n\n/** Generate a 32-byte base64url code verifier (43 characters). */\nexport function generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/** Derive the S256 code challenge for a verifier. */\nexport function codeChallengeFromVerifier(codeVerifier: string): string {\n return createHash('sha256').update(codeVerifier).digest('base64url');\n}\n\n/** Generate a verifier and its challenge in one call. */\nexport function generatePkcePair(): PkcePair {\n const codeVerifier = generateCodeVerifier();\n return {\n codeVerifier,\n codeChallenge: codeChallengeFromVerifier(codeVerifier),\n codeChallengeMethod: 'S256',\n };\n}\n\n/** Generate an unguessable OAuth2 `state` value. */\nexport function generateState(): string {\n return randomBytes(16).toString('base64url');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ESI.ts/ESI.ts/dist/index.js","../src/core/endpoints/buildEndpointPath.ts","../src/core/endpoints/createClient.ts","../src/clients/BaseEsiClient.ts","../src/core/endpoints/allianceEndpoints.ts","../src/core/endpoints/contactEndpoints.ts","../src/clients/AllianceClient.ts","../src/core/endpoints/assetEndpoints.ts","../src/clients/AssetsClient.ts","../src/core/endpoints/calendarEndpoints.ts","../src/clients/CalendarClient.ts","../src/core/endpoints/characterEndpoints.ts","../src/clients/CharacterClient.ts","../src/core/endpoints/cloneEndpoints.ts","../src/clients/ClonesClient.ts","../src/clients/ContactsClient.ts","../src/core/endpoints/contractEndpoints.ts","../src/clients/ContractsClient.ts","../src/core/endpoints/corporationEndpoints.ts","../src/clients/CorporationsClient.ts","../src/core/endpoints/corporationProjectEndpoints.ts","../src/clients/CorporationProjectsClient.ts","../src/core/endpoints/dogmaEndpoints.ts","../src/clients/DogmaClient.ts","../src/core/endpoints/factionEndpoints.ts","../src/clients/FactionClient.ts","../src/core/endpoints/fittingEndpoints.ts","../src/clients/FittingsClient.ts","../src/core/endpoints/fleetEndpoints.ts","../src/clients/FleetClient.ts","../src/core/endpoints/incursionEndpoints.ts","../src/clients/IncursionsClient.ts","../src/core/endpoints/industryEndpoints.ts","../src/clients/IndustryClient.ts","../src/core/endpoints/insuranceEndpoints.ts","../src/clients/InsuranceClient.ts","../src/core/endpoints/killmailEndpoints.ts","../src/clients/KillmailsClient.ts","../src/core/endpoints/locationEndpoints.ts","../src/clients/LocationClient.ts","../src/core/endpoints/loyaltyEndpoints.ts","../src/clients/LoyaltyClient.ts","../src/core/endpoints/mailEndpoints.ts","../src/clients/MailClient.ts","../src/core/endpoints/marketEndpoints.ts","../src/clients/MarketClient.ts","../src/core/endpoints/piEndpoints.ts","../src/clients/PiClient.ts","../src/core/endpoints/routeEndpoints.ts","../src/clients/RouteClient.ts","../src/core/endpoints/searchEndpoints.ts","../src/clients/SearchClient.ts","../src/core/endpoints/skillEndpoints.ts","../src/clients/SkillsClient.ts","../src/core/endpoints/sovereigntyEndpoints.ts","../src/clients/SovereigntyClient.ts","../src/core/endpoints/statusEndpoints.ts","../src/clients/StatusClient.ts","../src/core/endpoints/uiEndpoints.ts","../src/clients/UiClient.ts","../src/core/endpoints/universeEndpoints.ts","../src/clients/UniverseClient.ts","../src/core/endpoints/walletEndpoints.ts","../src/clients/WalletClient.ts","../src/core/endpoints/warEndpoints.ts","../src/clients/WarsClient.ts","../src/core/endpoints/metaEndpoints.ts","../src/clients/MetaClient.ts","../src/core/endpoints/freelanceJobsEndpoints.ts","../src/clients/FreelanceJobsClient.ts","../src/core/endpoints/skyhookEndpoints.ts","../src/clients/SkyhooksClient.ts","../src/core/endpoints/mercenaryEndpoints.ts","../src/clients/MercenaryClient.ts","../src/core/endpoints/accessListEndpoints.ts","../src/clients/AccessListsClient.ts","../src/core/endpoints/cosmeticsEndpoints.ts","../src/clients/CosmeticsClient.ts","../src/core/endpoints/paragonHubEndpoints.ts","../src/clients/ParagonHubClient.ts","../src/core/endpoints/militaryCampaignEndpoints.ts","../src/clients/MilitaryCampaignsClient.ts","../src/clients/ClientRegistry.ts","../src/core/EsiDiagnostics.ts","../src/core/BatchRequestHandler.ts","../src/EsiClient.ts","../src/EsiClientBuilder.ts","../src/core/ApiClientBuilder.ts","../src/core/endpoints/esi-scopes.generated.ts","../src/core/logger/NoopLogger.ts","../src/types/branded.ts","../src/types/generated/esi-spec.generated.ts","../src/auth/EveSsoClient.ts","../src/core/util/concurrency.ts","../src/auth/jwt.ts","../src/auth/storage/MemoryTokenStorage.ts","../src/auth/EsiTokenManager.ts","../src/auth/storage/FileTokenStorage.ts","../src/auth/pkce.ts"],"names":["path","response","responseBody","logWarn","z","logInfo","resolve","logDebug","superseded"],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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;AAClB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQkB,EAAA;AACA,IAAA;AAClB,EAAA;AACF;A3Dq0IyB;AACA;A4D14IP;AA4Be;AAChB,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACI,IAAA;AACpB,EAAA;AACqB,EAAA;AACb,IAAA;AACE,IAAA;AACM,IAAA;AACD,IAAA;AACG,IAAA;AAClB,EAAA;AACe,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACI,IAAA;AACpB,EAAA;AACe,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACI,IAAA;AACpB,EAAA;AACiB,EAAA;AACT,IAAA;AACE,IAAA;AACM,IAAA;AACD,IAAA;AACG,IAAA;AAClB,EAAA;AACmB,EAAA;AACX,IAAA;AACE,IAAA;AACM,IAAA;AACI,IAAA;AACpB,EAAA;AACsB,EAAA;AACd,IAAA;AACE,IAAA;AACM,IAAA;AACD,IAAA;AACG,IAAA;AAClB,EAAA;AACa,EAAA;AACL,IAAA;AACE,IAAA;AACM,IAAA;AACI,IAAA;AACpB,EAAA;AACa,EAAA;AACL,IAAA;AACE,IAAA;AACM,IAAA;AACI,IAAA;AACpB,EAAA;AACgB,EAAA;AACR,IAAA;AACE,IAAA;AACM,IAAA;AACD,IAAA;AACG,IAAA;AAClB,EAAA;AACe,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACI,IAAA;AACpB,EAAA;AACkB,EAAA;AACV,IAAA;AACE,IAAA;AACM,IAAA;AACD,IAAA;AACG,IAAA;AAClB,EAAA;AACoB,EAAA;AACZ,IAAA;AACE,IAAA;AACM,IAAA;AACA,IAAA;AACE,IAAA;AACC,IAAA;AACnB,EAAA;AACa,EAAA;AACL,IAAA;AACE,IAAA;AACM,IAAA;AACO,IAAA;AACL,IAAA;AAClB,EAAA;AACA,EAAA;AACQ,IAAA;AACE,IAAA;AACM,IAAA;AACA,IAAA;AACI,IAAA;AACD,IAAA;AACnB,EAAA;AACe,EAAA;AACP,IAAA;AACE,IAAA;AACM,IAAA;AACD,IAAA;AACG,IAAA;AAClB,EAAA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B;AACA;AwF/iNoC;AAC3D,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAC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CzB;AAGgB;AACI,EAAA;AACpB;AAGgB;AACO,EAAA;AACd,EAAA;AACL,IAAA;AACe,IAAA;AACM,IAAA;AACvB,EAAA;AACF;AAGwC;AACf,EAAA;AACzB;AlGsmPyB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ESI.ts/ESI.ts/dist/index.js","sourcesContent":[null,"import { EndpointDefinition } from './EndpointDefinition';\nimport { validatePathParam, validateQueryParam } from '../util/validation';\n\nexport interface EndpointPathResult {\n path: string;\n body: unknown;\n}\n\nexport function buildEndpointPath(\n def: EndpointDefinition,\n args: unknown[],\n datasource?: string,\n): EndpointPathResult {\n let argIndex = 0;\n let path = def.path;\n\n if (def.pathParams) {\n for (const param of def.pathParams) {\n const raw = args[argIndex++];\n const validated = validatePathParam(param, raw);\n path = path.replace(`{${param}}`, encodeURIComponent(validated));\n }\n }\n\n if (def.queryParams) {\n const queryParts: string[] = [];\n for (const [paramName, queryKey] of Object.entries(def.queryParams)) {\n const value = args[argIndex++];\n if (value !== undefined) {\n const validated = validateQueryParam(paramName, value);\n queryParts.push(`${queryKey}=${encodeURIComponent(validated)}`);\n }\n }\n if (queryParts.length > 0) {\n path += (path.includes('?') ? '&' : '?') + queryParts.join('&');\n }\n }\n\n let body: unknown = undefined;\n if (def.bodyBuilder) {\n /* eslint-disable @typescript-eslint/no-unsafe-argument */\n body = def.bodyBuilder(\n ...(args.slice(argIndex) as Parameters<typeof def.bodyBuilder>),\n );\n /* eslint-enable @typescript-eslint/no-unsafe-argument */\n } else if (def.hasBody) {\n // eslint-disable-next-line security/detect-object-injection\n body = args[argIndex];\n }\n\n if (datasource) {\n path +=\n (path.includes('?') ? '&' : '?') +\n `datasource=${encodeURIComponent(datasource)}`;\n }\n\n return { path, body };\n}\n","import { ApiClient } from '../ApiClient';\nimport { handleRequest, EsiHandlerResponse } from '../ApiRequestHandler';\nimport { EndpointMap, EndpointArgs } from './EndpointDefinition';\nimport { CursorTokens } from '../pagination/CursorPaginationHandler';\nimport {\n EsiResponse,\n EsiResult,\n EsiResponseMeta,\n} from '../../types/api-responses';\nimport { buildEndpointPath } from './buildEndpointPath';\nimport { parseWarning } from '../util/headersUtil';\nimport { logWarn } from '../logger/clientLog';\nimport { EsiValidationError, toEsiError } from '../util/error';\nimport { evictRejectedResponse, resolveCache } from '../requestPipeline';\nimport type { z } from 'zod';\n\nexport interface CursorOptions {\n before?: string;\n after?: string;\n}\n\nexport interface CursorResult<T = unknown> {\n data: T[];\n cursors: CursorTokens;\n}\n\nexport interface CreateClientOptions {\n returnMetadata?: boolean;\n safeMode?: boolean;\n}\n\n/** Extract the element type from an array type, or return T unchanged. */\nexport type UnwrapArray<T> = T extends readonly (infer E)[] ? E : T;\n\n/**\n * Infer the result type from an endpoint definition's responseSchema.\n *\n * - When `cursorPagination: true`, wraps in `CursorResult<ElementType>`.\n * - When `responseSchema` is present, uses `z.infer` to extract the type.\n * - Falls back to `unknown` when no `responseSchema` is defined.\n */\nexport type InferEndpointResult<D> = D extends { cursorPagination: true }\n ? D extends { responseSchema: infer S extends z.ZodType }\n ? CursorResult<UnwrapArray<z.infer<S>>>\n : CursorResult\n : D extends { responseSchema: infer S extends z.ZodType }\n ? z.infer<S>\n : unknown;\n\ntype ClientMethods<T extends EndpointMap> = {\n [K in keyof T]: (\n ...args: EndpointArgs<T[K]>\n ) => Promise<InferEndpointResult<T[K]>>;\n};\n\nexport type WithMetadata<T> = {\n [K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R>\n ? (...args: A) => Promise<EsiResponse<R>>\n : T[K];\n};\n\nexport type WithSafeMode<T> = {\n [K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R>\n ? (...args: A) => Promise<EsiResult<R>>\n : T[K];\n};\n\nfunction buildMeta(response: EsiHandlerResponse): EsiResponseMeta {\n const meta: EsiResponseMeta = {\n headers: response.headers,\n fromCache: response.fromCache ?? false,\n stale: response.stale ?? false,\n };\n if (response.cacheHitType) meta.cacheHitType = response.cacheHitType;\n if (response.responseTimeMs !== undefined)\n meta.responseTimeMs = response.responseTimeMs;\n const w = parseWarning(response.headers['warning']);\n if (w) meta.warning = w;\n if (response.headers['x-esi-request-id'])\n meta.requestId = response.headers['x-esi-request-id'];\n if (response.headers['date']) meta.date = response.headers['date'];\n if (response.headers['content-language'])\n meta.contentLanguage = response.headers['content-language'];\n if (response.headers['x-ratelimit-remaining']) {\n meta.rateLimit = {\n remaining: parseInt(response.headers['x-ratelimit-remaining'], 10),\n limit: parseInt(response.headers['x-ratelimit-limit'] ?? '0', 10),\n used: parseInt(response.headers['x-ratelimit-used'] ?? '0', 10),\n group: response.headers['x-ratelimit-group'] ?? null,\n };\n }\n if (response.headers['etag']) meta.etag = response.headers['etag'];\n if (response.headers['x-pages'])\n meta.pages = parseInt(response.headers['x-pages'], 10);\n if (response.headers['expires']) meta.expires = response.headers['expires'];\n if (response.headers['x-esi-error-limit-remain'])\n meta.errorLimitRemain = parseInt(\n response.headers['x-esi-error-limit-remain'],\n 10,\n );\n if (response.headers['x-esi-error-limit-reset'])\n meta.errorLimitReset = parseInt(\n response.headers['x-esi-error-limit-reset'],\n 10,\n );\n return meta;\n}\n\n/* eslint-disable sonarjs/cognitive-complexity */\nexport function createClient<T extends EndpointMap>(\n apiClient: ApiClient,\n endpoints: T,\n options?: CreateClientOptions,\n): ClientMethods<T> {\n const client = {} as ClientMethods<T>;\n const returnMetadata = options?.returnMetadata ?? false;\n const safeMode = options?.safeMode ?? false;\n\n for (const [methodName, def] of Object.entries(endpoints)) {\n // eslint-disable-next-line security/detect-object-injection\n (client as Record<string, (...args: unknown[]) => Promise<unknown>>)[\n methodName\n ] = async (...args: unknown[]) => {\n try {\n if (def.deprecated) {\n const parts = [`Endpoint '${methodName}' is deprecated.`];\n if (def.deprecated.message) parts.push(def.deprecated.message);\n if (def.deprecated.replacedBy)\n parts.push(`Use '${def.deprecated.replacedBy}' instead.`);\n if (def.deprecated.sunsetDate)\n parts.push(`Sunset date: ${def.deprecated.sunsetDate}.`);\n logWarn(apiClient, parts.join(' '), { endpoint: methodName });\n }\n\n const built = buildEndpointPath(def, args, apiClient.getDatasource());\n let path = built.path;\n const body = built.body;\n\n // Opt-in request body validation\n if (\n apiClient.getValidateRequest() &&\n def.requestSchema &&\n body != null\n ) {\n const reqResult = def.requestSchema.safeParse(body);\n if (!reqResult.success) {\n throw new EsiValidationError(\n `${apiClient.getLink()}/${path}`,\n reqResult.error,\n undefined,\n 'request',\n );\n }\n }\n\n if (def.cursorPagination) {\n const lastArg = args[args.length - 1];\n const isCursorArg =\n lastArg != null &&\n typeof lastArg === 'object' &&\n ('before' in lastArg || 'after' in lastArg);\n const cursorOpts: CursorOptions | undefined = isCursorArg\n ? (lastArg as CursorOptions)\n : undefined;\n\n if (cursorOpts) {\n const parts: string[] = [];\n if (cursorOpts.before)\n parts.push(`before=${encodeURIComponent(cursorOpts.before)}`);\n if (cursorOpts.after)\n parts.push(`after=${encodeURIComponent(cursorOpts.after)}`);\n if (parts.length > 0) {\n path += (path.includes('?') ? '&' : '?') + parts.join('&');\n }\n }\n\n const response = await handleRequest(\n apiClient,\n path,\n def.method,\n body,\n def.requiresAuth,\n true,\n def.path,\n );\n let responseBody = response.body;\n if (def.responseSchema && apiClient.getValidateResponse()) {\n const result = def.responseSchema.safeParse(responseBody);\n if (!result.success) {\n evictRejectedResponse(\n apiClient,\n path,\n def.requiresAuth,\n resolveCache,\n );\n throw new EsiValidationError(\n `${apiClient.getLink()}/${path}`,\n result.error,\n );\n }\n responseBody = result.data;\n }\n let data: unknown[];\n if (Array.isArray(responseBody)) {\n data = responseBody as unknown[];\n } else if (responseBody !== null && responseBody !== undefined) {\n data = [responseBody];\n } else {\n data = [];\n }\n const cursorResult: CursorResult = {\n data,\n cursors: response.cursors ?? { before: null, after: null },\n };\n\n if (returnMetadata || safeMode) {\n const meta = buildMeta(response);\n if (safeMode) {\n return { ok: true, data: cursorResult, meta };\n }\n return { data: cursorResult, meta };\n }\n return cursorResult;\n }\n\n const response = await handleRequest(\n apiClient,\n path,\n def.method,\n body,\n def.requiresAuth,\n true,\n def.path,\n undefined,\n def.textResponse,\n def.emptyWhenNoContent,\n );\n let responseBody = response.body;\n if (responseBody === undefined && def.emptyWhenNoContent) {\n responseBody = [];\n }\n if (def.responseSchema && apiClient.getValidateResponse()) {\n const result = def.responseSchema.safeParse(responseBody);\n if (!result.success) {\n evictRejectedResponse(\n apiClient,\n path,\n def.requiresAuth,\n resolveCache,\n );\n throw new EsiValidationError(\n `${apiClient.getLink()}/${path}`,\n result.error,\n );\n }\n responseBody = result.data;\n }\n if (safeMode) {\n return { ok: true, data: responseBody, meta: buildMeta(response) };\n }\n if (returnMetadata) {\n return { data: responseBody, meta: buildMeta(response) };\n }\n return responseBody;\n } catch (err) {\n if (safeMode) {\n return { ok: false, error: toEsiError(err) };\n }\n throw err;\n }\n };\n }\n\n return client;\n}\n/* eslint-enable sonarjs/cognitive-complexity */\n\n/**\n * Fetch all pages of a cursor-paginated endpoint.\n *\n * ESI returns cursor tokens in the response body. This helper follows\n * `after` tokens until the dataset is exhausted (empty items array).\n *\n * Usage with body-based cursors (ESI's actual format):\n * const allJobs = await fetchAllCursorPages(\n * (before, after) => client.freelanceJobs.getFreelanceJobs(before, after),\n * (response) => response.freelance_jobs,\n * (response) => response.cursor,\n * );\n *\n * Usage with CursorResult shape:\n * const all = await fetchAllCursorPages(\n * (before, after) => fetcher({ before, after }),\n * (r) => r.data,\n * (r) => r.cursors,\n * );\n */\nexport async function fetchAllCursorPages<TResponse, TItem = unknown>(\n fetcher: (before?: string, after?: string) => Promise<TResponse>,\n getItems: (response: TResponse) => TItem[],\n getCursor: (response: TResponse) => {\n before?: string | null | undefined;\n after?: string | null | undefined;\n },\n): Promise<TItem[]> {\n const allData: TItem[] = [];\n let afterToken: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const response = await fetcher(undefined, afterToken);\n const items = getItems(response);\n\n if (!items || items.length === 0) {\n hasMore = false;\n continue;\n }\n\n allData.push(...items);\n\n const cursor = getCursor(response);\n if (!cursor.after) {\n hasMore = false;\n continue;\n }\n\n afterToken = cursor.after;\n }\n\n return allData;\n}\n","import { ApiClient } from '../core/ApiClient';\nimport {\n createClient,\n CreateClientOptions,\n WithMetadata,\n WithSafeMode,\n} from '../core/endpoints/createClient';\nimport { EndpointMap } from '../core/endpoints/EndpointDefinition';\nimport { buildEndpointPath } from '../core/endpoints/buildEndpointPath';\nimport {\n fetchAllPages,\n fetchPages,\n PageResult,\n} from '../core/pagination/AsyncPaginationIterator';\n\n// A text endpoint (meta/openapi.yaml) is one document, not a page of JSON,\n// so the page helpers refuse it rather than fail parsing it as JSON.\nfunction notPageable(endpointName: string): TypeError {\n return new TypeError(\n `${endpointName} returns a text document and cannot be paged; call it directly.`,\n );\n}\n\ntype ClientMethods<T extends EndpointMap> = ReturnType<typeof createClient<T>>;\n\nexport abstract class BaseEsiClient<T extends EndpointMap> {\n protected api: ClientMethods<T>;\n protected _client: ApiClient;\n protected _endpoints: T;\n private _metaApi?: ClientMethods<T>;\n private _safeApi?: ClientMethods<T>;\n\n constructor(client: ApiClient, endpoints: T) {\n this._client = client;\n this._endpoints = endpoints;\n this.api = createClient(client, endpoints);\n }\n\n public streamEndpoint<R>(\n endpointName: string & keyof T,\n ...args: unknown[]\n ): AsyncGenerator<PageResult<R>, void, undefined> {\n const def = this._endpoints[endpointName]!;\n if (def.textResponse) throw notPageable(endpointName);\n const { path, body } = buildEndpointPath(\n def,\n args,\n this._client.getDatasource(),\n );\n return fetchPages<R>(\n this._client,\n path,\n def.method,\n def.requiresAuth,\n body,\n def.path,\n def.responseSchema,\n );\n }\n\n public fetchAllEndpoint<R>(\n endpointName: string & keyof T,\n args: unknown[],\n concurrency?: number,\n ): Promise<R[]> {\n const def = this._endpoints[endpointName]!;\n if (def.textResponse) return Promise.reject(notPageable(endpointName));\n const { path, body } = buildEndpointPath(\n def,\n args,\n this._client.getDatasource(),\n );\n return fetchAllPages<R>(\n this._client,\n path,\n def.method,\n def.requiresAuth,\n body,\n def.path,\n def.responseSchema,\n concurrency,\n );\n }\n\n withMetadata(): WithMetadata<Omit<this, 'withMetadata' | 'withSafeMode'>> {\n if (!this._metaApi) {\n this._metaApi = createClient(this._client, this._endpoints, {\n returnMetadata: true,\n });\n }\n return this._metaApi as unknown as WithMetadata<\n Omit<this, 'withMetadata' | 'withSafeMode'>\n >;\n }\n\n withSafeMode(): WithSafeMode<Omit<this, 'withMetadata' | 'withSafeMode'>> {\n if (!this._safeApi) {\n this._safeApi = createClient(this._client, this._endpoints, {\n safeMode: true,\n });\n }\n return this._safeApi as unknown as WithSafeMode<\n Omit<this, 'withMetadata' | 'withSafeMode'>\n >;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { AllianceInfoSchema, AllianceIconSchema } from '../../schemas/alliance';\n\nexport const allianceEndpoints = {\n getAllianceById: {\n path: 'alliances/{allianceId}/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['allianceId'],\n responseSchema: AllianceInfoSchema,\n },\n getCorporations: {\n path: 'alliances/{allianceId}/corporations/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['allianceId'],\n responseSchema: z.array(z.number()),\n },\n getIcons: {\n path: 'alliances/{allianceId}/icons/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['allianceId'],\n responseSchema: AllianceIconSchema,\n },\n getAlliances: {\n path: 'alliances',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n ContactSchema,\n ContactLabelSchema,\n AddedContactIdsSchema,\n} from '../../schemas/contacts';\n\nexport const contactEndpoints = {\n getAllianceContacts: {\n path: 'alliances/{allianceId}/contacts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['allianceId'],\n responseSchema: z.array(ContactSchema),\n },\n getAllianceContactLabels: {\n path: 'alliances/{allianceId}/contacts/labels',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['allianceId'],\n responseSchema: z.array(ContactLabelSchema),\n },\n getCharacterContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContactSchema),\n },\n getCharacterContactLabels: {\n path: 'characters/{characterId}/contacts/labels',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContactLabelSchema),\n },\n getCorporationContacts: {\n path: 'corporations/{corporationId}/contacts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContactSchema),\n },\n getCorporationContactLabels: {\n path: 'corporations/{corporationId}/contacts/labels',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContactLabelSchema),\n },\n addContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'POST',\n responseSchema: AddedContactIdsSchema,\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { standing: 'standing' },\n bodyBuilder: (contactIds: number[]) => contactIds,\n requestSchema: z.array(z.number().int()),\n },\n editContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { standing: 'standing' },\n bodyBuilder: (contactIds: number[]) => contactIds,\n },\n deleteCharacterContacts: {\n path: 'characters/{characterId}/contacts',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { contactIds: 'contact_ids' },\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { createClient } from '../core/endpoints/createClient';\nimport { allianceEndpoints } from '../core/endpoints/allianceEndpoints';\nimport { contactEndpoints } from '../core/endpoints/contactEndpoints';\nimport {\n AllianceInfo,\n AllianceContact,\n AllianceContactLabel,\n AllianceIcon,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\nimport { logWarn } from '../core/logger/clientLog';\n\nexport class AllianceClient extends BaseEsiClient<typeof allianceEndpoints> {\n private contactApi: ReturnType<typeof createClient<typeof contactEndpoints>>;\n\n constructor(client: ApiClient) {\n super(client, allianceEndpoints);\n this.contactApi = createClient(client, contactEndpoints);\n }\n\n /**\n * Retrieve public information about an alliance.\n *\n * @param allianceId - The ID of the alliance to look up\n * @returns Public alliance information including name, ticker, and founding date\n */\n getAllianceById(allianceId: number): Promise<AllianceInfo> {\n return this.api.getAllianceById(allianceId);\n }\n\n /**\n * Retrieve contacts for an alliance.\n *\n * @deprecated Use ContactsClient.getAllianceContacts() instead\n * @param allianceId - The ID of the alliance whose contacts to retrieve\n * @returns A list of alliance contacts with standings and contact types\n * @requires Authentication\n */\n getContacts(allianceId: number): Promise<AllianceContact[]> {\n logWarn(\n this._client,\n 'AllianceClient.getContacts() is deprecated. Use ContactsClient.getAllianceContacts() instead. Planned removal in next major version.',\n { allianceId },\n );\n // Schema mismatch: ContactSchema uses a wider contact_type enum than AllianceContactSchema.\n // Cast through unknown until schemas are unified.\n return this.contactApi.getAllianceContacts(allianceId);\n }\n\n /**\n * Retrieve custom contact labels for an alliance.\n *\n * @deprecated Use ContactsClient.getAllianceContactLabels() instead\n * @param allianceId - The ID of the alliance whose contact labels to retrieve\n * @returns A list of custom labels used to categorize alliance contacts\n * @requires Authentication\n */\n getContactLabels(allianceId: number): Promise<AllianceContactLabel[]> {\n logWarn(\n this._client,\n 'AllianceClient.getContactLabels() is deprecated. Use ContactsClient.getAllianceContactLabels() instead. Planned removal in next major version.',\n { allianceId },\n );\n // Schema mismatch: ContactLabelSchema vs AllianceContactLabelSchema are structurally\n // identical but TypeScript treats them as distinct nominal types from different schemas.\n return this.contactApi.getAllianceContactLabels(allianceId);\n }\n\n /**\n * Retrieve the list of corporation IDs that are members of an alliance.\n *\n * @param allianceId - The ID of the alliance whose member corporations to retrieve\n * @returns An array of corporation IDs belonging to the alliance\n */\n getCorporations(allianceId: number): Promise<number[]> {\n return this.api.getCorporations(allianceId);\n }\n\n /**\n * Retrieve icon URLs for an alliance.\n *\n * @param allianceId - The ID of the alliance whose icons to retrieve\n * @returns Icon URLs at various resolutions for the alliance\n */\n getIcons(allianceId: number): Promise<AllianceIcon> {\n return this.api.getIcons(allianceId);\n }\n\n /**\n * Retrieve a list of all active alliance IDs in EVE Online.\n *\n * @returns An array of all active alliance IDs\n */\n getAlliances(): Promise<number[]> {\n return this.api.getAlliances();\n }\n\n fetchAllAlliances(concurrency?: number): Promise<number[]> {\n return this.fetchAllEndpoint<number>('getAlliances', [], concurrency);\n }\n\n fetchAllCorporations(\n allianceId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getCorporations',\n [allianceId],\n concurrency,\n );\n }\n\n streamAlliances(): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getAlliances');\n }\n\n streamCorporations(\n allianceId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getCorporations', allianceId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterAssetSchema,\n AssetLocationSchema,\n AssetNameSchema,\n} from '../../schemas/assets';\n\nexport const assetEndpoints = {\n getCharacterAssets: {\n path: 'characters/{characterId}/assets/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterAssetSchema),\n },\n getCorporationAssets: {\n path: 'corporations/{corporationId}/assets/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CharacterAssetSchema),\n },\n postCharacterAssetLocations: {\n path: 'characters/{characterId}/assets/locations/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n responseSchema: z.array(AssetLocationSchema),\n },\n postCharacterAssetNames: {\n path: 'characters/{characterId}/assets/names/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['characterId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n responseSchema: z.array(AssetNameSchema),\n },\n postCorporationAssetLocations: {\n path: 'corporations/{corporationId}/assets/locations/',\n method: 'POST',\n responseSchema: z.array(AssetLocationSchema),\n requiresAuth: true,\n pathParams: ['corporationId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n },\n postCorporationAssetNames: {\n path: 'corporations/{corporationId}/assets/names/',\n method: 'POST',\n responseSchema: z.array(AssetNameSchema),\n requiresAuth: true,\n pathParams: ['corporationId'],\n bodyBuilder: (itemIds: number[]) => itemIds,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { assetEndpoints } from '../core/endpoints/assetEndpoints';\nimport {\n CharacterAsset,\n AssetLocation,\n AssetName,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class AssetsClient extends BaseEsiClient<typeof assetEndpoints> {\n constructor(client: ApiClient) {\n super(client, assetEndpoints);\n }\n\n /**\n * Retrieve a list of assets owned by a character.\n *\n * @param characterId - The ID of the character whose assets to retrieve\n * @returns A list of the character's assets including type, quantity, and location\n * @requires Authentication\n */\n getCharacterAssets(characterId: number): Promise<CharacterAsset[]> {\n return this.api.getCharacterAssets(characterId);\n }\n\n /**\n * Look up the locations of specific assets owned by a character via a bulk POST request.\n *\n * @param characterId - The ID of the character who owns the assets\n * @param itemIds - An array of item IDs to look up locations for\n * @returns Location information for each requested asset\n * @requires Authentication\n */\n postCharacterAssetLocations(\n characterId: number,\n itemIds: number[],\n ): Promise<AssetLocation[]> {\n return this.api.postCharacterAssetLocations(characterId, itemIds);\n }\n\n /**\n * Look up the names of specific assets owned by a character via a bulk POST request.\n *\n * @param characterId - The ID of the character who owns the assets\n * @param itemIds - An array of item IDs to look up names for\n * @returns The user-assigned names for each requested asset\n * @requires Authentication\n */\n postCharacterAssetNames(\n characterId: number,\n itemIds: number[],\n ): Promise<AssetName[]> {\n return this.api.postCharacterAssetNames(characterId, itemIds);\n }\n\n /**\n * Retrieve a list of assets owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose assets to retrieve\n * @returns A list of the corporation's assets including type, quantity, and location\n * @requires Authentication\n */\n getCorporationAssets(corporationId: number): Promise<CharacterAsset[]> {\n return this.api.getCorporationAssets(corporationId);\n }\n\n /**\n * Look up the locations of specific assets owned by a corporation via a bulk POST request.\n *\n * @param corporationId - The ID of the corporation that owns the assets\n * @param itemIds - An array of item IDs to look up locations for\n * @returns Location information for each requested asset\n * @requires Authentication\n */\n postCorporationAssetLocations(\n corporationId: number,\n itemIds: number[],\n ): Promise<AssetLocation[]> {\n return this.api.postCorporationAssetLocations(\n corporationId,\n itemIds,\n ) as Promise<AssetLocation[]>;\n }\n\n /**\n * Look up the names of specific assets owned by a corporation via a bulk POST request.\n *\n * @param corporationId - The ID of the corporation that owns the assets\n * @param itemIds - An array of item IDs to look up names for\n * @returns The user-assigned names for each requested asset\n * @requires Authentication\n */\n postCorporationAssetNames(\n corporationId: number,\n itemIds: number[],\n ): Promise<AssetName[]> {\n return this.api.postCorporationAssetNames(\n corporationId,\n itemIds,\n ) as Promise<AssetName[]>;\n }\n\n fetchAllCharacterAssets(\n characterId: number,\n concurrency?: number,\n ): Promise<CharacterAsset[]> {\n return this.fetchAllEndpoint<CharacterAsset>(\n 'getCharacterAssets',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationAssets(\n corporationId: number,\n concurrency?: number,\n ): Promise<CharacterAsset[]> {\n return this.fetchAllEndpoint<CharacterAsset>(\n 'getCorporationAssets',\n [corporationId],\n concurrency,\n );\n }\n\n streamCharacterAssets(\n characterId: number,\n ): AsyncGenerator<PageResult<CharacterAsset>, void, undefined> {\n return this.streamEndpoint<CharacterAsset>(\n 'getCharacterAssets',\n characterId,\n );\n }\n\n streamCorporationAssets(\n corporationId: number,\n ): AsyncGenerator<PageResult<CharacterAsset>, void, undefined> {\n return this.streamEndpoint<CharacterAsset>(\n 'getCorporationAssets',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CalendarEventSchema,\n CalendarEventDetailSchema,\n CalendarEventAttendeeSchema,\n} from '../../schemas/calendar';\n\nexport const calendarEndpoints = {\n getCalendarEvents: {\n path: 'characters/{characterId}/calendar/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CalendarEventSchema),\n },\n getCalendarEventById: {\n path: 'characters/{characterId}/calendar/{eventId}/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'eventId'],\n responseSchema: CalendarEventDetailSchema,\n },\n getEventAttendees: {\n path: 'characters/{characterId}/calendar/{eventId}/attendees/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'eventId'],\n responseSchema: z.array(CalendarEventAttendeeSchema),\n },\n respondToCalendarEvent: {\n path: 'characters/{characterId}/calendar/{eventId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['characterId', 'eventId'],\n bodyBuilder: (response: string) => ({ response }),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { calendarEndpoints } from '../core/endpoints/calendarEndpoints';\nimport {\n CalendarEvent,\n CalendarEventDetail,\n CalendarEventAttendee,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CalendarClient extends BaseEsiClient<typeof calendarEndpoints> {\n constructor(client: ApiClient) {\n super(client, calendarEndpoints);\n }\n\n /**\n * Retrieve a character's upcoming calendar events.\n *\n * @param characterId - The ID of the character whose calendar events to retrieve\n * @returns A list of upcoming calendar events\n * @requires Authentication\n */\n getCalendarEvents(characterId: number): Promise<CalendarEvent[]> {\n return this.api.getCalendarEvents(characterId);\n }\n\n /**\n * Retrieve detailed information about a specific calendar event for a character.\n *\n * @param characterId - The ID of the character who owns the event\n * @param eventId - The ID of the calendar event to retrieve\n * @returns Detailed event information including title, description, and timing\n * @requires Authentication\n */\n getCalendarEventById(\n characterId: number,\n eventId: number,\n ): Promise<CalendarEventDetail> {\n return this.api.getCalendarEventById(characterId, eventId);\n }\n\n /**\n * Set a character's response to a calendar event (accepted, declined, or tentative).\n *\n * @param characterId - The ID of the character responding to the event\n * @param eventId - The ID of the calendar event to respond to\n * @param response - The response status to set for this event\n * @requires Authentication\n */\n respondToCalendarEvent(\n characterId: number,\n eventId: number,\n response: string,\n ): Promise<void> {\n return this.api.respondToCalendarEvent(\n characterId,\n eventId,\n response,\n ) as Promise<void>;\n }\n\n /**\n * Retrieve the list of attendees and their response statuses for a calendar event.\n *\n * @param characterId - The ID of the character who owns the event\n * @param eventId - The ID of the calendar event whose attendees to retrieve\n * @returns A list of attendees with their response statuses\n * @requires Authentication\n */\n getEventAttendees(\n characterId: number,\n eventId: number,\n ): Promise<CalendarEventAttendee[]> {\n return this.api.getEventAttendees(characterId, eventId);\n }\n\n fetchAllCalendarEvents(\n characterId: number,\n concurrency?: number,\n ): Promise<CalendarEvent[]> {\n return this.fetchAllEndpoint<CalendarEvent>(\n 'getCalendarEvents',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllEventAttendees(\n characterId: number,\n eventId: number,\n concurrency?: number,\n ): Promise<CalendarEventAttendee[]> {\n return this.fetchAllEndpoint<CalendarEventAttendee>(\n 'getEventAttendees',\n [characterId, eventId],\n concurrency,\n );\n }\n\n streamCalendarEvents(\n characterId: number,\n ): AsyncGenerator<PageResult<CalendarEvent>, void, undefined> {\n return this.streamEndpoint<CalendarEvent>('getCalendarEvents', characterId);\n }\n\n streamEventAttendees(\n characterId: number,\n eventId: number,\n ): AsyncGenerator<PageResult<CalendarEventAttendee>, void, undefined> {\n return this.streamEndpoint<CalendarEventAttendee>(\n 'getEventAttendees',\n characterId,\n eventId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterInfoSchema,\n CharacterPortraitSchema,\n AgentResearchSchema,\n BlueprintSchema,\n CorporationHistorySchema,\n JumpFatigueSchema,\n MedalSchema,\n NotificationSchema,\n CharacterTitleSchema,\n CharacterRoleSchema,\n ContactNotificationSchema,\n CharacterAffiliationSchema,\n CspaChargeCostSchema,\n} from '../../schemas/character';\nimport { StandingSchema } from '../../schemas/common';\n\nexport const characterEndpoints = {\n getCharacterPublicInfo: {\n path: 'characters/{characterId}/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['characterId'],\n responseSchema: CharacterInfoSchema,\n },\n getAgentsResearch: {\n path: 'characters/{characterId}/agents_research/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(AgentResearchSchema),\n },\n getBlueprints: {\n path: 'characters/{characterId}/blueprints/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(BlueprintSchema),\n },\n getRoles: {\n path: 'characters/{characterId}/roles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterRoleSchema,\n },\n getStandings: {\n path: 'characters/{characterId}/standings',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(StandingSchema),\n },\n getTitles: {\n path: 'characters/{characterId}/titles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterTitleSchema),\n },\n getContactNotifications: {\n path: 'characters/{characterId}/notifications/contacts/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContactNotificationSchema),\n },\n getCorporationHistory: {\n path: 'characters/{characterId}/corporationhistory/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['characterId'],\n responseSchema: z.array(CorporationHistorySchema),\n },\n getJumpFatigue: {\n path: 'characters/{characterId}/fatigue/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: JumpFatigueSchema,\n },\n getMedals: {\n path: 'characters/{characterId}/medals/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MedalSchema),\n },\n getNotifications: {\n path: 'characters/{characterId}/notifications/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(NotificationSchema),\n },\n getPortrait: {\n path: 'characters/{characterId}/portrait/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['characterId'],\n responseSchema: CharacterPortraitSchema,\n },\n postCharacterAffiliation: {\n path: 'characters/affiliation',\n method: 'POST',\n responseSchema: z.array(CharacterAffiliationSchema),\n requiresAuth: false,\n hasBody: true,\n },\n calculateCspaChargeCost: {\n path: 'characters/{characterId}/cspa/',\n method: 'POST',\n responseSchema: CspaChargeCostSchema,\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { characterEndpoints } from '../core/endpoints/characterEndpoints';\nimport {\n CharacterInfo,\n CharacterPortrait,\n AgentResearch,\n Blueprint,\n CorporationHistory,\n JumpFatigue,\n Medal,\n Notification,\n Standing,\n CharacterTitle,\n CharacterAffiliation,\n CharacterRole,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CharacterClient extends BaseEsiClient<typeof characterEndpoints> {\n constructor(client: ApiClient) {\n super(client, characterEndpoints);\n }\n\n /**\n * Retrieve publicly available information about a character.\n *\n * @param characterId - The ID of the character to look up\n * @returns Public character information including name, corporation, and birthday\n */\n getCharacterPublicInfo(characterId: number): Promise<CharacterInfo> {\n return this.api.getCharacterPublicInfo(characterId);\n }\n\n /**\n * Retrieve a character's active research agents and their accumulated research points.\n *\n * @param characterId - The ID of the character whose research agents to retrieve\n * @returns A list of research agents with skill, points, and start date information\n * @requires Authentication\n */\n getCharacterAgentsResearch(characterId: number): Promise<AgentResearch[]> {\n return this.api.getAgentsResearch(characterId);\n }\n\n /**\n * Retrieve blueprints owned by a character.\n *\n * @param characterId - The ID of the character whose blueprints to retrieve\n * @returns A list of blueprints with material/time efficiency and run information\n * @requires Authentication\n */\n getCharacterBlueprints(characterId: number): Promise<Blueprint[]> {\n return this.api.getBlueprints(characterId);\n }\n\n /**\n * Retrieve the corporation membership history of a character (public endpoint).\n *\n * @param characterId - The ID of the character whose corporation history to retrieve\n * @returns A chronological list of corporations the character has been a member of\n */\n getCharacterCorporationHistory(\n characterId: number,\n ): Promise<CorporationHistory[]> {\n return this.api.getCorporationHistory(characterId);\n }\n\n /**\n * Calculate the CSPA (CONCORD Spam Prevention Act) charge cost for sending mail to a set of characters.\n *\n * @param characterId - The ID of the character who would be sending mail\n * @param characters - An array of character IDs to calculate CSPA charges for\n * @returns The total CSPA charge cost in ISK\n * @requires Authentication\n */\n postCspaChargeCost(\n characterId: number,\n characters: number[],\n ): Promise<number> {\n return this.api.calculateCspaChargeCost(\n characterId,\n characters,\n ) as Promise<number>;\n }\n\n /**\n * Retrieve a character's current jump fatigue and activation cooldown timers.\n *\n * @param characterId - The ID of the character whose jump fatigue to retrieve\n * @returns Jump fatigue expiry dates and last jump information\n * @requires Authentication\n */\n getCharacterFatigue(characterId: number): Promise<JumpFatigue> {\n return this.api.getJumpFatigue(characterId);\n }\n\n /**\n * Retrieve medals awarded to a character.\n *\n * @param characterId - The ID of the character whose medals to retrieve\n * @returns A list of medals the character has been awarded\n * @requires Authentication\n */\n getCharacterMedals(characterId: number): Promise<Medal[]> {\n return this.api.getMedals(characterId);\n }\n\n /**\n * Retrieve a character's notifications from the notification center.\n *\n * @param characterId - The ID of the character whose notifications to retrieve\n * @returns A list of notifications including type, sender, and timestamp\n * @requires Authentication\n */\n getCharacterNotifications(characterId: number): Promise<Notification[]> {\n return this.api.getNotifications(characterId);\n }\n\n /**\n * Retrieve notifications related to contact changes for a character.\n *\n * @param characterId - The ID of the character whose contact notifications to retrieve\n * @returns A list of contact-related notifications\n * @requires Authentication\n */\n getCharacterNotificationsContacts(\n characterId: number,\n ): Promise<Notification[]> {\n // Schema mismatch: ContactNotification schema differs from Notification type.\n // Cast through unknown until schema is aligned with the type.\n return this.api.getContactNotifications(characterId) as unknown as Promise<\n Notification[]\n >;\n }\n\n /**\n * Retrieve portrait image URLs for a character at various resolutions.\n *\n * @param characterId - The ID of the character whose portrait to retrieve\n * @returns Portrait URLs at different resolutions (64x64, 128x128, 256x256, 512x512)\n */\n getCharacterPortrait(characterId: number): Promise<CharacterPortrait> {\n return this.api.getPortrait(characterId);\n }\n\n /**\n * Retrieve the corporation roles assigned to a character.\n *\n * @param characterId - The ID of the character whose roles to retrieve\n * @returns The character's roles including regular, HQ, base, and other role categories\n * @requires Authentication\n */\n getCharacterRoles(characterId: number): Promise<CharacterRole> {\n return this.api.getRoles(characterId);\n }\n\n /**\n * Retrieve a character's standings with NPC factions, corporations, and agents.\n *\n * @param characterId - The ID of the character whose standings to retrieve\n * @returns A list of standings with from_type, from_id, and standing value\n * @requires Authentication\n */\n getCharacterStandings(characterId: number): Promise<Standing[]> {\n return this.api.getStandings(characterId);\n }\n\n /**\n * Retrieve the corporation titles held by a character.\n *\n * @param characterId - The ID of the character whose titles to retrieve\n * @returns A list of corporation titles assigned to the character\n * @requires Authentication\n */\n getCharacterTitles(characterId: number): Promise<CharacterTitle[]> {\n return this.api.getTitles(characterId);\n }\n\n /**\n * Look up the current corporation, alliance, and faction affiliations for a set of characters via a bulk POST request.\n *\n * @param characters - An array of character IDs to look up affiliations for\n * @returns Affiliation data including corporation, alliance, and faction IDs for each character\n */\n postCharacterAffiliation(\n characters: number[],\n ): Promise<CharacterAffiliation[]> {\n return this.api.postCharacterAffiliation(characters) as Promise<\n CharacterAffiliation[]\n >;\n }\n\n fetchAllCharacterAgentsResearch(\n characterId: number,\n concurrency?: number,\n ): Promise<AgentResearch[]> {\n return this.fetchAllEndpoint<AgentResearch>(\n 'getAgentsResearch',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterBlueprints(\n characterId: number,\n concurrency?: number,\n ): Promise<Blueprint[]> {\n return this.fetchAllEndpoint<Blueprint>(\n 'getBlueprints',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterCorporationHistory(\n characterId: number,\n concurrency?: number,\n ): Promise<CorporationHistory[]> {\n return this.fetchAllEndpoint<CorporationHistory>(\n 'getCorporationHistory',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterMedals(\n characterId: number,\n concurrency?: number,\n ): Promise<Medal[]> {\n return this.fetchAllEndpoint<Medal>(\n 'getMedals',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterNotifications(\n characterId: number,\n concurrency?: number,\n ): Promise<Notification[]> {\n return this.fetchAllEndpoint<Notification>(\n 'getNotifications',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterNotificationsContacts(\n characterId: number,\n concurrency?: number,\n ): Promise<Notification[]> {\n return this.fetchAllEndpoint<Notification>(\n 'getContactNotifications',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterStandings(\n characterId: number,\n concurrency?: number,\n ): Promise<Standing[]> {\n return this.fetchAllEndpoint<Standing>(\n 'getStandings',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterTitles(\n characterId: number,\n concurrency?: number,\n ): Promise<CharacterTitle[]> {\n return this.fetchAllEndpoint<CharacterTitle>(\n 'getTitles',\n [characterId],\n concurrency,\n );\n }\n\n streamCharacterAgentsResearch(\n characterId: number,\n ): AsyncGenerator<PageResult<AgentResearch>, void, undefined> {\n return this.streamEndpoint<AgentResearch>('getAgentsResearch', characterId);\n }\n\n streamCharacterBlueprints(\n characterId: number,\n ): AsyncGenerator<PageResult<Blueprint>, void, undefined> {\n return this.streamEndpoint<Blueprint>('getBlueprints', characterId);\n }\n\n streamCharacterCorporationHistory(\n characterId: number,\n ): AsyncGenerator<PageResult<CorporationHistory>, void, undefined> {\n return this.streamEndpoint<CorporationHistory>(\n 'getCorporationHistory',\n characterId,\n );\n }\n\n streamCharacterMedals(\n characterId: number,\n ): AsyncGenerator<PageResult<Medal>, void, undefined> {\n return this.streamEndpoint<Medal>('getMedals', characterId);\n }\n\n streamCharacterNotifications(\n characterId: number,\n ): AsyncGenerator<PageResult<Notification>, void, undefined> {\n return this.streamEndpoint<Notification>('getNotifications', characterId);\n }\n\n streamCharacterNotificationsContacts(\n characterId: number,\n ): AsyncGenerator<PageResult<Notification>, void, undefined> {\n return this.streamEndpoint<Notification>(\n 'getContactNotifications',\n characterId,\n );\n }\n\n streamCharacterStandings(\n characterId: number,\n ): AsyncGenerator<PageResult<Standing>, void, undefined> {\n return this.streamEndpoint<Standing>('getStandings', characterId);\n }\n\n streamCharacterTitles(\n characterId: number,\n ): AsyncGenerator<PageResult<CharacterTitle>, void, undefined> {\n return this.streamEndpoint<CharacterTitle>('getTitles', characterId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { CloneInfoSchema } from '../../schemas/clones';\n\nexport const cloneEndpoints = {\n getClones: {\n path: 'characters/{characterId}/clones',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CloneInfoSchema,\n },\n getImplants: {\n path: 'characters/{characterId}/implants',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { cloneEndpoints } from '../core/endpoints/cloneEndpoints';\nimport { CloneInfo } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class ClonesClient extends BaseEsiClient<typeof cloneEndpoints> {\n constructor(client: ApiClient) {\n super(client, cloneEndpoints);\n }\n\n /**\n * Retrieve a character's clone state, including home station and available jump clones.\n *\n * @param characterId - The ID of the character whose clone information to retrieve\n * @returns Clone information including home location and jump clone details\n * @requires Authentication\n */\n getClones(characterId: number): Promise<CloneInfo> {\n return this.api.getClones(characterId);\n }\n\n /**\n * Retrieve the implants currently installed in a character's active clone.\n *\n * @param characterId - The ID of the character whose implants to retrieve\n * @returns An array of type IDs for the currently installed implants\n * @requires Authentication\n */\n getImplants(characterId: number): Promise<number[]> {\n return this.api.getImplants(characterId);\n }\n\n fetchAllImplants(\n characterId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getImplants',\n [characterId],\n concurrency,\n );\n }\n\n streamImplants(\n characterId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getImplants', characterId);\n }\n}\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { contactEndpoints } from '../core/endpoints/contactEndpoints';\nimport { Contact, ContactLabel } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class ContactsClient extends BaseEsiClient<typeof contactEndpoints> {\n constructor(client: ApiClient) {\n super(client, contactEndpoints);\n }\n\n /**\n * Retrieve contacts for an alliance.\n *\n * @param allianceId - The ID of the alliance whose contacts to retrieve\n * @returns A list of alliance contacts with standings and contact types\n * @requires Authentication\n */\n getAllianceContacts(allianceId: number): Promise<Contact[]> {\n return this.api.getAllianceContacts(allianceId);\n }\n\n /**\n * Retrieve custom contact labels for an alliance.\n *\n * @param allianceId - The ID of the alliance whose contact labels to retrieve\n * @returns A list of custom labels used to categorize alliance contacts\n * @requires Authentication\n */\n getAllianceContactLabels(allianceId: number): Promise<ContactLabel[]> {\n return this.api.getAllianceContactLabels(allianceId);\n }\n\n /**\n * Delete contacts from a character's contact list.\n *\n * @param characterId - The ID of the character whose contacts to delete\n * @param contactIds - An array of contact IDs to remove\n * @requires Authentication\n */\n deleteCharacterContacts(\n characterId: number,\n contactIds: number[],\n ): Promise<void> {\n return this.api.deleteCharacterContacts(\n characterId,\n contactIds.join(','),\n ) as Promise<void>;\n }\n\n /**\n * Retrieve a character's contact list.\n *\n * @param characterId - The ID of the character whose contacts to retrieve\n * @returns A list of character contacts with standings, labels, and contact types\n * @requires Authentication\n */\n getCharacterContacts(characterId: number): Promise<Contact[]> {\n return this.api.getCharacterContacts(characterId);\n }\n\n /**\n * Add contacts to a character's contact list via a POST request.\n *\n * @param characterId - The ID of the character to add contacts for\n * @param standing - Standing value for the contacts (-10 to 10)\n * @param contactIds - Array of character/corporation/alliance IDs to add\n * @returns An array of contact IDs that were successfully added\n * @requires Authentication\n */\n postCharacterContacts(\n characterId: number,\n standing: number,\n contactIds: number[],\n ): Promise<number[]> {\n return this.api.addContacts(characterId, standing, contactIds) as Promise<\n number[]\n >;\n }\n\n /**\n * Update existing contacts in a character's contact list via a PUT request.\n *\n * @param characterId - The ID of the character whose contacts to update\n * @param standing - New standing value for the contacts (-10 to 10)\n * @param contactIds - Array of contact IDs to update\n * @requires Authentication\n */\n putCharacterContacts(\n characterId: number,\n standing: number,\n contactIds: number[],\n ): Promise<void> {\n return this.api.editContacts(\n characterId,\n standing,\n contactIds,\n ) as Promise<void>;\n }\n\n /**\n * Retrieve custom contact labels for a character.\n *\n * @param characterId - The ID of the character whose contact labels to retrieve\n * @returns A list of custom labels used to categorize character contacts\n * @requires Authentication\n */\n getCharacterContactLabels(characterId: number): Promise<ContactLabel[]> {\n return this.api.getCharacterContactLabels(characterId);\n }\n\n /**\n * Retrieve contacts for a corporation.\n *\n * @param corporationId - The ID of the corporation whose contacts to retrieve\n * @returns A list of corporation contacts with standings and contact types\n * @requires Authentication\n */\n getCorporationContacts(corporationId: number): Promise<Contact[]> {\n return this.api.getCorporationContacts(corporationId);\n }\n\n /**\n * Retrieve custom contact labels for a corporation.\n *\n * @param corporationId - The ID of the corporation whose contact labels to retrieve\n * @returns A list of custom labels used to categorize corporation contacts\n * @requires Authentication\n */\n getCorporationContactLabels(corporationId: number): Promise<ContactLabel[]> {\n return this.api.getCorporationContactLabels(corporationId);\n }\n\n fetchAllAllianceContacts(\n allianceId: number,\n concurrency?: number,\n ): Promise<Contact[]> {\n return this.fetchAllEndpoint<Contact>(\n 'getAllianceContacts',\n [allianceId],\n concurrency,\n );\n }\n\n fetchAllAllianceContactLabels(\n allianceId: number,\n concurrency?: number,\n ): Promise<ContactLabel[]> {\n return this.fetchAllEndpoint<ContactLabel>(\n 'getAllianceContactLabels',\n [allianceId],\n concurrency,\n );\n }\n\n fetchAllCharacterContacts(\n characterId: number,\n concurrency?: number,\n ): Promise<Contact[]> {\n return this.fetchAllEndpoint<Contact>(\n 'getCharacterContacts',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterContactLabels(\n characterId: number,\n concurrency?: number,\n ): Promise<ContactLabel[]> {\n return this.fetchAllEndpoint<ContactLabel>(\n 'getCharacterContactLabels',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationContacts(\n corporationId: number,\n concurrency?: number,\n ): Promise<Contact[]> {\n return this.fetchAllEndpoint<Contact>(\n 'getCorporationContacts',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationContactLabels(\n corporationId: number,\n concurrency?: number,\n ): Promise<ContactLabel[]> {\n return this.fetchAllEndpoint<ContactLabel>(\n 'getCorporationContactLabels',\n [corporationId],\n concurrency,\n );\n }\n\n streamAllianceContacts(\n allianceId: number,\n ): AsyncGenerator<PageResult<Contact>, void, undefined> {\n return this.streamEndpoint<Contact>('getAllianceContacts', allianceId);\n }\n\n streamAllianceContactLabels(\n allianceId: number,\n ): AsyncGenerator<PageResult<ContactLabel>, void, undefined> {\n return this.streamEndpoint<ContactLabel>(\n 'getAllianceContactLabels',\n allianceId,\n );\n }\n\n streamCharacterContacts(\n characterId: number,\n ): AsyncGenerator<PageResult<Contact>, void, undefined> {\n return this.streamEndpoint<Contact>('getCharacterContacts', characterId);\n }\n\n streamCharacterContactLabels(\n characterId: number,\n ): AsyncGenerator<PageResult<ContactLabel>, void, undefined> {\n return this.streamEndpoint<ContactLabel>(\n 'getCharacterContactLabels',\n characterId,\n );\n }\n\n streamCorporationContacts(\n corporationId: number,\n ): AsyncGenerator<PageResult<Contact>, void, undefined> {\n return this.streamEndpoint<Contact>(\n 'getCorporationContacts',\n corporationId,\n );\n }\n\n streamCorporationContactLabels(\n corporationId: number,\n ): AsyncGenerator<PageResult<ContactLabel>, void, undefined> {\n return this.streamEndpoint<ContactLabel>(\n 'getCorporationContactLabels',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n ContractSchema,\n PublicContractSchema,\n ContractBidSchema,\n ContractItemSchema,\n PublicContractBidSchema,\n PublicContractItemSchema,\n} from '../../schemas/contracts';\n\nexport const contractEndpoints = {\n getCharacterContracts: {\n path: 'characters/{characterId}/contracts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(ContractSchema),\n },\n getCharacterContractBids: {\n path: 'characters/{characterId}/contracts/{contractId}/bids',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'contractId'],\n responseSchema: z.array(ContractBidSchema),\n },\n getCharacterContractItems: {\n path: 'characters/{characterId}/contracts/{contractId}/items',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'contractId'],\n responseSchema: z.array(ContractItemSchema),\n },\n getCorporationContracts: {\n path: 'corporations/{corporationId}/contracts',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContractSchema),\n },\n getCorporationContractBids: {\n path: 'corporations/{corporationId}/contracts/{contractId}/bids',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'contractId'],\n responseSchema: z.array(ContractBidSchema),\n },\n getCorporationContractItems: {\n path: 'corporations/{corporationId}/contracts/{contractId}/items',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'contractId'],\n responseSchema: z.array(ContractItemSchema),\n },\n getPublicContracts: {\n path: 'contracts/public/{regionId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n responseSchema: z.array(PublicContractSchema),\n },\n getPublicContractBids: {\n path: 'contracts/public/bids/{contractId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['contractId'],\n responseSchema: z.array(PublicContractBidSchema),\n // ESI answers an expired or accepted contract with no content.\n emptyWhenNoContent: true,\n },\n getPublicContractItems: {\n path: 'contracts/public/items/{contractId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['contractId'],\n responseSchema: z.array(PublicContractItemSchema),\n // ESI answers an expired or accepted contract with no content.\n emptyWhenNoContent: true,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { contractEndpoints } from '../core/endpoints/contractEndpoints';\nimport {\n Contract,\n ContractBid,\n ContractItem,\n PublicContract,\n PublicContractBid,\n PublicContractItem,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class ContractsClient extends BaseEsiClient<typeof contractEndpoints> {\n constructor(client: ApiClient) {\n super(client, contractEndpoints);\n }\n\n /**\n * Retrieve contracts issued by or assigned to a character.\n *\n * @param characterId - The ID of the character whose contracts to retrieve\n * @returns A list of contracts with type, status, and pricing information\n * @requires Authentication\n */\n getCharacterContracts(characterId: number): Promise<Contract[]> {\n return this.api.getCharacterContracts(characterId);\n }\n\n /**\n * Retrieve bids placed on an auction contract owned by a character.\n *\n * @param characterId - The ID of the character who owns the contract\n * @param contractId - The ID of the contract whose bids to retrieve\n * @returns A list of bids with bidder, amount, and timestamp\n * @requires Authentication\n */\n getCharacterContractBids(\n characterId: number,\n contractId: number,\n ): Promise<ContractBid[]> {\n return this.api.getCharacterContractBids(characterId, contractId);\n }\n\n /**\n * Retrieve the items included in a contract owned by a character.\n *\n * @param characterId - The ID of the character who owns the contract\n * @param contractId - The ID of the contract whose items to retrieve\n * @returns A list of items in the contract with type, quantity, and included/excluded status\n * @requires Authentication\n */\n getCharacterContractItems(\n characterId: number,\n contractId: number,\n ): Promise<ContractItem[]> {\n return this.api.getCharacterContractItems(characterId, contractId);\n }\n\n /**\n * Retrieve publicly available contracts in a specific region.\n *\n * @param regionId - The ID of the region whose public contracts to retrieve\n * @returns A list of public contracts in the region. ESI sends no status\n * or availability on these: every listed contract is public and outstanding.\n */\n getPublicContracts(regionId: number): Promise<PublicContract[]> {\n return this.api.getPublicContracts(regionId);\n }\n\n /**\n * Retrieve bids placed on a public auction contract.\n *\n * @param contractId - The ID of the public contract whose bids to retrieve\n * @returns A list of bids with amount and timestamp. ESI does not name the\n * bidder on a public contract.\n */\n getPublicContractBids(contractId: number): Promise<PublicContractBid[]> {\n return this.api.getPublicContractBids(contractId);\n }\n\n /**\n * Retrieve the items included in a public contract.\n *\n * @param contractId - The ID of the public contract whose items to retrieve\n * @returns A list of items in the contract with type, quantity, and included/excluded\n * status; blueprint lines also carry item ID, efficiencies and runs\n */\n getPublicContractItems(contractId: number): Promise<PublicContractItem[]> {\n return this.api.getPublicContractItems(contractId);\n }\n\n /**\n * Retrieve contracts issued by or assigned to a corporation.\n *\n * @param corporationId - The ID of the corporation whose contracts to retrieve\n * @returns A list of contracts with type, status, and pricing information\n * @requires Authentication\n */\n getCorporationContracts(corporationId: number): Promise<Contract[]> {\n return this.api.getCorporationContracts(corporationId);\n }\n\n /**\n * Retrieve bids placed on an auction contract owned by a corporation.\n *\n * @param corporationId - The ID of the corporation that owns the contract\n * @param contractId - The ID of the contract whose bids to retrieve\n * @returns A list of bids with bidder, amount, and timestamp\n * @requires Authentication\n */\n getCorporationContractBids(\n corporationId: number,\n contractId: number,\n ): Promise<ContractBid[]> {\n return this.api.getCorporationContractBids(corporationId, contractId);\n }\n\n /**\n * Retrieve the items included in a contract owned by a corporation.\n *\n * @param corporationId - The ID of the corporation that owns the contract\n * @param contractId - The ID of the contract whose items to retrieve\n * @returns A list of items in the contract with type, quantity, and included/excluded status\n * @requires Authentication\n */\n getCorporationContractItems(\n corporationId: number,\n contractId: number,\n ): Promise<ContractItem[]> {\n return this.api.getCorporationContractItems(corporationId, contractId);\n }\n\n fetchAllPublicContracts(\n regionId: number,\n concurrency?: number,\n ): Promise<PublicContract[]> {\n return this.fetchAllEndpoint<PublicContract>(\n 'getPublicContracts',\n [regionId],\n concurrency,\n );\n }\n\n fetchAllCharacterContracts(\n characterId: number,\n concurrency?: number,\n ): Promise<Contract[]> {\n return this.fetchAllEndpoint<Contract>(\n 'getCharacterContracts',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationContracts(\n corporationId: number,\n concurrency?: number,\n ): Promise<Contract[]> {\n return this.fetchAllEndpoint<Contract>(\n 'getCorporationContracts',\n [corporationId],\n concurrency,\n );\n }\n\n streamPublicContracts(\n regionId: number,\n ): AsyncGenerator<PageResult<PublicContract>, void, undefined> {\n return this.streamEndpoint<PublicContract>('getPublicContracts', regionId);\n }\n\n streamCharacterContracts(\n characterId: number,\n ): AsyncGenerator<PageResult<Contract>, void, undefined> {\n return this.streamEndpoint<Contract>('getCharacterContracts', characterId);\n }\n\n streamCorporationContracts(\n corporationId: number,\n ): AsyncGenerator<PageResult<Contract>, void, undefined> {\n return this.streamEndpoint<Contract>(\n 'getCorporationContracts',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n CorporationInfoSchema,\n CorporationAllianceHistorySchema,\n ContainerLogSchema,\n CorporationDivisionsSchema,\n CorporationFacilitySchema,\n CorporationMedalSchema,\n CorporationIssuedMedalSchema,\n CorporationMemberTitleSchema,\n CorporationMemberTrackingSchema,\n CorporationMemberRoleSchema,\n CorporationRoleHistorySchema,\n CorporationShareholderSchema,\n CorporationStarbaseSchema,\n CorporationStarbaseDetailSchema,\n CorporationStructureSchema,\n CorporationTitleSchema,\n CorporationIconSchema,\n CorporationStandingSchema,\n CorporationWalletDivisionSchema,\n} from '../../schemas/corporation';\nimport { BlueprintSchema } from '../../schemas/character';\n\nexport const corporationEndpoints = {\n getCorporationInfo: {\n path: 'corporations/{corporationId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: CorporationInfoSchema,\n },\n getCorporationAllianceHistory: {\n path: 'corporations/{corporationId}/alliancehistory',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationAllianceHistorySchema),\n },\n getCorporationBlueprints: {\n path: 'corporations/{corporationId}/blueprints',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(BlueprintSchema),\n },\n getCorporationAlscLogs: {\n path: 'corporations/{corporationId}/containers/logs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(ContainerLogSchema),\n },\n getCorporationDivisions: {\n path: 'corporations/{corporationId}/divisions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: CorporationDivisionsSchema,\n },\n getCorporationFacilities: {\n path: 'corporations/{corporationId}/facilities',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationFacilitySchema),\n },\n getCorporationIcon: {\n path: 'corporations/{corporationId}/icons',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: CorporationIconSchema,\n },\n getCorporationMedals: {\n path: 'corporations/{corporationId}/medals',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMedalSchema),\n },\n getCorporationIssuedMedals: {\n path: 'corporations/{corporationId}/medals/issued',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationIssuedMedalSchema),\n },\n getCorporationMembers: {\n path: 'corporations/{corporationId}/members',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(z.number()),\n },\n getCorporationMemberLimit: {\n path: 'corporations/{corporationId}/members/limit',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.number(),\n },\n getCorporationMembersTitles: {\n path: 'corporations/{corporationId}/members/titles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMemberTitleSchema),\n },\n getCorporationMemberTracking: {\n path: 'corporations/{corporationId}/membertracking',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMemberTrackingSchema),\n },\n getCorporationMemberRoles: {\n path: 'corporations/{corporationId}/roles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMemberRoleSchema),\n },\n getCorporationMemberRolesHistory: {\n path: 'corporations/{corporationId}/roles/history',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationRoleHistorySchema),\n },\n getCorporationShareholders: {\n path: 'corporations/{corporationId}/shareholders',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationShareholderSchema),\n },\n getCorporationStandings: {\n path: 'corporations/{corporationId}/standings',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationStandingSchema),\n },\n getCorporationStarbases: {\n path: 'corporations/{corporationId}/starbases',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationStarbaseSchema),\n },\n getCorporationStarbaseDetail: {\n path: 'corporations/{corporationId}/starbases/{starbaseId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'starbaseId'],\n responseSchema: CorporationStarbaseDetailSchema,\n },\n getCorporationStructures: {\n path: 'corporations/{corporationId}/structures',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationStructureSchema),\n },\n getCorporationTitles: {\n path: 'corporations/{corporationId}/titles',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationTitleSchema),\n },\n getNpcCorporations: {\n path: 'corporations/npccorps',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { corporationEndpoints } from '../core/endpoints/corporationEndpoints';\nimport {\n Blueprint,\n CorporationInfo,\n CorporationAllianceHistory,\n CorporationDivisions,\n CorporationFacility,\n CorporationIssuedMedal,\n CorporationMedal,\n CorporationMemberRole,\n CorporationMemberTitle,\n CorporationMemberTracking,\n CorporationRoleHistory,\n CorporationShareholder,\n CorporationStarbase,\n CorporationStarbaseDetail,\n CorporationStructure,\n CorporationTitle,\n ContainerLog,\n Standing,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CorporationsClient extends BaseEsiClient<\n typeof corporationEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, corporationEndpoints);\n }\n\n /**\n * Retrieve public information about a corporation.\n *\n * @param corporationId - The ID of the corporation to look up\n * @returns Public corporation information including name, ticker, member count, and CEO\n */\n getCorporationInfo(corporationId: number): Promise<CorporationInfo> {\n return this.api.getCorporationInfo(corporationId);\n }\n\n /**\n * Retrieve the alliance membership history of a corporation.\n *\n * @param corporationId - The ID of the corporation whose alliance history to retrieve\n * @returns A chronological list of alliances the corporation has been a member of\n */\n getCorporationAllianceHistory(\n corporationId: number,\n ): Promise<CorporationAllianceHistory[]> {\n return this.api.getCorporationAllianceHistory(corporationId);\n }\n\n /**\n * Retrieve blueprints owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose blueprints to retrieve\n * @returns A list of blueprints with material/time efficiency and run information\n * @requires Authentication\n */\n getCorporationBlueprints(corporationId: number): Promise<Blueprint[]> {\n return this.api.getCorporationBlueprints(corporationId);\n }\n\n /**\n * Retrieve audit log secure container (ALSC) logs for a corporation.\n *\n * @param corporationId - The ID of the corporation whose container logs to retrieve\n * @returns A list of container access logs with action, character, and timestamp details\n * @requires Authentication\n */\n getCorporationAlscLogs(corporationId: number): Promise<ContainerLog[]> {\n return this.api.getCorporationAlscLogs(corporationId);\n }\n\n /**\n * Retrieve the hangar and wallet division names for a corporation.\n *\n * @param corporationId - The ID of the corporation whose divisions to retrieve\n * @returns Hangar and wallet division configurations with custom names\n * @requires Authentication\n */\n getCorporationDivisions(\n corporationId: number,\n ): Promise<CorporationDivisions> {\n return this.api.getCorporationDivisions(corporationId);\n }\n\n /**\n * Retrieve the industrial facilities owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose facilities to retrieve\n * @returns A list of corporation-owned facilities with type and solar system information\n * @requires Authentication\n */\n getCorporationFacilities(\n corporationId: number,\n ): Promise<CorporationFacility[]> {\n return this.api.getCorporationFacilities(corporationId);\n }\n\n /**\n * Retrieve icon URLs for a corporation at various resolutions.\n *\n * @param corporationId - The ID of the corporation whose icons to retrieve\n * @returns Icon URLs at 64x64, 128x128, and 256x256 resolutions\n */\n getCorporationIcon(corporationId: number): Promise<{\n px64x64?: string | undefined;\n px128x128?: string | undefined;\n px256x256?: string | undefined;\n }> {\n return this.api.getCorporationIcon(corporationId);\n }\n\n /**\n * Retrieve medals created by a corporation.\n *\n * @param corporationId - The ID of the corporation whose medals to retrieve\n * @returns A list of medals defined by the corporation\n * @requires Authentication\n */\n getCorporationMedals(corporationId: number): Promise<CorporationMedal[]> {\n return this.api.getCorporationMedals(corporationId);\n }\n\n /**\n * Retrieve medals that have been issued to members by a corporation.\n *\n * @param corporationId - The ID of the corporation whose issued medals to retrieve\n * @returns A list of medals issued to corporation members with recipient and issuer details\n * @requires Authentication\n */\n getCorporationIssuedMedals(\n corporationId: number,\n ): Promise<CorporationIssuedMedal[]> {\n return this.api.getCorporationIssuedMedals(corporationId);\n }\n\n /**\n * Retrieve the character IDs of all members in a corporation.\n *\n * @param corporationId - The ID of the corporation whose members to retrieve\n * @returns An array of character IDs for all corporation members\n * @requires Authentication\n */\n getCorporationMembers(corporationId: number): Promise<number[]> {\n return this.api.getCorporationMembers(corporationId);\n }\n\n /**\n * Retrieve the maximum number of members a corporation can have based on its current skills.\n *\n * @param corporationId - The ID of the corporation whose member limit to retrieve\n * @returns The maximum member count for the corporation\n * @requires Authentication\n */\n getCorporationMemberLimit(corporationId: number): Promise<number> {\n return this.api.getCorporationMemberLimit(corporationId);\n }\n\n /**\n * Retrieve the titles assigned to each member of a corporation.\n *\n * @param corporationId - The ID of the corporation whose member titles to retrieve\n * @returns A list of members and their assigned title IDs\n * @requires Authentication\n */\n getCorporationMemberTitles(\n corporationId: number,\n ): Promise<CorporationMemberTitle[]> {\n return this.api.getCorporationMembersTitles(corporationId);\n }\n\n /**\n * Retrieve tracking information for corporation members including last login and location.\n *\n * @param corporationId - The ID of the corporation whose member tracking data to retrieve\n * @returns A list of members with login times, ship types, and location details\n * @requires Authentication\n */\n getCorporationMemberTracking(\n corporationId: number,\n ): Promise<CorporationMemberTracking[]> {\n return this.api.getCorporationMemberTracking(corporationId);\n }\n\n /**\n * Retrieve the roles assigned to each member of a corporation.\n *\n * @param corporationId - The ID of the corporation whose member roles to retrieve\n * @returns A list of members and their assigned roles across all role categories\n * @requires Authentication\n */\n getCorporationRoles(corporationId: number): Promise<CorporationMemberRole[]> {\n return this.api.getCorporationMemberRoles(corporationId);\n }\n\n /**\n * Retrieve the history of role changes for members of a corporation.\n *\n * @param corporationId - The ID of the corporation whose role change history to retrieve\n * @returns A chronological list of role changes with before/after states and issuer details\n * @requires Authentication\n */\n getCorporationRolesHistory(\n corporationId: number,\n ): Promise<CorporationRoleHistory[]> {\n return this.api.getCorporationMemberRolesHistory(corporationId);\n }\n\n /**\n * Retrieve the shareholders of a corporation, including characters and corporations holding shares.\n *\n * @param corporationId - The ID of the corporation whose shareholders to retrieve\n * @returns A list of shareholders with share counts and holder types\n * @requires Authentication\n */\n getCorporationShareholders(\n corporationId: number,\n ): Promise<CorporationShareholder[]> {\n return this.api.getCorporationShareholders(corporationId);\n }\n\n /**\n * Retrieve a corporation's standings with NPC factions, corporations, and agents.\n *\n * @param corporationId - The ID of the corporation whose standings to retrieve\n * @returns A list of standings with from_type, from_id, and standing value\n * @requires Authentication\n */\n getCorporationStandings(corporationId: number): Promise<Standing[]> {\n return this.api.getCorporationStandings(corporationId);\n }\n\n /**\n * Retrieve the list of starbases (POSes) owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose starbases to retrieve\n * @returns A list of starbases with type, system, and state information\n * @requires Authentication\n */\n getCorporationStarbases(\n corporationId: number,\n ): Promise<CorporationStarbase[]> {\n return this.api.getCorporationStarbases(corporationId);\n }\n\n /**\n * Retrieve detailed configuration and fuel information for a specific starbase (POS).\n *\n * @param corporationId - The ID of the corporation that owns the starbase\n * @param starbaseId - The ID of the starbase to retrieve details for\n * @returns Detailed starbase information including fuel levels and access settings\n * @requires Authentication\n */\n getCorporationStarbaseDetail(\n corporationId: number,\n starbaseId: number,\n ): Promise<CorporationStarbaseDetail> {\n return this.api.getCorporationStarbaseDetail(corporationId, starbaseId);\n }\n\n /**\n * Retrieve citadel and other upwell structures owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose structures to retrieve\n * @returns A list of structures with type, location, state, and service information\n * @requires Authentication\n */\n getCorporationStructures(\n corporationId: number,\n ): Promise<CorporationStructure[]> {\n return this.api.getCorporationStructures(corporationId);\n }\n\n /**\n * Retrieve the titles defined by a corporation and their associated roles.\n *\n * @param corporationId - The ID of the corporation whose titles to retrieve\n * @returns A list of corporation titles with names and granted roles\n * @requires Authentication\n */\n getCorporationTitles(corporationId: number): Promise<CorporationTitle[]> {\n return this.api.getCorporationTitles(corporationId);\n }\n\n /**\n * Retrieve a list of all NPC corporation IDs in EVE Online.\n *\n * @returns An array of NPC corporation IDs\n */\n getNpcCorporations(): Promise<number[]> {\n return this.api.getNpcCorporations();\n }\n\n fetchAllCorporationAllianceHistory(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationAllianceHistory[]> {\n return this.fetchAllEndpoint<CorporationAllianceHistory>(\n 'getCorporationAllianceHistory',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationBlueprints(\n corporationId: number,\n concurrency?: number,\n ): Promise<Blueprint[]> {\n return this.fetchAllEndpoint<Blueprint>(\n 'getCorporationBlueprints',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationAlscLogs(\n corporationId: number,\n concurrency?: number,\n ): Promise<ContainerLog[]> {\n return this.fetchAllEndpoint<ContainerLog>(\n 'getCorporationAlscLogs',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationFacilities(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationFacility[]> {\n return this.fetchAllEndpoint<CorporationFacility>(\n 'getCorporationFacilities',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMedals(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMedal[]> {\n return this.fetchAllEndpoint<CorporationMedal>(\n 'getCorporationMedals',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationIssuedMedals(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationIssuedMedal[]> {\n return this.fetchAllEndpoint<CorporationIssuedMedal>(\n 'getCorporationIssuedMedals',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMembers(\n corporationId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getCorporationMembers',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMemberTitles(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMemberTitle[]> {\n return this.fetchAllEndpoint<CorporationMemberTitle>(\n 'getCorporationMembersTitles',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMemberTracking(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMemberTracking[]> {\n return this.fetchAllEndpoint<CorporationMemberTracking>(\n 'getCorporationMemberTracking',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationRoles(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMemberRole[]> {\n return this.fetchAllEndpoint<CorporationMemberRole>(\n 'getCorporationMemberRoles',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationRolesHistory(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationRoleHistory[]> {\n return this.fetchAllEndpoint<CorporationRoleHistory>(\n 'getCorporationMemberRolesHistory',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationShareholders(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationShareholder[]> {\n return this.fetchAllEndpoint<CorporationShareholder>(\n 'getCorporationShareholders',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationStandings(\n corporationId: number,\n concurrency?: number,\n ): Promise<Standing[]> {\n return this.fetchAllEndpoint<Standing>(\n 'getCorporationStandings',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationStarbases(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationStarbase[]> {\n return this.fetchAllEndpoint<CorporationStarbase>(\n 'getCorporationStarbases',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationStructures(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationStructure[]> {\n return this.fetchAllEndpoint<CorporationStructure>(\n 'getCorporationStructures',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationTitles(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationTitle[]> {\n return this.fetchAllEndpoint<CorporationTitle>(\n 'getCorporationTitles',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllNpcCorporations(concurrency?: number): Promise<number[]> {\n return this.fetchAllEndpoint<number>('getNpcCorporations', [], concurrency);\n }\n\n streamCorporationAllianceHistory(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationAllianceHistory>, void, undefined> {\n return this.streamEndpoint<CorporationAllianceHistory>(\n 'getCorporationAllianceHistory',\n corporationId,\n );\n }\n\n streamCorporationBlueprints(\n corporationId: number,\n ): AsyncGenerator<PageResult<Blueprint>, void, undefined> {\n return this.streamEndpoint<Blueprint>(\n 'getCorporationBlueprints',\n corporationId,\n );\n }\n\n streamCorporationAlscLogs(\n corporationId: number,\n ): AsyncGenerator<PageResult<ContainerLog>, void, undefined> {\n return this.streamEndpoint<ContainerLog>(\n 'getCorporationAlscLogs',\n corporationId,\n );\n }\n\n streamCorporationFacilities(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationFacility>, void, undefined> {\n return this.streamEndpoint<CorporationFacility>(\n 'getCorporationFacilities',\n corporationId,\n );\n }\n\n streamCorporationMedals(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMedal>, void, undefined> {\n return this.streamEndpoint<CorporationMedal>(\n 'getCorporationMedals',\n corporationId,\n );\n }\n\n streamCorporationIssuedMedals(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationIssuedMedal>, void, undefined> {\n return this.streamEndpoint<CorporationIssuedMedal>(\n 'getCorporationIssuedMedals',\n corporationId,\n );\n }\n\n streamCorporationMembers(\n corporationId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getCorporationMembers', corporationId);\n }\n\n streamCorporationMemberTitles(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMemberTitle>, void, undefined> {\n return this.streamEndpoint<CorporationMemberTitle>(\n 'getCorporationMembersTitles',\n corporationId,\n );\n }\n\n streamCorporationMemberTracking(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMemberTracking>, void, undefined> {\n return this.streamEndpoint<CorporationMemberTracking>(\n 'getCorporationMemberTracking',\n corporationId,\n );\n }\n\n streamCorporationRoles(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMemberRole>, void, undefined> {\n return this.streamEndpoint<CorporationMemberRole>(\n 'getCorporationMemberRoles',\n corporationId,\n );\n }\n\n streamCorporationRolesHistory(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationRoleHistory>, void, undefined> {\n return this.streamEndpoint<CorporationRoleHistory>(\n 'getCorporationMemberRolesHistory',\n corporationId,\n );\n }\n\n streamCorporationShareholders(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationShareholder>, void, undefined> {\n return this.streamEndpoint<CorporationShareholder>(\n 'getCorporationShareholders',\n corporationId,\n );\n }\n\n streamCorporationStandings(\n corporationId: number,\n ): AsyncGenerator<PageResult<Standing>, void, undefined> {\n return this.streamEndpoint<Standing>(\n 'getCorporationStandings',\n corporationId,\n );\n }\n\n streamCorporationStarbases(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationStarbase>, void, undefined> {\n return this.streamEndpoint<CorporationStarbase>(\n 'getCorporationStarbases',\n corporationId,\n );\n }\n\n streamCorporationStructures(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationStructure>, void, undefined> {\n return this.streamEndpoint<CorporationStructure>(\n 'getCorporationStructures',\n corporationId,\n );\n }\n\n streamCorporationTitles(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationTitle>, void, undefined> {\n return this.streamEndpoint<CorporationTitle>(\n 'getCorporationTitles',\n corporationId,\n );\n }\n\n streamNpcCorporations(): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getNpcCorporations');\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n CorporationProjectsListingSchema,\n CorporationProjectSchema,\n CorporationProjectContributionSchema,\n CorporationProjectContributorsListingSchema,\n} from '../../schemas/corporation-projects';\n\nexport const corporationProjectEndpoints = {\n getCorporationProjects: {\n path: 'corporations/{corporationId}/projects',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CorporationProjectsListingSchema,\n },\n getCorporationProject: {\n path: 'corporations/{corporationId}/projects/{projectId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'projectId'],\n responseSchema: CorporationProjectSchema,\n },\n getCorporationProjectContribution: {\n path: 'corporations/{corporationId}/projects/{projectId}/contribution/{characterId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'projectId', 'characterId'],\n responseSchema: CorporationProjectContributionSchema,\n },\n getCorporationProjectContributors: {\n path: 'corporations/{corporationId}/projects/{projectId}/contributors',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'projectId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CorporationProjectContributorsListingSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { corporationProjectEndpoints } from '../core/endpoints/corporationProjectEndpoints';\nimport {\n CorporationProject,\n CorporationProjectContribution,\n CorporationProjectContributorsListing,\n CorporationProjectsListing,\n} from '../types/api-responses';\n\nexport class CorporationProjectsClient extends BaseEsiClient<\n typeof corporationProjectEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, corporationProjectEndpoints);\n }\n\n /**\n * Retrieves one page of a corporation's projects.\n *\n * The list is cursor paginated: pass `cursor.after` from one page as\n * `after` to read the next. Tokens are opaque; an empty `projects` array\n * marks the end of the list.\n *\n * @param corporationId - The ID of the corporation\n * @param before - Optional cursor token to read records before\n * @param after - Optional cursor token to read records after\n * @returns A page of projects and its cursor\n * @requires Authentication\n */\n getCorporationProjects(\n corporationId: number,\n before?: string,\n after?: string,\n ): Promise<CorporationProjectsListing> {\n return this.api.getCorporationProjects(corporationId, before, after);\n }\n\n /**\n * Retrieves details of a specific corporation project.\n *\n * @param corporationId - The ID of the corporation\n * @param projectId - The project's UUID\n * @returns The corporation project details\n * @requires Authentication\n */\n getCorporationProject(\n corporationId: number,\n projectId: string,\n ): Promise<CorporationProject> {\n return this.api.getCorporationProject(corporationId, projectId);\n }\n\n /**\n * Retrieves a character's contribution to a specific corporation project.\n *\n * @param corporationId - The ID of the corporation\n * @param projectId - The project's UUID\n * @param characterId - The ID of the character\n * @returns The character's contribution details\n * @requires Authentication\n */\n getCorporationProjectContribution(\n corporationId: number,\n projectId: string,\n characterId: number,\n ): Promise<CorporationProjectContribution> {\n return this.api.getCorporationProjectContribution(\n corporationId,\n projectId,\n characterId,\n );\n }\n\n /**\n * Retrieves one page of the contributors to a corporation project.\n *\n * Cursor paginated in the same way as {@link getCorporationProjects}.\n *\n * @param corporationId - The ID of the corporation\n * @param projectId - The project's UUID\n * @param before - Optional cursor token to read records before\n * @param after - Optional cursor token to read records after\n * @returns A page of contributors and its cursor\n * @requires Authentication\n */\n getCorporationProjectContributors(\n corporationId: number,\n projectId: string,\n before?: string,\n after?: string,\n ): Promise<CorporationProjectContributorsListing> {\n return this.api.getCorporationProjectContributors(\n corporationId,\n projectId,\n before,\n after,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n DogmaAttributeSchema,\n DogmaEffectSchema,\n DogmaDynamicItemSchema,\n} from '../../schemas/dogma';\n\nexport const dogmaEndpoints = {\n getAttributes: {\n path: 'dogma/attributes',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getAttributeById: {\n path: 'dogma/attributes/{attributeId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['attributeId'],\n responseSchema: DogmaAttributeSchema,\n },\n getEffects: {\n path: 'dogma/effects',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getEffectById: {\n path: 'dogma/effects/{effectId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['effectId'],\n responseSchema: DogmaEffectSchema,\n },\n getDynamicItemInfo: {\n path: 'dogma/dynamic/items/{typeId}/{itemId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['typeId', 'itemId'],\n responseSchema: DogmaDynamicItemSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { dogmaEndpoints } from '../core/endpoints/dogmaEndpoints';\nimport {\n DogmaAttribute,\n DogmaEffect,\n DogmaDynamicItem,\n} from '../types/api-responses';\n\nexport class DogmaClient extends BaseEsiClient<typeof dogmaEndpoints> {\n constructor(client: ApiClient) {\n super(client, dogmaEndpoints);\n }\n\n /**\n * Retrieves a list of all dogma attribute IDs.\n *\n * @returns An array of dogma attribute IDs\n */\n getAttributes(): Promise<number[]> {\n return this.api.getAttributes() as Promise<number[]>;\n }\n\n /**\n * Retrieves detailed information about a specific dogma attribute.\n *\n * @param attributeId - The ID of the dogma attribute to look up\n * @returns Detailed information about the dogma attribute\n */\n getAttributeById(attributeId: number): Promise<DogmaAttribute> {\n return this.api.getAttributeById(attributeId) as Promise<DogmaAttribute>;\n }\n\n /**\n * Retrieves the dynamic dogma information for a specific mutated item, including its modified attributes.\n *\n * @param typeId - The type ID of the item\n * @param itemId - The item ID of the specific dynamic item\n * @returns Dynamic dogma information for the mutated item\n */\n getDynamicItemInfo(\n typeId: number,\n itemId: number,\n ): Promise<DogmaDynamicItem> {\n return this.api.getDynamicItemInfo(\n typeId,\n itemId,\n ) as Promise<DogmaDynamicItem>;\n }\n\n /**\n * Retrieves a list of all dogma effect IDs.\n *\n * @returns An array of dogma effect IDs\n */\n getEffects(): Promise<number[]> {\n return this.api.getEffects() as Promise<number[]>;\n }\n\n /**\n * Retrieves detailed information about a specific dogma effect.\n *\n * @param effectId - The ID of the dogma effect to look up\n * @returns Detailed information about the dogma effect\n */\n getEffectById(effectId: number): Promise<DogmaEffect> {\n return this.api.getEffectById(effectId) as Promise<DogmaEffect>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n FactionWarfareStatsSchema,\n FactionWarfareCharacterStatsSchema,\n FactionWarfareSystemSchema,\n FactionWarfareWarSchema,\n FactionWarfareFactionLeaderboardSchema,\n FactionWarfareCharacterLeaderboardSchema,\n FactionWarfareCorporationLeaderboardSchema,\n FactionWarfareCorporationStatsSchema,\n} from '../../schemas/faction-warfare';\n\nexport const factionEndpoints = {\n getCharacterStats: {\n path: 'characters/{characterId}/fw/stats',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: FactionWarfareCharacterStatsSchema,\n },\n getCorporationStats: {\n path: 'corporations/{corporationId}/fw/stats',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: FactionWarfareCorporationStatsSchema,\n },\n getOverall: {\n path: 'fw/leaderboards',\n method: 'GET',\n requiresAuth: false,\n responseSchema: FactionWarfareFactionLeaderboardSchema,\n },\n getCharacters: {\n path: 'fw/leaderboards/characters',\n method: 'GET',\n requiresAuth: false,\n responseSchema: FactionWarfareCharacterLeaderboardSchema,\n },\n getCorporations: {\n path: 'fw/leaderboards/corporations',\n method: 'GET',\n requiresAuth: false,\n responseSchema: FactionWarfareCorporationLeaderboardSchema,\n },\n getStats: {\n path: 'fw/stats',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionWarfareStatsSchema),\n },\n getSystems: {\n path: 'fw/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionWarfareSystemSchema),\n },\n getWars: {\n path: 'fw/wars',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionWarfareWarSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { factionEndpoints } from '../core/endpoints/factionEndpoints';\nimport {\n FactionWarfareStats,\n FactionWarfareCharacterStats,\n FactionWarfareCorporationStats,\n FactionWarfareCharacterLeaderboard,\n FactionWarfareCorporationLeaderboard,\n FactionWarfareFactionLeaderboard,\n FactionWarfareSystem,\n FactionWarfareWar,\n} from '../types/api-responses';\n\nexport class FactionClient extends BaseEsiClient<typeof factionEndpoints> {\n constructor(client: ApiClient) {\n super(client, factionEndpoints);\n }\n\n /**\n * Retrieves the top characters in faction warfare leaderboards.\n *\n * @returns Faction warfare character leaderboard rankings\n */\n getLeaderboardsCharacters(): Promise<FactionWarfareCharacterLeaderboard> {\n return this.api.getCharacters();\n }\n\n /**\n * Retrieves the top corporations in faction warfare leaderboards.\n *\n * @returns Faction warfare corporation leaderboard rankings\n */\n getLeaderboardsCorporations(): Promise<FactionWarfareCorporationLeaderboard> {\n return this.api.getCorporations();\n }\n\n /**\n * Retrieves the overall faction warfare leaderboards across all factions.\n *\n * @returns Overall faction warfare leaderboard rankings\n */\n getLeaderboardsOverall(): Promise<FactionWarfareFactionLeaderboard> {\n return this.api.getOverall();\n }\n\n /**\n * Retrieves faction warfare statistics for all factions, including kill and victory point totals.\n *\n * @returns An array of per-faction warfare statistics\n */\n getStats(): Promise<FactionWarfareStats[]> {\n return this.api.getStats();\n }\n\n /**\n * Retrieves faction warfare statistics for a specific character, including enlistment info and kill counts.\n *\n * @param characterId - The ID of the character\n * @returns Faction warfare statistics for the character\n * @requires Authentication\n */\n getCharacterStats(\n characterId: number,\n ): Promise<FactionWarfareCharacterStats> {\n return this.api.getCharacterStats(characterId);\n }\n\n /**\n * Retrieves faction warfare statistics for a specific corporation, including kill counts and victory points.\n *\n * @param corporationId - The ID of the corporation\n * @returns Faction warfare statistics for the corporation\n * @requires Authentication\n */\n getCorporationStats(\n corporationId: number,\n ): Promise<FactionWarfareCorporationStats> {\n return this.api.getCorporationStats(corporationId);\n }\n\n /**\n * Retrieves the current ownership and contested status of all faction warfare systems.\n *\n * @returns An array of faction warfare system statuses\n */\n getSystems(): Promise<FactionWarfareSystem[]> {\n return this.api.getSystems();\n }\n\n /**\n * Retrieves the list of active faction warfare wars, showing which factions are fighting each other.\n *\n * @returns An array of active faction warfare wars\n */\n getWars(): Promise<FactionWarfareWar[]> {\n return this.api.getWars();\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { FittingSchema, FittingCreatedSchema } from '../../schemas/fittings';\n\nexport const fittingEndpoints = {\n getFittings: {\n path: 'characters/{characterId}/fittings',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(FittingSchema),\n },\n createFitting: {\n path: 'characters/{characterId}/fittings',\n method: 'POST',\n responseSchema: FittingCreatedSchema,\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n },\n deleteFitting: {\n path: 'characters/{characterId}/fittings/{fittingId}',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId', 'fittingId'],\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { fittingEndpoints } from '../core/endpoints/fittingEndpoints';\nimport { Fitting } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class FittingsClient extends BaseEsiClient<typeof fittingEndpoints> {\n constructor(client: ApiClient) {\n super(client, fittingEndpoints);\n }\n\n /**\n * Retrieves all saved ship fittings for a character.\n *\n * @param characterId - The ID of the character\n * @returns An array of the character's saved fittings\n * @requires Authentication\n */\n getFittings(characterId: number): Promise<Fitting[]> {\n return this.api.getFittings(characterId);\n }\n\n /**\n * Creates a new saved ship fitting for a character via POST.\n *\n * @param characterId - The ID of the character\n * @param fittingData - The fitting details including ship type and module layout\n * @returns The ID of the newly created fitting\n * @requires Authentication\n */\n createFitting(\n characterId: number,\n fittingData: object,\n ): Promise<{ fitting_id: number }> {\n return this.api.createFitting(characterId, fittingData) as Promise<{\n fitting_id: number;\n }>;\n }\n\n /**\n * Deletes a saved ship fitting for a character.\n *\n * @param characterId - The ID of the character\n * @param fittingId - The ID of the fitting to delete\n * @requires Authentication\n */\n deleteFitting(characterId: number, fittingId: number): Promise<void> {\n return this.api.deleteFitting(characterId, fittingId) as Promise<void>;\n }\n\n fetchAllFittings(\n characterId: number,\n concurrency?: number,\n ): Promise<Fitting[]> {\n return this.fetchAllEndpoint<Fitting>(\n 'getFittings',\n [characterId],\n concurrency,\n );\n }\n\n streamFittings(\n characterId: number,\n ): AsyncGenerator<PageResult<Fitting>, void, undefined> {\n return this.streamEndpoint<Fitting>('getFittings', characterId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n FleetInfoSchema,\n FleetMemberSchema,\n FleetWingSchema,\n CharacterFleetInfoSchema,\n FleetWingCreatedSchema,\n FleetSquadCreatedSchema,\n} from '../../schemas/fleet';\n\nexport const fleetEndpoints = {\n getCharacterFleetInfo: {\n path: 'characters/{characterId}/fleet',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterFleetInfoSchema,\n },\n getFleetInfo: {\n path: 'fleets/{fleetId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['fleetId'],\n responseSchema: FleetInfoSchema,\n },\n updateFleet: {\n path: 'fleets/{fleetId}',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId'],\n hasBody: true,\n requestSchema: z.looseObject({\n is_free_move: z.boolean().optional(),\n motd: z.string().optional(),\n }),\n },\n getFleetMembers: {\n path: 'fleets/{fleetId}/members',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['fleetId'],\n responseSchema: z.array(FleetMemberSchema),\n },\n createFleetInvitation: {\n path: 'fleets/{fleetId}/members/',\n method: 'POST',\n requiresAuth: true,\n pathParams: ['fleetId'],\n hasBody: true,\n },\n kickFleetMember: {\n path: 'fleets/{fleetId}/members/{memberId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['fleetId', 'memberId'],\n },\n moveFleetMember: {\n path: 'fleets/{fleetId}/members/{memberId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId', 'memberId'],\n hasBody: true,\n },\n deleteFleetSquad: {\n path: 'fleets/{fleetId}/squads/{squadId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['fleetId', 'squadId'],\n },\n renameFleetSquad: {\n path: 'fleets/{fleetId}/squads/{squadId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId', 'squadId'],\n bodyBuilder: (name: string) => ({ name }),\n },\n getFleetWings: {\n path: 'fleets/{fleetId}/wings/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['fleetId'],\n responseSchema: z.array(FleetWingSchema),\n },\n createFleetWing: {\n path: 'fleets/{fleetId}/wings/',\n method: 'POST',\n responseSchema: FleetWingCreatedSchema,\n requiresAuth: true,\n pathParams: ['fleetId'],\n hasBody: true,\n },\n deleteFleetWing: {\n path: 'fleets/{fleetId}/wings/{wingId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['fleetId', 'wingId'],\n },\n renameFleetWing: {\n path: 'fleets/{fleetId}/wings/{wingId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['fleetId', 'wingId'],\n bodyBuilder: (name: string) => ({ name }),\n },\n createFleetSquad: {\n path: 'fleets/{fleetId}/wings/{wingId}/squads/',\n method: 'POST',\n responseSchema: FleetSquadCreatedSchema,\n requiresAuth: true,\n pathParams: ['fleetId', 'wingId'],\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { fleetEndpoints } from '../core/endpoints/fleetEndpoints';\nimport {\n CharacterFleetInfo,\n FleetInfo,\n FleetMember,\n FleetWing,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class FleetClient extends BaseEsiClient<typeof fleetEndpoints> {\n constructor(client: ApiClient) {\n super(client, fleetEndpoints);\n }\n\n /**\n * Retrieves the fleet that a character is currently in, including their role and wing/squad assignment.\n *\n * @param characterId - The ID of the character\n * @returns Fleet membership information for the character\n * @requires Authentication\n */\n getCharacterFleetInfo(characterId: number): Promise<CharacterFleetInfo> {\n return this.api.getCharacterFleetInfo(characterId);\n }\n\n /**\n * Retrieves detailed information about a fleet, including its MOTD and free-move setting.\n *\n * @param fleetId - The ID of the fleet\n * @returns Detailed fleet information\n * @requires Authentication\n */\n getFleetInformation(fleetId: number): Promise<FleetInfo> {\n return this.api.getFleetInfo(fleetId);\n }\n\n /**\n * Updates fleet settings such as the MOTD and free-move toggle via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param body - The fleet settings to update\n * @requires Authentication\n */\n updateFleet(fleetId: number, body: object): Promise<void> {\n return this.api.updateFleet(fleetId, body) as Promise<void>;\n }\n\n /**\n * Retrieves all current members of a fleet, including their ship types and roles.\n *\n * @param fleetId - The ID of the fleet\n * @returns An array of fleet members\n * @requires Authentication\n */\n getFleetMembers(fleetId: number): Promise<FleetMember[]> {\n return this.api.getFleetMembers(fleetId);\n }\n\n /**\n * Sends an invitation to a character to join a fleet via POST.\n *\n * @param fleetId - The ID of the fleet\n * @param body - The invitation details including the character to invite and their role\n * @requires Authentication\n */\n createFleetInvitation(fleetId: number, body: object): Promise<void> {\n return this.api.createFleetInvitation(fleetId, body) as Promise<void>;\n }\n\n /**\n * Kicks a member from a fleet.\n *\n * @param fleetId - The ID of the fleet\n * @param memberId - The character ID of the member to kick\n * @requires Authentication\n */\n kickFleetMember(fleetId: number, memberId: number): Promise<void> {\n return this.api.kickFleetMember(fleetId, memberId) as Promise<void>;\n }\n\n /**\n * Moves a fleet member to a different wing, squad, or role via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param memberId - The character ID of the member to move\n * @param body - The target role, wing, and/or squad assignment\n * @requires Authentication\n */\n moveFleetMember(\n fleetId: number,\n memberId: number,\n body: object,\n ): Promise<void> {\n return this.api.moveFleetMember(fleetId, memberId, body) as Promise<void>;\n }\n\n /**\n * Deletes a squad from a fleet.\n *\n * @param fleetId - The ID of the fleet\n * @param squadId - The ID of the squad to delete\n * @requires Authentication\n */\n deleteFleetSquad(fleetId: number, squadId: number): Promise<void> {\n return this.api.deleteFleetSquad(fleetId, squadId) as Promise<void>;\n }\n\n /**\n * Renames a squad within a fleet via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param squadId - The ID of the squad to rename\n * @param name - The new name for the squad (max 10 characters)\n * @requires Authentication\n */\n renameFleetSquad(\n fleetId: number,\n squadId: number,\n name: string,\n ): Promise<void> {\n if (name.length > 10) {\n return Promise.reject(\n new Error(\n `Fleet squad name \"${name}\" exceeds ESI maximum of 10 characters`,\n ),\n );\n }\n return this.api.renameFleetSquad(fleetId, squadId, name) as Promise<void>;\n }\n\n /**\n * Retrieves all wings and their squads for a fleet.\n *\n * @param fleetId - The ID of the fleet\n * @returns An array of fleet wings with their nested squads\n * @requires Authentication\n */\n getFleetWings(fleetId: number): Promise<FleetWing[]> {\n return this.api.getFleetWings(fleetId);\n }\n\n /**\n * Creates a new wing in a fleet via POST.\n *\n * @param fleetId - The ID of the fleet\n * @param body - The wing creation details\n * @returns The ID of the newly created wing\n * @requires Authentication\n */\n createFleetWing(fleetId: number, body: object): Promise<{ wing_id: number }> {\n return this.api.createFleetWing(fleetId, body) as Promise<{\n wing_id: number;\n }>;\n }\n\n /**\n * Deletes a wing from a fleet, along with all its squads.\n *\n * @param fleetId - The ID of the fleet\n * @param wingId - The ID of the wing to delete\n * @requires Authentication\n */\n deleteFleetWing(fleetId: number, wingId: number): Promise<void> {\n return this.api.deleteFleetWing(fleetId, wingId) as Promise<void>;\n }\n\n /**\n * Renames a wing within a fleet via PUT.\n *\n * @param fleetId - The ID of the fleet\n * @param wingId - The ID of the wing to rename\n * @param name - The new name for the wing (max 10 characters)\n * @requires Authentication\n */\n renameFleetWing(\n fleetId: number,\n wingId: number,\n name: string,\n ): Promise<void> {\n if (name.length > 10) {\n return Promise.reject(\n new Error(\n `Fleet wing name \"${name}\" exceeds ESI maximum of 10 characters`,\n ),\n );\n }\n return this.api.renameFleetWing(fleetId, wingId, name) as Promise<void>;\n }\n\n /**\n * Creates a new squad under a wing in a fleet via POST.\n *\n * @param fleetId - The ID of the fleet\n * @param wingId - The ID of the wing to add the squad to\n * @returns The ID of the newly created squad\n * @requires Authentication\n */\n createFleetSquad(\n fleetId: number,\n wingId: number,\n ): Promise<{ squad_id: number }> {\n return this.api.createFleetSquad(fleetId, wingId) as Promise<{\n squad_id: number;\n }>;\n }\n\n fetchAllFleetMembers(\n fleetId: number,\n concurrency?: number,\n ): Promise<FleetMember[]> {\n return this.fetchAllEndpoint<FleetMember>(\n 'getFleetMembers',\n [fleetId],\n concurrency,\n );\n }\n\n fetchAllFleetWings(\n fleetId: number,\n concurrency?: number,\n ): Promise<FleetWing[]> {\n return this.fetchAllEndpoint<FleetWing>(\n 'getFleetWings',\n [fleetId],\n concurrency,\n );\n }\n\n streamFleetMembers(\n fleetId: number,\n ): AsyncGenerator<PageResult<FleetMember>, void, undefined> {\n return this.streamEndpoint<FleetMember>('getFleetMembers', fleetId);\n }\n\n streamFleetWings(\n fleetId: number,\n ): AsyncGenerator<PageResult<FleetWing>, void, undefined> {\n return this.streamEndpoint<FleetWing>('getFleetWings', fleetId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { IncursionSchema } from '../../schemas/incursions';\n\nexport const incursionEndpoints = {\n getIncursions: {\n path: 'incursions',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(IncursionSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { incursionEndpoints } from '../core/endpoints/incursionEndpoints';\nimport { Incursion } from '../types/api-responses';\n\nexport class IncursionsClient extends BaseEsiClient<typeof incursionEndpoints> {\n constructor(client: ApiClient) {\n super(client, incursionEndpoints);\n }\n\n /**\n * Retrieves all currently active incursions, including their staging systems and influence levels.\n *\n * @returns An array of active incursions\n */\n getIncursions(): Promise<Incursion[]> {\n return this.api.getIncursions() as Promise<Incursion[]>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n IndustryJobSchema,\n CorporationIndustryJobSchema,\n MiningLedgerEntrySchema,\n IndustryFacilitySchema,\n IndustrySystemSchema,\n MoonExtractionTimerSchema,\n MiningObserverSchema,\n MiningObserverEntrySchema,\n} from '../../schemas/industry';\n\nexport const industryEndpoints = {\n getCharacterIndustryJobs: {\n path: 'characters/{characterId}/industry/jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(IndustryJobSchema),\n },\n getCharacterMiningLedger: {\n path: 'characters/{characterId}/mining',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MiningLedgerEntrySchema),\n },\n getCorporationIndustryJobs: {\n path: 'corporations/{corporationId}/industry/jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationIndustryJobSchema),\n },\n getMoonExtractionTimers: {\n path: 'corporation/{corporationId}/mining/extractions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(MoonExtractionTimerSchema),\n },\n getCorporationMiningObservers: {\n path: 'corporation/{corporationId}/mining/observers',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(MiningObserverSchema),\n },\n getCorporationMiningObserver: {\n path: 'corporation/{corporationId}/mining/observers/{observerId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'observerId'],\n responseSchema: z.array(MiningObserverEntrySchema),\n },\n getIndustryFacilities: {\n path: 'industry/facilities',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(IndustryFacilitySchema),\n },\n getIndustrySystems: {\n path: 'industry/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(IndustrySystemSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { industryEndpoints } from '../core/endpoints/industryEndpoints';\nimport {\n IndustryJob,\n CorporationIndustryJob,\n MiningLedgerEntry,\n IndustryFacility,\n IndustrySystem,\n MoonExtractionTimer,\n MiningObserver,\n MiningObserverEntry,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class IndustryClient extends BaseEsiClient<typeof industryEndpoints> {\n constructor(client: ApiClient) {\n super(client, industryEndpoints);\n }\n\n /**\n * Retrieves all industry jobs for a character, including manufacturing, research, and invention.\n *\n * @param characterId - The ID of the character\n * @returns An array of the character's industry jobs\n * @requires Authentication\n */\n getCharacterIndustryJobs(characterId: number): Promise<IndustryJob[]> {\n return this.api.getCharacterIndustryJobs(characterId);\n }\n\n /**\n * Retrieves a character's personal mining ledger, showing ore mined per day.\n *\n * @param characterId - The ID of the character\n * @returns An array of mining ledger entries\n * @requires Authentication\n */\n getCharacterMiningLedger(characterId: number): Promise<MiningLedgerEntry[]> {\n return this.api.getCharacterMiningLedger(characterId);\n }\n\n /**\n * Retrieves moon extraction timers for a corporation's refineries.\n *\n * @param corporationId - The ID of the corporation\n * @returns An array of moon extraction timers\n * @requires Authentication\n */\n getMoonExtractionTimers(\n corporationId: number,\n ): Promise<MoonExtractionTimer[]> {\n return this.api.getMoonExtractionTimers(corporationId);\n }\n\n /**\n * Retrieves the list of mining observers (e.g., refineries) owned by a corporation.\n *\n * @param corporationId - The ID of the corporation\n * @returns An array of mining observers\n * @requires Authentication\n */\n getCorporationMiningObservers(\n corporationId: number,\n ): Promise<MiningObserver[]> {\n return this.api.getCorporationMiningObservers(corporationId);\n }\n\n /**\n * Retrieves mining activity recorded by a specific corporation mining observer.\n *\n * @param corporationId - The ID of the corporation\n * @param observerId - The ID of the mining observer\n * @returns An array of mining activity entries for the observer\n * @requires Authentication\n */\n getCorporationMiningObserver(\n corporationId: number,\n observerId: number,\n ): Promise<MiningObserverEntry[]> {\n return this.api.getCorporationMiningObserver(corporationId, observerId);\n }\n\n /**\n * Retrieves all industry jobs for a corporation, including manufacturing, research, and invention.\n *\n * @param corporationId - The ID of the corporation\n * @returns An array of the corporation's industry jobs\n * @requires Authentication\n */\n getCorporationIndustryJobs(\n corporationId: number,\n ): Promise<CorporationIndustryJob[]> {\n return this.api.getCorporationIndustryJobs(corporationId);\n }\n\n /**\n * Retrieves a list of all publicly available industry facilities in the universe.\n *\n * @returns An array of industry facilities\n */\n getIndustryFacilities(): Promise<IndustryFacility[]> {\n return this.api.getIndustryFacilities();\n }\n\n /**\n * Retrieves cost indices for solar systems with industry activity, used to calculate job installation fees.\n *\n * @returns An array of industry system cost indices\n */\n getIndustrySystems(): Promise<IndustrySystem[]> {\n return this.api.getIndustrySystems();\n }\n\n fetchAllCharacterIndustryJobs(\n characterId: number,\n concurrency?: number,\n ): Promise<IndustryJob[]> {\n return this.fetchAllEndpoint<IndustryJob>(\n 'getCharacterIndustryJobs',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCharacterMiningLedger(\n characterId: number,\n concurrency?: number,\n ): Promise<MiningLedgerEntry[]> {\n return this.fetchAllEndpoint<MiningLedgerEntry>(\n 'getCharacterMiningLedger',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationIndustryJobs(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationIndustryJob[]> {\n return this.fetchAllEndpoint<CorporationIndustryJob>(\n 'getCorporationIndustryJobs',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllMoonExtractionTimers(\n corporationId: number,\n concurrency?: number,\n ): Promise<MoonExtractionTimer[]> {\n return this.fetchAllEndpoint<MoonExtractionTimer>(\n 'getMoonExtractionTimers',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMiningObservers(\n corporationId: number,\n concurrency?: number,\n ): Promise<MiningObserver[]> {\n return this.fetchAllEndpoint<MiningObserver>(\n 'getCorporationMiningObservers',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationMiningObserver(\n corporationId: number,\n observerId: number,\n concurrency?: number,\n ): Promise<MiningObserverEntry[]> {\n return this.fetchAllEndpoint<MiningObserverEntry>(\n 'getCorporationMiningObserver',\n [corporationId, observerId],\n concurrency,\n );\n }\n\n fetchAllIndustryFacilities(\n concurrency?: number,\n ): Promise<IndustryFacility[]> {\n return this.fetchAllEndpoint<IndustryFacility>(\n 'getIndustryFacilities',\n [],\n concurrency,\n );\n }\n\n fetchAllIndustrySystems(concurrency?: number): Promise<IndustrySystem[]> {\n return this.fetchAllEndpoint<IndustrySystem>(\n 'getIndustrySystems',\n [],\n concurrency,\n );\n }\n\n streamCharacterIndustryJobs(\n characterId: number,\n ): AsyncGenerator<PageResult<IndustryJob>, void, undefined> {\n return this.streamEndpoint<IndustryJob>(\n 'getCharacterIndustryJobs',\n characterId,\n );\n }\n\n streamCharacterMiningLedger(\n characterId: number,\n ): AsyncGenerator<PageResult<MiningLedgerEntry>, void, undefined> {\n return this.streamEndpoint<MiningLedgerEntry>(\n 'getCharacterMiningLedger',\n characterId,\n );\n }\n\n streamCorporationIndustryJobs(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationIndustryJob>, void, undefined> {\n return this.streamEndpoint<CorporationIndustryJob>(\n 'getCorporationIndustryJobs',\n corporationId,\n );\n }\n\n streamMoonExtractionTimers(\n corporationId: number,\n ): AsyncGenerator<PageResult<MoonExtractionTimer>, void, undefined> {\n return this.streamEndpoint<MoonExtractionTimer>(\n 'getMoonExtractionTimers',\n corporationId,\n );\n }\n\n streamCorporationMiningObservers(\n corporationId: number,\n ): AsyncGenerator<PageResult<MiningObserver>, void, undefined> {\n return this.streamEndpoint<MiningObserver>(\n 'getCorporationMiningObservers',\n corporationId,\n );\n }\n\n streamCorporationMiningObserver(\n corporationId: number,\n observerId: number,\n ): AsyncGenerator<PageResult<MiningObserverEntry>, void, undefined> {\n return this.streamEndpoint<MiningObserverEntry>(\n 'getCorporationMiningObserver',\n corporationId,\n observerId,\n );\n }\n\n streamIndustryFacilities(): AsyncGenerator<\n PageResult<IndustryFacility>,\n void,\n undefined\n > {\n return this.streamEndpoint<IndustryFacility>('getIndustryFacilities');\n }\n\n streamIndustrySystems(): AsyncGenerator<\n PageResult<IndustrySystem>,\n void,\n undefined\n > {\n return this.streamEndpoint<IndustrySystem>('getIndustrySystems');\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { InsurancePriceSchema } from '../../schemas/insurance';\n\nexport const insuranceEndpoints = {\n getInsurancePrices: {\n path: 'insurance/prices',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(InsurancePriceSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { insuranceEndpoints } from '../core/endpoints/insuranceEndpoints';\nimport { InsurancePrice } from '../types/api-responses';\n\nexport class InsuranceClient extends BaseEsiClient<typeof insuranceEndpoints> {\n constructor(client: ApiClient) {\n super(client, insuranceEndpoints);\n }\n\n /**\n * Retrieves available insurance levels and their costs for all ship types.\n *\n * @returns An array of insurance price listings per ship type\n */\n getInsurancePrices(): Promise<InsurancePrice[]> {\n return this.api.getInsurancePrices() as Promise<InsurancePrice[]>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { KillmailSummarySchema, KillmailSchema } from '../../schemas/killmails';\n\nexport const killmailEndpoints = {\n getCharacterRecentKillmails: {\n path: 'characters/{characterId}/killmails/recent',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(KillmailSummarySchema),\n },\n getCorporationRecentKillmails: {\n path: 'corporations/{corporationId}/killmails/recent',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(KillmailSummarySchema),\n },\n getKillmail: {\n path: 'killmails/{killmailId}/{killmailHash}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['killmailId', 'killmailHash'],\n responseSchema: KillmailSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { killmailEndpoints } from '../core/endpoints/killmailEndpoints';\nimport { KillmailSummary, Killmail } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class KillmailsClient extends BaseEsiClient<typeof killmailEndpoints> {\n constructor(client: ApiClient) {\n super(client, killmailEndpoints);\n }\n\n /**\n * Retrieves a list of recent killmail summaries for a character.\n *\n * @param characterId - The ID of the character to fetch killmails for\n * @returns A list of recent killmail summaries including killmail IDs and hashes\n * @requires Authentication\n */\n getCharacterRecentKillmails(characterId: number): Promise<KillmailSummary[]> {\n return this.api.getCharacterRecentKillmails(characterId);\n }\n\n /**\n * Retrieves a list of recent killmail summaries for a corporation.\n *\n * @param corporationId - The ID of the corporation to fetch killmails for\n * @returns A list of recent killmail summaries including killmail IDs and hashes\n * @requires Authentication\n */\n getCorporationRecentKillmails(\n corporationId: number,\n ): Promise<KillmailSummary[]> {\n return this.api.getCorporationRecentKillmails(corporationId);\n }\n\n /**\n * Retrieves the full details of a specific killmail by its ID and hash.\n *\n * @param killmailId - The ID of the killmail to retrieve\n * @param killmailHash - The hash of the killmail for verification\n * @returns The full killmail details including victim, attackers, and items\n */\n getKillmail(killmailId: number, killmailHash: string): Promise<Killmail> {\n return this.api.getKillmail(killmailId, killmailHash);\n }\n\n fetchAllCharacterRecentKillmails(\n characterId: number,\n concurrency?: number,\n ): Promise<KillmailSummary[]> {\n return this.fetchAllEndpoint<KillmailSummary>(\n 'getCharacterRecentKillmails',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationRecentKillmails(\n corporationId: number,\n concurrency?: number,\n ): Promise<KillmailSummary[]> {\n return this.fetchAllEndpoint<KillmailSummary>(\n 'getCorporationRecentKillmails',\n [corporationId],\n concurrency,\n );\n }\n\n streamCharacterRecentKillmails(\n characterId: number,\n ): AsyncGenerator<PageResult<KillmailSummary>, void, undefined> {\n return this.streamEndpoint<KillmailSummary>(\n 'getCharacterRecentKillmails',\n characterId,\n );\n }\n\n streamCorporationRecentKillmails(\n corporationId: number,\n ): AsyncGenerator<PageResult<KillmailSummary>, void, undefined> {\n return this.streamEndpoint<KillmailSummary>(\n 'getCorporationRecentKillmails',\n corporationId,\n );\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterLocationSchema,\n CharacterOnlineSchema,\n CharacterShipSchema,\n} from '../../schemas/location';\n\nexport const locationEndpoints = {\n getCharacterLocation: {\n path: 'characters/{characterId}/location',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterLocationSchema,\n },\n getCharacterOnline: {\n path: 'characters/{characterId}/online',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterOnlineSchema,\n },\n getCharacterShip: {\n path: 'characters/{characterId}/ship',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterShipSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { locationEndpoints } from '../core/endpoints/locationEndpoints';\nimport {\n CharacterLocation,\n CharacterOnline,\n CharacterShip,\n} from '../types/api-responses';\n\nexport class LocationClient extends BaseEsiClient<typeof locationEndpoints> {\n constructor(client: ApiClient) {\n super(client, locationEndpoints);\n }\n\n /**\n * Retrieves the current solar system, station, and structure location of a character.\n *\n * @param characterId - The ID of the character to locate\n * @returns The character's current location including solar system and optional station or structure\n * @requires Authentication\n */\n getCharacterLocation(characterId: number): Promise<CharacterLocation> {\n return this.api.getCharacterLocation(\n characterId,\n ) as Promise<CharacterLocation>;\n }\n\n /**\n * Checks whether a character is currently online and retrieves login/logout timestamps.\n *\n * @param characterId - The ID of the character to check\n * @returns The character's online status and last login/logout times\n * @requires Authentication\n */\n getCharacterOnline(characterId: number): Promise<CharacterOnline> {\n return this.api.getCharacterOnline(characterId) as Promise<CharacterOnline>;\n }\n\n /**\n * Retrieves the type, name, and item ID of the ship a character is currently flying.\n *\n * @param characterId - The ID of the character whose ship to retrieve\n * @returns The character's current ship details including type ID and ship name\n * @requires Authentication\n */\n getCharacterShip(characterId: number): Promise<CharacterShip> {\n return this.api.getCharacterShip(characterId) as Promise<CharacterShip>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n LoyaltyPointsSchema,\n LoyaltyStoreOfferSchema,\n} from '../../schemas/loyalty';\n\nexport const loyaltyEndpoints = {\n getLoyaltyPoints: {\n path: 'characters/{characterId}/loyalty/points',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(LoyaltyPointsSchema),\n },\n getLoyaltyStoreOffers: {\n path: 'loyalty/stores/{corporationId}/offers',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['corporationId'],\n responseSchema: z.array(LoyaltyStoreOfferSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { loyaltyEndpoints } from '../core/endpoints/loyaltyEndpoints';\nimport { LoyaltyPoints, LoyaltyStoreOffer } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class LoyaltyClient extends BaseEsiClient<typeof loyaltyEndpoints> {\n constructor(client: ApiClient) {\n super(client, loyaltyEndpoints);\n }\n\n /**\n * Retrieves the loyalty points a character has earned with each NPC corporation.\n *\n * @param characterId - The ID of the character to fetch loyalty points for\n * @returns A list of loyalty point balances per corporation\n * @requires Authentication\n */\n getLoyaltyPoints(characterId: number): Promise<LoyaltyPoints[]> {\n return this.api.getLoyaltyPoints(characterId);\n }\n\n /**\n * Retrieves the list of items available in an NPC corporation's loyalty point store.\n *\n * @param corporationId - The ID of the NPC corporation whose LP store to query\n * @returns A list of offers available in the loyalty store\n */\n getLoyaltyStoreOffers(corporationId: number): Promise<LoyaltyStoreOffer[]> {\n return this.api.getLoyaltyStoreOffers(corporationId);\n }\n\n fetchAllLoyaltyPoints(\n characterId: number,\n concurrency?: number,\n ): Promise<LoyaltyPoints[]> {\n return this.fetchAllEndpoint<LoyaltyPoints>(\n 'getLoyaltyPoints',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllLoyaltyStoreOffers(\n corporationId: number,\n concurrency?: number,\n ): Promise<LoyaltyStoreOffer[]> {\n return this.fetchAllEndpoint<LoyaltyStoreOffer>(\n 'getLoyaltyStoreOffers',\n [corporationId],\n concurrency,\n );\n }\n\n streamLoyaltyPoints(\n characterId: number,\n ): AsyncGenerator<PageResult<LoyaltyPoints>, void, undefined> {\n return this.streamEndpoint<LoyaltyPoints>('getLoyaltyPoints', characterId);\n }\n\n streamLoyaltyStoreOffers(\n corporationId: number,\n ): AsyncGenerator<PageResult<LoyaltyStoreOffer>, void, undefined> {\n return this.streamEndpoint<LoyaltyStoreOffer>(\n 'getLoyaltyStoreOffers',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MailHeaderSchema,\n MailMessageSchema,\n MailLabelSchema,\n MailLabelsResponseSchema,\n MailingListSchema,\n MailIdSchema,\n MailLabelIdSchema,\n} from '../../schemas/mail';\n\nexport const mailEndpoints = {\n getCharacterMailHeaders: {\n path: 'characters/{characterId}/mail/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MailHeaderSchema),\n },\n sendMail: {\n path: 'characters/{characterId}/mail/',\n method: 'POST',\n responseSchema: MailIdSchema,\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n requestSchema: z.looseObject({\n recipients: z.array(\n z.looseObject({\n recipient_id: z.number().int(),\n recipient_type: z.enum([\n 'alliance',\n 'character',\n 'corporation',\n 'mailing_list',\n ]),\n }),\n ),\n subject: z.string().min(1),\n body: z.string().min(1),\n }),\n },\n getMail: {\n path: 'characters/{characterId}/mail/{mailId}/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'mailId'],\n responseSchema: MailMessageSchema,\n },\n deleteMail: {\n path: 'characters/{characterId}/mail/{mailId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId', 'mailId'],\n },\n updateMailMetadata: {\n path: 'characters/{characterId}/mail/{mailId}/',\n method: 'PUT',\n requiresAuth: true,\n pathParams: ['characterId', 'mailId'],\n hasBody: true,\n },\n getMailLabels: {\n path: 'characters/{characterId}/mail/labels/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: MailLabelsResponseSchema,\n },\n createMailLabel: {\n path: 'characters/{characterId}/mail/labels/',\n method: 'POST',\n responseSchema: MailLabelIdSchema,\n requiresAuth: true,\n pathParams: ['characterId'],\n hasBody: true,\n },\n deleteMailLabel: {\n path: 'characters/{characterId}/mail/labels/{labelId}/',\n method: 'DELETE',\n requiresAuth: true,\n pathParams: ['characterId', 'labelId'],\n },\n getMailingLists: {\n path: 'characters/{characterId}/mail/lists/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MailingListSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { mailEndpoints } from '../core/endpoints/mailEndpoints';\nimport { MailHeader, MailMessage, MailLabel } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class MailClient extends BaseEsiClient<typeof mailEndpoints> {\n constructor(client: ApiClient) {\n super(client, mailEndpoints);\n }\n\n /**\n * Retrieves the mail headers (subject, sender, timestamp) for a character's inbox.\n *\n * @param characterId - The ID of the character whose mail headers to fetch\n * @returns A list of mail message headers\n * @requires Authentication\n */\n getMailHeaders(characterId: number): Promise<MailHeader[]> {\n return this.api.getCharacterMailHeaders(characterId);\n }\n\n /**\n * Sends a new mail on behalf of a character via POST.\n *\n * @param characterId - The ID of the character sending the mail\n * @param body - The mail content including recipients, subject, and body text\n * @returns The ID of the newly created mail\n * @requires Authentication\n */\n sendMail(characterId: number, body: object): Promise<number> {\n return this.api.sendMail(characterId, body) as Promise<number>;\n }\n\n /**\n * Deletes a specific mail from a character's mailbox.\n *\n * @param characterId - The ID of the character who owns the mail\n * @param mailId - The ID of the mail to delete\n * @returns void\n * @requires Authentication\n */\n deleteMail(characterId: number, mailId: number): Promise<void> {\n return this.api.deleteMail(characterId, mailId) as Promise<void>;\n }\n\n /**\n * Retrieves the full contents of a specific mail including its body text.\n *\n * @param characterId - The ID of the character who owns the mail\n * @param mailId - The ID of the mail to retrieve\n * @returns The full mail message including body, sender, and recipients\n * @requires Authentication\n */\n getMail(characterId: number, mailId: number): Promise<MailMessage> {\n return this.api.getMail(characterId, mailId);\n }\n\n /**\n * Updates the metadata of a mail, such as read status or labels, via PUT.\n *\n * @param characterId - The ID of the character who owns the mail\n * @param mailId - The ID of the mail to update\n * @param body - The metadata fields to update (e.g., labels, read status)\n * @returns void\n * @requires Authentication\n */\n updateMailMetadata(\n characterId: number,\n mailId: number,\n body: object,\n ): Promise<void> {\n return this.api.updateMailMetadata(\n characterId,\n mailId,\n body,\n ) as Promise<void>;\n }\n\n /**\n * Retrieves the mail labels and total unread count for a character.\n *\n * @param characterId - The ID of the character whose labels to fetch\n * @returns The character's mail labels and total unread mail count\n * @requires Authentication\n */\n getMailLabels(characterId: number): Promise<{\n total_unread_count?: number | undefined;\n labels?: MailLabel[] | undefined;\n }> {\n return this.api.getMailLabels(characterId);\n }\n\n /**\n * Creates a new custom mail label for a character via POST.\n *\n * @param characterId - The ID of the character to create the label for\n * @param body - The label definition including name and optional color\n * @returns The ID of the newly created label\n * @requires Authentication\n */\n createMailLabel(characterId: number, body: object): Promise<number> {\n return this.api.createMailLabel(characterId, body) as Promise<number>;\n }\n\n /**\n * Deletes a custom mail label from a character's mailbox.\n *\n * @param characterId - The ID of the character who owns the label\n * @param labelId - The ID of the label to delete\n * @returns void\n * @requires Authentication\n */\n deleteMailLabel(characterId: number, labelId: number): Promise<void> {\n return this.api.deleteMailLabel(characterId, labelId) as Promise<void>;\n }\n\n /**\n * Retrieves the mailing lists that a character is subscribed to.\n *\n * @param characterId - The ID of the character whose mailing lists to fetch\n * @returns A list of mailing lists with their IDs and names\n * @requires Authentication\n */\n getMailingLists(\n characterId: number,\n ): Promise<{ mailing_list_id: number; name: string }[]> {\n return this.api.getMailingLists(characterId);\n }\n\n fetchAllMailHeaders(\n characterId: number,\n concurrency?: number,\n ): Promise<MailHeader[]> {\n return this.fetchAllEndpoint<MailHeader>(\n 'getCharacterMailHeaders',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllMailingLists(\n characterId: number,\n concurrency?: number,\n ): Promise<{ mailing_list_id: number; name: string }[]> {\n return this.fetchAllEndpoint<{ mailing_list_id: number; name: string }>(\n 'getMailingLists',\n [characterId],\n concurrency,\n );\n }\n\n streamMailHeaders(\n characterId: number,\n ): AsyncGenerator<PageResult<MailHeader>, void, undefined> {\n return this.streamEndpoint<MailHeader>(\n 'getCharacterMailHeaders',\n characterId,\n );\n }\n\n streamMailingLists(\n characterId: number,\n ): AsyncGenerator<\n PageResult<{ mailing_list_id: number; name: string }>,\n void,\n undefined\n > {\n return this.streamEndpoint<{ mailing_list_id: number; name: string }>(\n 'getMailingLists',\n characterId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MarketOrderSchema,\n CharacterMarketOrderSchema,\n CharacterMarketOrderHistorySchema,\n CorporationMarketOrderSchema,\n CorporationMarketOrderHistorySchema,\n StructureMarketOrderSchema,\n MarketHistorySchema,\n MarketGroupSchema,\n MarketPriceSchema,\n} from '../../schemas/market';\n\nexport const marketEndpoints = {\n getCharacterOrders: {\n path: 'characters/{characterId}/orders/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterMarketOrderSchema),\n },\n getCharacterOrderHistory: {\n path: 'characters/{characterId}/orders/history/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(CharacterMarketOrderHistorySchema),\n },\n getCorporationOrders: {\n path: 'corporations/{corporationId}/orders/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMarketOrderSchema),\n },\n getCorporationOrderHistory: {\n path: 'corporations/{corporationId}/orders/history/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationMarketOrderHistorySchema),\n },\n getMarketGroups: {\n path: 'markets/groups/',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getMarketGroupInformation: {\n path: 'markets/groups/{marketGroupId}/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['marketGroupId'],\n responseSchema: MarketGroupSchema,\n },\n getMarketPrices: {\n path: 'markets/prices/',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(MarketPriceSchema),\n },\n getMarketOrdersInStructure: {\n path: 'markets/structures/{structureId}/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['structureId'],\n responseSchema: z.array(StructureMarketOrderSchema),\n },\n getMarketHistory: {\n path: 'markets/{regionId}/history/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n queryParams: { typeId: 'type_id' },\n responseSchema: z.array(MarketHistorySchema),\n },\n getMarketOrders: {\n path: 'markets/{regionId}/orders/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n queryParams: { orderType: 'order_type' },\n responseSchema: z.array(MarketOrderSchema),\n },\n getMarketTypes: {\n path: 'markets/{regionId}/types/',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n responseSchema: z.array(z.number()),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { marketEndpoints } from '../core/endpoints/marketEndpoints';\nimport {\n MarketOrder,\n CharacterMarketOrder,\n CharacterMarketOrderHistory,\n CorporationMarketOrder,\n CorporationMarketOrderHistory,\n StructureMarketOrder,\n MarketHistory,\n MarketGroup,\n MarketPrice,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class MarketClient extends BaseEsiClient<typeof marketEndpoints> {\n constructor(client: ApiClient) {\n super(client, marketEndpoints);\n }\n\n /**\n * Retrieves all active market orders placed by a character.\n *\n * @param characterId - The ID of the character whose orders to fetch\n * @returns A list of the character's open market orders\n * @requires Authentication\n */\n getCharacterOrders(characterId: number): Promise<CharacterMarketOrder[]> {\n return this.api.getCharacterOrders(characterId);\n }\n\n /**\n * Retrieves the history of expired and cancelled market orders for a character.\n *\n * @param characterId - The ID of the character whose order history to fetch\n * @returns A list of the character's historical market orders\n * @requires Authentication\n */\n getCharacterOrderHistory(\n characterId: number,\n ): Promise<CharacterMarketOrderHistory[]> {\n return this.api.getCharacterOrderHistory(characterId);\n }\n\n /**\n * Retrieves all active market orders placed by members of a corporation.\n *\n * @param corporationId - The ID of the corporation whose orders to fetch\n * @returns A list of the corporation's open market orders\n * @requires Authentication\n */\n getCorporationOrders(\n corporationId: number,\n ): Promise<CorporationMarketOrder[]> {\n return this.api.getCorporationOrders(corporationId);\n }\n\n /**\n * Retrieves the history of expired and cancelled market orders for a corporation.\n *\n * @param corporationId - The ID of the corporation whose order history to fetch\n * @returns A list of the corporation's historical market orders\n * @requires Authentication\n */\n getCorporationOrderHistory(\n corporationId: number,\n ): Promise<CorporationMarketOrderHistory[]> {\n return this.api.getCorporationOrderHistory(corporationId);\n }\n\n /**\n * Retrieves the daily price and volume history for a specific item type in a region.\n *\n * @param regionId - The ID of the region to fetch market history for\n * @param typeId - The type ID of the item to get history for\n * @returns A list of daily market history entries with price and volume data\n */\n getMarketHistory(regionId: number, typeId: number): Promise<MarketHistory[]> {\n return this.api.getMarketHistory(regionId, typeId);\n }\n\n /**\n * Retrieves all active market orders in a region for all item types.\n *\n * @param regionId - The ID of the region to fetch orders for\n * @returns A list of all active market orders in the region\n */\n getMarketOrders(regionId: number): Promise<MarketOrder[]> {\n return this.api.getMarketOrders(regionId, 'all');\n }\n\n /**\n * Retrieves the list of type IDs that have active market orders in a region.\n *\n * @param regionId - The ID of the region to check for active types\n * @returns A list of type IDs with active orders in the region\n */\n getMarketTypes(regionId: number): Promise<number[]> {\n return this.api.getMarketTypes(regionId);\n }\n\n /**\n * Retrieves the list of all market group IDs used to categorize items on the market.\n *\n * @returns A list of all market group IDs\n */\n getMarketGroups(): Promise<number[]> {\n return this.api.getMarketGroups();\n }\n\n /**\n * Retrieves detailed information about a specific market group, including its name, description, and contained types.\n *\n * @param marketGroupId - The ID of the market group to look up\n * @returns The market group details including name, description, types, and optional parent group\n */\n getMarketGroupInformation(marketGroupId: number): Promise<MarketGroup> {\n return this.api.getMarketGroupInformation(marketGroupId);\n }\n\n /**\n * Retrieves the global average and adjusted prices for all tradeable item types.\n *\n * @returns A list of item types with their average and adjusted market prices\n */\n getMarketPrices(): Promise<MarketPrice[]> {\n return this.api.getMarketPrices();\n }\n\n /**\n * Retrieves all active market orders listed in a specific player-owned structure.\n *\n * @param structureId - The ID of the structure to fetch orders for\n * @returns A list of active market orders in the structure\n * @requires Authentication\n */\n getMarketOrdersInStructure(\n structureId: number,\n ): Promise<StructureMarketOrder[]> {\n return this.api.getMarketOrdersInStructure(structureId);\n }\n\n fetchAllMarketOrders(\n regionId: number,\n concurrency?: number,\n ): Promise<MarketOrder[]> {\n return this.fetchAllEndpoint<MarketOrder>(\n 'getMarketOrders',\n [regionId, 'all'],\n concurrency,\n );\n }\n\n fetchAllMarketTypes(\n regionId: number,\n concurrency?: number,\n ): Promise<number[]> {\n return this.fetchAllEndpoint<number>(\n 'getMarketTypes',\n [regionId],\n concurrency,\n );\n }\n\n fetchAllCharacterOrderHistory(\n characterId: number,\n concurrency?: number,\n ): Promise<CharacterMarketOrderHistory[]> {\n return this.fetchAllEndpoint<CharacterMarketOrderHistory>(\n 'getCharacterOrderHistory',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationOrders(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMarketOrder[]> {\n return this.fetchAllEndpoint<CorporationMarketOrder>(\n 'getCorporationOrders',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllCorporationOrderHistory(\n corporationId: number,\n concurrency?: number,\n ): Promise<CorporationMarketOrderHistory[]> {\n return this.fetchAllEndpoint<CorporationMarketOrderHistory>(\n 'getCorporationOrderHistory',\n [corporationId],\n concurrency,\n );\n }\n\n fetchAllMarketOrdersInStructure(\n structureId: number,\n concurrency?: number,\n ): Promise<StructureMarketOrder[]> {\n return this.fetchAllEndpoint<StructureMarketOrder>(\n 'getMarketOrdersInStructure',\n [structureId],\n concurrency,\n );\n }\n\n streamMarketOrders(\n regionId: number,\n ): AsyncGenerator<PageResult<MarketOrder>, void, undefined> {\n return this.streamEndpoint<MarketOrder>('getMarketOrders', regionId, 'all');\n }\n\n streamMarketTypes(\n regionId: number,\n ): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getMarketTypes', regionId);\n }\n\n streamCharacterOrderHistory(\n characterId: number,\n ): AsyncGenerator<PageResult<CharacterMarketOrderHistory>, void, undefined> {\n return this.streamEndpoint<CharacterMarketOrderHistory>(\n 'getCharacterOrderHistory',\n characterId,\n );\n }\n\n streamCorporationOrders(\n corporationId: number,\n ): AsyncGenerator<PageResult<CorporationMarketOrder>, void, undefined> {\n return this.streamEndpoint<CorporationMarketOrder>(\n 'getCorporationOrders',\n corporationId,\n );\n }\n\n streamCorporationOrderHistory(\n corporationId: number,\n ): AsyncGenerator<\n PageResult<CorporationMarketOrderHistory>,\n void,\n undefined\n > {\n return this.streamEndpoint<CorporationMarketOrderHistory>(\n 'getCorporationOrderHistory',\n corporationId,\n );\n }\n\n streamMarketOrdersInStructure(\n structureId: number,\n ): AsyncGenerator<PageResult<StructureMarketOrder>, void, undefined> {\n return this.streamEndpoint<StructureMarketOrder>(\n 'getMarketOrdersInStructure',\n structureId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n PlanetaryColonySchema,\n CustomsOfficeSchema,\n ColonyLayoutSchema,\n} from '../../schemas/pi';\nimport { SchematicInfoSchema } from '../../schemas/universe';\n\nexport const piEndpoints = {\n getColonies: {\n path: 'characters/{characterId}/planets',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(PlanetaryColonySchema),\n },\n getColonyLayout: {\n path: 'characters/{characterId}/planets/{planetId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'planetId'],\n responseSchema: ColonyLayoutSchema,\n },\n getCorporationCustomsOffices: {\n path: 'corporations/{corporationId}/customs_offices',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CustomsOfficeSchema),\n },\n getSchematicInformation: {\n path: 'universe/schematics/{schematicId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['schematicId'],\n responseSchema: SchematicInfoSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { piEndpoints } from '../core/endpoints/piEndpoints';\nimport {\n PlanetaryColony,\n CustomsOffice,\n ColonyLayout,\n SchematicInfo,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class PiClient extends BaseEsiClient<typeof piEndpoints> {\n constructor(client: ApiClient) {\n super(client, piEndpoints);\n }\n\n /**\n * Retrieves the list of planetary interaction colonies owned by a character.\n *\n * @param characterId - The ID of the character whose colonies to fetch\n * @returns A list of the character's planetary colonies\n * @requires Authentication\n */\n getColonies(characterId: number): Promise<PlanetaryColony[]> {\n return this.api.getColonies(characterId);\n }\n\n /**\n * Retrieves the full layout of a planetary colony including pins, links, and routes.\n *\n * @param characterId - The ID of the character who owns the colony\n * @param planetId - The ID of the planet to get the colony layout for\n * @returns The colony layout with pins, links, and routes\n * @requires Authentication\n */\n getColonyLayout(\n characterId: number,\n planetId: number,\n ): Promise<ColonyLayout> {\n return this.api.getColonyLayout(characterId, planetId);\n }\n\n /**\n * Retrieves the list of customs offices owned by a corporation.\n *\n * @param corporationId - The ID of the corporation whose customs offices to fetch\n * @returns A list of the corporation's customs offices with their settings\n * @requires Authentication\n */\n getCorporationCustomsOffices(\n corporationId: number,\n ): Promise<CustomsOffice[]> {\n return this.api.getCorporationCustomsOffices(corporationId);\n }\n\n /**\n * Retrieves information about a planetary interaction schematic, including its inputs and outputs.\n *\n * @param schematicId - The ID of the schematic to look up\n * @returns The schematic details including cycle time, inputs, and outputs\n */\n getSchematicInformation(schematicId: number): Promise<SchematicInfo> {\n return this.api.getSchematicInformation(schematicId);\n }\n\n fetchAllColonies(\n characterId: number,\n concurrency?: number,\n ): Promise<PlanetaryColony[]> {\n return this.fetchAllEndpoint<PlanetaryColony>(\n 'getColonies',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationCustomsOffices(\n corporationId: number,\n concurrency?: number,\n ): Promise<CustomsOffice[]> {\n return this.fetchAllEndpoint<CustomsOffice>(\n 'getCorporationCustomsOffices',\n [corporationId],\n concurrency,\n );\n }\n\n streamColonies(\n characterId: number,\n ): AsyncGenerator<PageResult<PlanetaryColony>, void, undefined> {\n return this.streamEndpoint<PlanetaryColony>('getColonies', characterId);\n }\n\n streamCorporationCustomsOffices(\n corporationId: number,\n ): AsyncGenerator<PageResult<CustomsOffice>, void, undefined> {\n return this.streamEndpoint<CustomsOffice>(\n 'getCorporationCustomsOffices',\n corporationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\n\nexport const routeEndpoints = {\n getRoute: {\n path: 'route/{origin}/{destination}',\n method: 'POST',\n requiresAuth: false,\n pathParams: ['origin', 'destination'],\n hasBody: true,\n responseSchema: z.looseObject({ route: z.array(z.number()) }),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { routeEndpoints } from '../core/endpoints/routeEndpoints';\n\nexport interface RouteOptions {\n preference?: 'Shorter' | 'Safer' | 'LessSecure' | undefined;\n avoid_systems?: number[] | undefined;\n connections?: { from: number; to: number }[] | undefined;\n security_penalty?: number | undefined;\n}\n\nexport class RouteClient extends BaseEsiClient<typeof routeEndpoints> {\n constructor(client: ApiClient) {\n super(client, routeEndpoints);\n }\n\n /**\n * Calculates a route between two solar systems, returning the list of system IDs along the path via POST.\n *\n * @param origin - The solar system ID to start the route from\n * @param destination - The solar system ID to route to\n * @param options - Optional routing preferences such as route type, avoided systems, and custom connections\n * @returns An ordered list of solar system IDs representing the route\n */\n async getRoute(\n origin: number,\n destination: number,\n options?: RouteOptions,\n ): Promise<number[]> {\n const body = options ?? {};\n const result = (await this.api.getRoute(origin, destination, body)) as {\n route: number[];\n };\n return result.route;\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport { SearchResultSchema } from '../../schemas/universe';\n\nexport const searchEndpoints = {\n searchCharacter: {\n path: 'characters/{characterId}/search/',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { searchString: 'search', categories: 'categories' },\n responseSchema: SearchResultSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { searchEndpoints } from '../core/endpoints/searchEndpoints';\nimport { SearchResult } from '../types/api-responses';\n\nexport class SearchClient extends BaseEsiClient<typeof searchEndpoints> {\n constructor(client: ApiClient) {\n super(client, searchEndpoints);\n }\n\n /**\n * Searches for entities matching a query string on behalf of a character.\n *\n * @param characterId - The ID of the character performing the search\n * @param searchString - The search query string to match against\n * @returns Search results grouped by entity category\n * @requires Authentication\n */\n characterSearch(\n characterId: number,\n searchString: string,\n categories: string[],\n ): Promise<SearchResult> {\n return this.api.searchCharacter(\n characterId,\n searchString,\n categories.join(','),\n ) as Promise<SearchResult>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n SkillQueueSchema,\n CharacterSkillsResponseSchema,\n} from '../../schemas/skills';\nimport { CharacterAttributesSchema } from '../../schemas/character';\n\nexport const skillEndpoints = {\n getCharacterAttributes: {\n path: 'characters/{characterId}/attributes',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterAttributesSchema,\n },\n getCharacterSkillQueue: {\n path: 'characters/{characterId}/skillqueue',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(SkillQueueSchema),\n },\n getCharacterSkills: {\n path: 'characters/{characterId}/skills',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterSkillsResponseSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { skillEndpoints } from '../core/endpoints/skillEndpoints';\nimport {\n CharacterAttributes,\n CharacterSkill,\n SkillQueue,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class CharacterSkillsClient extends BaseEsiClient<\n typeof skillEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, skillEndpoints);\n }\n\n /**\n * Retrieves a character's neural remap attribute values (intelligence, memory, charisma, perception, willpower).\n *\n * @param characterId - The ID of the character\n * @returns The character's current attribute values and bonus remap information\n * @requires Authentication\n */\n getCharacterAttributes(characterId: number): Promise<CharacterAttributes> {\n return this.api.getCharacterAttributes(characterId);\n }\n\n /**\n * Retrieves the skill training queue for a character.\n *\n * @param characterId - The ID of the character\n * @returns An ordered list of skills currently in the character's training queue\n * @requires Authentication\n */\n getCharacterSkillQueue(characterId: number): Promise<SkillQueue[]> {\n return this.api.getCharacterSkillQueue(characterId);\n }\n\n /**\n * Retrieves all trained skills for a character, including total and unallocated skill points.\n *\n * @param characterId - The ID of the character\n * @returns The character's trained skills, total SP, and optionally unallocated SP\n * @requires Authentication\n */\n getCharacterSkills(characterId: number): Promise<{\n skills: CharacterSkill[];\n total_sp: number;\n unallocated_sp?: number | undefined;\n }> {\n return this.api.getCharacterSkills(characterId);\n }\n\n fetchAllCharacterSkillQueue(\n characterId: number,\n concurrency?: number,\n ): Promise<SkillQueue[]> {\n return this.fetchAllEndpoint<SkillQueue>(\n 'getCharacterSkillQueue',\n [characterId],\n concurrency,\n );\n }\n\n streamCharacterSkillQueue(\n characterId: number,\n ): AsyncGenerator<PageResult<SkillQueue>, void, undefined> {\n return this.streamEndpoint<SkillQueue>(\n 'getCharacterSkillQueue',\n characterId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n SovereigntyCampaignSchema,\n SovereigntySystemSchema,\n} from '../../schemas/sovereignty';\n\nexport const sovereigntyEndpoints = {\n getSovereigntyCampaigns: {\n path: 'sovereignty/campaigns',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(SovereigntyCampaignSchema),\n },\n getSovereigntySystems: {\n path: 'sovereignty/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: SovereigntySystemSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { sovereigntyEndpoints } from '../core/endpoints/sovereigntyEndpoints';\nimport { SovereigntyCampaign, SovereigntySystem } from '../types/api-responses';\n\nexport class SovereigntyClient extends BaseEsiClient<\n typeof sovereigntyEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, sovereigntyEndpoints);\n }\n\n /**\n * Retrieves all active sovereignty campaigns, including command node contests and station freeports.\n *\n * @returns A list of active sovereignty campaigns\n */\n getSovereigntyCampaigns(): Promise<SovereigntyCampaign[]> {\n return this.api.getSovereigntyCampaigns() as Promise<SovereigntyCampaign[]>;\n }\n\n /**\n * Retrieves the combined sovereignty systems data including occupancy, structures, and separate ADM indices (military, industry, strategic).\n *\n * @returns A list of sovereignty systems with ownership, ADM indices, and anchored structures\n */\n getSovereigntySystems(): Promise<SovereigntySystem> {\n return this.api.getSovereigntySystems() as Promise<SovereigntySystem>;\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport { ServerStatusSchema } from '../../schemas/status';\n\nexport const statusEndpoints = {\n getStatus: {\n path: 'status',\n method: 'GET',\n requiresAuth: false,\n responseSchema: ServerStatusSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { statusEndpoints } from '../core/endpoints/statusEndpoints';\nimport { ServerStatus } from '../types/api-responses';\n\nexport class StatusClient extends BaseEsiClient<typeof statusEndpoints> {\n constructor(client: ApiClient) {\n super(client, statusEndpoints);\n }\n\n /**\n * Retrieves the current Tranquility server status, including player count and server version.\n *\n * @returns The current server status information\n */\n getStatus(): Promise<ServerStatus> {\n return this.api.getStatus() as Promise<ServerStatus>;\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\n\nexport const uiEndpoints = {\n setAutopilotWaypoint: {\n path: 'ui/autopilot/waypoint',\n method: 'POST',\n requiresAuth: true,\n queryParams: {\n destinationId: 'destination_id',\n addToBeginning: 'add_to_beginning',\n clearOtherWaypoints: 'clear_other_waypoints',\n },\n },\n openContractWindow: {\n path: 'ui/openwindow/contract',\n method: 'POST',\n requiresAuth: true,\n queryParams: { contractId: 'contract_id' },\n },\n openInformationWindow: {\n path: 'ui/openwindow/information',\n method: 'POST',\n requiresAuth: true,\n queryParams: { targetId: 'target_id' },\n },\n openMarketDetailsWindow: {\n path: 'ui/openwindow/marketdetails',\n method: 'POST',\n requiresAuth: true,\n queryParams: { typeId: 'type_id' },\n },\n openNewMailWindow: {\n path: 'ui/openwindow/newmail',\n method: 'POST',\n requiresAuth: true,\n hasBody: true,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { uiEndpoints } from '../core/endpoints/uiEndpoints';\n\nexport class UiClient extends BaseEsiClient<typeof uiEndpoints> {\n constructor(client: ApiClient) {\n super(client, uiEndpoints);\n }\n\n /**\n * Sets a solar system as an autopilot waypoint in the EVE client.\n *\n * @param destinationId - The solar system, station, or structure ID to set as waypoint\n * @param addToBeginning - Whether to add the waypoint to the beginning of the route\n * @param clearOtherWaypoints - Whether to clear existing waypoints first\n * @requires Authentication\n */\n setAutopilotWaypoint(\n destinationId: number,\n addToBeginning: boolean,\n clearOtherWaypoints: boolean,\n ): Promise<void> {\n return this.api.setAutopilotWaypoint(\n destinationId,\n addToBeginning,\n clearOtherWaypoints,\n ) as Promise<void>;\n }\n\n /**\n * Opens the contract window for a specific contract in the EVE client.\n *\n * @param contractId - The contract ID to display\n * @requires Authentication\n */\n openContractWindow(contractId: number): Promise<void> {\n return this.api.openContractWindow(contractId) as Promise<void>;\n }\n\n /**\n * Opens the information window for a specific entity in the EVE client.\n *\n * @param targetId - The character, corporation, alliance, or type ID to display\n * @requires Authentication\n */\n openInformationWindow(targetId: number): Promise<void> {\n return this.api.openInformationWindow(targetId) as Promise<void>;\n }\n\n /**\n * Opens the market details window for a specific type in the EVE client.\n *\n * @param typeId - The inventory type ID to display market details for\n * @requires Authentication\n */\n openMarketDetailsWindow(typeId: number): Promise<void> {\n return this.api.openMarketDetailsWindow(typeId) as Promise<void>;\n }\n\n /**\n * Opens the new mail composition window in the EVE client with pre-filled fields.\n *\n * @param body - The mail details including recipients (integer array), subject, and body text\n * @requires Authentication\n */\n openNewMailWindow(body: object): Promise<void> {\n return this.api.openNewMailWindow(body) as Promise<void>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n AncestrySchema,\n AsteroidBeltInfoSchema,\n BloodlineSchema,\n BulkIdResultSchema,\n ConstellationInfoSchema,\n FactionSchema,\n GraphicInfoSchema,\n ItemCategorySchema,\n ItemGroupSchema,\n MoonInfoSchema,\n NameAndCategorySchema,\n PlanetInfoSchema,\n RaceSchema,\n RegionInfoSchema,\n SchematicInfoSchema,\n SolarSystemInfoSchema,\n StarInfoSchema,\n StargateInfoSchema,\n StationInfoSchema,\n StructureInfoSchema,\n SystemJumpSchema,\n SystemKillSchema,\n TypeInfoSchema,\n} from '../../schemas/universe';\n\nexport const universeEndpoints = {\n getAncestries: {\n path: 'universe/ancestries',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(AncestrySchema),\n },\n getAsteroidBeltInfo: {\n path: 'universe/asteroid_belts/{asteroidBeltId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['asteroidBeltId'],\n responseSchema: AsteroidBeltInfoSchema,\n },\n getBloodlines: {\n path: 'universe/bloodlines',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(BloodlineSchema),\n },\n getCategories: {\n path: 'universe/categories',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getCategoryById: {\n path: 'universe/categories/{categoryId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['categoryId'],\n responseSchema: ItemCategorySchema,\n },\n getConstellations: {\n path: 'universe/constellations',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getConstellationById: {\n path: 'universe/constellations/{constellationId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['constellationId'],\n responseSchema: ConstellationInfoSchema,\n },\n getFactions: {\n path: 'universe/factions',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(FactionSchema),\n },\n getGraphics: {\n path: 'universe/graphics',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getGraphicById: {\n path: 'universe/graphics/{graphicId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['graphicId'],\n responseSchema: GraphicInfoSchema,\n },\n getItemGroups: {\n path: 'universe/groups',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getItemGroupById: {\n path: 'universe/groups/{groupId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['groupId'],\n responseSchema: ItemGroupSchema,\n },\n postBulkNamesToIds: {\n path: 'universe/ids',\n method: 'POST',\n requiresAuth: false,\n bodyBuilder: (names: string[]) => names,\n responseSchema: BulkIdResultSchema,\n requestSchema: z.array(z.string().min(1)),\n },\n getMoonById: {\n path: 'universe/moons/{moonId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['moonId'],\n responseSchema: MoonInfoSchema,\n },\n postNamesAndCategories: {\n path: 'universe/names',\n method: 'POST',\n requiresAuth: false,\n bodyBuilder: (ids: number[]) => ids,\n responseSchema: z.array(NameAndCategorySchema),\n requestSchema: z.array(z.number().int()),\n },\n getPlanetById: {\n path: 'universe/planets/{planetId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['planetId'],\n responseSchema: PlanetInfoSchema,\n },\n getRaces: {\n path: 'universe/races',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(RaceSchema),\n },\n getRegions: {\n path: 'universe/regions',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getRegionById: {\n path: 'universe/regions/{regionId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['regionId'],\n responseSchema: RegionInfoSchema,\n },\n getSchematicById: {\n path: 'universe/schematics/{schematicId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['schematicId'],\n responseSchema: SchematicInfoSchema,\n },\n getStargateById: {\n path: 'universe/stargates/{stargateId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['stargateId'],\n responseSchema: StargateInfoSchema,\n },\n getStarById: {\n path: 'universe/stars/{starId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['starId'],\n responseSchema: StarInfoSchema,\n },\n getStationById: {\n path: 'universe/stations/{stationId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['stationId'],\n responseSchema: StationInfoSchema,\n },\n getStructures: {\n path: 'universe/structures',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getStructureById: {\n path: 'universe/structures/{structureId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['structureId'],\n responseSchema: StructureInfoSchema,\n },\n getSystemJumps: {\n path: 'universe/system_jumps',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(SystemJumpSchema),\n },\n getSystemKills: {\n path: 'universe/system_kills',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(SystemKillSchema),\n },\n getSystems: {\n path: 'universe/systems',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getSystemById: {\n path: 'universe/systems/{systemId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['systemId'],\n responseSchema: SolarSystemInfoSchema,\n },\n getTypes: {\n path: 'universe/types',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getTypeById: {\n path: 'universe/types/{typeId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['typeId'],\n responseSchema: TypeInfoSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { universeEndpoints } from '../core/endpoints/universeEndpoints';\nimport {\n Ancestry,\n AsteroidBeltInfo,\n Bloodline,\n BulkIdResult,\n ConstellationInfo,\n Faction,\n GraphicInfo,\n ItemCategory,\n ItemGroup,\n MoonInfo,\n NameAndCategory,\n PlanetInfo,\n Race,\n RegionInfo,\n SchematicInfo,\n SolarSystemInfo,\n StarInfo,\n StargateInfo,\n StationInfo,\n StructureInfo,\n SystemJump,\n SystemKill,\n TypeInfo,\n} from '../types/api-responses';\n\nexport class UniverseClient extends BaseEsiClient<typeof universeEndpoints> {\n constructor(client: ApiClient) {\n super(client, universeEndpoints);\n }\n\n /**\n * Retrieves all available character ancestries for character creation.\n *\n * @returns A list of character ancestries\n */\n getAncestries(): Promise<Ancestry[]> {\n return this.api.getAncestries() as Promise<Ancestry[]>;\n }\n\n /**\n * Retrieves information about an asteroid belt, including its position in space.\n *\n * @param asteroidBeltId - The ID of the asteroid belt\n * @returns Details about the asteroid belt\n */\n getAsteroidBeltInfo(asteroidBeltId: number): Promise<AsteroidBeltInfo> {\n return this.api.getAsteroidBeltInfo(\n asteroidBeltId,\n ) as Promise<AsteroidBeltInfo>;\n }\n\n /**\n * Retrieves all available character bloodlines for character creation.\n *\n * @returns A list of character bloodlines\n */\n getBloodlines(): Promise<Bloodline[]> {\n return this.api.getBloodlines() as Promise<Bloodline[]>;\n }\n\n /**\n * Retrieves information about a constellation, including its systems and position.\n *\n * @param constellationId - The ID of the constellation\n * @returns Detailed constellation information\n */\n getConstellationById(constellationId: number): Promise<ConstellationInfo> {\n return this.api.getConstellationById(\n constellationId,\n ) as Promise<ConstellationInfo>;\n }\n\n /**\n * Retrieves a list of all constellation IDs in the EVE universe.\n *\n * @returns A list of constellation IDs\n */\n getConstellations(): Promise<number[]> {\n return this.api.getConstellations() as Promise<number[]>;\n }\n\n /**\n * Retrieves all NPC factions in the EVE universe.\n *\n * @returns A list of NPC factions\n */\n getFactions(): Promise<Faction[]> {\n return this.api.getFactions() as Promise<Faction[]>;\n }\n\n /**\n * Retrieves information about a specific graphic asset used in the EVE client.\n *\n * @param graphicId - The ID of the graphic\n * @returns Detailed graphic information\n */\n getGraphicById(graphicId: number): Promise<GraphicInfo> {\n return this.api.getGraphicById(graphicId) as Promise<GraphicInfo>;\n }\n\n /**\n * Retrieves a list of all graphic asset IDs.\n *\n * @returns A list of graphic IDs\n */\n getGraphics(): Promise<number[]> {\n return this.api.getGraphics() as Promise<number[]>;\n }\n\n /**\n * Retrieves a list of all item category IDs in the EVE universe.\n *\n * @returns A list of item category IDs\n */\n getItemCategories(): Promise<number[]> {\n return this.api.getCategories() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a specific item category, including its groups.\n *\n * @param categoryId - The ID of the item category\n * @returns Detailed item category information\n */\n getItemCategoryById(categoryId: number): Promise<ItemCategory> {\n return this.api.getCategoryById(categoryId) as Promise<ItemCategory>;\n }\n\n /**\n * Retrieves information about a specific item group, including its types.\n *\n * @param groupId - The ID of the item group\n * @returns Detailed item group information\n */\n getItemGroupById(groupId: number): Promise<ItemGroup> {\n return this.api.getItemGroupById(groupId) as Promise<ItemGroup>;\n }\n\n /**\n * Retrieves a list of all item group IDs in the EVE universe.\n *\n * @returns A list of item group IDs\n */\n getItemGroups(): Promise<number[]> {\n return this.api.getItemGroups() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a moon, including its name and position.\n *\n * @param moonId - The ID of the moon\n * @returns Detailed moon information\n */\n getMoonById(moonId: number): Promise<MoonInfo> {\n return this.api.getMoonById(moonId) as Promise<MoonInfo>;\n }\n\n /**\n * Retrieves information about a planet, including its name, type, and position.\n *\n * @param planetId - The ID of the planet\n * @returns Detailed planet information\n */\n getPlanetById(planetId: number): Promise<PlanetInfo> {\n return this.api.getPlanetById(planetId) as Promise<PlanetInfo>;\n }\n\n /**\n * Retrieves all playable races in the EVE universe.\n *\n * @returns A list of playable races\n */\n getRaces(): Promise<Race[]> {\n return this.api.getRaces() as Promise<Race[]>;\n }\n\n /**\n * Retrieves information about a region, including its constellations and name.\n *\n * @param regionId - The ID of the region\n * @returns Detailed region information\n */\n getRegionById(regionId: number): Promise<RegionInfo> {\n return this.api.getRegionById(regionId) as Promise<RegionInfo>;\n }\n\n /**\n * Retrieves information about a star, including its spectral class and luminosity.\n *\n * @param starId - The ID of the star\n * @returns Detailed star information\n */\n getStarById(starId: number): Promise<StarInfo> {\n return this.api.getStarById(starId) as Promise<StarInfo>;\n }\n\n /**\n * Retrieves information about a stargate, including its destination and position.\n *\n * @param stargateId - The ID of the stargate\n * @returns Detailed stargate information\n */\n getStargateById(stargateId: number): Promise<StargateInfo> {\n return this.api.getStargateById(stargateId) as Promise<StargateInfo>;\n }\n\n /**\n * Retrieves public information about a station, including its services and location.\n *\n * @param stationId - The ID of the station\n * @returns Detailed station information\n */\n getStationById(stationId: number): Promise<StationInfo> {\n return this.api.getStationById(stationId) as Promise<StationInfo>;\n }\n\n /**\n * Retrieves information about a player-owned structure by its ID.\n *\n * @param structureId - The ID of the structure\n * @returns Detailed structure information\n * @requires Authentication\n */\n getStructureById(structureId: number): Promise<StructureInfo> {\n return this.api.getStructureById(structureId) as Promise<StructureInfo>;\n }\n\n /**\n * Retrieves a list of all publicly visible player-owned structure IDs.\n *\n * @returns A list of structure IDs\n */\n getStructures(): Promise<number[]> {\n return this.api.getStructures() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a solar system, including its planets, stargates, and security status.\n *\n * @param systemId - The ID of the solar system\n * @returns Detailed solar system information\n */\n getSystemById(systemId: number): Promise<SolarSystemInfo> {\n return this.api.getSystemById(systemId) as Promise<SolarSystemInfo>;\n }\n\n /**\n * Retrieves the number of ship jumps per solar system within the last hour.\n *\n * @returns A list of solar systems with their jump counts\n */\n getSystemJumps(): Promise<SystemJump[]> {\n return this.api.getSystemJumps() as Promise<SystemJump[]>;\n }\n\n /**\n * Retrieves the number of NPC and player ship kills per solar system within the last hour.\n *\n * @returns A list of solar systems with their kill counts\n */\n getSystemKills(): Promise<SystemKill[]> {\n return this.api.getSystemKills() as Promise<SystemKill[]>;\n }\n\n /**\n * Retrieves a list of all solar system IDs in the EVE universe.\n *\n * @returns A list of solar system IDs\n */\n getSystems(): Promise<number[]> {\n return this.api.getSystems() as Promise<number[]>;\n }\n\n /**\n * Retrieves information about a specific item type, including its description and attributes.\n *\n * @param typeId - The ID of the item type\n * @returns Detailed item type information\n */\n getTypeById(typeId: number): Promise<TypeInfo> {\n return this.api.getTypeById(typeId) as Promise<TypeInfo>;\n }\n\n /**\n * Retrieves a list of all item type IDs in the EVE universe.\n *\n * @returns A list of item type IDs\n */\n getTypes(): Promise<number[]> {\n return this.api.getTypes() as Promise<number[]>;\n }\n\n /**\n * Resolves a list of names to their corresponding IDs via a bulk POST operation.\n *\n * @param names - An array of names to resolve to IDs\n * @returns The resolved IDs grouped by entity category\n */\n postBulkNamesToIds(names: string[]): Promise<BulkIdResult> {\n return this.api.postBulkNamesToIds(names) as Promise<BulkIdResult>;\n }\n\n /**\n * Resolves a list of IDs to their names and categories via a bulk POST operation.\n *\n * @param ids - An array of entity IDs to resolve\n * @returns A list of names with their corresponding categories\n */\n postNamesAndCategories(ids: number[]): Promise<NameAndCategory[]> {\n return this.api.postNamesAndCategories(ids) as Promise<NameAndCategory[]>;\n }\n\n /**\n * Retrieves information about a planetary interaction schematic.\n *\n * @param schematicId - The ID of the PI schematic\n * @returns Detailed schematic information including inputs and outputs\n */\n getSchematicById(schematicId: number): Promise<SchematicInfo> {\n return this.api.getSchematicById(schematicId) as Promise<SchematicInfo>;\n }\n\n /**\n * Retrieves a list of all region IDs in the EVE universe.\n *\n * @returns A list of region IDs\n */\n getRegions(): Promise<number[]> {\n return this.api.getRegions() as Promise<number[]>;\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n WalletJournalSchema,\n WalletTransactionSchema,\n CorporationWalletTransactionSchema,\n} from '../../schemas/wallet';\nimport { CorporationWalletDivisionSchema } from '../../schemas/corporation';\n\nexport const walletEndpoints = {\n getCharacterWallet: {\n path: 'characters/{characterId}/wallet',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.number(),\n },\n getCharacterWalletJournal: {\n path: 'characters/{characterId}/wallet/journal',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(WalletJournalSchema),\n },\n getCharacterWalletTransactions: {\n path: 'characters/{characterId}/wallet/transactions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(WalletTransactionSchema),\n },\n getCorporationWallets: {\n path: 'corporations/{corporationId}/wallets',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(CorporationWalletDivisionSchema),\n },\n getCorporationWalletJournal: {\n path: 'corporations/{corporationId}/wallets/{division}/journal',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'division'],\n responseSchema: z.array(WalletJournalSchema),\n },\n getCorporationWalletTransactions: {\n path: 'corporations/{corporationId}/wallets/{division}/transactions',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'division'],\n responseSchema: z.array(CorporationWalletTransactionSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { walletEndpoints } from '../core/endpoints/walletEndpoints';\nimport {\n CorporationWalletTransaction,\n WalletJournal,\n WalletTransaction,\n} from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class WalletClient extends BaseEsiClient<typeof walletEndpoints> {\n constructor(client: ApiClient) {\n super(client, walletEndpoints);\n }\n\n /**\n * Retrieves the current ISK balance of a character's wallet.\n *\n * @param characterId - The ID of the character\n * @returns The character's wallet balance in ISK\n * @requires Authentication\n */\n getCharacterWallet(characterId: number): Promise<number> {\n return this.api.getCharacterWallet(characterId);\n }\n\n /**\n * Retrieves the wallet journal entries for a character, showing ISK transactions and their reasons.\n *\n * @param characterId - The ID of the character\n * @returns A list of wallet journal entries\n * @requires Authentication\n */\n getCharacterWalletJournal(characterId: number): Promise<WalletJournal[]> {\n return this.api.getCharacterWalletJournal(characterId);\n }\n\n /**\n * Retrieves the market transaction history for a character's wallet.\n *\n * @param characterId - The ID of the character\n * @returns A list of market buy and sell transactions\n * @requires Authentication\n */\n getCharacterWalletTransactions(\n characterId: number,\n ): Promise<WalletTransaction[]> {\n return this.api.getCharacterWalletTransactions(characterId);\n }\n\n /**\n * Retrieves the balances for all wallet divisions of a corporation.\n *\n * @param corporationId - The ID of the corporation\n * @returns A list of wallet divisions with their balances\n * @requires Authentication\n */\n getCorporationWallets(\n corporationId: number,\n ): Promise<{ division: number; balance: number }[]> {\n return this.api.getCorporationWallets(corporationId);\n }\n\n /**\n * Retrieves the wallet journal entries for a specific division of a corporation wallet.\n *\n * @param corporationId - The ID of the corporation\n * @param division - The wallet division number (1-7)\n * @returns A list of wallet journal entries for the specified division\n * @requires Authentication\n */\n getCorporationWalletJournal(\n corporationId: number,\n division: number,\n ): Promise<WalletJournal[]> {\n return this.api.getCorporationWalletJournal(corporationId, division);\n }\n\n /**\n * Retrieves the market transaction history for a specific division of a corporation wallet.\n *\n * @param corporationId - The ID of the corporation\n * @param division - The wallet division number (1-7)\n * @returns A list of market buy and sell transactions for the specified division\n * @requires Authentication\n */\n getCorporationWalletTransactions(\n corporationId: number,\n division: number,\n ): Promise<CorporationWalletTransaction[]> {\n return this.api.getCorporationWalletTransactions(corporationId, division);\n }\n\n fetchAllCharacterWalletJournal(\n characterId: number,\n concurrency?: number,\n ): Promise<WalletJournal[]> {\n return this.fetchAllEndpoint<WalletJournal>(\n 'getCharacterWalletJournal',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationWalletJournal(\n corporationId: number,\n division: number,\n concurrency?: number,\n ): Promise<WalletJournal[]> {\n return this.fetchAllEndpoint<WalletJournal>(\n 'getCorporationWalletJournal',\n [corporationId, division],\n concurrency,\n );\n }\n\n fetchAllCharacterWalletTransactions(\n characterId: number,\n concurrency?: number,\n ): Promise<WalletTransaction[]> {\n return this.fetchAllEndpoint<WalletTransaction>(\n 'getCharacterWalletTransactions',\n [characterId],\n concurrency,\n );\n }\n\n fetchAllCorporationWalletTransactions(\n corporationId: number,\n division: number,\n concurrency?: number,\n ): Promise<CorporationWalletTransaction[]> {\n return this.fetchAllEndpoint<CorporationWalletTransaction>(\n 'getCorporationWalletTransactions',\n [corporationId, division],\n concurrency,\n );\n }\n\n streamCharacterWalletJournal(\n characterId: number,\n ): AsyncGenerator<PageResult<WalletJournal>, void, undefined> {\n return this.streamEndpoint<WalletJournal>(\n 'getCharacterWalletJournal',\n characterId,\n );\n }\n\n streamCorporationWalletJournal(\n corporationId: number,\n division: number,\n ): AsyncGenerator<PageResult<WalletJournal>, void, undefined> {\n return this.streamEndpoint<WalletJournal>(\n 'getCorporationWalletJournal',\n corporationId,\n division,\n );\n }\n\n streamCharacterWalletTransactions(\n characterId: number,\n ): AsyncGenerator<PageResult<WalletTransaction>, void, undefined> {\n return this.streamEndpoint<WalletTransaction>(\n 'getCharacterWalletTransactions',\n characterId,\n );\n }\n\n streamCorporationWalletTransactions(\n corporationId: number,\n division: number,\n ): AsyncGenerator<PageResult<CorporationWalletTransaction>, void, undefined> {\n return this.streamEndpoint<CorporationWalletTransaction>(\n 'getCorporationWalletTransactions',\n corporationId,\n division,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { WarSchema } from '../../schemas/wars';\nimport { KillmailSummarySchema } from '../../schemas/killmails';\n\nexport const warEndpoints = {\n getWars: {\n path: 'wars',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.array(z.number()),\n },\n getWarById: {\n path: 'wars/{warId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['warId'],\n responseSchema: WarSchema,\n },\n getWarKillmails: {\n path: 'wars/{warId}/killmails',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['warId'],\n responseSchema: z.array(KillmailSummarySchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { warEndpoints } from '../core/endpoints/warEndpoints';\nimport { War, KillmailSummary } from '../types/api-responses';\nimport { PageResult } from '../core/pagination/AsyncPaginationIterator';\n\nexport class WarsClient extends BaseEsiClient<typeof warEndpoints> {\n constructor(client: ApiClient) {\n super(client, warEndpoints);\n }\n\n /**\n * Retrieves a list of all war IDs, ordered by war ID descending.\n *\n * @returns A list of war IDs\n */\n getWars(): Promise<number[]> {\n return this.api.getWars();\n }\n\n /**\n * Retrieves detailed information about a specific war, including aggressors, defenders, and status.\n *\n * @param warId - The ID of the war\n * @returns Detailed war information\n */\n getWarById(warId: number): Promise<War> {\n return this.api.getWarById(warId);\n }\n\n /**\n * Retrieves the killmail summaries associated with a specific war.\n *\n * @param warId - The ID of the war\n * @returns A list of killmail summaries for the war\n */\n getWarKillmails(warId: number): Promise<KillmailSummary[]> {\n return this.api.getWarKillmails(warId);\n }\n\n fetchAllWars(concurrency?: number): Promise<number[]> {\n return this.fetchAllEndpoint<number>('getWars', [], concurrency);\n }\n\n fetchAllWarKillmails(\n warId: number,\n concurrency?: number,\n ): Promise<KillmailSummary[]> {\n return this.fetchAllEndpoint<KillmailSummary>(\n 'getWarKillmails',\n [warId],\n concurrency,\n );\n }\n\n streamWars(): AsyncGenerator<PageResult<number>, void, undefined> {\n return this.streamEndpoint<number>('getWars');\n }\n\n streamWarKillmails(\n warId: number,\n ): AsyncGenerator<PageResult<KillmailSummary>, void, undefined> {\n return this.streamEndpoint<KillmailSummary>('getWarKillmails', warId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MetaChangelogSchema,\n MetaCompatibilityDatesSchema,\n MetaNameSchema,\n MetaStatusSchema,\n} from '../../schemas/meta';\n\nexport const metaEndpoints = {\n getOpenApiJson: {\n path: 'meta/openapi.json',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.record(z.string(), z.unknown()),\n },\n getOpenApiYaml: {\n path: 'meta/openapi.yaml',\n method: 'GET',\n requiresAuth: false,\n responseSchema: z.string(),\n textResponse: { accept: 'application/yaml, text/yaml, text/plain' },\n },\n getChangelog: {\n path: 'meta/changelog',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaChangelogSchema,\n },\n getCompatibilityDates: {\n path: 'meta/compatibility-dates',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaCompatibilityDatesSchema,\n },\n getName: {\n path: 'meta/name',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaNameSchema,\n },\n getStatus: {\n path: 'meta/status',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MetaStatusSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { metaEndpoints } from '../core/endpoints/metaEndpoints';\nimport {\n MetaChangelog,\n MetaCompatibilityDates,\n MetaName,\n MetaStatus,\n} from '../types/api-responses';\n\nexport class MetaClient extends BaseEsiClient<typeof metaEndpoints> {\n constructor(client: ApiClient) {\n super(client, metaEndpoints);\n }\n\n /**\n * Retrieves the ESI OpenAPI specification in JSON format.\n *\n * @returns The full ESI OpenAPI specification as a JSON object\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n getOpenApiJson(): Promise<Record<string, any>> {\n return this.api.getOpenApiJson() as Promise<Record<string, any>>;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n /**\n * Retrieves the ESI OpenAPI specification in YAML format.\n *\n * @returns The full ESI OpenAPI specification as a YAML string\n */\n getOpenApiYaml(): Promise<string> {\n return this.api.getOpenApiYaml();\n }\n\n /**\n * Retrieves the ESI changelog data.\n *\n * @returns `{ changelog }`: the change entries keyed by compatibility date\n */\n getChangelog(): Promise<MetaChangelog> {\n return this.api.getChangelog();\n }\n\n /**\n * Retrieves the list of ESI compatibility dates.\n *\n * @returns An object containing the list of compatibility dates\n */\n getCompatibilityDates(): Promise<MetaCompatibilityDates> {\n return this.api.getCompatibilityDates();\n }\n\n /**\n * Retrieves the ESI name.\n *\n * @returns `{ current, history }`: the name ESI has now and the dated names\n * it had before\n */\n getName(): Promise<MetaName> {\n return this.api.getName();\n }\n\n /**\n * Retrieves the health of each ESI route.\n *\n * @returns `{ routes }`, one entry per route with its method, path and\n * status ('OK', 'Degraded', 'Down', ...)\n */\n getStatus(): Promise<MetaStatus> {\n return this.api.getStatus();\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n FreelanceJobsListingSchema,\n FreelanceJobDetailSchema,\n CharacterFreelanceJobsListingSchema,\n FreelanceJobParticipationSchema,\n CorporationFreelanceJobsListingSchema,\n FreelanceJobParticipantsListingSchema,\n} from '../../schemas/freelance-jobs';\n\nexport const freelanceJobsEndpoints = {\n getFreelanceJobs: {\n path: 'freelance-jobs',\n method: 'GET',\n requiresAuth: false,\n queryParams: { before: 'before', after: 'after' },\n responseSchema: FreelanceJobsListingSchema,\n },\n getFreelanceJobById: {\n path: 'freelance-jobs/{jobId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['jobId'],\n responseSchema: FreelanceJobDetailSchema,\n },\n getCharacterFreelanceJobs: {\n path: 'characters/{characterId}/freelance-jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CharacterFreelanceJobsListingSchema,\n },\n getCharacterFreelanceJobParticipation: {\n path: 'characters/{characterId}/freelance-jobs/{jobId}/participation',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'jobId'],\n responseSchema: FreelanceJobParticipationSchema,\n },\n getCorporationFreelanceJobs: {\n path: 'corporations/{corporationId}/freelance-jobs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n queryParams: { before: 'before', after: 'after' },\n responseSchema: CorporationFreelanceJobsListingSchema,\n },\n getCorporationFreelanceJobParticipants: {\n path: 'corporations/{corporationId}/freelance-jobs/{jobId}/participants',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'jobId'],\n responseSchema: FreelanceJobParticipantsListingSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { freelanceJobsEndpoints } from '../core/endpoints/freelanceJobsEndpoints';\nimport {\n FreelanceJobsListing,\n FreelanceJobDetail,\n CharacterFreelanceJobsListing,\n FreelanceJobParticipation,\n CorporationFreelanceJobsListing,\n FreelanceJobParticipantsListing,\n} from '../types/api-responses';\n\nexport class FreelanceJobsClient extends BaseEsiClient<\n typeof freelanceJobsEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, freelanceJobsEndpoints);\n }\n\n /**\n * Retrieves a paginated listing of all publicly available freelance jobs.\n *\n * @param before - Optional cursor token for fetching the previous page of results\n * @param after - Optional cursor token for fetching the next page of results\n * @returns A listing of freelance jobs with cursor pagination metadata\n */\n getFreelanceJobs(\n before?: string,\n after?: string,\n ): Promise<FreelanceJobsListing> {\n return this.api.getFreelanceJobs(before, after);\n }\n\n /**\n * Retrieves detailed information about a specific freelance job.\n *\n * @param jobId - The unique identifier of the freelance job\n * @returns Detailed information about the freelance job\n */\n getFreelanceJobById(jobId: string): Promise<FreelanceJobDetail> {\n return this.api.getFreelanceJobById(jobId);\n }\n\n /**\n * Retrieves a paginated listing of freelance jobs associated with a specific character.\n *\n * @param characterId - The ID of the character\n * @param before - Optional cursor token for fetching the previous page of results\n * @param after - Optional cursor token for fetching the next page of results\n * @returns A listing of the character's freelance jobs with cursor pagination metadata\n * @requires Authentication\n */\n getCharacterFreelanceJobs(\n characterId: number,\n before?: string,\n after?: string,\n ): Promise<CharacterFreelanceJobsListing> {\n return this.api.getCharacterFreelanceJobs(characterId, before, after);\n }\n\n /**\n * Retrieves a character's participation details for a specific freelance job.\n *\n * @param characterId - The ID of the character\n * @param jobId - The unique identifier of the freelance job\n * @returns The character's participation details for the job\n * @requires Authentication\n */\n getCharacterFreelanceJobParticipation(\n characterId: number,\n jobId: string,\n ): Promise<FreelanceJobParticipation> {\n return this.api.getCharacterFreelanceJobParticipation(characterId, jobId);\n }\n\n /**\n * Retrieves a paginated listing of freelance jobs associated with a specific corporation.\n *\n * @param corporationId - The ID of the corporation\n * @param before - Optional cursor token for fetching the previous page of results\n * @param after - Optional cursor token for fetching the next page of results\n * @returns A listing of the corporation's freelance jobs with cursor pagination metadata\n * @requires Authentication\n */\n getCorporationFreelanceJobs(\n corporationId: number,\n before?: string,\n after?: string,\n ): Promise<CorporationFreelanceJobsListing> {\n return this.api.getCorporationFreelanceJobs(corporationId, before, after);\n }\n\n /**\n * Retrieves the list of participants from a corporation in a specific freelance job.\n *\n * @param corporationId - The ID of the corporation\n * @param jobId - The unique identifier of the freelance job\n * @returns A page holding the job's participants, with an optional cursor\n * @requires Authentication\n */\n getCorporationFreelanceJobParticipants(\n corporationId: number,\n jobId: string,\n ): Promise<FreelanceJobParticipantsListing> {\n return this.api.getCorporationFreelanceJobParticipants(\n corporationId,\n jobId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n SovereigntyHubSchema,\n OrbitalSkyhookSchema,\n RaidableSkyhooksResponseSchema,\n SkyhookDetailSchema,\n SovereigntyHubDetailSchema,\n} from '../../schemas/skyhooks';\n\nexport const skyhookEndpoints = {\n getSovereigntyHubs: {\n path: 'corporations/{corporationId}/structures/sovereignty-hubs',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(SovereigntyHubSchema),\n },\n getOrbitalSkyhooks: {\n path: 'corporations/{corporationId}/structures/skyhooks',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n responseSchema: z.array(OrbitalSkyhookSchema),\n },\n getRaidableSkyhooks: {\n path: 'skyhooks/raidable',\n method: 'GET',\n requiresAuth: false,\n responseSchema: RaidableSkyhooksResponseSchema,\n },\n getSkyhookDetail: {\n path: 'corporations/{corporationId}/structures/skyhooks/{skyhookId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'skyhookId'],\n responseSchema: SkyhookDetailSchema,\n },\n getSovereigntyHubDetail: {\n path: 'corporations/{corporationId}/structures/sovereignty-hubs/{sovereigntyHubId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId', 'sovereigntyHubId'],\n responseSchema: SovereigntyHubDetailSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { skyhookEndpoints } from '../core/endpoints/skyhookEndpoints';\nimport {\n SovereigntyHub,\n OrbitalSkyhook,\n RaidableSkyhooksResponse,\n SkyhookDetail,\n SovereigntyHubDetail,\n} from '../types/api-responses';\n\nexport class SkyhooksClient extends BaseEsiClient<typeof skyhookEndpoints> {\n constructor(client: ApiClient) {\n super(client, skyhookEndpoints);\n }\n\n /**\n * Retrieves all sovereignty hubs exposed as Upwell structures, including online status and installed upgrades.\n *\n * @param corporationId - The ID of the corporation to query sovereignty hubs for\n * @returns A list of sovereignty hubs\n * @requires Authentication\n */\n getSovereigntyHubs(corporationId: number): Promise<SovereigntyHub[]> {\n return this.api.getSovereigntyHubs(corporationId);\n }\n\n /**\n * Retrieves all orbital skyhooks with their silo capacity and levels.\n *\n * @param corporationId - The ID of the corporation to query skyhooks for\n * @returns A list of orbital skyhooks\n * @requires Authentication\n */\n getOrbitalSkyhooks(corporationId: number): Promise<OrbitalSkyhook[]> {\n return this.api.getOrbitalSkyhooks(corporationId);\n }\n\n /**\n * Retrieves the rolling list of skyhooks that are currently or becoming raidable across New Eden.\n *\n * @returns ESI's response as sent: `skyhooks`, one entry per skyhook with its\n * planet, solar system and theft vulnerability window\n */\n getRaidableSkyhooks(): Promise<RaidableSkyhooksResponse> {\n return this.api.getRaidableSkyhooks();\n }\n\n /**\n * Retrieves detail for a specific skyhook including reagents, reinforcement timer, and theft vulnerability.\n *\n * @param corporationId - The ID of the corporation\n * @param skyhookId - The ID of the skyhook\n * @returns Skyhook detail\n * @requires Authentication\n */\n getSkyhookDetail(\n corporationId: number,\n skyhookId: number,\n ): Promise<SkyhookDetail> {\n return this.api.getSkyhookDetail(corporationId, skyhookId);\n }\n\n /**\n * Retrieves detail for a specific sovereignty hub including reagent bay, resources, upgrades, and vulnerability window.\n *\n * @param corporationId - The ID of the corporation\n * @param sovereigntyHubId - The ID of the sovereignty hub\n * @returns Sovereignty hub detail\n * @requires Authentication\n */\n getSovereigntyHubDetail(\n corporationId: number,\n sovereigntyHubId: number,\n ): Promise<SovereigntyHubDetail> {\n return this.api.getSovereigntyHubDetail(corporationId, sovereigntyHubId);\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport {\n MercenaryDenSchema,\n MercenaryTacticalOperationSchema,\n MercenaryDenDetailSchema,\n MercenaryTacticalOperationDetailSchema,\n} from '../../schemas/mercenary';\n\nexport const mercenaryEndpoints = {\n getMercenaryDens: {\n path: 'characters/{characterId}/structures/mercenary-dens',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MercenaryDenSchema),\n },\n getMercenaryTacticalOperations: {\n path: 'characters/{characterId}/mercenary-tactical-operations',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(MercenaryTacticalOperationSchema),\n },\n getMercenaryDenDetail: {\n path: 'characters/{characterId}/structures/mercenary-dens/{mercenaryDenId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'mercenaryDenId'],\n responseSchema: MercenaryDenDetailSchema,\n },\n getMercenaryTacticalOperationDetail: {\n path: 'characters/{characterId}/mercenary-tactical-operations/{operationId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'operationId'],\n responseSchema: MercenaryTacticalOperationDetailSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { mercenaryEndpoints } from '../core/endpoints/mercenaryEndpoints';\nimport {\n MercenaryDen,\n MercenaryTacticalOperation,\n MercenaryDenDetail,\n MercenaryTacticalOperationDetail,\n} from '../types/api-responses';\n\nexport class MercenaryClient extends BaseEsiClient<typeof mercenaryEndpoints> {\n constructor(client: ApiClient) {\n super(client, mercenaryEndpoints);\n }\n\n /**\n * Retrieves all mercenary dens with their development and anarchy parameters.\n *\n * @param characterId - The ID of the character to query mercenary dens for\n * @returns A list of mercenary dens\n * @requires Authentication\n */\n getMercenaryDens(characterId: number): Promise<MercenaryDen[]> {\n return this.api.getMercenaryDens(characterId);\n }\n\n /**\n * Retrieves all mercenary tactical operations (MTOs) spawned from mercenary dens.\n *\n * @param characterId - The ID of the character to query tactical operations for\n * @returns A list of mercenary tactical operations\n * @requires Authentication\n */\n getMercenaryTacticalOperations(\n characterId: number,\n ): Promise<MercenaryTacticalOperation[]> {\n return this.api.getMercenaryTacticalOperations(characterId);\n }\n\n /**\n * Retrieves detail for a specific mercenary den including evolution, infomorphs, and skyhook attachment.\n *\n * @param characterId - The ID of the character\n * @param mercenaryDenId - The ID of the mercenary den\n * @returns Mercenary den detail\n * @requires Authentication\n */\n getMercenaryDenDetail(\n characterId: number,\n mercenaryDenId: number,\n ): Promise<MercenaryDenDetail> {\n return this.api.getMercenaryDenDetail(characterId, mercenaryDenId);\n }\n\n /**\n * Retrieves detail for a specific mercenary tactical operation.\n *\n * @param characterId - The ID of the character\n * @param operationId - The UUID of the tactical operation\n * @returns Mercenary tactical operation detail\n * @requires Authentication\n */\n getMercenaryTacticalOperationDetail(\n characterId: number,\n operationId: string,\n ): Promise<MercenaryTacticalOperationDetail> {\n return this.api.getMercenaryTacticalOperationDetail(\n characterId,\n operationId,\n );\n }\n}\n","import { z } from 'zod';\nimport { EndpointMap } from './EndpointDefinition';\nimport { AccessListSchema } from '../../schemas/access-lists';\n\nexport const accessListEndpoints = {\n getAccessList: {\n path: 'characters/{characterId}/access-lists/{accessListId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'accessListId'],\n responseSchema: AccessListSchema,\n },\n getCharacterAccessLists: {\n path: 'characters/{characterId}/access-lists',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: z.array(AccessListSchema),\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { accessListEndpoints } from '../core/endpoints/accessListEndpoints';\nimport { AccessList } from '../types/api-responses';\n\nexport class AccessListsClient extends BaseEsiClient<\n typeof accessListEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, accessListEndpoints);\n }\n\n /**\n * Retrieves the contents of an access list (ACL) including all character, corporation, and alliance entries.\n *\n * @param characterId - The ID of the character who owns the access list\n * @param accessListId - The ID of the access list to retrieve\n * @returns The access list with its entries\n * @requires Authentication\n */\n getAccessList(\n characterId: number,\n accessListId: number,\n ): Promise<AccessList> {\n return this.api.getAccessList(characterId, accessListId);\n }\n\n /**\n * Retrieves all access lists for a character.\n *\n * @param characterId - The ID of the character\n * @returns An array of the character's access lists\n * @requires Authentication\n */\n getCharacterAccessLists(characterId: number): Promise<AccessList[]> {\n return this.api.getCharacterAccessLists(characterId);\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n CharacterSkinrSchema,\n CharacterSkinrComponentsSchema,\n SkinrSchema,\n} from '../../schemas/cosmetics';\n\nexport const cosmeticsEndpoints = {\n getCharacterSkinr: {\n path: 'characters/{characterId}/cosmetics/skinr',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterSkinrSchema,\n },\n getCharacterSkinrComponents: {\n path: 'characters/{characterId}/cosmetics/skinr/components',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n responseSchema: CharacterSkinrComponentsSchema,\n },\n getSkinr: {\n path: 'cosmetics/skinr/{skinrId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['skinrId'],\n responseSchema: SkinrSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { cosmeticsEndpoints } from '../core/endpoints/cosmeticsEndpoints';\nimport {\n CharacterSkinr,\n CharacterSkinrComponents,\n Skinr,\n} from '../types/api-responses';\n\nexport class CosmeticsClient extends BaseEsiClient<typeof cosmeticsEndpoints> {\n constructor(client: ApiClient) {\n super(client, cosmeticsEndpoints);\n }\n\n getCharacterSkinr(characterId: number): Promise<CharacterSkinr> {\n return this.api.getCharacterSkinr(characterId);\n }\n\n getCharacterSkinrComponents(\n characterId: number,\n ): Promise<CharacterSkinrComponents> {\n return this.api.getCharacterSkinrComponents(characterId);\n }\n\n getSkinr(skinrId: string): Promise<Skinr> {\n return this.api.getSkinr(skinrId);\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n ParagonHubSkinrResponseSchema,\n ParagonHubCharacterSkinrResponseSchema,\n} from '../../schemas/paragon-hub';\n\nexport const paragonHubEndpoints = {\n getPublicListings: {\n path: 'paragon-hub/skinr',\n method: 'GET',\n requiresAuth: false,\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n getCharacterListings: {\n path: 'characters/{characterId}/paragon-hub/skinr',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubCharacterSkinrResponseSchema,\n },\n getAllianceListings: {\n path: 'paragon-hub/skinr/alliances/{allianceId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['allianceId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n getCharacterTargetedListings: {\n path: 'paragon-hub/skinr/characters/{characterId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n getCorporationListings: {\n path: 'paragon-hub/skinr/corporations/{corporationId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['corporationId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: ParagonHubSkinrResponseSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { paragonHubEndpoints } from '../core/endpoints/paragonHubEndpoints';\nimport {\n ParagonHubSkinrResponse,\n ParagonHubCharacterSkinrResponse,\n} from '../types/api-responses';\n\nexport class ParagonHubClient extends BaseEsiClient<\n typeof paragonHubEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, paragonHubEndpoints);\n }\n\n getPublicListings(\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getPublicListings(after, before, limit);\n }\n\n getCharacterListings(\n characterId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubCharacterSkinrResponse> {\n return this.api.getCharacterListings(characterId, after, before, limit);\n }\n\n getAllianceListings(\n allianceId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getAllianceListings(allianceId, after, before, limit);\n }\n\n getCharacterTargetedListings(\n characterId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getCharacterTargetedListings(\n characterId,\n after,\n before,\n limit,\n );\n }\n\n getCorporationListings(\n corporationId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<ParagonHubSkinrResponse> {\n return this.api.getCorporationListings(corporationId, after, before, limit);\n }\n}\n","import { EndpointMap } from './EndpointDefinition';\nimport {\n MilitaryCampaignSchema,\n MilitaryCampaignsResponseSchema,\n MilitaryCampaignObjectiveSchema,\n MilitaryCampaignObjectivesResponseSchema,\n CharacterMilitaryCampaignObjectiveSchema,\n CharacterMilitaryCampaignObjectivesResponseSchema,\n} from '../../schemas/military-campaigns';\n\nexport const militaryCampaignEndpoints = {\n getMilitaryCampaigns: {\n path: 'military-campaigns',\n method: 'GET',\n requiresAuth: false,\n responseSchema: MilitaryCampaignsResponseSchema,\n },\n getMilitaryCampaign: {\n path: 'military-campaigns/{campaignId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['campaignId'],\n responseSchema: MilitaryCampaignSchema,\n },\n getMilitaryCampaignObjectives: {\n path: 'military-campaigns/{campaignId}/objectives',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['campaignId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: MilitaryCampaignObjectivesResponseSchema,\n },\n getMilitaryCampaignObjective: {\n path: 'military-campaigns/{campaignId}/objectives/{objectiveId}',\n method: 'GET',\n requiresAuth: false,\n pathParams: ['campaignId', 'objectiveId'],\n responseSchema: MilitaryCampaignObjectiveSchema,\n },\n getCharacterMilitaryCampaignObjectives: {\n path: 'characters/{characterId}/military-campaigns/objectives',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId'],\n queryParams: { after: 'after', before: 'before', limit: 'limit' },\n responseSchema: CharacterMilitaryCampaignObjectivesResponseSchema,\n },\n getCharacterMilitaryCampaignObjective: {\n path: 'characters/{characterId}/military-campaigns/objectives/{objectiveId}',\n method: 'GET',\n requiresAuth: true,\n pathParams: ['characterId', 'objectiveId'],\n responseSchema: CharacterMilitaryCampaignObjectiveSchema,\n },\n} as const satisfies EndpointMap;\n","import { ApiClient } from '../core/ApiClient';\nimport { BaseEsiClient } from './BaseEsiClient';\nimport { militaryCampaignEndpoints } from '../core/endpoints/militaryCampaignEndpoints';\nimport {\n MilitaryCampaign,\n MilitaryCampaignsResponse,\n MilitaryCampaignObjective,\n MilitaryCampaignObjectivesResponse,\n CharacterMilitaryCampaignObjective,\n CharacterMilitaryCampaignObjectivesResponse,\n} from '../types/api-responses';\n\nexport class MilitaryCampaignsClient extends BaseEsiClient<\n typeof militaryCampaignEndpoints\n> {\n constructor(client: ApiClient) {\n super(client, militaryCampaignEndpoints);\n }\n\n /**\n * Retrieves a list of all active, completed, and expired military campaigns.\n *\n * @returns `{ campaigns }`, one entry per campaign\n */\n getMilitaryCampaigns(): Promise<MilitaryCampaignsResponse> {\n return this.api.getMilitaryCampaigns();\n }\n\n /**\n * Retrieves detailed information about a specific military campaign.\n *\n * @param campaignId - The UUID of the military campaign\n * @returns Detailed information about the campaign\n */\n getMilitaryCampaign(campaignId: string): Promise<MilitaryCampaign> {\n return this.api.getMilitaryCampaign(campaignId);\n }\n\n /**\n * Retrieves all objectives for a specific military campaign.\n *\n * @param campaignId - The UUID of the military campaign\n * @param after - `cursor.after` from a previous page, for the page after it\n * @param before - `cursor.before` from a previous page, for the page before it\n * @param limit - Maximum number of objectives on the page\n * @returns `{ objectives, cursor }` for one page of the campaign's objectives\n */\n getMilitaryCampaignObjectives(\n campaignId: string,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<MilitaryCampaignObjectivesResponse> {\n return this.api.getMilitaryCampaignObjectives(\n campaignId,\n after,\n before,\n limit,\n );\n }\n\n /**\n * Retrieves detailed information about a specific objective in a military campaign.\n *\n * @param campaignId - The UUID of the military campaign\n * @param objectiveId - The UUID of the objective\n * @returns Detailed information about the objective\n */\n getMilitaryCampaignObjective(\n campaignId: string,\n objectiveId: string,\n ): Promise<MilitaryCampaignObjective> {\n return this.api.getMilitaryCampaignObjective(campaignId, objectiveId);\n }\n\n /**\n * Retrieves a character's participated objectives across military campaigns.\n *\n * @param characterId - The ID of the character\n * @param after - `cursor.after` from a previous page, for the page after it\n * @param before - `cursor.before` from a previous page, for the page before it\n * @param limit - Maximum number of objectives on the page\n * @returns `{ objectives, cursor }` for one page of the character's campaign\n * objective participations\n * @requires Authentication with scope esi.activity.char:read\n */\n getCharacterMilitaryCampaignObjectives(\n characterId: number,\n after?: string,\n before?: string,\n limit?: number,\n ): Promise<CharacterMilitaryCampaignObjectivesResponse> {\n return this.api.getCharacterMilitaryCampaignObjectives(\n characterId,\n after,\n before,\n limit,\n );\n }\n\n /**\n * Retrieves a character's participation details for a specific campaign objective.\n *\n * @param characterId - The ID of the character\n * @param objectiveId - The UUID of the objective\n * @returns The character's participation details for the objective\n * @requires Authentication with scope esi.activity.char:read\n */\n getCharacterMilitaryCampaignObjective(\n characterId: number,\n objectiveId: string,\n ): Promise<CharacterMilitaryCampaignObjective> {\n return this.api.getCharacterMilitaryCampaignObjective(\n characterId,\n objectiveId,\n );\n }\n}\n","import { ApiClient } from '../core/ApiClient';\nimport { AllianceClient } from './AllianceClient';\nimport { AssetsClient } from './AssetsClient';\nimport { CalendarClient } from './CalendarClient';\nimport { CharacterClient } from './CharacterClient';\nimport { ClonesClient } from './ClonesClient';\nimport { ContactsClient } from './ContactsClient';\nimport { ContractsClient } from './ContractsClient';\nimport { CorporationsClient } from './CorporationsClient';\nimport { CorporationProjectsClient } from './CorporationProjectsClient';\nimport { DogmaClient } from './DogmaClient';\nimport { FactionClient } from './FactionClient';\nimport { FittingsClient } from './FittingsClient';\nimport { FleetClient } from './FleetClient';\nimport { IncursionsClient } from './IncursionsClient';\nimport { IndustryClient } from './IndustryClient';\nimport { InsuranceClient } from './InsuranceClient';\nimport { KillmailsClient } from './KillmailsClient';\nimport { LocationClient } from './LocationClient';\nimport { LoyaltyClient } from './LoyaltyClient';\nimport { MailClient } from './MailClient';\nimport { MarketClient } from './MarketClient';\nimport { PiClient } from './PiClient';\nimport { RouteClient } from './RouteClient';\nimport { SearchClient } from './SearchClient';\nimport { CharacterSkillsClient } from './SkillsClient';\nimport { SovereigntyClient } from './SovereigntyClient';\nimport { StatusClient } from './StatusClient';\nimport { UiClient } from './UiClient';\nimport { UniverseClient } from './UniverseClient';\nimport { WalletClient } from './WalletClient';\nimport { WarsClient } from './WarsClient';\nimport { MetaClient } from './MetaClient';\nimport { FreelanceJobsClient } from './FreelanceJobsClient';\nimport { SkyhooksClient } from './SkyhooksClient';\nimport { MercenaryClient } from './MercenaryClient';\nimport { AccessListsClient } from './AccessListsClient';\nimport { CosmeticsClient } from './CosmeticsClient';\nimport { ParagonHubClient } from './ParagonHubClient';\nimport { MilitaryCampaignsClient } from './MilitaryCampaignsClient';\n\nexport type ApiClientType =\n | 'alliance'\n | 'assets'\n | 'calendar'\n | 'characters'\n | 'clones'\n | 'contacts'\n | 'contracts'\n | 'corporations'\n | 'corporationProjects'\n | 'dogma'\n | 'factions'\n | 'fittings'\n | 'fleets'\n | 'incursions'\n | 'industry'\n | 'insurance'\n | 'killmails'\n | 'location'\n | 'loyalty'\n | 'mail'\n | 'market'\n | 'pi'\n | 'route'\n | 'search'\n | 'skills'\n | 'sovereignty'\n | 'status'\n | 'ui'\n | 'universe'\n | 'wallet'\n | 'wars'\n | 'meta'\n | 'freelanceJobs'\n | 'skyhooks'\n | 'cosmetics'\n | 'paragonHub'\n | 'mercenary'\n | 'militaryCampaigns'\n | 'accessLists';\n\nexport type ClientInstance =\n | AllianceClient\n | AssetsClient\n | CalendarClient\n | CharacterClient\n | ClonesClient\n | ContactsClient\n | ContractsClient\n | CorporationsClient\n | CorporationProjectsClient\n | DogmaClient\n | FactionClient\n | FittingsClient\n | FleetClient\n | IncursionsClient\n | IndustryClient\n | InsuranceClient\n | KillmailsClient\n | LocationClient\n | LoyaltyClient\n | MailClient\n | MarketClient\n | PiClient\n | RouteClient\n | SearchClient\n | CharacterSkillsClient\n | SovereigntyClient\n | StatusClient\n | UiClient\n | UniverseClient\n | WalletClient\n | WarsClient\n | MetaClient\n | FreelanceJobsClient\n | SkyhooksClient\n | CosmeticsClient\n | ParagonHubClient\n | MercenaryClient\n | MilitaryCampaignsClient\n | AccessListsClient;\n\nconst clientFactories: Record<\n ApiClientType,\n new (apiClient: ApiClient) => ClientInstance\n> = {\n alliance: AllianceClient,\n assets: AssetsClient,\n calendar: CalendarClient,\n characters: CharacterClient,\n clones: ClonesClient,\n contacts: ContactsClient,\n contracts: ContractsClient,\n corporations: CorporationsClient,\n corporationProjects: CorporationProjectsClient,\n dogma: DogmaClient,\n factions: FactionClient,\n fittings: FittingsClient,\n fleets: FleetClient,\n incursions: IncursionsClient,\n industry: IndustryClient,\n insurance: InsuranceClient,\n killmails: KillmailsClient,\n location: LocationClient,\n loyalty: LoyaltyClient,\n mail: MailClient,\n market: MarketClient,\n pi: PiClient,\n route: RouteClient,\n search: SearchClient,\n skills: CharacterSkillsClient,\n sovereignty: SovereigntyClient,\n status: StatusClient,\n ui: UiClient,\n universe: UniverseClient,\n wallet: WalletClient,\n wars: WarsClient,\n meta: MetaClient,\n freelanceJobs: FreelanceJobsClient,\n skyhooks: SkyhooksClient,\n cosmetics: CosmeticsClient,\n paragonHub: ParagonHubClient,\n mercenary: MercenaryClient,\n militaryCampaigns: MilitaryCampaignsClient,\n accessLists: AccessListsClient,\n};\n\nexport function createClientInstance(\n name: ApiClientType,\n apiClient: ApiClient,\n): ClientInstance {\n // eslint-disable-next-line security/detect-object-injection\n return new clientFactories[name](apiClient);\n}\n\nconst allClientTypes: ApiClientType[] = Object.keys(\n clientFactories,\n) as ApiClientType[];\n\n// Re-export client classes for direct use\nexport {\n AllianceClient,\n AssetsClient,\n CalendarClient,\n CharacterClient,\n ClonesClient,\n ContactsClient,\n ContractsClient,\n CorporationsClient,\n CorporationProjectsClient,\n DogmaClient,\n FactionClient,\n FittingsClient,\n FleetClient,\n IncursionsClient,\n IndustryClient,\n InsuranceClient,\n KillmailsClient,\n LocationClient,\n LoyaltyClient,\n MailClient,\n MarketClient,\n PiClient,\n RouteClient,\n SearchClient,\n CharacterSkillsClient,\n SovereigntyClient,\n StatusClient,\n UiClient,\n UniverseClient,\n WalletClient,\n WarsClient,\n MetaClient,\n FreelanceJobsClient,\n SkyhooksClient,\n CosmeticsClient,\n ParagonHubClient,\n MercenaryClient,\n MilitaryCampaignsClient,\n AccessListsClient,\n};\n","import { ApiClient } from './ApiClient';\nimport { ETagCacheManager, ETagCacheConfig } from './cache/ETagCacheManager';\nimport { RequestDeduplicator } from './RequestDeduplicator';\n\nexport interface CacheStats {\n totalEntries: number;\n maxEntries: number;\n hits: number;\n misses: number;\n hitRate: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n}\n\nexport interface CircuitBreakerStats {\n totalCircuits: number;\n openCircuits: number;\n circuits: Record<\n string,\n { state: 'closed' | 'open' | 'half-open'; failures: number }\n >;\n}\n\nexport class EsiDiagnostics {\n constructor(\n private apiClient: ApiClient,\n private etagCacheEnabled: boolean,\n private deduplicator: RequestDeduplicator | null,\n ) {}\n\n getCacheStats(): CacheStats | null {\n if (!this.etagCacheEnabled) return null;\n const cache = this.apiClient.getCache();\n return cache ? (cache as ETagCacheManager).getStats() : null;\n }\n\n clearCache(): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).clear();\n }\n }\n\n updateCacheConfig(newConfig: Partial<ETagCacheConfig>): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).updateConfig(newConfig);\n }\n }\n\n getCircuitBreakerStats(): CircuitBreakerStats | null {\n const cb = this.apiClient.getCircuitBreaker();\n return cb ? cb.getStats() : null;\n }\n\n resetCircuitBreaker(endpoint?: string): void {\n const cb = this.apiClient.getCircuitBreaker();\n if (cb) {\n cb.reset(endpoint);\n }\n }\n\n getDeduplicatorStats(): { pendingRequests: number } | null {\n return this.deduplicator\n ? { pendingRequests: this.deduplicator.pending }\n : null;\n }\n}\n","import { EsiError } from './util/error';\nimport type { ApiClient } from './ApiClient';\nimport { logDebug, logInfo } from './logger/clientLog';\n\nexport interface BatchOptions {\n concurrency?: number | undefined;\n onProgress?: ((completed: number, total: number) => void) | undefined;\n}\n\nexport interface BatchResult<K, T> {\n results: Map<K, T>;\n errors: Map<K, EsiError | Error>;\n}\n\nexport async function batchFetch<K, T>(\n keys: K[],\n fetcher: (key: K) => Promise<T>,\n options: BatchOptions = {},\n): Promise<BatchResult<K, T>> {\n return batchFetchFor(null, keys, fetcher, options);\n}\n\n/**\n * `batchFetch` logging to a client's logger. Not exported from the package:\n * `EsiClient.batch` calls it with its own client, the standalone\n * `batchFetch` with none (the global logger).\n */\nexport async function batchFetchFor<K, T>(\n client: ApiClient | null,\n keys: K[],\n fetcher: (key: K) => Promise<T>,\n options: BatchOptions = {},\n): Promise<BatchResult<K, T>> {\n const concurrency = options.concurrency ?? 20;\n const results = new Map<K, T>();\n const errors = new Map<K, EsiError | Error>();\n let completed = 0;\n let running = 0;\n let index = 0;\n\n logInfo(\n client,\n `Batch fetch: ${keys.length} items, concurrency=${concurrency}`,\n {\n total: keys.length,\n concurrency,\n },\n );\n\n return new Promise((resolve) => {\n function next(): void {\n while (running < concurrency && index < keys.length) {\n const currentIndex = index++;\n const key = keys[currentIndex]!;\n running++;\n\n fetcher(key)\n .then((result) => {\n results.set(key, result);\n })\n .catch((err: unknown) => {\n const error =\n err instanceof EsiError || err instanceof Error\n ? err\n : new Error(String(err));\n errors.set(key, error);\n })\n .finally(() => {\n running--;\n completed++;\n if (options.onProgress) {\n options.onProgress(completed, keys.length);\n }\n if (completed === keys.length) {\n logDebug(\n client,\n `Batch complete: ${results.size} succeeded, ${errors.size} failed`,\n { succeeded: results.size, failed: errors.size },\n );\n resolve({ results, errors });\n } else {\n next();\n }\n });\n }\n }\n\n if (keys.length === 0) {\n resolve({ results, errors });\n return;\n }\n\n next();\n });\n}\n\nexport async function batchPost<T>(\n ids: number[],\n poster: (chunk: number[]) => Promise<T[]>,\n chunkSize: number = 1000,\n): Promise<T[]> {\n return batchPostFor(null, ids, poster, chunkSize);\n}\n\n/**\n * `batchPost` logging to a client's logger; see `batchFetchFor`.\n */\nexport async function batchPostFor<T>(\n client: ApiClient | null,\n ids: number[],\n poster: (chunk: number[]) => Promise<T[]>,\n chunkSize: number = 1000,\n): Promise<T[]> {\n const chunks: number[][] = [];\n for (let i = 0; i < ids.length; i += chunkSize) {\n chunks.push(ids.slice(i, i + chunkSize));\n }\n\n logInfo(\n client,\n `Batch POST: ${ids.length} IDs in ${chunks.length} chunks of ${chunkSize}`,\n { total: ids.length, chunks: chunks.length, chunkSize },\n );\n\n const results: T[] = [];\n for (const chunk of chunks) {\n const chunkResult = await poster(chunk);\n results.push(...chunkResult);\n }\n\n return results;\n}\n","import { ApiClient, TokenProvider } from './core/ApiClient';\nimport {\n RequestInterceptor,\n ResponseInterceptor,\n} from './core/middleware/Middleware';\nimport { createClientInstance, ApiClientType } from './clients/ClientRegistry';\nimport type { EsiClientConfig, EsiDatasource } from './core/EsiClientConfig';\nimport { AllianceClient } from './clients/AllianceClient';\nimport { AssetsClient } from './clients/AssetsClient';\nimport { CalendarClient } from './clients/CalendarClient';\nimport { CharacterClient } from './clients/CharacterClient';\nimport { ClonesClient } from './clients/ClonesClient';\nimport { ContactsClient } from './clients/ContactsClient';\nimport { ContractsClient } from './clients/ContractsClient';\nimport { CorporationsClient } from './clients/CorporationsClient';\nimport { CorporationProjectsClient } from './clients/CorporationProjectsClient';\nimport { DogmaClient } from './clients/DogmaClient';\nimport { FactionClient } from './clients/FactionClient';\nimport { FittingsClient } from './clients/FittingsClient';\nimport { FleetClient } from './clients/FleetClient';\nimport { IncursionsClient } from './clients/IncursionsClient';\nimport { IndustryClient } from './clients/IndustryClient';\nimport { InsuranceClient } from './clients/InsuranceClient';\nimport { KillmailsClient } from './clients/KillmailsClient';\nimport { LocationClient } from './clients/LocationClient';\nimport { LoyaltyClient } from './clients/LoyaltyClient';\nimport { MailClient } from './clients/MailClient';\nimport { MarketClient } from './clients/MarketClient';\nimport { PiClient } from './clients/PiClient';\nimport { RouteClient } from './clients/RouteClient';\nimport { SearchClient } from './clients/SearchClient';\nimport { CharacterSkillsClient } from './clients/SkillsClient';\nimport { SovereigntyClient } from './clients/SovereigntyClient';\nimport { StatusClient } from './clients/StatusClient';\nimport { UiClient } from './clients/UiClient';\nimport { UniverseClient } from './clients/UniverseClient';\nimport { WalletClient } from './clients/WalletClient';\nimport { WarsClient } from './clients/WarsClient';\nimport { MetaClient } from './clients/MetaClient';\nimport { FreelanceJobsClient } from './clients/FreelanceJobsClient';\nimport { CosmeticsClient } from './clients/CosmeticsClient';\nimport { ParagonHubClient } from './clients/ParagonHubClient';\nimport { SkyhooksClient } from './clients/SkyhooksClient';\nimport { MercenaryClient } from './clients/MercenaryClient';\nimport { AccessListsClient } from './clients/AccessListsClient';\nimport { MilitaryCampaignsClient } from './clients/MilitaryCampaignsClient';\nimport { validateBaseUrl } from './core/util/validation';\nimport {\n ETagCacheManager,\n ETagCacheConfig,\n} from './core/cache/ETagCacheManager';\nimport { CircuitBreakerConfig } from './core/circuitBreaker/CircuitBreaker';\nimport { RateLimiterConfig } from './core/rateLimiter/RateLimiter';\nimport { RequestDeduplicator } from './core/RequestDeduplicator';\nimport { RetryConfig } from './core/util/retry';\nimport { IRetryStrategy } from './core/IRetryStrategy';\nimport {\n EsiDiagnostics,\n type CacheStats,\n type CircuitBreakerStats,\n} from './core/EsiDiagnostics';\nimport {\n batchFetchFor,\n batchPostFor,\n BatchOptions,\n BatchResult,\n} from './core/BatchRequestHandler';\nimport { configureApiClient } from './core/configureApiClient';\nimport { logInfo } from './core/logger/clientLog';\n\nexport type { EsiClientConfig, EsiDatasource } from './core/EsiClientConfig';\n\nexport class EsiClient {\n private apiClient: ApiClient;\n private clients: Map<string, unknown> = new Map();\n private etagCacheEnabled: boolean;\n private _diagnostics: EsiDiagnostics | null = null;\n private deduplicator: RequestDeduplicator | null = null;\n\n constructor(config?: EsiClientConfig) {\n const token = config?.accessToken || process.env.ESI_ACCESS_TOKEN;\n const baseUrl = validateBaseUrl(\n config?.baseUrl || process.env.ESI_BASE_URL || 'https://esi.evetech.net',\n config?.unsafeAllowCustomHost,\n );\n this.apiClient = new ApiClient(\n config?.clientId || process.env.ESI_CLIENT_ID || 'esi-client',\n baseUrl,\n token,\n );\n\n const datasource =\n config?.datasource ||\n (process.env.ESI_DATASOURCE as EsiDatasource | undefined);\n if (datasource) {\n this.apiClient.setDatasource(datasource);\n }\n\n if (config?.language) {\n this.apiClient.setLanguage(config.language);\n }\n\n if (config?.compatibilityDate) {\n this.apiClient.setCompatibilityDate(config.compatibilityDate);\n }\n\n if (config?.onTokenRefresh) {\n this.apiClient.setTokenProvider(config.onTokenRefresh);\n }\n\n const result = configureApiClient(this.apiClient, config);\n this.deduplicator = result.deduplicator;\n this.etagCacheEnabled = config?.enableETagCache !== false;\n\n logInfo(this.apiClient, 'EsiClient initialized successfully', {\n baseUrl,\n clientId: config?.clientId,\n });\n }\n\n private getClient<T>(name: ApiClientType): T {\n if (!this.clients.has(name)) {\n this.clients.set(name, createClientInstance(name, this.apiClient));\n }\n return this.clients.get(name) as T;\n }\n\n // Domain client accessors\n get alliance(): AllianceClient {\n return this.getClient('alliance');\n }\n get assets(): AssetsClient {\n return this.getClient('assets');\n }\n get calendar(): CalendarClient {\n return this.getClient('calendar');\n }\n get characters(): CharacterClient {\n return this.getClient('characters');\n }\n get clones(): ClonesClient {\n return this.getClient('clones');\n }\n get contacts(): ContactsClient {\n return this.getClient('contacts');\n }\n get contracts(): ContractsClient {\n return this.getClient('contracts');\n }\n get corporations(): CorporationsClient {\n return this.getClient('corporations');\n }\n get corporationProjects(): CorporationProjectsClient {\n return this.getClient('corporationProjects');\n }\n get dogma(): DogmaClient {\n return this.getClient('dogma');\n }\n get factions(): FactionClient {\n return this.getClient('factions');\n }\n get fittings(): FittingsClient {\n return this.getClient('fittings');\n }\n get fleets(): FleetClient {\n return this.getClient('fleets');\n }\n get incursions(): IncursionsClient {\n return this.getClient('incursions');\n }\n get industry(): IndustryClient {\n return this.getClient('industry');\n }\n get insurance(): InsuranceClient {\n return this.getClient('insurance');\n }\n get killmails(): KillmailsClient {\n return this.getClient('killmails');\n }\n get location(): LocationClient {\n return this.getClient('location');\n }\n get loyalty(): LoyaltyClient {\n return this.getClient('loyalty');\n }\n get mail(): MailClient {\n return this.getClient('mail');\n }\n get market(): MarketClient {\n return this.getClient('market');\n }\n get pi(): PiClient {\n return this.getClient('pi');\n }\n get route(): RouteClient {\n return this.getClient('route');\n }\n get search(): SearchClient {\n return this.getClient('search');\n }\n get skills(): CharacterSkillsClient {\n return this.getClient('skills');\n }\n get sovereignty(): SovereigntyClient {\n return this.getClient('sovereignty');\n }\n get status(): StatusClient {\n return this.getClient('status');\n }\n get ui(): UiClient {\n return this.getClient('ui');\n }\n get universe(): UniverseClient {\n return this.getClient('universe');\n }\n get wallet(): WalletClient {\n return this.getClient('wallet');\n }\n get wars(): WarsClient {\n return this.getClient('wars');\n }\n get meta(): MetaClient {\n return this.getClient('meta');\n }\n get freelanceJobs(): FreelanceJobsClient {\n return this.getClient('freelanceJobs');\n }\n get cosmetics(): CosmeticsClient {\n return this.getClient('cosmetics');\n }\n get paragonHub(): ParagonHubClient {\n return this.getClient('paragonHub');\n }\n get skyhooks(): SkyhooksClient {\n return this.getClient('skyhooks');\n }\n get mercenary(): MercenaryClient {\n return this.getClient('mercenary');\n }\n get militaryCampaigns(): MilitaryCampaignsClient {\n return this.getClient('militaryCampaigns');\n }\n get accessLists(): AccessListsClient {\n return this.getClient('accessLists');\n }\n\n addRequestInterceptor(fn: RequestInterceptor): () => void {\n return this.apiClient.addRequestInterceptor(fn);\n }\n\n addResponseInterceptor(fn: ResponseInterceptor): () => void {\n return this.apiClient.addResponseInterceptor(fn);\n }\n\n setAccessToken(token: string): void {\n this.apiClient.setAccessToken(token);\n logInfo(this.apiClient, 'Access token updated');\n }\n\n setTokenProvider(provider: TokenProvider | undefined): void {\n this.apiClient.setTokenProvider(provider);\n logInfo(\n this.apiClient,\n provider ? 'Token provider configured' : 'Token provider removed',\n );\n }\n\n get diagnostics(): EsiDiagnostics {\n if (!this._diagnostics) {\n this._diagnostics = new EsiDiagnostics(\n this.apiClient,\n this.etagCacheEnabled,\n this.deduplicator,\n );\n }\n return this._diagnostics;\n }\n\n getCacheStats(): CacheStats | null {\n return this.diagnostics.getCacheStats();\n }\n\n clearCache(): void {\n this.diagnostics.clearCache();\n }\n\n updateCacheConfig(newConfig: Partial<ETagCacheConfig>): void {\n this.diagnostics.updateCacheConfig(newConfig);\n }\n\n getCircuitBreakerStats(): CircuitBreakerStats | null {\n return this.diagnostics.getCircuitBreakerStats();\n }\n\n resetCircuitBreaker(endpoint?: string): void {\n this.diagnostics.resetCircuitBreaker(endpoint);\n }\n\n async batch<K, T>(\n keys: K[],\n fetcher: (key: K) => Promise<T>,\n options?: BatchOptions,\n ): Promise<BatchResult<K, T>> {\n return batchFetchFor(this.apiClient, keys, fetcher, options);\n }\n\n async batchPost<T>(\n ids: number[],\n poster: (chunk: number[]) => Promise<T[]>,\n chunkSize?: number,\n ): Promise<T[]> {\n return batchPostFor(this.apiClient, ids, poster, chunkSize);\n }\n\n shutdown(): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).shutdown();\n }\n const cb = this.apiClient.getCircuitBreaker();\n if (cb) {\n cb.shutdown();\n }\n if (this.deduplicator) {\n this.deduplicator.clear();\n }\n this.clients.clear();\n logInfo(this.apiClient, 'EsiClient shutdown completed');\n }\n}\n\nlet _defaultClient: EsiClient | null = null;\nexport function getDefaultClient(): EsiClient {\n if (!_defaultClient) {\n _defaultClient = new EsiClient();\n }\n return _defaultClient;\n}\n","import { ApiClient } from './core/ApiClient';\nimport { validateBaseUrl } from './core/util/validation';\nimport {\n ApiClientType,\n ClientInstance,\n createClientInstance,\n AllianceClient,\n AssetsClient,\n CalendarClient,\n CharacterClient,\n ClonesClient,\n ContactsClient,\n ContractsClient,\n CorporationsClient,\n DogmaClient,\n FactionClient,\n FittingsClient,\n FleetClient,\n IncursionsClient,\n IndustryClient,\n InsuranceClient,\n KillmailsClient,\n LocationClient,\n LoyaltyClient,\n MailClient,\n MarketClient,\n PiClient,\n RouteClient,\n SearchClient,\n CharacterSkillsClient,\n SovereigntyClient,\n StatusClient,\n UiClient,\n UniverseClient,\n WalletClient,\n WarsClient,\n MetaClient,\n FreelanceJobsClient,\n SkyhooksClient,\n MercenaryClient,\n AccessListsClient,\n CorporationProjectsClient,\n CosmeticsClient,\n ParagonHubClient,\n MilitaryCampaignsClient,\n} from './clients/ClientRegistry';\nimport { EsiClientConfig } from './EsiClient';\nimport { configureApiClient } from './core/configureApiClient';\nimport { ETagCacheManager } from './core/cache/ETagCacheManager';\nimport { RequestDeduplicator } from './core/RequestDeduplicator';\nimport { logInfo } from './core/logger/clientLog';\n\nexport { ApiClientType, ClientInstance };\n\nexport class CustomEsiClient {\n private apiClient: ApiClient;\n private clients: Map<string, ClientInstance> = new Map();\n private enabledClients: Set<ApiClientType>;\n private deduplicator: RequestDeduplicator | null = null;\n\n constructor(config: EsiClientConfig & { clients: ApiClientType[] }) {\n this.enabledClients = new Set(config.clients);\n const baseUrl = validateBaseUrl(\n config.baseUrl || process.env.ESI_BASE_URL || 'https://esi.evetech.net',\n config.unsafeAllowCustomHost,\n );\n this.apiClient = new ApiClient(\n config.clientId || process.env.ESI_CLIENT_ID || 'esi-custom-client',\n baseUrl,\n config.accessToken || process.env.ESI_ACCESS_TOKEN,\n );\n\n if (config.language) {\n this.apiClient.setLanguage(config.language);\n }\n\n if (config.compatibilityDate) {\n this.apiClient.setCompatibilityDate(config.compatibilityDate);\n }\n\n if (config.onTokenRefresh) {\n this.apiClient.setTokenProvider(config.onTokenRefresh);\n }\n\n const datasource = config.datasource;\n if (datasource) {\n this.apiClient.setDatasource(datasource);\n }\n\n const result = configureApiClient(this.apiClient, config);\n this.deduplicator = result.deduplicator;\n\n for (const name of this.enabledClients) {\n this.clients.set(name, createClientInstance(name, this.apiClient));\n }\n\n logInfo(\n this.apiClient,\n `CustomEsiClient initialized with clients: ${config.clients.join(', ')}`,\n { clients: config.clients },\n );\n }\n\n getClient(clientType: ApiClientType): ClientInstance | undefined {\n return this.clients.get(clientType);\n }\n\n hasClient(clientType: ApiClientType): boolean {\n return this.clients.has(clientType);\n }\n\n getEnabledClients(): ApiClientType[] {\n return Array.from(this.enabledClients);\n }\n\n get alliance(): AllianceClient | undefined {\n return this.getClient('alliance') as AllianceClient;\n }\n get assets(): AssetsClient | undefined {\n return this.getClient('assets') as AssetsClient;\n }\n get calendar(): CalendarClient | undefined {\n return this.getClient('calendar') as CalendarClient;\n }\n get characters(): CharacterClient | undefined {\n return this.getClient('characters') as CharacterClient;\n }\n get clones(): ClonesClient | undefined {\n return this.getClient('clones') as ClonesClient;\n }\n get contacts(): ContactsClient | undefined {\n return this.getClient('contacts') as ContactsClient;\n }\n get contracts(): ContractsClient | undefined {\n return this.getClient('contracts') as ContractsClient;\n }\n get corporations(): CorporationsClient | undefined {\n return this.getClient('corporations') as CorporationsClient;\n }\n get dogma(): DogmaClient | undefined {\n return this.getClient('dogma') as DogmaClient;\n }\n get factions(): FactionClient | undefined {\n return this.getClient('factions') as FactionClient;\n }\n get fittings(): FittingsClient | undefined {\n return this.getClient('fittings') as FittingsClient;\n }\n get fleets(): FleetClient | undefined {\n return this.getClient('fleets') as FleetClient;\n }\n get incursions(): IncursionsClient | undefined {\n return this.getClient('incursions') as IncursionsClient;\n }\n get industry(): IndustryClient | undefined {\n return this.getClient('industry') as IndustryClient;\n }\n get insurance(): InsuranceClient | undefined {\n return this.getClient('insurance') as InsuranceClient;\n }\n get killmails(): KillmailsClient | undefined {\n return this.getClient('killmails') as KillmailsClient;\n }\n get location(): LocationClient | undefined {\n return this.getClient('location') as LocationClient;\n }\n get loyalty(): LoyaltyClient | undefined {\n return this.getClient('loyalty') as LoyaltyClient;\n }\n get mail(): MailClient | undefined {\n return this.getClient('mail') as MailClient;\n }\n get market(): MarketClient | undefined {\n return this.getClient('market') as MarketClient;\n }\n get pi(): PiClient | undefined {\n return this.getClient('pi') as PiClient;\n }\n get route(): RouteClient | undefined {\n return this.getClient('route') as RouteClient;\n }\n get search(): SearchClient | undefined {\n return this.getClient('search') as SearchClient;\n }\n get skills(): CharacterSkillsClient | undefined {\n return this.getClient('skills') as CharacterSkillsClient;\n }\n get sovereignty(): SovereigntyClient | undefined {\n return this.getClient('sovereignty') as SovereigntyClient;\n }\n get status(): StatusClient | undefined {\n return this.getClient('status') as StatusClient;\n }\n get ui(): UiClient | undefined {\n return this.getClient('ui') as UiClient;\n }\n get universe(): UniverseClient | undefined {\n return this.getClient('universe') as UniverseClient;\n }\n get wallet(): WalletClient | undefined {\n return this.getClient('wallet') as WalletClient;\n }\n get wars(): WarsClient | undefined {\n return this.getClient('wars') as WarsClient;\n }\n get meta(): MetaClient | undefined {\n return this.getClient('meta') as MetaClient;\n }\n get freelanceJobs(): FreelanceJobsClient | undefined {\n return this.getClient('freelanceJobs') as FreelanceJobsClient;\n }\n get skyhooks(): SkyhooksClient | undefined {\n return this.getClient('skyhooks') as SkyhooksClient;\n }\n get mercenary(): MercenaryClient | undefined {\n return this.getClient('mercenary') as MercenaryClient;\n }\n get accessLists(): AccessListsClient | undefined {\n return this.getClient('accessLists') as AccessListsClient;\n }\n get corporationProjects(): CorporationProjectsClient | undefined {\n return this.getClient('corporationProjects') as CorporationProjectsClient;\n }\n get cosmetics(): CosmeticsClient | undefined {\n return this.getClient('cosmetics') as CosmeticsClient;\n }\n get paragonHub(): ParagonHubClient | undefined {\n return this.getClient('paragonHub') as ParagonHubClient;\n }\n get militaryCampaigns(): MilitaryCampaignsClient | undefined {\n return this.getClient('militaryCampaigns') as MilitaryCampaignsClient;\n }\n\n shutdown(): void {\n const cache = this.apiClient.getCache();\n if (cache) {\n (cache as ETagCacheManager).shutdown();\n }\n const cb = this.apiClient.getCircuitBreaker();\n if (cb) {\n cb.shutdown();\n }\n if (this.deduplicator) {\n this.deduplicator.clear();\n }\n this.clients.clear();\n logInfo(this.apiClient, 'CustomEsiClient shutdown completed');\n }\n}\n\n/**\n * One legacy domain client on its own `ApiClient`.\n *\n * The nine named `create*Client` methods are deprecated since 11.0.0 in\n * favour of `createEsi` and `esi.as(identity)` from `@lgriffin/esi.ts/client`,\n * and are removed no earlier than 12.0.0. {@link EsiApiFactory.createClient}\n * is not deprecated.\n *\n * @example\n * ```ts\n * import { createEsi } from '@lgriffin/esi.ts/client';\n *\n * const esi = createEsi({ userAgent: 'price-checker/1.0 (ops@example.com)' });\n * const prices = await esi.public.markets.prices.get();\n * const wallet = await esi\n * .as(tokens.identity(characterId))\n * .character(characterId)\n * .wallet.get();\n * ```\n */\nexport class EsiApiFactory {\n /**\n * A standalone `AllianceClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For an alliance's public record:\n * `esi.public.alliance(allianceId).get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createAllianceClient(config?: EsiClientConfig): AllianceClient {\n return createClientInstance(\n 'alliance',\n this.buildApiClient(config),\n ) as AllianceClient;\n }\n\n /**\n * A standalone `CharacterClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a character's public record:\n * `esi.public.character(characterId).get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createCharacterClient(config?: EsiClientConfig): CharacterClient {\n return createClientInstance(\n 'characters',\n this.buildApiClient(config),\n ) as CharacterClient;\n }\n\n /**\n * A standalone `CorporationsClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a corporation's public record:\n * `esi.public.corporation(corporationId).get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createCorporationClient(config?: EsiClientConfig): CorporationsClient {\n return createClientInstance(\n 'corporations',\n this.buildApiClient(config),\n ) as CorporationsClient;\n }\n\n /**\n * A standalone `MarketClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a region's sell orders, every page followed:\n * `esi.public.market(regionId).orders.get({ order_type: 'sell' })`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createMarketClient(config?: EsiClientConfig): MarketClient {\n return createClientInstance(\n 'market',\n this.buildApiClient(config),\n ) as MarketClient;\n }\n\n /**\n * A standalone `UniverseClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a type:\n * `esi.public.universe.types(typeId).get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createUniverseClient(config?: EsiClientConfig): UniverseClient {\n return createClientInstance(\n 'universe',\n this.buildApiClient(config),\n ) as UniverseClient;\n }\n\n /**\n * A standalone `FleetClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a fleet, as its member:\n * `esi.as(identity).fleet(fleetId).get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createFleetClient(config?: EsiClientConfig): FleetClient {\n return createClientInstance(\n 'fleets',\n this.buildApiClient(config),\n ) as FleetClient;\n }\n\n /**\n * A standalone `AssetsClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a character's assets:\n * `esi.as(identity).character(characterId).assets.get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createAssetsClient(config?: EsiClientConfig): AssetsClient {\n return createClientInstance(\n 'assets',\n this.buildApiClient(config),\n ) as AssetsClient;\n }\n\n /**\n * A standalone `WalletClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a character's wallet balance:\n * `esi.as(identity).character(characterId).wallet.get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createWalletClient(config?: EsiClientConfig): WalletClient {\n return createClientInstance(\n 'wallet',\n this.buildApiClient(config),\n ) as WalletClient;\n }\n\n /**\n * A standalone `MailClient` on its own `ApiClient`.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Use the\n * shared runtime from `@lgriffin/esi.ts/client`: `createEsi({ userAgent })`\n * once, then `esi.public` for public operations and `esi.as(identity)` for\n * authenticated ones. For a character's mail headers:\n * `esi.as(identity).character(characterId).mail.get()`.\n * To stay on the legacy client meanwhile, `EsiApiFactory.createClient(type)`\n * is not deprecated. See guides/MULTI-CHARACTER.md.\n */\n static createMailClient(config?: EsiClientConfig): MailClient {\n return createClientInstance(\n 'mail',\n this.buildApiClient(config),\n ) as MailClient;\n }\n\n /**\n * Any of the registered domain clients, by name, on its own `ApiClient`.\n * Not deprecated; use it to stay on the legacy domain clients.\n */\n static createClient(\n clientType: ApiClientType,\n config?: EsiClientConfig,\n ): ClientInstance {\n return createClientInstance(clientType, this.buildApiClient(config));\n }\n\n private static buildApiClient(config?: EsiClientConfig): ApiClient {\n const baseUrl = validateBaseUrl(\n config?.baseUrl || process.env.ESI_BASE_URL || 'https://esi.evetech.net',\n config?.unsafeAllowCustomHost,\n );\n const client = new ApiClient(\n config?.clientId || process.env.ESI_CLIENT_ID || 'esi-standalone-client',\n baseUrl,\n config?.accessToken || process.env.ESI_ACCESS_TOKEN,\n );\n\n if (config?.language) {\n client.setLanguage(config.language);\n }\n\n if (config?.compatibilityDate) {\n client.setCompatibilityDate(config.compatibilityDate);\n }\n\n if (config?.onTokenRefresh) {\n client.setTokenProvider(config.onTokenRefresh);\n }\n\n const datasource = config?.datasource;\n if (datasource) {\n client.setDatasource(datasource);\n }\n\n configureApiClient(client, config);\n return client;\n }\n}\n\nexport class EsiClientBuilder {\n private clients: ApiClientType[] = [];\n private config: EsiClientConfig = {};\n\n addClient(clientType: ApiClientType): this {\n if (!this.clients.includes(clientType)) {\n this.clients.push(clientType);\n }\n return this;\n }\n\n addClients(clientTypes: ApiClientType[]): this {\n clientTypes.forEach((type) => this.addClient(type));\n return this;\n }\n\n withConfig(config: EsiClientConfig): this {\n this.config = { ...this.config, ...config };\n return this;\n }\n\n withClientId(clientId: string): this {\n this.config.clientId = clientId;\n return this;\n }\n\n withAccessToken(accessToken: string): this {\n this.config.accessToken = accessToken;\n return this;\n }\n\n build(): CustomEsiClient {\n if (this.clients.length === 0) {\n throw new Error('At least one client type must be specified');\n }\n return new CustomEsiClient({ ...this.config, clients: this.clients });\n }\n}\n","import { ApiClient, FetchLike } from './ApiClient';\nimport { IRateLimiter } from './rateLimiter/IRateLimiter';\nimport { RateLimiter } from './rateLimiter/RateLimiter';\nimport { ICache } from './cache/ICache';\nimport { CircuitBreaker } from './circuitBreaker/CircuitBreaker';\n\nexport class ApiClientBuilder {\n private clientId!: string;\n private link!: string;\n private accessToken?: string | undefined;\n private rateLimiter?: IRateLimiter | undefined;\n private cache?: ICache | undefined;\n private circuitBreaker?: CircuitBreaker | undefined;\n private _timeout?: number | undefined;\n private _fetch?: FetchLike | undefined;\n\n setClientId(clientId: string): ApiClientBuilder {\n this.clientId = clientId;\n return this;\n }\n\n setLink(link: string): ApiClientBuilder {\n this.link = link;\n return this;\n }\n\n setAccessToken(accessToken?: string): ApiClientBuilder {\n this.accessToken = accessToken;\n return this;\n }\n\n setRateLimiter(limiter: IRateLimiter): ApiClientBuilder {\n this.rateLimiter = limiter;\n return this;\n }\n\n setCache(cache: ICache): ApiClientBuilder {\n this.cache = cache;\n return this;\n }\n\n setCircuitBreaker(cb: CircuitBreaker): ApiClientBuilder {\n this.circuitBreaker = cb;\n return this;\n }\n\n setTimeout(timeout: number): ApiClientBuilder {\n this._timeout = timeout;\n return this;\n }\n\n setFetch(fn: FetchLike): ApiClientBuilder {\n this._fetch = fn;\n return this;\n }\n\n build(): ApiClient {\n const client = new ApiClient(this.clientId, this.link, this.accessToken);\n if (this.rateLimiter) {\n client.setRateLimiter(this.rateLimiter);\n } else {\n const rateLimiter = new RateLimiter();\n rateLimiter.setClient(client);\n client.setRateLimiter(rateLimiter);\n }\n if (this.cache) client.setCache(this.cache);\n if (this.circuitBreaker) client.setCircuitBreaker(this.circuitBreaker);\n if (this._timeout !== undefined) client.setTimeout(this._timeout);\n if (this._fetch) client.setFetch(this._fetch);\n return client;\n }\n}\n","// Auto-generated from ESI OpenAPI spec — do not edit manually\n// Compatibility date: 2026-08-18\n// Total scopes: 72\n// Endpoints requiring scopes: 145\n\nexport type EsiScope =\n | 'esi-access.read_lists.v1'\n | 'esi-activities.read_character.v1'\n | 'esi-alliances.read_contacts.v1'\n | 'esi-assets.read_assets.v1'\n | 'esi-assets.read_corporation_assets.v1'\n | 'esi-calendar.read_calendar_events.v1'\n | 'esi-calendar.respond_calendar_events.v1'\n | 'esi-characters.read_agents_research.v1'\n | 'esi-characters.read_blueprints.v1'\n | 'esi-characters.read_contacts.v1'\n | 'esi-characters.read_corporation_roles.v1'\n | 'esi-characters.read_fatigue.v1'\n | 'esi-characters.read_freelance_jobs.v1'\n | 'esi-characters.read_fw_stats.v1'\n | 'esi-characters.read_loyalty.v1'\n | 'esi-characters.read_medals.v1'\n | 'esi-characters.read_notifications.v1'\n | 'esi-characters.read_standings.v1'\n | 'esi-characters.read_titles.v1'\n | 'esi-characters.write_contacts.v1'\n | 'esi-clones.read_clones.v1'\n | 'esi-clones.read_implants.v1'\n | 'esi-contracts.read_character_contracts.v1'\n | 'esi-contracts.read_corporation_contracts.v1'\n | 'esi-corporations.read_blueprints.v1'\n | 'esi-corporations.read_contacts.v1'\n | 'esi-corporations.read_container_logs.v1'\n | 'esi-corporations.read_corporation_membership.v1'\n | 'esi-corporations.read_divisions.v1'\n | 'esi-corporations.read_facilities.v1'\n | 'esi-corporations.read_freelance_jobs.v1'\n | 'esi-corporations.read_fw_stats.v1'\n | 'esi-corporations.read_medals.v1'\n | 'esi-corporations.read_projects.v1'\n | 'esi-corporations.read_standings.v1'\n | 'esi-corporations.read_starbases.v1'\n | 'esi-corporations.read_structures.v1'\n | 'esi-corporations.read_titles.v1'\n | 'esi-corporations.track_members.v1'\n | 'esi-fittings.read_fittings.v1'\n | 'esi-fittings.write_fittings.v1'\n | 'esi-fleets.read_fleet.v1'\n | 'esi-fleets.write_fleet.v1'\n | 'esi-industry.read_character_jobs.v1'\n | 'esi-industry.read_character_mining.v1'\n | 'esi-industry.read_corporation_jobs.v1'\n | 'esi-industry.read_corporation_mining.v1'\n | 'esi-killmails.read_corporation_killmails.v1'\n | 'esi-killmails.read_killmails.v1'\n | 'esi-location.read_location.v1'\n | 'esi-location.read_online.v1'\n | 'esi-location.read_ship_type.v1'\n | 'esi-mail.organize_mail.v1'\n | 'esi-mail.read_mail.v1'\n | 'esi-mail.send_mail.v1'\n | 'esi-markets.read_character_orders.v1'\n | 'esi-markets.read_corporation_orders.v1'\n | 'esi-markets.structure_markets.v1'\n | 'esi-planets.manage_planets.v1'\n | 'esi-planets.read_customs_offices.v1'\n | 'esi-search.search_structures.v1'\n | 'esi-skills.read_skillqueue.v1'\n | 'esi-skills.read_skills.v1'\n | 'esi-structures.read_character.v1'\n | 'esi-structures.read_corporation.v1'\n | 'esi-ui.open_window.v1'\n | 'esi-ui.write_waypoint.v1'\n | 'esi-universe.read_structures.v1'\n | 'esi-wallet.read_character_wallet.v1'\n | 'esi-wallet.read_corporation_wallets.v1'\n | 'esi.activity.char:read'\n | 'esi.cosmetic.char:read';\n\nexport const esiEndpointScopes: Record<string, EsiScope[]> = {\n 'GET:alliances/{alliance_id}/contacts': ['esi-alliances.read_contacts.v1'],\n 'GET:alliances/{alliance_id}/contacts/labels': ['esi-alliances.read_contacts.v1'],\n 'GET:characters/{character_id}/access-lists': ['esi-access.read_lists.v1'],\n 'GET:characters/{character_id}/access-lists/{access_list_id}': ['esi-access.read_lists.v1'],\n 'GET:characters/{character_id}/agents_research': ['esi-characters.read_agents_research.v1'],\n 'GET:characters/{character_id}/assets': ['esi-assets.read_assets.v1'],\n 'POST:characters/{character_id}/assets/locations': ['esi-assets.read_assets.v1'],\n 'POST:characters/{character_id}/assets/names': ['esi-assets.read_assets.v1'],\n 'GET:characters/{character_id}/attributes': ['esi-skills.read_skills.v1'],\n 'GET:characters/{character_id}/blueprints': ['esi-characters.read_blueprints.v1'],\n 'GET:characters/{character_id}/calendar': ['esi-calendar.read_calendar_events.v1'],\n 'GET:characters/{character_id}/calendar/{event_id}': ['esi-calendar.read_calendar_events.v1'],\n 'PUT:characters/{character_id}/calendar/{event_id}': ['esi-calendar.respond_calendar_events.v1'],\n 'GET:characters/{character_id}/calendar/{event_id}/attendees': ['esi-calendar.read_calendar_events.v1'],\n 'GET:characters/{character_id}/clones': ['esi-clones.read_clones.v1'],\n 'GET:characters/{character_id}/contacts': ['esi-characters.read_contacts.v1'],\n 'POST:characters/{character_id}/contacts': ['esi-characters.write_contacts.v1'],\n 'PUT:characters/{character_id}/contacts': ['esi-characters.write_contacts.v1'],\n 'DELETE:characters/{character_id}/contacts': ['esi-characters.write_contacts.v1'],\n 'GET:characters/{character_id}/contacts/labels': ['esi-characters.read_contacts.v1'],\n 'GET:characters/{character_id}/contracts': ['esi-contracts.read_character_contracts.v1'],\n 'GET:characters/{character_id}/contracts/{contract_id}/bids': ['esi-contracts.read_character_contracts.v1'],\n 'GET:characters/{character_id}/contracts/{contract_id}/items': ['esi-contracts.read_character_contracts.v1'],\n 'GET:characters/{character_id}/cosmetics/skinr': ['esi.cosmetic.char:read'],\n 'GET:characters/{character_id}/cosmetics/skinr/components': ['esi.cosmetic.char:read'],\n 'POST:characters/{character_id}/cspa': ['esi-characters.read_contacts.v1'],\n 'GET:characters/{character_id}/fatigue': ['esi-characters.read_fatigue.v1'],\n 'GET:characters/{character_id}/fittings': ['esi-fittings.read_fittings.v1'],\n 'POST:characters/{character_id}/fittings': ['esi-fittings.write_fittings.v1'],\n 'DELETE:characters/{character_id}/fittings/{fitting_id}': ['esi-fittings.write_fittings.v1'],\n 'GET:characters/{character_id}/fleet': ['esi-fleets.read_fleet.v1'],\n 'GET:characters/{character_id}/freelance-jobs': ['esi-characters.read_freelance_jobs.v1'],\n 'GET:characters/{character_id}/freelance-jobs/{job_id}/participation': ['esi-characters.read_freelance_jobs.v1'],\n 'GET:characters/{character_id}/fw/stats': ['esi-characters.read_fw_stats.v1'],\n 'GET:characters/{character_id}/implants': ['esi-clones.read_implants.v1'],\n 'GET:characters/{character_id}/industry/jobs': ['esi-industry.read_character_jobs.v1'],\n 'GET:characters/{character_id}/killmails/recent': ['esi-killmails.read_killmails.v1'],\n 'GET:characters/{character_id}/location': ['esi-location.read_location.v1'],\n 'GET:characters/{character_id}/loyalty/points': ['esi-characters.read_loyalty.v1'],\n 'GET:characters/{character_id}/mail': ['esi-mail.read_mail.v1'],\n 'POST:characters/{character_id}/mail': ['esi-mail.send_mail.v1'],\n 'GET:characters/{character_id}/mail/{mail_id}': ['esi-mail.read_mail.v1'],\n 'PUT:characters/{character_id}/mail/{mail_id}': ['esi-mail.organize_mail.v1'],\n 'DELETE:characters/{character_id}/mail/{mail_id}': ['esi-mail.organize_mail.v1'],\n 'GET:characters/{character_id}/mail/labels': ['esi-mail.read_mail.v1'],\n 'POST:characters/{character_id}/mail/labels': ['esi-mail.organize_mail.v1'],\n 'DELETE:characters/{character_id}/mail/labels/{label_id}': ['esi-mail.organize_mail.v1'],\n 'GET:characters/{character_id}/mail/lists': ['esi-mail.read_mail.v1'],\n 'GET:characters/{character_id}/medals': ['esi-characters.read_medals.v1'],\n 'GET:characters/{character_id}/mercenary-tactical-operations': ['esi-activities.read_character.v1'],\n 'GET:characters/{character_id}/mercenary-tactical-operations/{operation_id}': ['esi-activities.read_character.v1'],\n 'GET:characters/{character_id}/military-campaigns/objectives': ['esi.activity.char:read'],\n 'GET:characters/{character_id}/military-campaigns/objectives/{objective_id}': ['esi.activity.char:read'],\n 'GET:characters/{character_id}/mining': ['esi-industry.read_character_mining.v1'],\n 'GET:characters/{character_id}/notifications': ['esi-characters.read_notifications.v1'],\n 'GET:characters/{character_id}/notifications/contacts': ['esi-characters.read_notifications.v1'],\n 'GET:characters/{character_id}/online': ['esi-location.read_online.v1'],\n 'GET:characters/{character_id}/orders': ['esi-markets.read_character_orders.v1'],\n 'GET:characters/{character_id}/orders/history': ['esi-markets.read_character_orders.v1'],\n 'GET:characters/{character_id}/paragon-hub/skinr': ['esi.cosmetic.char:read'],\n 'GET:characters/{character_id}/planets': ['esi-planets.manage_planets.v1'],\n 'GET:characters/{character_id}/planets/{planet_id}': ['esi-planets.manage_planets.v1'],\n 'GET:characters/{character_id}/roles': ['esi-characters.read_corporation_roles.v1'],\n 'GET:characters/{character_id}/search': ['esi-search.search_structures.v1'],\n 'GET:characters/{character_id}/ship': ['esi-location.read_ship_type.v1'],\n 'GET:characters/{character_id}/skillqueue': ['esi-skills.read_skillqueue.v1'],\n 'GET:characters/{character_id}/skills': ['esi-skills.read_skills.v1'],\n 'GET:characters/{character_id}/standings': ['esi-characters.read_standings.v1'],\n 'GET:characters/{character_id}/structures/mercenary-dens': ['esi-structures.read_character.v1'],\n 'GET:characters/{character_id}/structures/mercenary-dens/{mercenary_den_id}': ['esi-structures.read_character.v1'],\n 'GET:characters/{character_id}/titles': ['esi-characters.read_titles.v1'],\n 'GET:characters/{character_id}/wallet': ['esi-wallet.read_character_wallet.v1'],\n 'GET:characters/{character_id}/wallet/journal': ['esi-wallet.read_character_wallet.v1'],\n 'GET:characters/{character_id}/wallet/transactions': ['esi-wallet.read_character_wallet.v1'],\n 'GET:corporation/{corporation_id}/mining/extractions': ['esi-industry.read_corporation_mining.v1'],\n 'GET:corporation/{corporation_id}/mining/observers': ['esi-industry.read_corporation_mining.v1'],\n 'GET:corporation/{corporation_id}/mining/observers/{observer_id}': ['esi-industry.read_corporation_mining.v1'],\n 'GET:corporations/{corporation_id}/assets': ['esi-assets.read_corporation_assets.v1'],\n 'POST:corporations/{corporation_id}/assets/locations': ['esi-assets.read_corporation_assets.v1'],\n 'POST:corporations/{corporation_id}/assets/names': ['esi-assets.read_corporation_assets.v1'],\n 'GET:corporations/{corporation_id}/blueprints': ['esi-corporations.read_blueprints.v1'],\n 'GET:corporations/{corporation_id}/contacts': ['esi-corporations.read_contacts.v1'],\n 'GET:corporations/{corporation_id}/contacts/labels': ['esi-corporations.read_contacts.v1'],\n 'GET:corporations/{corporation_id}/containers/logs': ['esi-corporations.read_container_logs.v1'],\n 'GET:corporations/{corporation_id}/contracts': ['esi-contracts.read_corporation_contracts.v1'],\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/bids': ['esi-contracts.read_corporation_contracts.v1'],\n 'GET:corporations/{corporation_id}/contracts/{contract_id}/items': ['esi-contracts.read_corporation_contracts.v1'],\n 'GET:corporations/{corporation_id}/customs_offices': ['esi-planets.read_customs_offices.v1'],\n 'GET:corporations/{corporation_id}/divisions': ['esi-corporations.read_divisions.v1'],\n 'GET:corporations/{corporation_id}/facilities': ['esi-corporations.read_facilities.v1'],\n 'GET:corporations/{corporation_id}/freelance-jobs': ['esi-corporations.read_freelance_jobs.v1'],\n 'GET:corporations/{corporation_id}/freelance-jobs/{job_id}/participants': ['esi-corporations.read_freelance_jobs.v1'],\n 'GET:corporations/{corporation_id}/fw/stats': ['esi-corporations.read_fw_stats.v1'],\n 'GET:corporations/{corporation_id}/industry/jobs': ['esi-industry.read_corporation_jobs.v1'],\n 'GET:corporations/{corporation_id}/killmails/recent': ['esi-killmails.read_corporation_killmails.v1'],\n 'GET:corporations/{corporation_id}/medals': ['esi-corporations.read_medals.v1'],\n 'GET:corporations/{corporation_id}/medals/issued': ['esi-corporations.read_medals.v1'],\n 'GET:corporations/{corporation_id}/members': ['esi-corporations.read_corporation_membership.v1'],\n 'GET:corporations/{corporation_id}/members/limit': ['esi-corporations.track_members.v1'],\n 'GET:corporations/{corporation_id}/members/titles': ['esi-corporations.read_titles.v1'],\n 'GET:corporations/{corporation_id}/membertracking': ['esi-corporations.track_members.v1'],\n 'GET:corporations/{corporation_id}/orders': ['esi-markets.read_corporation_orders.v1'],\n 'GET:corporations/{corporation_id}/orders/history': ['esi-markets.read_corporation_orders.v1'],\n 'GET:corporations/{corporation_id}/projects': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/projects/{project_id}': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/projects/{project_id}/contribution/{character_id}': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/projects/{project_id}/contributors': ['esi-corporations.read_projects.v1'],\n 'GET:corporations/{corporation_id}/roles': ['esi-corporations.read_corporation_membership.v1'],\n 'GET:corporations/{corporation_id}/roles/history': ['esi-corporations.read_corporation_membership.v1'],\n 'GET:corporations/{corporation_id}/shareholders': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:corporations/{corporation_id}/standings': ['esi-corporations.read_standings.v1'],\n 'GET:corporations/{corporation_id}/starbases': ['esi-corporations.read_starbases.v1'],\n 'GET:corporations/{corporation_id}/starbases/{starbase_id}': ['esi-corporations.read_starbases.v1'],\n 'GET:corporations/{corporation_id}/structures': ['esi-corporations.read_structures.v1'],\n 'GET:corporations/{corporation_id}/structures/skyhooks': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/structures/skyhooks/{skyhook_id}': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/structures/sovereignty-hubs/{sovereignty_hub_id}': ['esi-structures.read_corporation.v1'],\n 'GET:corporations/{corporation_id}/titles': ['esi-corporations.read_titles.v1'],\n 'GET:corporations/{corporation_id}/wallets': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:corporations/{corporation_id}/wallets/{division}/journal': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:corporations/{corporation_id}/wallets/{division}/transactions': ['esi-wallet.read_corporation_wallets.v1'],\n 'GET:fleets/{fleet_id}': ['esi-fleets.read_fleet.v1'],\n 'PUT:fleets/{fleet_id}': ['esi-fleets.write_fleet.v1'],\n 'GET:fleets/{fleet_id}/members': ['esi-fleets.read_fleet.v1'],\n 'POST:fleets/{fleet_id}/members': ['esi-fleets.write_fleet.v1'],\n 'PUT:fleets/{fleet_id}/members/{member_id}': ['esi-fleets.write_fleet.v1'],\n 'DELETE:fleets/{fleet_id}/members/{member_id}': ['esi-fleets.write_fleet.v1'],\n 'PUT:fleets/{fleet_id}/squads/{squad_id}': ['esi-fleets.write_fleet.v1'],\n 'DELETE:fleets/{fleet_id}/squads/{squad_id}': ['esi-fleets.write_fleet.v1'],\n 'GET:fleets/{fleet_id}/wings': ['esi-fleets.read_fleet.v1'],\n 'POST:fleets/{fleet_id}/wings': ['esi-fleets.write_fleet.v1'],\n 'PUT:fleets/{fleet_id}/wings/{wing_id}': ['esi-fleets.write_fleet.v1'],\n 'DELETE:fleets/{fleet_id}/wings/{wing_id}': ['esi-fleets.write_fleet.v1'],\n 'POST:fleets/{fleet_id}/wings/{wing_id}/squads': ['esi-fleets.write_fleet.v1'],\n 'GET:markets/structures/{structure_id}': ['esi-markets.structure_markets.v1'],\n 'GET:paragon-hub/skinr/alliances/{alliance_id}': ['esi.cosmetic.char:read'],\n 'GET:paragon-hub/skinr/characters/{character_id}': ['esi.cosmetic.char:read'],\n 'GET:paragon-hub/skinr/corporations/{corporation_id}': ['esi.cosmetic.char:read'],\n 'POST:ui/autopilot/waypoint': ['esi-ui.write_waypoint.v1'],\n 'POST:ui/openwindow/contract': ['esi-ui.open_window.v1'],\n 'POST:ui/openwindow/information': ['esi-ui.open_window.v1'],\n 'POST:ui/openwindow/marketdetails': ['esi-ui.open_window.v1'],\n 'POST:ui/openwindow/newmail': ['esi-ui.open_window.v1'],\n 'GET:universe/structures/{structure_id}': ['esi-universe.read_structures.v1'],\n};\n","import type { ILogger } from './ILogger';\n\nconst noop = (_message: string, _context?: unknown): void => {};\n\nconst noopLogger: ILogger = {\n fatal: noop,\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n isLevelEnabled: () => false,\n};\n\n/**\n * A logger that discards all events. Useful in tests, benchmarks, and\n * embedded contexts where library log output is noise.\n */\nexport function createNoopLogger(): ILogger {\n return noopLogger;\n}\n","declare const __brand: unique symbol;\n\ntype Brand<T, B extends string> = T & { readonly [__brand]: B };\n\nexport type CharacterId = Brand<number, 'CharacterId'>;\nexport type CorporationId = Brand<number, 'CorporationId'>;\nexport type AllianceId = Brand<number, 'AllianceId'>;\nexport type TypeId = Brand<number, 'TypeId'>;\nexport type RegionId = Brand<number, 'RegionId'>;\nexport type SystemId = Brand<number, 'SystemId'>;\nexport type StationId = Brand<number, 'StationId'>;\nexport type StructureId = Brand<number, 'StructureId'>;\nexport type OrderId = Brand<number, 'OrderId'>;\nexport type ContractId = Brand<number, 'ContractId'>;\nexport type KillmailId = Brand<number, 'KillmailId'>;\nexport type FactionId = Brand<number, 'FactionId'>;\nexport type CorporationAllianceId = Brand<number, 'CorporationAllianceId'>;\nexport type FleetId = Brand<number, 'FleetId'>;\nexport type PlanetId = Brand<number, 'PlanetId'>;\nexport type WarId = Brand<number, 'WarId'>;\n\nexport function brand<T>(value: number): T {\n return value as unknown as T;\n}\n","/* eslint-disable */\n// Auto-generated from ESI OpenAPI spec — do not edit manually\n// Compatibility date: 2026-08-18\n// Spec hash: 34f6278baa75\n// Total interfaces: 186\n\n// --- Access List ---\n\nexport interface CharactersAccessListsDetail {\n description: string;\n id: number;\n membership: {\n alliances: ({\n access: 'Unspecified' | 'Allowed' | 'Blocked' | 'Manager' | 'Admin';\n alliance_id: number;\n })[];\n allow_everyone: boolean;\n characters: ({\n access: 'Unspecified' | 'Allowed' | 'Blocked' | 'Manager' | 'Admin';\n character_id: number;\n })[];\n corporations: ({\n access: 'Unspecified' | 'Allowed' | 'Blocked' | 'Manager' | 'Admin';\n corporation_id: number;\n })[];\n };\n name: string;\n}\n\nexport interface CharactersAccessListsListing {\n access_lists: ({\n id: number;\n })[];\n}\n\n// --- Activities ---\n\nexport interface CharactersMercenaryTacticalOperationsDetail {\n dungeon_type_id: number;\n expires: string;\n id: string;\n mercenary_den_id: number;\n state: 'Unspecified' | 'Available' | 'Started' | 'Completed' | 'Expired' | 'Removed';\n}\n\nexport interface CharactersMercenaryTacticalOperationsListing {\n operations: ({\n id: string;\n mercenary_den_id: number;\n })[];\n}\n\nexport interface SkyhooksRaidable {\n skyhooks: ({\n planet_id: number;\n solar_system_id: number;\n theft_vulnerability: {\n end: string;\n start: string;\n };\n })[];\n}\n\n// --- Alliance ---\n\nexport interface AlliancesAllianceIdIconsGet {\n px128x128?: string;\n px64x64?: string;\n}\n\nexport interface AlliancesDetail {\n creator_corporation_id: number;\n creator_id: number;\n date_founded: string;\n executor_corporation_id?: number;\n faction_id?: number;\n name: string;\n ticker: string;\n}\n\n// --- Assets ---\n\nexport interface CharactersCharacterIdAssetsGet {\n is_blueprint_copy?: boolean;\n is_singleton: boolean;\n item_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'BoosterBay' | 'CapsuleerDeliveries' | 'Cargo' | 'CorporationGoalDeliveries' | 'CorpseBay' | 'Deliveries' | 'DroneBay' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'InfrastructureHangar' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'QuafeBay' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'ShipHangar' | 'Skill' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureDeedBay' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wardrobe';\n location_id: number;\n location_type: 'station' | 'solar_system' | 'item' | 'other';\n quantity: number;\n type_id: number;\n}\n\nexport interface CharactersCharacterIdAssetsLocationsPost {\n item_id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n}\n\nexport interface CharactersCharacterIdAssetsNamesPost {\n item_id: number;\n name: string;\n}\n\nexport interface CorporationsCorporationIdAssetsGet {\n is_blueprint_copy?: boolean;\n is_singleton: boolean;\n item_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'Bonus' | 'Booster' | 'BoosterBay' | 'Capsule' | 'CapsuleerDeliveries' | 'Cargo' | 'CorpDeliveries' | 'CorpSAG1' | 'CorpSAG2' | 'CorpSAG3' | 'CorpSAG4' | 'CorpSAG5' | 'CorpSAG6' | 'CorpSAG7' | 'CorporationGoalDeliveries' | 'CrateLoot' | 'Deliveries' | 'DroneBay' | 'DustBattle' | 'DustDatabank' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'Impounded' | 'InfrastructureHangar' | 'JunkyardReprocessed' | 'JunkyardTrashed' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'OfficeFolder' | 'Pilot' | 'PlanetSurface' | 'QuafeBay' | 'QuantumCoreRoom' | 'Reward' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'SecondaryStorage' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'ShipHangar' | 'ShipOffline' | 'Skill' | 'SkillInTraining' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureActive' | 'StructureFuel' | 'StructureInactive' | 'StructureOffline' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wallet' | 'Wardrobe';\n location_id: number;\n location_type: 'station' | 'solar_system' | 'item' | 'other';\n quantity: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdAssetsLocationsPost {\n item_id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n}\n\nexport interface CorporationsCorporationIdAssetsNamesPost {\n item_id: number;\n name: string;\n}\n\n// --- Calendar ---\n\nexport interface CharactersCharacterIdCalendarEventIdAttendeesGet {\n character_id?: number;\n event_response?: 'declined' | 'not_responded' | 'accepted' | 'tentative';\n}\n\nexport interface CharactersCharacterIdCalendarEventIdGet {\n date: string;\n duration: number;\n event_id: number;\n importance: number;\n owner_id: number;\n owner_name: string;\n owner_type: 'eve_server' | 'corporation' | 'faction' | 'character' | 'alliance';\n response: string;\n text: string;\n title: string;\n}\n\nexport interface CharactersCharacterIdCalendarGet {\n event_date?: string;\n event_id?: number;\n event_response?: 'declined' | 'not_responded' | 'accepted' | 'tentative';\n importance?: number;\n title?: string;\n}\n\n// --- Character ---\n\nexport interface CharactersAffiliationPost {\n alliance_id?: number;\n character_id: number;\n corporation_id: number;\n faction_id?: number;\n}\n\nexport interface CharactersCharacterIdAgentsResearchGet {\n agent_id: number;\n points_per_day: number;\n remainder_points: number;\n skill_type_id: number;\n started_at: string;\n}\n\nexport interface CharactersCharacterIdBlueprintsGet {\n item_id: number;\n location_flag: 'AutoFit' | 'Cargo' | 'CorpseBay' | 'DroneBay' | 'FleetHangar' | 'Deliveries' | 'HiddenModifiers' | 'Hangar' | 'HangarAll' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'AssetSafety' | 'Locked' | 'Unlocked' | 'Implant' | 'QuafeBay' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'ShipHangar' | 'SpecializedFuelBay' | 'SpecializedOreHold' | 'SpecializedGasHold' | 'SpecializedMineralHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'SpecializedMediumShipHold' | 'SpecializedLargeShipHold' | 'SpecializedIndustrialShipHold' | 'SpecializedAmmoHold' | 'SpecializedCommandCenterHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedMaterialBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'Module';\n location_id: number;\n material_efficiency: number;\n quantity: number;\n runs: number;\n time_efficiency: number;\n type_id: number;\n}\n\nexport interface CharactersCharacterIdCorporationhistoryGet {\n corporation_id: number;\n is_deleted?: boolean;\n record_id: number;\n start_date: string;\n}\n\nexport interface CharactersCharacterIdFatigueGet {\n jump_fatigue_expire_date?: string;\n last_jump_date?: string;\n last_update_date?: string;\n}\n\nexport interface CharactersCharacterIdMedalsGet {\n corporation_id: number;\n date: string;\n description: string;\n graphics: ({\n color?: number;\n graphic: string;\n layer: number;\n part: number;\n })[];\n issuer_id: number;\n medal_id: number;\n reason: string;\n status: 'public' | 'private';\n title: string;\n}\n\nexport interface CharactersCharacterIdNotificationsContactsGet {\n message: string;\n notification_id: number;\n send_date: string;\n sender_character_id: number;\n standing_level: number;\n}\n\nexport interface CharactersCharacterIdNotificationsGet {\n is_read?: boolean;\n notification_id: number;\n sender_id: number;\n sender_type: 'character' | 'corporation' | 'alliance' | 'faction' | 'other';\n text?: string;\n timestamp: string;\n type: 'AcceptedAlly' | 'AcceptedSurrender' | 'AgentRetiredTrigravian' | 'AllAnchoringMsg' | 'AllMaintenanceBillMsg' | 'AllStrucInvulnerableMsg' | 'AllStructVulnerableMsg' | 'AllWarCorpJoinedAllianceMsg' | 'AllWarDeclaredMsg' | 'AllWarInvalidatedMsg' | 'AllWarRetractedMsg' | 'AllWarSurrenderMsg' | 'AllianceCapitalChanged' | 'AllianceWarDeclaredV2' | 'AllyContractCancelled' | 'AllyJoinedWarAggressorMsg' | 'AllyJoinedWarAllyMsg' | 'AllyJoinedWarDefenderMsg' | 'BattlePunishFriendlyFire' | 'BillOutOfMoneyMsg' | 'BillPaidCorpAllMsg' | 'BountyClaimMsg' | 'BountyESSShared' | 'BountyESSTaken' | 'BountyPlacedAlliance' | 'BountyPlacedChar' | 'BountyPlacedCorp' | 'BountyYourBountyClaimed' | 'BuddyConnectContactAdd' | 'CharAppAcceptMsg' | 'CharAppRejectMsg' | 'CharAppWithdrawMsg' | 'CharLeftCorpMsg' | 'CharMedalMsg' | 'CharTerminationMsg' | 'CloneActivationMsg' | 'CloneActivationMsg2' | 'CloneMovedMsg' | 'CloneRevokedMsg1' | 'CloneRevokedMsg2' | 'CombatOperationFinished' | 'ContactAdd' | 'ContactEdit' | 'ContainerPasswordMsg' | 'ContractRegionChangedToPochven' | 'CorpAllBillMsg' | 'CorpAppAcceptMsg' | 'CorpAppInvitedMsg' | 'CorpAppNewMsg' | 'CorpAppRejectCustomMsg' | 'CorpAppRejectMsg' | 'CorpBecameWarEligible' | 'CorpDividendMsg' | 'CorpFriendlyFireDisableTimerCompleted' | 'CorpFriendlyFireDisableTimerStarted' | 'CorpFriendlyFireEnableTimerCompleted' | 'CorpFriendlyFireEnableTimerStarted' | 'CorpKicked' | 'CorpLiquidationMsg' | 'CorpNewCEOMsg' | 'CorpNewsMsg' | 'CorpNoLongerWarEligible' | 'CorpOfficeExpirationMsg' | 'CorpStructLostMsg' | 'CorpTaxChangeMsg' | 'CorpVoteCEORevokedMsg' | 'CorpVoteMsg' | 'CorpWarDeclaredMsg' | 'CorpWarDeclaredV2' | 'CorpWarFightingLegalMsg' | 'CorpWarInvalidatedMsg' | 'CorpWarRetractedMsg' | 'CorpWarSurrenderMsg' | 'CorporationGoalClosed' | 'CorporationGoalCompleted' | 'CorporationGoalCreated' | 'CorporationGoalExpired' | 'CorporationGoalLimitReached' | 'CorporationGoalNameChange' | 'CorporationLeft' | 'CustomsMsg' | 'DailyItemRewardAutoClaimed' | 'DeclareWar' | 'DistrictAttacked' | 'DustAppAcceptedMsg' | 'ESSMainBankLink' | 'EntosisCaptureStarted' | 'ExpertSystemExpired' | 'ExpertSystemExpiryImminent' | 'FWAllianceKickCeoIndividualStandingWarning' | 'FWAllianceKickMsg' | 'FWAllianceKickedCeoIndividualStanding' | 'FWAllianceWarningMsg' | 'FWCharKickMsg' | 'FWCharRankGainMsg' | 'FWCharRankLossMsg' | 'FWCharWarningMsg' | 'FWCharacterKickFromCorpIndividualStandingWarning' | 'FWCharacterKickedFromCorpIndividualStanding' | 'FWCorpJoinMsg' | 'FWCorpKickMsg' | 'FWCorpLeaveMsg' | 'FWCorpWarningMsg' | 'FWCorporationKickCeoIndividualStandingWarning' | 'FWCorporationKickedCeoIndividualStanding' | 'FacWarCorpJoinRequestMsg' | 'FacWarCorpJoinWithdrawMsg' | 'FacWarCorpLeaveRequestMsg' | 'FacWarCorpLeaveWithdrawMsg' | 'FacWarDirectEnlistmentRevoked' | 'FacWarLPDisqualifiedEvent' | 'FacWarLPDisqualifiedKill' | 'FacWarLPPayoutEvent' | 'FacWarLPPayoutKill' | 'FreelanceProjectACLDeleted' | 'FreelanceProjectClosed' | 'FreelanceProjectCompleted' | 'FreelanceProjectCreated' | 'FreelanceProjectExpired' | 'FreelanceProjectLimitReached' | 'FreelanceProjectParticipantKicked' | 'GameTimeAdded' | 'GameTimeReceived' | 'GameTimeSent' | 'GiftReceived' | 'IHubDestroyedByBillFailure' | 'IncursionCompletedMsg' | 'IndustryOperationFinished' | 'IndustryTeamAuctionLost' | 'IndustryTeamAuctionWon' | 'InfrastructureHubBillAboutToExpire' | 'InsuranceExpirationMsg' | 'InsuranceFirstShipMsg' | 'InsuranceInvalidatedMsg' | 'InsuranceIssuedMsg' | 'InsurancePayoutMsg' | 'InvasionCompletedMsg' | 'InvasionSystemLogin' | 'InvasionSystemStart' | 'JumpCloneDeletedMsg1' | 'JumpCloneDeletedMsg2' | 'KillReportFinalBlow' | 'KillReportVictim' | 'KillRightAvailable' | 'KillRightAvailableOpen' | 'KillRightEarned' | 'KillRightUnavailable' | 'KillRightUnavailableOpen' | 'KillRightUsed' | 'LPAutoRedeemed' | 'LocateCharMsg' | 'MadeWarMutual' | 'MercOfferRetractedMsg' | 'MercOfferedNegotiationMsg' | 'MercenaryDenAttacked' | 'MercenaryDenNewMTO' | 'MercenaryDenReinforced' | 'MissionCanceledTriglavian' | 'MissionOfferExpirationMsg' | 'MissionTimeoutMsg' | 'MoonminingAutomaticFracture' | 'MoonminingExtractionCancelled' | 'MoonminingExtractionFinished' | 'MoonminingExtractionStarted' | 'MoonminingLaserFired' | 'MutualWarExpired' | 'MutualWarInviteAccepted' | 'MutualWarInviteRejected' | 'MutualWarInviteSent' | 'NPCStandingsGained' | 'NPCStandingsLost' | 'OfferToAllyRetracted' | 'OfferedSurrender' | 'OfferedToAlly' | 'OfficeLeaseCanceledInsufficientStandings' | 'OldLscMessages' | 'OperationFinished' | 'OrbitalAttacked' | 'OrbitalReinforced' | 'OwnershipTransferred' | 'RaffleCreated' | 'RaffleExpired' | 'RaffleFinished' | 'ReimbursementMsg' | 'ResearchMissionAvailableMsg' | 'RetractsWar' | 'SPAutoRedeemed' | 'SeasonalChallengeCompleted' | 'SkinSequencingCompleted' | 'SkyhookDeployed' | 'SkyhookDestroyed' | 'SkyhookLostShields' | 'SkyhookOnline' | 'SkyhookUnderAttack' | 'SovAllClaimAquiredMsg' | 'SovAllClaimLostMsg' | 'SovCommandNodeEventStarted' | 'SovCorpBillLateMsg' | 'SovCorpClaimFailMsg' | 'SovDisruptorMsg' | 'SovStationEnteredFreeport' | 'SovStructureDestroyed' | 'SovStructureReinforced' | 'SovStructureSelfDestructCancel' | 'SovStructureSelfDestructFinished' | 'SovStructureSelfDestructRequested' | 'SovereigntyIHDamageMsg' | 'SovereigntySBUDamageMsg' | 'SovereigntyTCUDamageMsg' | 'StationAggressionMsg1' | 'StationAggressionMsg2' | 'StationConquerMsg' | 'StationServiceDisabled' | 'StationServiceEnabled' | 'StationStateChangeMsg' | 'StoryLineMissionAvailableMsg' | 'StructureAnchoring' | 'StructureCourierContractChanged' | 'StructureDestroyed' | 'StructureFuelAlert' | 'StructureImpendingAbandonmentAssetsAtRisk' | 'StructureItemsDelivered' | 'StructureItemsMovedToSafety' | 'StructureLostArmor' | 'StructureLostShields' | 'StructureLowReagentsAlert' | 'StructureNoReagentsAlert' | 'StructureOnline' | 'StructurePaintPurchased' | 'StructureServicesOffline' | 'StructureUnanchoring' | 'StructureUnderAttack' | 'StructureWentHighPower' | 'StructureWentLowPower' | 'StructuresJobsCancelled' | 'StructuresJobsPaused' | 'StructuresReinforcementChanged' | 'TowerAlertMsg' | 'TowerResourceAlertMsg' | 'TransactionReversalMsg' | 'TutorialMsg' | 'WarAdopted ' | 'WarAllyInherited' | 'WarAllyOfferDeclinedMsg' | 'WarConcordInvalidates' | 'WarDeclared' | 'WarEndedHqSecurityDrop' | 'WarHQRemovedFromSpace' | 'WarInherited' | 'WarInvalid' | 'WarRetracted' | 'WarRetractedByConcord' | 'WarSurrenderDeclinedMsg' | 'WarSurrenderOfferMsg';\n}\n\nexport interface CharactersCharacterIdPortraitGet {\n px128x128?: string;\n px256x256?: string;\n px512x512?: string;\n px64x64?: string;\n}\n\nexport interface CharactersCharacterIdRolesGet {\n roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n}\n\nexport interface CharactersCharacterIdStandingsGet {\n from_id: number;\n from_type: 'agent' | 'npc_corp' | 'faction';\n standing: number;\n}\n\nexport interface CharactersCharacterIdTitlesGet {\n name?: string;\n title_id?: number;\n}\n\nexport interface CharactersDetail {\n achievement_score: number;\n alliance_id?: number;\n birthday: string;\n bloodline_id: number;\n character_title_id?: string;\n corporation_id: number;\n corporation_title?: string;\n description?: string;\n faction_id?: number;\n gender: 'male' | 'female';\n name: string;\n race_id: number;\n security_status?: number;\n}\n\n// --- Clones ---\n\nexport interface CharactersCharacterIdClonesGet {\n home_location?: {\n location_id?: number;\n location_type?: 'station' | 'structure';\n };\n jump_clones: ({\n implants: number[];\n jump_clone_id: number;\n location_id: number;\n location_type: 'station' | 'structure';\n name?: string;\n })[];\n last_clone_jump_date?: string;\n last_station_change_date?: string;\n}\n\n// --- Contacts ---\n\nexport interface AlliancesAllianceIdContactsGet {\n contact_id: number;\n contact_type: 'character' | 'corporation' | 'alliance' | 'faction';\n label_ids?: number[];\n standing: number;\n}\n\nexport interface AlliancesAllianceIdContactsLabelsGet {\n label_id: number;\n label_name: string;\n}\n\nexport interface CharactersCharacterIdContactsGet {\n contact_id: number;\n contact_type: 'character' | 'corporation' | 'alliance' | 'faction';\n is_blocked?: boolean;\n is_watched?: boolean;\n label_ids?: number[];\n standing: number;\n}\n\nexport interface CharactersCharacterIdContactsLabelsGet {\n label_id: number;\n label_name: string;\n}\n\nexport interface CorporationsCorporationIdContactsGet {\n contact_id: number;\n contact_type: 'character' | 'corporation' | 'alliance' | 'faction';\n is_watched?: boolean;\n label_ids?: number[];\n standing: number;\n}\n\nexport interface CorporationsCorporationIdContactsLabelsGet {\n label_id: number;\n label_name: string;\n}\n\n// --- Contracts ---\n\nexport interface CharactersCharacterIdContractsContractIdBidsGet {\n amount: number;\n bid_id: number;\n bidder_id: number;\n date_bid: string;\n}\n\nexport interface CharactersCharacterIdContractsContractIdItemsGet {\n is_included: boolean;\n is_singleton: boolean;\n quantity: number;\n raw_quantity?: number;\n record_id: number;\n type_id: number;\n}\n\nexport interface CharactersCharacterIdContractsGet {\n acceptor_id: number;\n assignee_id: number;\n availability: 'public' | 'personal' | 'corporation' | 'alliance';\n buyout?: number;\n collateral?: number;\n contract_id: number;\n date_accepted?: string;\n date_completed?: string;\n date_expired: string;\n date_issued: string;\n days_to_complete?: number;\n end_location_id?: number;\n for_corporation: boolean;\n issuer_corporation_id: number;\n issuer_id: number;\n price?: number;\n reward?: number;\n start_location_id?: number;\n status: 'outstanding' | 'in_progress' | 'finished_issuer' | 'finished_contractor' | 'finished' | 'cancelled' | 'rejected' | 'failed' | 'deleted' | 'reversed';\n title?: string;\n type: 'unknown' | 'item_exchange' | 'auction' | 'courier' | 'loan';\n volume?: number;\n}\n\nexport interface ContractsPublicBidsContractIdGet {\n amount: number;\n bid_id: number;\n date_bid: string;\n}\n\nexport interface ContractsPublicItemsContractIdGet {\n is_blueprint_copy?: boolean;\n is_included: boolean;\n item_id?: number;\n material_efficiency?: number;\n quantity: number;\n record_id: number;\n runs?: number;\n time_efficiency?: number;\n type_id: number;\n}\n\nexport interface ContractsPublicRegionIdGet {\n buyout?: number;\n collateral?: number;\n contract_id: number;\n date_expired: string;\n date_issued: string;\n days_to_complete?: number;\n end_location_id?: number;\n for_corporation?: boolean;\n issuer_corporation_id: number;\n issuer_id: number;\n price?: number;\n reward?: number;\n start_location_id?: number;\n title?: string;\n type: 'unknown' | 'item_exchange' | 'auction' | 'courier' | 'loan';\n volume?: number;\n}\n\nexport interface CorporationsCorporationIdContractsContractIdBidsGet {\n amount: number;\n bid_id: number;\n bidder_id: number;\n date_bid: string;\n}\n\nexport interface CorporationsCorporationIdContractsContractIdItemsGet {\n is_included: boolean;\n is_singleton: boolean;\n quantity: number;\n raw_quantity?: number;\n record_id: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdContractsGet {\n acceptor_id: number;\n assignee_id: number;\n availability: 'public' | 'personal' | 'corporation' | 'alliance';\n buyout?: number;\n collateral?: number;\n contract_id: number;\n date_accepted?: string;\n date_completed?: string;\n date_expired: string;\n date_issued: string;\n days_to_complete?: number;\n end_location_id?: number;\n for_corporation: boolean;\n issuer_corporation_id: number;\n issuer_id: number;\n price?: number;\n reward?: number;\n start_location_id?: number;\n status: 'outstanding' | 'in_progress' | 'finished_issuer' | 'finished_contractor' | 'finished' | 'cancelled' | 'rejected' | 'failed' | 'deleted' | 'reversed';\n title?: string;\n type: 'unknown' | 'item_exchange' | 'auction' | 'courier' | 'loan';\n volume?: number;\n}\n\n// --- Corporation ---\n\nexport interface CorporationsCorporationIdAlliancehistoryGet {\n alliance_id?: number;\n is_deleted?: boolean;\n record_id: number;\n start_date: string;\n}\n\nexport interface CorporationsCorporationIdBlueprintsGet {\n item_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'Bonus' | 'Booster' | 'BoosterBay' | 'Capsule' | 'CapsuleerDeliveries' | 'Cargo' | 'CorpDeliveries' | 'CorpSAG1' | 'CorpSAG2' | 'CorpSAG3' | 'CorpSAG4' | 'CorpSAG5' | 'CorpSAG6' | 'CorpSAG7' | 'CorporationGoalDeliveries' | 'CrateLoot' | 'Deliveries' | 'DroneBay' | 'DustBattle' | 'DustDatabank' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'Impounded' | 'InfrastructureHangar' | 'JunkyardReprocessed' | 'JunkyardTrashed' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'OfficeFolder' | 'Pilot' | 'PlanetSurface' | 'QuafeBay' | 'QuantumCoreRoom' | 'Reward' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'SecondaryStorage' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'ShipHangar' | 'ShipOffline' | 'Skill' | 'SkillInTraining' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureActive' | 'StructureFuel' | 'StructureInactive' | 'StructureOffline' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wallet' | 'Wardrobe';\n location_id: number;\n material_efficiency: number;\n quantity: number;\n runs: number;\n time_efficiency: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdContainersLogsGet {\n action: 'add' | 'assemble' | 'configure' | 'enter_password' | 'lock' | 'move' | 'repackage' | 'set_name' | 'set_password' | 'unlock';\n character_id: number;\n container_id: number;\n container_type_id: number;\n location_flag: 'AssetSafety' | 'AutoFit' | 'Bonus' | 'Booster' | 'BoosterBay' | 'Capsule' | 'CapsuleerDeliveries' | 'Cargo' | 'CorpDeliveries' | 'CorpSAG1' | 'CorpSAG2' | 'CorpSAG3' | 'CorpSAG4' | 'CorpSAG5' | 'CorpSAG6' | 'CorpSAG7' | 'CorporationGoalDeliveries' | 'CrateLoot' | 'Deliveries' | 'DroneBay' | 'DustBattle' | 'DustDatabank' | 'ExpeditionHold' | 'FighterBay' | 'FighterTube0' | 'FighterTube1' | 'FighterTube2' | 'FighterTube3' | 'FighterTube4' | 'FleetHangar' | 'FrigateEscapeBay' | 'Hangar' | 'HangarAll' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'HiddenModifiers' | 'Implant' | 'Impounded' | 'InfrastructureHangar' | 'JunkyardReprocessed' | 'JunkyardTrashed' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'Locked' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'MobileDepotHold' | 'MoonMaterialBay' | 'OfficeFolder' | 'Pilot' | 'PlanetSurface' | 'QuafeBay' | 'QuantumCoreRoom' | 'Reward' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'RigSlot3' | 'RigSlot4' | 'RigSlot5' | 'RigSlot6' | 'RigSlot7' | 'SecondaryStorage' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'ShipHangar' | 'ShipOffline' | 'Skill' | 'SkillInTraining' | 'SpecializedAmmoHold' | 'SpecializedAsteroidHold' | 'SpecializedCommandCenterHold' | 'SpecializedFuelBay' | 'SpecializedGasHold' | 'SpecializedIceHold' | 'SpecializedIndustrialShipHold' | 'SpecializedLargeShipHold' | 'SpecializedMaterialBay' | 'SpecializedMediumShipHold' | 'SpecializedMineralHold' | 'SpecializedOreHold' | 'SpecializedPlanetaryCommoditiesHold' | 'SpecializedSalvageHold' | 'SpecializedShipHold' | 'SpecializedSmallShipHold' | 'StructureActive' | 'StructureFuel' | 'StructureInactive' | 'StructureOffline' | 'SubSystemBay' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3' | 'SubSystemSlot4' | 'SubSystemSlot5' | 'SubSystemSlot6' | 'SubSystemSlot7' | 'Unlocked' | 'Wallet' | 'Wardrobe';\n location_id: number;\n logged_at: string;\n new_config_bitmask?: number;\n old_config_bitmask?: number;\n password_type?: 'config' | 'general';\n quantity?: number;\n type_id?: number;\n}\n\nexport interface CorporationsCorporationIdDivisionsGet {\n hangar?: ({\n division?: number;\n name?: string;\n })[];\n wallet?: ({\n division?: number;\n name?: string;\n })[];\n}\n\nexport interface CorporationsCorporationIdFacilitiesGet {\n facility_id: number;\n system_id: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdIconsGet {\n px128x128?: string;\n px256x256?: string;\n px64x64?: string;\n}\n\nexport interface CorporationsCorporationIdMedalsGet {\n created_at: string;\n creator_id: number;\n description: string;\n medal_id: number;\n title: string;\n}\n\nexport interface CorporationsCorporationIdMedalsIssuedGet {\n character_id: number;\n issued_at: string;\n issuer_id: number;\n medal_id: number;\n reason: string;\n status: 'private' | 'public';\n}\n\nexport interface CorporationsCorporationIdMembersTitlesGet {\n character_id: number;\n titles: number[];\n}\n\nexport interface CorporationsCorporationIdMembertrackingGet {\n base_id?: number;\n character_id: number;\n location_id?: number;\n logoff_date?: string;\n logon_date?: string;\n ship_type_id?: number;\n start_date?: string;\n}\n\nexport interface CorporationsCorporationIdRolesGet {\n character_id: number;\n grantable_roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n}\n\nexport interface CorporationsCorporationIdRolesHistoryGet {\n changed_at: string;\n character_id: number;\n issuer_id: number;\n new_roles: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n old_roles: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n role_type: 'grantable_roles' | 'grantable_roles_at_base' | 'grantable_roles_at_hq' | 'grantable_roles_at_other' | 'roles' | 'roles_at_base' | 'roles_at_hq' | 'roles_at_other';\n}\n\nexport interface CorporationsCorporationIdShareholdersGet {\n share_count: number;\n shareholder_id: number;\n shareholder_type: 'character' | 'corporation';\n}\n\nexport interface CorporationsCorporationIdStandingsGet {\n from_id: number;\n from_type: 'agent' | 'npc_corp' | 'faction';\n standing: number;\n}\n\nexport interface CorporationsCorporationIdStarbasesGet {\n moon_id?: number;\n onlined_since?: string;\n reinforced_until?: string;\n starbase_id: number;\n state?: 'offline' | 'online' | 'onlining' | 'reinforced' | 'unanchoring';\n system_id: number;\n type_id: number;\n unanchor_at?: string;\n}\n\nexport interface CorporationsCorporationIdStarbasesStarbaseIdGet {\n allow_alliance_members: boolean;\n allow_corporation_members: boolean;\n anchor: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n attack_if_at_war: boolean;\n attack_if_other_security_status_dropping: boolean;\n attack_security_status_threshold?: number;\n attack_standing_threshold?: number;\n fuel_bay_take: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n fuel_bay_view: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n fuels?: ({\n quantity: number;\n type_id: number;\n })[];\n offline: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n online: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n unanchor: 'alliance_member' | 'config_starbase_equipment_role' | 'corporation_member' | 'starbase_fuel_technician_role';\n use_alliance_standings: boolean;\n}\n\nexport interface CorporationsCorporationIdStructuresGet {\n corporation_id: number;\n fuel_expires?: string;\n name?: string;\n next_reinforce_apply?: string;\n next_reinforce_hour?: number;\n profile_id: number;\n reinforce_hour?: number;\n services?: ({\n name: string;\n state: 'online' | 'offline' | 'cleanup';\n })[];\n state: 'anchor_vulnerable' | 'anchoring' | 'armor_reinforce' | 'armor_vulnerable' | 'deploy_vulnerable' | 'fitting_invulnerable' | 'hull_reinforce' | 'hull_vulnerable' | 'online_deprecated' | 'onlining_vulnerable' | 'shield_vulnerable' | 'unanchored' | 'unknown';\n state_timer_end?: string;\n state_timer_start?: string;\n structure_id: number;\n system_id: number;\n type_id: number;\n unanchors_at?: string;\n}\n\nexport interface CorporationsCorporationIdTitlesGet {\n grantable_roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n grantable_roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n name?: string;\n roles?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_base?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_hq?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n roles_at_other?: 'Account_Take_1' | 'Account_Take_2' | 'Account_Take_3' | 'Account_Take_4' | 'Account_Take_5' | 'Account_Take_6' | 'Account_Take_7' | 'Accountant' | 'Auditor' | 'Brand_Manager' | 'Communications_Officer' | 'Config_Equipment' | 'Config_Starbase_Equipment' | 'Container_Take_1' | 'Container_Take_2' | 'Container_Take_3' | 'Container_Take_4' | 'Container_Take_5' | 'Container_Take_6' | 'Container_Take_7' | 'Contract_Manager' | 'Deliveries_Container_Take' | 'Deliveries_Query' | 'Deliveries_Take' | 'Diplomat' | 'Director' | 'Factory_Manager' | 'Fitting_Manager' | 'Hangar_Query_1' | 'Hangar_Query_2' | 'Hangar_Query_3' | 'Hangar_Query_4' | 'Hangar_Query_5' | 'Hangar_Query_6' | 'Hangar_Query_7' | 'Hangar_Take_1' | 'Hangar_Take_2' | 'Hangar_Take_3' | 'Hangar_Take_4' | 'Hangar_Take_5' | 'Hangar_Take_6' | 'Hangar_Take_7' | 'Junior_Accountant' | 'Personnel_Manager' | 'Project_Manager' | 'Rent_Factory_Facility' | 'Rent_Office' | 'Rent_Research_Facility' | 'Security_Officer' | 'Skill_Plan_Manager' | 'Starbase_Defense_Operator' | 'Starbase_Fuel_Technician' | 'Station_Manager' | 'Trader'[];\n title_id?: number;\n}\n\nexport interface CorporationsDetail {\n alliance_id?: number;\n ceo_id?: number;\n creator_id?: number;\n date_founded?: string;\n description: string;\n enlisted_faction_id?: number;\n friendly_fire: 'legal' | 'illegal';\n home_station_id: number;\n member_count: number;\n name: string;\n palette?: {\n main_color: string;\n secondary_color?: string;\n tertiary_color?: string;\n };\n shares: number;\n state: 'active' | 'closed';\n tax_rates: {\n isk: number;\n loyalty_point: number;\n };\n ticker: string;\n type: 'player_owned' | 'npc_owned';\n url?: string;\n war_eligible: boolean;\n}\n\n// --- Corporation Projects ---\n\nexport interface CorporationsProjectsContribution {\n contributed: number;\n last_modified?: string;\n}\n\nexport interface CorporationsProjectsContributors {\n contributors: ({\n contributed: number;\n id: number;\n name: string;\n })[];\n cursor?: {\n after?: string;\n before?: string;\n };\n}\n\nexport interface CorporationsProjectsDetail {\n configuration: unknown;\n contribution?: {\n participation_limit?: number;\n reward_per_contribution?: number;\n submission_limit?: number;\n submission_multiplier?: number;\n };\n creator: {\n id: number;\n name: string;\n };\n details: {\n career: 'Unspecified' | 'Explorer' | 'Industrialist' | 'Enforcer' | 'Soldier of Fortune';\n created: string;\n description: string;\n expires?: string;\n finished?: string;\n };\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n}\n\nexport interface CorporationsProjectsListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n projects: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\n// --- Cosmetics ---\n\nexport interface CharactersCosmeticsSkinr {\n licenses: ({\n activated: boolean;\n skinr_id: string;\n unactivated: number;\n })[];\n}\n\nexport interface CharactersCosmeticsSkinrComponents {\n licenses: ({\n component_id: number;\n runs: unknown;\n type: 'nanocoating' | 'pattern';\n })[];\n}\n\nexport interface CosmeticsSkinr {\n creator_id: number;\n id: string;\n layout: {\n pattern_blend_mode: 'normal' | 'subtract' | 'exclusion' | 'nested' | 'nested_inverted';\n slots: ({\n configuration: unknown;\n id: number;\n })[];\n };\n line?: string;\n name: string;\n ship_type_id: number;\n tier: {\n level: number;\n };\n}\n\n// --- Dogma ---\n\nexport interface DogmaAttributesAttributeIdGet {\n attribute_id: number;\n default_value?: number;\n description?: string;\n display_name?: string;\n high_is_good?: boolean;\n icon_id?: number;\n name?: string;\n published?: boolean;\n stackable?: boolean;\n unit_id?: number;\n}\n\nexport interface DogmaDynamicItemsTypeIdItemIdGet {\n created_by: number;\n dogma_attributes: ({\n attribute_id: number;\n value: number;\n })[];\n dogma_effects: ({\n effect_id: number;\n is_default: boolean;\n })[];\n mutator_type_id: number;\n source_type_id: number;\n}\n\nexport interface DogmaEffectsEffectIdGet {\n description?: string;\n disallow_auto_repeat?: boolean;\n discharge_attribute_id?: number;\n display_name?: string;\n duration_attribute_id?: number;\n effect_category?: number;\n effect_id: number;\n electronic_chance?: boolean;\n falloff_attribute_id?: number;\n icon_id?: number;\n is_assistance?: boolean;\n is_offensive?: boolean;\n is_warp_safe?: boolean;\n modifiers?: ({\n domain?: string;\n effect_id?: number;\n func: string;\n modified_attribute_id?: number;\n modifying_attribute_id?: number;\n operator?: number;\n })[];\n name?: string;\n post_expression?: number;\n pre_expression?: number;\n published?: boolean;\n range_attribute_id?: number;\n range_chance?: boolean;\n tracking_speed_attribute_id?: number;\n}\n\n// --- Faction Warfare ---\n\nexport interface CharactersCharacterIdFwStatsGet {\n current_rank?: number;\n enlisted_on?: string;\n faction_id?: number;\n highest_rank?: number;\n kills: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n victory_points: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n}\n\nexport interface CorporationsCorporationIdFwStatsGet {\n enlisted_on?: string;\n faction_id?: number;\n kills: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n pilots?: number;\n victory_points: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n}\n\nexport interface FwLeaderboardsCharactersGet {\n kills: {\n active_total: ({\n amount?: number;\n character_id?: number;\n })[];\n last_week: ({\n amount?: number;\n character_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n character_id?: number;\n })[];\n };\n victory_points: {\n active_total: ({\n amount?: number;\n character_id?: number;\n })[];\n last_week: ({\n amount?: number;\n character_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n character_id?: number;\n })[];\n };\n}\n\nexport interface FwLeaderboardsCorporationsGet {\n kills: {\n active_total: ({\n amount?: number;\n corporation_id?: number;\n })[];\n last_week: ({\n amount?: number;\n corporation_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n corporation_id?: number;\n })[];\n };\n victory_points: {\n active_total: ({\n amount?: number;\n corporation_id?: number;\n })[];\n last_week: ({\n amount?: number;\n corporation_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n corporation_id?: number;\n })[];\n };\n}\n\nexport interface FwLeaderboardsGet {\n kills: {\n active_total: ({\n amount?: number;\n faction_id?: number;\n })[];\n last_week: ({\n amount?: number;\n faction_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n faction_id?: number;\n })[];\n };\n victory_points: {\n active_total: ({\n amount?: number;\n faction_id?: number;\n })[];\n last_week: ({\n amount?: number;\n faction_id?: number;\n })[];\n yesterday: ({\n amount?: number;\n faction_id?: number;\n })[];\n };\n}\n\nexport interface FwStatsGet {\n faction_id: number;\n kills: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n pilots: number;\n systems_controlled: number;\n victory_points: {\n last_week: number;\n total: number;\n yesterday: number;\n };\n}\n\nexport interface FwSystemsGet {\n contested: 'captured' | 'contested' | 'uncontested' | 'vulnerable';\n occupier_faction_id: number;\n owner_faction_id: number;\n solar_system_id: number;\n victory_points: number;\n victory_points_threshold: number;\n}\n\nexport interface FwWarsGet {\n against_id: number;\n faction_id: number;\n}\n\n// --- Fittings ---\n\nexport interface CharactersCharacterIdFittingsGet {\n description: string;\n fitting_id: number;\n items: ({\n flag: 'Cargo' | 'DroneBay' | 'FighterBay' | 'HiSlot0' | 'HiSlot1' | 'HiSlot2' | 'HiSlot3' | 'HiSlot4' | 'HiSlot5' | 'HiSlot6' | 'HiSlot7' | 'Invalid' | 'LoSlot0' | 'LoSlot1' | 'LoSlot2' | 'LoSlot3' | 'LoSlot4' | 'LoSlot5' | 'LoSlot6' | 'LoSlot7' | 'MedSlot0' | 'MedSlot1' | 'MedSlot2' | 'MedSlot3' | 'MedSlot4' | 'MedSlot5' | 'MedSlot6' | 'MedSlot7' | 'RigSlot0' | 'RigSlot1' | 'RigSlot2' | 'ServiceSlot0' | 'ServiceSlot1' | 'ServiceSlot2' | 'ServiceSlot3' | 'ServiceSlot4' | 'ServiceSlot5' | 'ServiceSlot6' | 'ServiceSlot7' | 'SubSystemSlot0' | 'SubSystemSlot1' | 'SubSystemSlot2' | 'SubSystemSlot3';\n quantity: number;\n type_id: number;\n })[];\n name: string;\n ship_type_id: number;\n}\n\n// --- Fleets ---\n\nexport interface CharactersCharacterIdFleetGet {\n fleet_boss_id: number;\n fleet_id: number;\n role: 'fleet_commander' | 'squad_commander' | 'squad_member' | 'wing_commander';\n squad_id: number;\n wing_id: number;\n}\n\nexport interface FleetsFleetIdGet {\n is_free_move: boolean;\n is_registered: boolean;\n is_voice_enabled: boolean;\n motd: string;\n}\n\nexport interface FleetsFleetIdMembersGet {\n character_id: number;\n join_time: string;\n role: 'fleet_commander' | 'wing_commander' | 'squad_commander' | 'squad_member';\n role_name: string;\n ship_type_id: number;\n solar_system_id: number;\n squad_id: number;\n station_id?: number;\n takes_fleet_warp: boolean;\n wing_id: number;\n}\n\nexport interface FleetsFleetIdWingsGet {\n id: number;\n name: string;\n squads: ({\n id: number;\n name: string;\n })[];\n}\n\n// --- Freelance Jobs ---\n\nexport interface CharactersFreelanceJobsListing {\n freelance_jobs: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\nexport interface CharactersFreelanceJobsParticipation {\n contributed: number;\n last_modified: string;\n state: 'Unspecified' | 'Committed' | 'Kicked' | 'Resigned';\n}\n\nexport interface CorporationsFreelanceJobsListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n freelance_jobs: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\nexport interface CorporationsFreelanceJobsParticipants {\n cursor?: {\n after?: string;\n before?: string;\n };\n participants: ({\n contributed: number;\n id: number;\n name: string;\n state: 'Unspecified' | 'Committed' | 'Kicked' | 'Resigned';\n })[];\n}\n\nexport interface FreelanceJobsDetail {\n access_and_visibility: {\n acl_protected: boolean;\n broadcast_locations?: ({\n id: number;\n name: string;\n })[];\n restrictions?: {\n maximum_age?: number;\n minimum_age?: number;\n };\n };\n configuration: {\n method: string;\n parameters: Record<string, unknown>;\n version: number;\n };\n contribution?: {\n contribution_per_participant_limit?: number;\n max_committed_participants: number;\n reward_per_contribution?: number;\n submission_limit?: number;\n submission_multiplier?: number;\n };\n details: {\n career: 'Unspecified' | 'Explorer' | 'Industrialist' | 'Enforcer' | 'Soldier of Fortune';\n created: string;\n creator: {\n character: {\n id: number;\n name: string;\n };\n corporation: {\n id: number;\n name: string;\n };\n };\n description: string;\n expires?: string;\n finished?: string;\n };\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n}\n\nexport interface FreelanceJobsListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n freelance_jobs: ({\n id: string;\n last_modified: string;\n name: string;\n progress: {\n current: number;\n desired: number;\n };\n reward?: {\n initial: number;\n remaining: number;\n };\n state: 'Unspecified' | 'Active' | 'Closed' | 'Completed' | 'Expired' | 'Deleted';\n })[];\n}\n\n// --- Incursions ---\n\nexport interface IncursionsGet {\n constellation_id: number;\n faction_id: number;\n has_boss: boolean;\n infested_solar_systems: number[];\n influence: number;\n staging_solar_system_id: number;\n state: 'withdrawing' | 'mobilizing' | 'established';\n type: string;\n}\n\n// --- Industry ---\n\nexport interface CharactersCharacterIdIndustryJobsGet {\n activity_id: number;\n blueprint_id: number;\n blueprint_location_id: number;\n blueprint_type_id: number;\n completed_character_id?: number;\n completed_date?: string;\n cost?: number;\n duration: number;\n end_date: string;\n facility_id: number;\n installer_id: number;\n job_id: number;\n licensed_runs?: number;\n output_location_id: number;\n pause_date?: string;\n probability?: number;\n product_type_id?: number;\n runs: number;\n start_date: string;\n station_id: number;\n status: 'active' | 'cancelled' | 'delivered' | 'paused' | 'ready' | 'reverted';\n successful_runs?: number;\n}\n\nexport interface CharactersCharacterIdMiningGet {\n date: string;\n quantity: number;\n solar_system_id: number;\n type_id: number;\n}\n\nexport interface CorporationCorporationIdMiningExtractionsGet {\n chunk_arrival_time: string;\n extraction_start_time: string;\n moon_id: number;\n natural_decay_time: string;\n structure_id: number;\n}\n\nexport interface CorporationCorporationIdMiningObserversGet {\n last_updated: string;\n observer_id: number;\n observer_type: 'structure';\n}\n\nexport interface CorporationCorporationIdMiningObserversObserverIdGet {\n character_id: number;\n last_updated: string;\n quantity: number;\n recorded_corporation_id: number;\n type_id: number;\n}\n\nexport interface CorporationsCorporationIdIndustryJobsGet {\n activity_id: number;\n blueprint_id: number;\n blueprint_location_id: number;\n blueprint_type_id: number;\n completed_character_id?: number;\n completed_date?: string;\n cost?: number;\n duration: number;\n end_date: string;\n facility_id: number;\n installer_id: number;\n job_id: number;\n licensed_runs?: number;\n location_id: number;\n output_location_id: number;\n pause_date?: string;\n probability?: number;\n product_type_id?: number;\n runs: number;\n start_date: string;\n status: 'active' | 'cancelled' | 'delivered' | 'paused' | 'ready' | 'reverted';\n successful_runs?: number;\n}\n\nexport interface IndustryFacilitiesGet {\n facility_id: number;\n owner_id: number;\n region_id: number;\n solar_system_id: number;\n tax?: number;\n type_id: number;\n}\n\nexport interface IndustrySystemsGet {\n cost_indices: ({\n activity: 'copying' | 'duplicating' | 'invention' | 'manufacturing' | 'none' | 'reaction' | 'researching_material_efficiency' | 'researching_technology' | 'researching_time_efficiency' | 'reverse_engineering';\n cost_index: number;\n })[];\n solar_system_id: number;\n}\n\n// --- Insurance ---\n\nexport interface InsurancePricesGet {\n levels: ({\n cost: number;\n name: string;\n payout: number;\n })[];\n type_id: number;\n}\n\n// --- Killmails ---\n\nexport interface CharactersCharacterIdKillmailsRecentGet {\n killmail_hash: string;\n killmail_id: number;\n}\n\nexport interface CorporationsCorporationIdKillmailsRecentGet {\n killmail_hash: string;\n killmail_id: number;\n}\n\nexport interface KillmailsKillmailIdKillmailHashGet {\n attackers: ({\n alliance_id?: number;\n character_id?: number;\n corporation_id?: number;\n damage_done: number;\n faction_id?: number;\n final_blow: boolean;\n security_status: number;\n ship_type_id?: number;\n weapon_type_id?: number;\n })[];\n killmail_id: number;\n killmail_time: string;\n moon_id?: number;\n solar_system_id: number;\n victim: {\n alliance_id?: number;\n character_id?: number;\n corporation_id?: number;\n damage_taken: number;\n faction_id?: number;\n items?: ({\n flag: number;\n item_type_id: number;\n items?: ({\n flag: number;\n item_type_id: number;\n quantity_destroyed?: number;\n quantity_dropped?: number;\n singleton: number;\n })[];\n quantity_destroyed?: number;\n quantity_dropped?: number;\n singleton: number;\n })[];\n position?: {\n x: number;\n y: number;\n z: number;\n };\n ship_type_id: number;\n };\n war_id?: number;\n}\n\n// --- Location ---\n\nexport interface CharactersLocation {\n solar_system_id: number;\n station_id?: number;\n structure_id?: number;\n}\n\nexport interface CharactersOnline {\n last_login?: string;\n last_logout?: string;\n logins?: number;\n online: boolean;\n}\n\nexport interface CharactersShip {\n ship_item_id: number;\n ship_name: string;\n ship_type_id: number;\n}\n\n// --- Loyalty ---\n\nexport interface CharactersCharacterIdLoyaltyPointsGet {\n corporation_id: number;\n loyalty_points: number;\n}\n\nexport interface LoyaltyStoresCorporationIdOffersGet {\n ak_cost?: number;\n isk_cost: number;\n lp_cost: number;\n offer_id: number;\n quantity: number;\n required_items: ({\n quantity: number;\n type_id: number;\n })[];\n type_id: number;\n}\n\n// --- Mail ---\n\nexport interface CharactersCharacterIdMailGet {\n from?: number;\n is_read?: boolean;\n labels?: number[];\n mail_id?: number;\n recipients?: ({\n recipient_id: number;\n recipient_type: 'alliance' | 'character' | 'corporation' | 'mailing_list';\n })[];\n subject?: string;\n timestamp?: string;\n}\n\nexport interface CharactersCharacterIdMailLabelsGet {\n labels?: ({\n color?: '#0000fe' | '#006634' | '#0099ff' | '#00ff33' | '#01ffff' | '#349800' | '#660066' | '#666666' | '#999999' | '#99ffff' | '#9a0000' | '#ccff9a' | '#e6e6e6' | '#fe0000' | '#ff6600' | '#ffff01' | '#ffffcd' | '#ffffff';\n label_id?: number;\n name?: string;\n unread_count?: number;\n })[];\n total_unread_count?: number;\n}\n\nexport interface CharactersCharacterIdMailListsGet {\n mailing_list_id: number;\n name: string;\n}\n\nexport interface CharactersCharacterIdMailMailIdGet {\n body?: string;\n from?: number;\n labels?: number[];\n read?: boolean;\n recipients?: ({\n recipient_id: number;\n recipient_type: 'alliance' | 'character' | 'corporation' | 'mailing_list';\n })[];\n subject?: string;\n timestamp?: string;\n}\n\n// --- Market ---\n\nexport interface CharactersCharacterIdOrdersGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n is_corporation: boolean;\n issued: string;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\nexport interface CharactersCharacterIdOrdersHistoryGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n is_corporation: boolean;\n issued: string;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n state: 'cancelled' | 'expired';\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\nexport interface CorporationsCorporationIdOrdersGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n issued: string;\n issued_by: number;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n type_id: number;\n volume_remain: number;\n volume_total: number;\n wallet_division: number;\n}\n\nexport interface CorporationsCorporationIdOrdersHistoryGet {\n duration: number;\n escrow?: number;\n is_buy_order?: boolean;\n issued: string;\n issued_by?: number;\n location_id: number;\n min_volume?: number;\n order_id: number;\n price: number;\n range: '1' | '10' | '2' | '20' | '3' | '30' | '4' | '40' | '5' | 'region' | 'solarsystem' | 'station';\n region_id: number;\n state: 'cancelled' | 'expired';\n type_id: number;\n volume_remain: number;\n volume_total: number;\n wallet_division: number;\n}\n\nexport interface MarketsGroupsMarketGroupIdGet {\n description: string;\n market_group_id: number;\n name: string;\n parent_group_id?: number;\n types: number[];\n}\n\nexport interface MarketsPricesGet {\n adjusted_price?: number;\n average_price?: number;\n type_id: number;\n}\n\nexport interface MarketsRegionIdHistoryGet {\n average: number;\n date: string;\n highest: number;\n lowest: number;\n order_count: number;\n volume: number;\n}\n\nexport interface MarketsRegionIdOrdersGet {\n duration: number;\n is_buy_order: boolean;\n issued: string;\n location_id: number;\n min_volume: number;\n order_id: number;\n price: number;\n range: 'station' | 'region' | 'solarsystem' | '1' | '2' | '3' | '4' | '5' | '10' | '20' | '30' | '40';\n system_id: number;\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\nexport interface MarketsStructuresStructureIdGet {\n duration: number;\n is_buy_order: boolean;\n issued: string;\n location_id: number;\n min_volume: number;\n order_id: number;\n price: number;\n range: 'station' | 'region' | 'solarsystem' | '1' | '2' | '3' | '4' | '5' | '10' | '20' | '30' | '40';\n type_id: number;\n volume_remain: number;\n volume_total: number;\n}\n\n// --- Meta ---\n\nexport interface MetaChangelog {\n changelog: Record<string, unknown>;\n}\n\nexport interface MetaCompatibilityDates {\n compatibility_dates: string[];\n}\n\nexport interface MetaName {\n current: string;\n history: ({\n date: string;\n name: string;\n })[];\n}\n\nexport interface MetaStatus {\n routes: ({\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n status: 'Unknown' | 'OK' | 'Degraded' | 'Down' | 'Recovering';\n })[];\n}\n\n// --- Military Campaigns ---\n\nexport interface CharactersMilitaryCampaignsObjectivesListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n objectives: ({\n campaign_id: string;\n contributed: number;\n id: string;\n is_committed: boolean;\n last_modified: string;\n })[];\n}\n\nexport interface CharactersMilitaryCampaignsObjectivesParticipation {\n campaign_id: string;\n contributed: number;\n id: string;\n is_committed: boolean;\n last_modified: string;\n}\n\nexport interface MilitaryCampaignsDetail {\n finished?: string;\n id: string;\n progress: number;\n started?: string;\n state: 'Unspecified' | 'Active' | 'Completed' | 'Expired';\n}\n\nexport interface MilitaryCampaignsListing {\n campaigns: ({\n finished?: string;\n id: string;\n progress: number;\n started?: string;\n state: 'Unspecified' | 'Active' | 'Completed' | 'Expired';\n })[];\n}\n\nexport interface MilitaryCampaignsObjectivesDetail {\n finished?: string;\n id: string;\n last_modified: string;\n participants: {\n committed: number;\n contributors: number;\n total: number;\n };\n progress: number;\n started?: string;\n state: 'Unspecified' | 'Active' | 'Completed' | 'Expired';\n}\n\nexport interface MilitaryCampaignsObjectivesListing {\n cursor?: {\n after?: string;\n before?: string;\n };\n objectives: ({\n finished?: string;\n id: string;\n last_modified: string;\n participants: {\n committed: number;\n contributors: number;\n total: number;\n };\n progress: number;\n started?: string;\n state: 'Unspecified' | 'Active' | 'Completed' | 'Expired';\n })[];\n}\n\n// --- Paragon Hub ---\n\nexport interface CharactersParagonHubSkinr {\n cursor?: {\n after?: string;\n before?: string;\n };\n listings: ({\n created: string;\n expires: string;\n id: string;\n last_modified: string;\n price: unknown;\n quantity: number;\n seller_id: number;\n skinr_id: string;\n state: 'listed' | 'sold_out' | 'expired' | 'removed';\n target: unknown;\n })[];\n}\n\nexport interface ParagonHubSkinr {\n cursor?: {\n after?: string;\n before?: string;\n };\n listings: ({\n created: string;\n expires: string;\n id: string;\n last_modified: string;\n price: unknown;\n quantity: number;\n seller_id: number;\n skinr_id: string;\n state: 'listed' | 'sold_out' | 'expired' | 'removed';\n })[];\n}\n\nexport interface ParagonHubSkinrAlliances {\n cursor?: {\n after?: string;\n before?: string;\n };\n listings: ({\n created: string;\n expires: string;\n id: string;\n last_modified: string;\n price: unknown;\n quantity: number;\n seller_id: number;\n skinr_id: string;\n state: 'listed' | 'sold_out' | 'expired' | 'removed';\n })[];\n}\n\nexport interface ParagonHubSkinrCharacters {\n cursor?: {\n after?: string;\n before?: string;\n };\n listings: ({\n created: string;\n expires: string;\n id: string;\n last_modified: string;\n price: unknown;\n quantity: number;\n seller_id: number;\n skinr_id: string;\n state: 'listed' | 'sold_out' | 'expired' | 'removed';\n })[];\n}\n\nexport interface ParagonHubSkinrCorporations {\n cursor?: {\n after?: string;\n before?: string;\n };\n listings: ({\n created: string;\n expires: string;\n id: string;\n last_modified: string;\n price: unknown;\n quantity: number;\n seller_id: number;\n skinr_id: string;\n state: 'listed' | 'sold_out' | 'expired' | 'removed';\n })[];\n}\n\n// --- Planetary Interaction ---\n\nexport interface CharactersCharacterIdPlanetsGet {\n last_update: string;\n num_pins: number;\n owner_id: number;\n planet_id: number;\n planet_type: 'temperate' | 'barren' | 'oceanic' | 'ice' | 'gas' | 'lava' | 'storm' | 'plasma';\n solar_system_id: number;\n upgrade_level: number;\n}\n\nexport interface CharactersCharacterIdPlanetsPlanetIdGet {\n links: ({\n destination_pin_id: number;\n link_level: number;\n source_pin_id: number;\n })[];\n pins: ({\n contents?: ({\n amount: number;\n type_id: number;\n })[];\n expiry_time?: string;\n extractor_details?: {\n cycle_time?: number;\n head_radius?: number;\n heads: ({\n head_id: number;\n latitude: number;\n longitude: number;\n })[];\n product_type_id?: number;\n qty_per_cycle?: number;\n };\n factory_details?: {\n schematic_id: number;\n };\n install_time?: string;\n last_cycle_start?: string;\n latitude: number;\n longitude: number;\n pin_id: number;\n schematic_id?: number;\n type_id: number;\n })[];\n routes: ({\n content_type_id: number;\n destination_pin_id: number;\n quantity: number;\n route_id: number;\n source_pin_id: number;\n waypoints?: number[];\n })[];\n}\n\nexport interface CorporationsCorporationIdCustomsOfficesGet {\n alliance_tax_rate?: number;\n allow_access_with_standings: boolean;\n allow_alliance_access: boolean;\n bad_standing_tax_rate?: number;\n corporation_tax_rate?: number;\n excellent_standing_tax_rate?: number;\n good_standing_tax_rate?: number;\n neutral_standing_tax_rate?: number;\n office_id: number;\n reinforce_exit_end: number;\n reinforce_exit_start: number;\n standing_level?: 'bad' | 'excellent' | 'good' | 'neutral' | 'terrible';\n system_id: number;\n terrible_standing_tax_rate?: number;\n type_id?: number;\n}\n\nexport interface UniverseSchematicsSchematicIdGet {\n cycle_time: number;\n schematic_name: string;\n}\n\n// --- Routes ---\n\nexport interface Route {\n route: number[];\n}\n\n// --- Search ---\n\nexport interface CharactersCharacterIdSearchGet {\n agent?: number[];\n alliance?: number[];\n character?: number[];\n constellation?: number[];\n corporation?: number[];\n faction?: number[];\n inventory_type?: number[];\n region?: number[];\n solar_system?: number[];\n station?: number[];\n structure?: number[];\n}\n\n// --- Skills ---\n\nexport interface CharactersCharacterIdAttributesGet {\n accrued_remap_cooldown_date?: string;\n bonus_remaps?: number;\n charisma: number;\n intelligence: number;\n last_remap_date?: string;\n memory: number;\n perception: number;\n willpower: number;\n}\n\nexport interface CharactersSkillqueueSkill {\n finish_date?: string;\n finished_level: number;\n level_end_sp?: number;\n level_start_sp?: number;\n queue_position: number;\n skill_id: number;\n start_date?: string;\n training_start_sp?: number;\n}\n\nexport interface CharactersSkills {\n skills: ({\n active_skill_level: number;\n skill_id: number;\n skillpoints_in_skill: number;\n trained_skill_level: number;\n })[];\n total_sp: number;\n unallocated_sp?: number;\n}\n\n// --- Sovereignty ---\n\nexport interface SovereigntyCampaignsGet {\n attackers_score?: number;\n campaign_id: number;\n constellation_id: number;\n defender_id?: number;\n defender_score?: number;\n event_type: 'tcu_defense' | 'ihub_defense' | 'station_defense' | 'station_freeport';\n participants?: ({\n alliance_id: number;\n score: number;\n })[];\n solar_system_id: number;\n start_time: string;\n structure_id: number;\n}\n\nexport interface SovereigntySystems {\n solar_systems: ({\n claim: unknown;\n solar_system_id: number;\n })[];\n}\n\n// --- Status ---\n\nexport interface Status {\n players: number;\n server_version: string;\n start_time: string;\n vip: boolean;\n}\n\n// --- Structures ---\n\nexport interface CharactersStructuresMercenaryDensDetail {\n evolution: {\n anarchy: {\n amount: number;\n level: 'Unspecified' | 'Level0' | 'Level1' | 'Level2' | 'Level3' | 'Level4';\n };\n development: {\n amount: number;\n level: 'Unspecified' | 'Level0' | 'Level1' | 'Level2' | 'Level3' | 'Level4';\n };\n };\n id: number;\n infomorphs: {\n amount: number;\n };\n reinforcement_timer?: {\n end: string;\n };\n skyhook: {\n corporation_id: number;\n id: number;\n planet_id: number;\n };\n state: 'Unspecified' | 'Running' | 'Paused' | 'Disabled';\n type_id: number;\n}\n\nexport interface CharactersStructuresMercenaryDensListing {\n mercenary_dens: ({\n id: number;\n planet_id: number;\n })[];\n}\n\nexport interface CorporationsStructuresSkyhooksDetail {\n effective_workforce?: number;\n id: number;\n is_active: boolean;\n planet_id: number;\n reagents?: ({\n last_cycle: string;\n secured_stock: number;\n type_id: number;\n unsecured_stock: number;\n })[];\n reinforcement_timer?: {\n end: string;\n };\n state: 'Unspecified' | 'ShieldVulnerable' | 'ArmorReinforced' | 'ArmorVulnerable' | 'HullReinforced' | 'HullVulnerable';\n theft_vulnerability?: {\n end: string;\n start: string;\n };\n}\n\nexport interface CorporationsStructuresSkyhooksListing {\n skyhooks: ({\n id: number;\n planet_id: number;\n })[];\n}\n\nexport interface CorporationsStructuresSovereigntyHubsDetail {\n fuel_access_list_id?: number;\n id: number;\n reagent_bay: {\n last_updated: string;\n reagents: ({\n amount: number;\n burning_per_hour: number;\n type_id: number;\n })[];\n };\n resources: {\n power: {\n allocated: number;\n available: number;\n };\n workforce: {\n allocated: number;\n available: number;\n };\n };\n solar_system_id: number;\n upgrades: ({\n power_state: 'Unspecified' | 'Online' | 'Offline' | 'Low' | 'Pending';\n type_id: number;\n })[];\n vulnerability_window?: {\n end: string;\n start: string;\n };\n workforce_transport: {\n configuration: unknown;\n state: unknown;\n };\n}\n\nexport interface CorporationsStructuresSovereigntyHubsListing {\n sovereignty_hubs: ({\n id: number;\n solar_system_id: number;\n })[];\n}\n\n// --- Universe ---\n\nexport interface UniverseAncestriesGet {\n bloodline_id: number;\n description: string;\n icon_id?: number;\n id: number;\n name: string;\n short_description?: string;\n}\n\nexport interface UniverseAsteroidBeltsAsteroidBeltIdGet {\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n system_id: number;\n}\n\nexport interface UniverseBloodlinesGet {\n bloodline_id: number;\n charisma: number;\n corporation_id: number;\n description: string;\n intelligence: number;\n memory: number;\n name: string;\n perception: number;\n race_id: number;\n ship_type_id: number;\n willpower: number;\n}\n\nexport interface UniverseCategoriesCategoryIdGet {\n category_id: number;\n groups: number[];\n name: string;\n published: boolean;\n}\n\nexport interface UniverseConstellationsConstellationIdGet {\n constellation_id: number;\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n region_id: number;\n systems: number[];\n}\n\nexport interface UniverseFactionsGet {\n corporation_id?: number;\n description: string;\n faction_id: number;\n is_unique: boolean;\n militia_corporation_id?: number;\n name: string;\n size_factor: number;\n solar_system_id?: number;\n station_count: number;\n station_system_count: number;\n}\n\nexport interface UniverseGraphicsGraphicIdGet {\n collision_file?: string;\n graphic_file?: string;\n graphic_id: number;\n icon_folder?: string;\n sof_dna?: string;\n sof_fation_name?: string;\n sof_hull_name?: string;\n sof_race_name?: string;\n}\n\nexport interface UniverseGroupsGroupIdGet {\n category_id: number;\n group_id: number;\n name: string;\n published: boolean;\n types: number[];\n}\n\nexport interface UniverseIdsPost {\n agents?: ({\n id?: number;\n name?: string;\n })[];\n alliances?: ({\n id?: number;\n name?: string;\n })[];\n characters?: ({\n id?: number;\n name?: string;\n })[];\n constellations?: ({\n id?: number;\n name?: string;\n })[];\n corporations?: ({\n id?: number;\n name?: string;\n })[];\n factions?: ({\n id?: number;\n name?: string;\n })[];\n inventory_types?: ({\n id?: number;\n name?: string;\n })[];\n regions?: ({\n id?: number;\n name?: string;\n })[];\n stations?: ({\n id?: number;\n name?: string;\n })[];\n systems?: ({\n id?: number;\n name?: string;\n })[];\n}\n\nexport interface UniverseMoonsMoonIdGet {\n moon_id: number;\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n system_id: number;\n}\n\nexport interface UniverseNamesPost {\n category: 'alliance' | 'character' | 'constellation' | 'corporation' | 'inventory_type' | 'region' | 'solar_system' | 'station' | 'faction';\n id: number;\n name: string;\n}\n\nexport interface UniversePlanetsPlanetIdGet {\n name: string;\n planet_id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n system_id: number;\n type_id: number;\n}\n\nexport interface UniverseRacesGet {\n alliance_id: number;\n description: string;\n name: string;\n race_id: number;\n}\n\nexport interface UniverseRegionsRegionIdGet {\n constellations: number[];\n description?: string;\n name: string;\n region_id: number;\n}\n\nexport interface UniverseStargatesStargateIdGet {\n destination: {\n stargate_id: number;\n system_id: number;\n };\n name: string;\n position: {\n x: number;\n y: number;\n z: number;\n };\n stargate_id: number;\n system_id: number;\n type_id: number;\n}\n\nexport interface UniverseStarsStarIdGet {\n age: number;\n luminosity: number;\n name: string;\n radius: number;\n solar_system_id: number;\n spectral_class: 'K2 V' | 'K4 V' | 'G2 V' | 'G8 V' | 'M7 V' | 'K7 V' | 'M2 V' | 'K5 V' | 'M3 V' | 'G0 V' | 'G7 V' | 'G3 V' | 'F9 V' | 'G5 V' | 'F6 V' | 'K8 V' | 'K9 V' | 'K6 V' | 'G9 V' | 'G6 V' | 'G4 VI' | 'G4 V' | 'F8 V' | 'F2 V' | 'F1 V' | 'K3 V' | 'F0 VI' | 'G1 VI' | 'G0 VI' | 'K1 V' | 'M4 V' | 'M1 V' | 'M6 V' | 'M0 V' | 'K2 IV' | 'G2 VI' | 'K0 V' | 'K5 IV' | 'F5 VI' | 'G6 VI' | 'F6 VI' | 'F2 IV' | 'G3 VI' | 'M8 V' | 'F1 VI' | 'K1 IV' | 'F7 V' | 'G5 VI' | 'M5 V' | 'G7 VI' | 'F5 V' | 'F4 VI' | 'F8 VI' | 'K3 IV' | 'F4 IV' | 'F0 V' | 'G7 IV' | 'G8 VI' | 'F2 VI' | 'F4 V' | 'F7 VI' | 'F3 V' | 'G1 V' | 'G9 VI' | 'F3 IV' | 'F9 VI' | 'M9 V' | 'K0 IV' | 'F1 IV' | 'G4 IV' | 'F3 VI' | 'K4 IV' | 'G5 IV' | 'G3 IV' | 'G1 IV' | 'K7 IV' | 'G0 IV' | 'K6 IV' | 'K9 IV' | 'G2 IV' | 'F9 IV' | 'F0 IV' | 'K8 IV' | 'G8 IV' | 'F6 IV' | 'F5 IV' | 'A0' | 'A0IV' | 'A0IV2';\n temperature: number;\n type_id: number;\n}\n\nexport interface UniverseStationsStationIdGet {\n max_dockable_ship_volume: number;\n name: string;\n office_rental_cost: number;\n owner?: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n race_id?: number;\n reprocessing_efficiency: number;\n reprocessing_stations_take: number;\n services: 'bounty-missions' | 'assasination-missions' | 'courier-missions' | 'interbus' | 'reprocessing-plant' | 'refinery' | 'market' | 'black-market' | 'stock-exchange' | 'cloning' | 'surgery' | 'dna-therapy' | 'repair-facilities' | 'factory' | 'labratory' | 'gambling' | 'fitting' | 'paintshop' | 'news' | 'storage' | 'insurance' | 'docking' | 'office-rental' | 'jump-clone-facility' | 'loyalty-point-store' | 'navy-offices' | 'security-offices'[];\n station_id: number;\n system_id: number;\n type_id: number;\n}\n\nexport interface UniverseStructuresStructureIdGet {\n name: string;\n owner_id: number;\n position?: {\n x: number;\n y: number;\n z: number;\n };\n solar_system_id: number;\n type_id?: number;\n}\n\nexport interface UniverseSystemJumpsGet {\n ship_jumps: number;\n system_id: number;\n}\n\nexport interface UniverseSystemKillsGet {\n npc_kills: number;\n pod_kills: number;\n ship_kills: number;\n system_id: number;\n}\n\nexport interface UniverseSystemsSystemIdGet {\n constellation_id: number;\n name: string;\n planets?: ({\n asteroid_belts?: number[];\n moons?: number[];\n planet_id: number;\n })[];\n position: {\n x: number;\n y: number;\n z: number;\n };\n security_class?: string;\n security_status: number;\n star_id?: number;\n stargates?: number[];\n stations?: number[];\n system_id: number;\n}\n\nexport interface UniverseTypesTypeIdGet {\n capacity?: number;\n description: string;\n dogma_attributes?: ({\n attribute_id: number;\n value: number;\n })[];\n dogma_effects?: ({\n effect_id: number;\n is_default: boolean;\n })[];\n graphic_id?: number;\n group_id: number;\n icon_id?: number;\n market_group_id?: number;\n mass?: number;\n name: string;\n packaged_volume?: number;\n portion_size?: number;\n published: boolean;\n radius?: number;\n type_id: number;\n volume?: number;\n}\n\n// --- Wallet ---\n\nexport interface CharactersCharacterIdWalletJournalGet {\n amount?: number;\n balance?: number;\n context_id?: number;\n context_id_type?: 'structure_id' | 'station_id' | 'market_transaction_id' | 'character_id' | 'corporation_id' | 'alliance_id' | 'eve_system' | 'industry_job_id' | 'contract_id' | 'planet_id' | 'system_id' | 'type_id';\n date: string;\n description: string;\n first_party_id?: number;\n id: number;\n reason?: string;\n ref_type: 'acceleration_gate_fee' | 'achievement_category_milestone_reward' | 'achievement_milestone_reward' | 'advertisement_listing_fee' | 'agent_donation' | 'agent_location_services' | 'agent_miscellaneous' | 'agent_mission_collateral_paid' | 'agent_mission_collateral_refunded' | 'agent_mission_reward' | 'agent_mission_reward_corporation_tax' | 'agent_mission_security_tax' | 'agent_mission_time_bonus_reward' | 'agent_mission_time_bonus_reward_corporation_tax' | 'agent_security_services' | 'agent_services_rendered' | 'agents_preward' | 'air_career_program_reward' | 'alliance_maintainance_fee' | 'alliance_registration_fee' | 'allignment_based_gate_toll' | 'asset_safety_recovery_tax' | 'bounty' | 'bounty_prize' | 'bounty_prize_corporation_tax' | 'bounty_prizes' | 'bounty_reimbursement' | 'bounty_surcharge' | 'brokers_fee' | 'campaign_objective_isk_reward' | 'clone_activation' | 'clone_transfer' | 'contraband_fine' | 'contract_auction_bid' | 'contract_auction_bid_corp' | 'contract_auction_bid_refund' | 'contract_auction_sold' | 'contract_brokers_fee' | 'contract_brokers_fee_corp' | 'contract_collateral' | 'contract_collateral_deposited_corp' | 'contract_collateral_payout' | 'contract_collateral_refund' | 'contract_deposit' | 'contract_deposit_corp' | 'contract_deposit_refund' | 'contract_deposit_sales_tax' | 'contract_price' | 'contract_price_payment_corp' | 'contract_reversal' | 'contract_reward' | 'contract_reward_deposited' | 'contract_reward_deposited_corp' | 'contract_reward_refund' | 'contract_sales_tax' | 'copying' | 'corporate_reward_payout' | 'corporate_reward_tax' | 'corporation_account_withdrawal' | 'corporation_bulk_payment' | 'corporation_dividend_payment' | 'corporation_liquidation' | 'corporation_logo_change_cost' | 'corporation_payment' | 'corporation_registration_fee' | 'cosmetic_market_component_item_purchase' | 'cosmetic_market_skin_purchase' | 'cosmetic_market_skin_sale' | 'cosmetic_market_skin_sale_broker_fee' | 'cosmetic_market_skin_sale_tax' | 'cosmetic_market_skin_transaction' | 'courier_mission_escrow' | 'cspa' | 'cspaofflinerefund' | 'daily_challenge_reward' | 'daily_goal_payouts' | 'daily_goal_payouts_tax' | 'datacore_fee' | 'dna_modification_fee' | 'docking_fee' | 'duel_wager_escrow' | 'duel_wager_payment' | 'duel_wager_refund' | 'ess_escrow_transfer' | 'external_trade_delivery' | 'external_trade_freeze' | 'external_trade_thaw' | 'factory_slot_rental_fee' | 'flux_payout' | 'flux_tax' | 'flux_ticket_repayment' | 'flux_ticket_sale' | 'freelance_jobs_broadcasting_fee' | 'freelance_jobs_duration_fee' | 'freelance_jobs_escrow_refund' | 'freelance_jobs_reward' | 'freelance_jobs_reward_corporation_tax' | 'freelance_jobs_reward_escrow' | 'gm_cash_transfer' | 'gm_plex_fee_refund' | 'industry_job_tax' | 'industry_security_tax' | 'infrastructure_hub_maintenance' | 'inheritance' | 'insurance' | 'insurgency_corruption_contribution_reward' | 'insurgency_suppression_contribution_reward' | 'item_trader_payment' | 'jump_clone_activation_fee' | 'jump_clone_installation_fee' | 'kill_right_fee' | 'lp_store' | 'manufacturing' | 'market_escrow' | 'market_fine_paid' | 'market_provider_tax' | 'market_security_tax' | 'market_transaction' | 'medal_creation' | 'medal_issued' | 'milestone_reward_payment' | 'mission_completion' | 'mission_cost' | 'mission_expiration' | 'mission_reward' | 'npc_bounty_security_tax' | 'office_rental_fee' | 'operation_bonus' | 'opportunity_reward' | 'planetary_construction' | 'planetary_export_tax' | 'planetary_import_tax' | 'player_donation' | 'player_trading' | 'project_discovery_reward' | 'project_discovery_tax' | 'project_payouts' | 'reaction' | 'redeemed_isk_token' | 'release_of_impounded_property' | 'repair_bill' | 'reprocessing_tax' | 'researching_material_productivity' | 'researching_technology' | 'researching_time_productivity' | 'resource_wars_reward' | 'reverse_engineering' | 'season_challenge_reward' | 'security_processing_fee' | 'shares' | 'skill_purchase' | 'skyhook_claim_fee' | 'sovereignity_bill' | 'store_purchase' | 'store_purchase_refund' | 'structure_gate_jump' | 'transaction_tax' | 'under_construction' | 'upkeep_adjustment_fee' | 'war_ally_contract' | 'war_fee' | 'war_fee_surrender';\n second_party_id?: number;\n tax?: number;\n tax_receiver_id?: number;\n}\n\nexport interface CharactersCharacterIdWalletTransactionsGet {\n client_id: number;\n date: string;\n is_buy: boolean;\n is_personal: boolean;\n journal_ref_id: number;\n location_id: number;\n quantity: number;\n transaction_id: number;\n type_id: number;\n unit_price: number;\n}\n\nexport interface CorporationsCorporationIdWalletsDivisionJournalGet {\n amount?: number;\n balance?: number;\n context_id?: number;\n context_id_type?: 'structure_id' | 'station_id' | 'market_transaction_id' | 'character_id' | 'corporation_id' | 'alliance_id' | 'eve_system' | 'industry_job_id' | 'contract_id' | 'planet_id' | 'system_id' | 'type_id';\n date: string;\n description: string;\n first_party_id?: number;\n id: number;\n reason?: string;\n ref_type: 'acceleration_gate_fee' | 'achievement_category_milestone_reward' | 'achievement_milestone_reward' | 'advertisement_listing_fee' | 'agent_donation' | 'agent_location_services' | 'agent_miscellaneous' | 'agent_mission_collateral_paid' | 'agent_mission_collateral_refunded' | 'agent_mission_reward' | 'agent_mission_reward_corporation_tax' | 'agent_mission_security_tax' | 'agent_mission_time_bonus_reward' | 'agent_mission_time_bonus_reward_corporation_tax' | 'agent_security_services' | 'agent_services_rendered' | 'agents_preward' | 'air_career_program_reward' | 'alliance_maintainance_fee' | 'alliance_registration_fee' | 'allignment_based_gate_toll' | 'asset_safety_recovery_tax' | 'bounty' | 'bounty_prize' | 'bounty_prize_corporation_tax' | 'bounty_prizes' | 'bounty_reimbursement' | 'bounty_surcharge' | 'brokers_fee' | 'campaign_objective_isk_reward' | 'clone_activation' | 'clone_transfer' | 'contraband_fine' | 'contract_auction_bid' | 'contract_auction_bid_corp' | 'contract_auction_bid_refund' | 'contract_auction_sold' | 'contract_brokers_fee' | 'contract_brokers_fee_corp' | 'contract_collateral' | 'contract_collateral_deposited_corp' | 'contract_collateral_payout' | 'contract_collateral_refund' | 'contract_deposit' | 'contract_deposit_corp' | 'contract_deposit_refund' | 'contract_deposit_sales_tax' | 'contract_price' | 'contract_price_payment_corp' | 'contract_reversal' | 'contract_reward' | 'contract_reward_deposited' | 'contract_reward_deposited_corp' | 'contract_reward_refund' | 'contract_sales_tax' | 'copying' | 'corporate_reward_payout' | 'corporate_reward_tax' | 'corporation_account_withdrawal' | 'corporation_bulk_payment' | 'corporation_dividend_payment' | 'corporation_liquidation' | 'corporation_logo_change_cost' | 'corporation_payment' | 'corporation_registration_fee' | 'cosmetic_market_component_item_purchase' | 'cosmetic_market_skin_purchase' | 'cosmetic_market_skin_sale' | 'cosmetic_market_skin_sale_broker_fee' | 'cosmetic_market_skin_sale_tax' | 'cosmetic_market_skin_transaction' | 'courier_mission_escrow' | 'cspa' | 'cspaofflinerefund' | 'daily_challenge_reward' | 'daily_goal_payouts' | 'daily_goal_payouts_tax' | 'datacore_fee' | 'dna_modification_fee' | 'docking_fee' | 'duel_wager_escrow' | 'duel_wager_payment' | 'duel_wager_refund' | 'ess_escrow_transfer' | 'external_trade_delivery' | 'external_trade_freeze' | 'external_trade_thaw' | 'factory_slot_rental_fee' | 'flux_payout' | 'flux_tax' | 'flux_ticket_repayment' | 'flux_ticket_sale' | 'freelance_jobs_broadcasting_fee' | 'freelance_jobs_duration_fee' | 'freelance_jobs_escrow_refund' | 'freelance_jobs_reward' | 'freelance_jobs_reward_corporation_tax' | 'freelance_jobs_reward_escrow' | 'gm_cash_transfer' | 'gm_plex_fee_refund' | 'industry_job_tax' | 'industry_security_tax' | 'infrastructure_hub_maintenance' | 'inheritance' | 'insurance' | 'insurgency_corruption_contribution_reward' | 'insurgency_suppression_contribution_reward' | 'item_trader_payment' | 'jump_clone_activation_fee' | 'jump_clone_installation_fee' | 'kill_right_fee' | 'lp_store' | 'manufacturing' | 'market_escrow' | 'market_fine_paid' | 'market_provider_tax' | 'market_security_tax' | 'market_transaction' | 'medal_creation' | 'medal_issued' | 'milestone_reward_payment' | 'mission_completion' | 'mission_cost' | 'mission_expiration' | 'mission_reward' | 'npc_bounty_security_tax' | 'office_rental_fee' | 'operation_bonus' | 'opportunity_reward' | 'planetary_construction' | 'planetary_export_tax' | 'planetary_import_tax' | 'player_donation' | 'player_trading' | 'project_discovery_reward' | 'project_discovery_tax' | 'project_payouts' | 'reaction' | 'redeemed_isk_token' | 'release_of_impounded_property' | 'repair_bill' | 'reprocessing_tax' | 'researching_material_productivity' | 'researching_technology' | 'researching_time_productivity' | 'resource_wars_reward' | 'reverse_engineering' | 'season_challenge_reward' | 'security_processing_fee' | 'shares' | 'skill_purchase' | 'skyhook_claim_fee' | 'sovereignity_bill' | 'store_purchase' | 'store_purchase_refund' | 'structure_gate_jump' | 'transaction_tax' | 'under_construction' | 'upkeep_adjustment_fee' | 'war_ally_contract' | 'war_fee' | 'war_fee_surrender';\n second_party_id?: number;\n tax?: number;\n tax_receiver_id?: number;\n}\n\nexport interface CorporationsCorporationIdWalletsDivisionTransactionsGet {\n client_id: number;\n date: string;\n is_buy: boolean;\n journal_ref_id: number;\n location_id: number;\n quantity: number;\n transaction_id: number;\n type_id: number;\n unit_price: number;\n}\n\nexport interface CorporationsCorporationIdWalletsGet {\n balance: number;\n division: number;\n}\n\n// --- Wars ---\n\nexport interface WarsWarIdGet {\n aggressor: {\n alliance_id?: number;\n corporation_id?: number;\n isk_destroyed: number;\n ships_killed: number;\n };\n allies?: ({\n alliance_id?: number;\n corporation_id?: number;\n })[];\n declared: string;\n defender: {\n alliance_id?: number;\n corporation_id?: number;\n isk_destroyed: number;\n ships_killed: number;\n };\n finished?: string;\n id: number;\n mutual: boolean;\n open_for_allies: boolean;\n retracted?: string;\n started?: string;\n}\n\nexport interface WarsWarIdKillmailsGet {\n killmail_hash: string;\n killmail_id: number;\n}\n\n// Operation ID → Response type mapping\nexport interface EsiOperationTypes {\n 'GetAlliancesAllianceId': AlliancesDetail;\n 'GetAlliancesAllianceIdContacts': AlliancesAllianceIdContactsGet[];\n 'GetAlliancesAllianceIdContactsLabels': AlliancesAllianceIdContactsLabelsGet[];\n 'GetAlliancesAllianceIdIcons': AlliancesAllianceIdIconsGet;\n 'GetCharactersAccessListsDetail': CharactersAccessListsDetail;\n 'GetCharactersAccessListsListing': CharactersAccessListsListing;\n 'GetCharactersCharacterIdAgentsResearch': CharactersCharacterIdAgentsResearchGet[];\n 'GetCharactersCharacterIdAssets': CharactersCharacterIdAssetsGet[];\n 'GetCharactersCharacterIdAttributes': CharactersCharacterIdAttributesGet;\n 'GetCharactersCharacterIdBlueprints': CharactersCharacterIdBlueprintsGet[];\n 'GetCharactersCharacterIdCalendar': CharactersCharacterIdCalendarGet[];\n 'GetCharactersCharacterIdCalendarEventId': CharactersCharacterIdCalendarEventIdGet;\n 'GetCharactersCharacterIdCalendarEventIdAttendees': CharactersCharacterIdCalendarEventIdAttendeesGet[];\n 'GetCharactersCharacterIdClones': CharactersCharacterIdClonesGet;\n 'GetCharactersCharacterIdContacts': CharactersCharacterIdContactsGet[];\n 'GetCharactersCharacterIdContactsLabels': CharactersCharacterIdContactsLabelsGet[];\n 'GetCharactersCharacterIdContracts': CharactersCharacterIdContractsGet[];\n 'GetCharactersCharacterIdContractsContractIdBids': CharactersCharacterIdContractsContractIdBidsGet[];\n 'GetCharactersCharacterIdContractsContractIdItems': CharactersCharacterIdContractsContractIdItemsGet[];\n 'GetCharactersCharacterIdCorporationhistory': CharactersCharacterIdCorporationhistoryGet[];\n 'GetCharactersCharacterIdFatigue': CharactersCharacterIdFatigueGet;\n 'GetCharactersCharacterIdFittings': CharactersCharacterIdFittingsGet[];\n 'GetCharactersCharacterIdFleet': CharactersCharacterIdFleetGet;\n 'GetCharactersCharacterIdFwStats': CharactersCharacterIdFwStatsGet;\n 'GetCharactersCharacterIdIndustryJobs': CharactersCharacterIdIndustryJobsGet[];\n 'GetCharactersCharacterIdKillmailsRecent': CharactersCharacterIdKillmailsRecentGet[];\n 'GetCharactersCharacterIdLocation': CharactersLocation;\n 'GetCharactersCharacterIdLoyaltyPoints': CharactersCharacterIdLoyaltyPointsGet[];\n 'GetCharactersCharacterIdMail': CharactersCharacterIdMailGet[];\n 'GetCharactersCharacterIdMailLabels': CharactersCharacterIdMailLabelsGet;\n 'GetCharactersCharacterIdMailLists': CharactersCharacterIdMailListsGet[];\n 'GetCharactersCharacterIdMailMailId': CharactersCharacterIdMailMailIdGet;\n 'GetCharactersCharacterIdMedals': CharactersCharacterIdMedalsGet[];\n 'GetCharactersCharacterIdMining': CharactersCharacterIdMiningGet[];\n 'GetCharactersCharacterIdNotifications': CharactersCharacterIdNotificationsGet[];\n 'GetCharactersCharacterIdNotificationsContacts': CharactersCharacterIdNotificationsContactsGet[];\n 'GetCharactersCharacterIdOnline': CharactersOnline;\n 'GetCharactersCharacterIdOrders': CharactersCharacterIdOrdersGet[];\n 'GetCharactersCharacterIdOrdersHistory': CharactersCharacterIdOrdersHistoryGet[];\n 'GetCharactersCharacterIdPlanets': CharactersCharacterIdPlanetsGet[];\n 'GetCharactersCharacterIdPlanetsPlanetId': CharactersCharacterIdPlanetsPlanetIdGet;\n 'GetCharactersCharacterIdPortrait': CharactersCharacterIdPortraitGet;\n 'GetCharactersCharacterIdRoles': CharactersCharacterIdRolesGet;\n 'GetCharactersCharacterIdSearch': CharactersCharacterIdSearchGet;\n 'GetCharactersCharacterIdShip': CharactersShip;\n 'GetCharactersCharacterIdSkillqueue': CharactersSkillqueueSkill[];\n 'GetCharactersCharacterIdSkills': CharactersSkills;\n 'GetCharactersCharacterIdStandings': CharactersCharacterIdStandingsGet[];\n 'GetCharactersCharacterIdTitles': CharactersCharacterIdTitlesGet[];\n 'GetCharactersCharacterIdWalletJournal': CharactersCharacterIdWalletJournalGet[];\n 'GetCharactersCharacterIdWalletTransactions': CharactersCharacterIdWalletTransactionsGet[];\n 'GetCharactersCosmeticsSkinr': CharactersCosmeticsSkinr;\n 'GetCharactersCosmeticsSkinrComponents': CharactersCosmeticsSkinrComponents;\n 'GetCharactersDetail': CharactersDetail;\n 'GetCharactersFreelanceJobsListing': CharactersFreelanceJobsListing;\n 'GetCharactersFreelanceJobsParticipation': CharactersFreelanceJobsParticipation;\n 'GetCharactersMercenaryTacticalOperationsDetail': CharactersMercenaryTacticalOperationsDetail;\n 'GetCharactersMercenaryTacticalOperationsListing': CharactersMercenaryTacticalOperationsListing;\n 'GetCharactersMilitaryCampaignsObjectivesListing': CharactersMilitaryCampaignsObjectivesListing;\n 'GetCharactersMilitaryCampaignsObjectivesParticipation': CharactersMilitaryCampaignsObjectivesParticipation;\n 'GetCharactersParagonHubSkinr': CharactersParagonHubSkinr;\n 'GetCharactersStructuresMercenaryDensDetail': CharactersStructuresMercenaryDensDetail;\n 'GetCharactersStructuresMercenaryDensListing': CharactersStructuresMercenaryDensListing;\n 'GetContractsPublicBidsContractId': ContractsPublicBidsContractIdGet[];\n 'GetContractsPublicItemsContractId': ContractsPublicItemsContractIdGet[];\n 'GetContractsPublicRegionId': ContractsPublicRegionIdGet[];\n 'GetCorporationCorporationIdMiningExtractions': CorporationCorporationIdMiningExtractionsGet[];\n 'GetCorporationCorporationIdMiningObservers': CorporationCorporationIdMiningObserversGet[];\n 'GetCorporationCorporationIdMiningObserversObserverId': CorporationCorporationIdMiningObserversObserverIdGet[];\n 'GetCorporationsCorporationId': CorporationsDetail;\n 'GetCorporationsCorporationIdAlliancehistory': CorporationsCorporationIdAlliancehistoryGet[];\n 'GetCorporationsCorporationIdAssets': CorporationsCorporationIdAssetsGet[];\n 'GetCorporationsCorporationIdBlueprints': CorporationsCorporationIdBlueprintsGet[];\n 'GetCorporationsCorporationIdContacts': CorporationsCorporationIdContactsGet[];\n 'GetCorporationsCorporationIdContactsLabels': CorporationsCorporationIdContactsLabelsGet[];\n 'GetCorporationsCorporationIdContainersLogs': CorporationsCorporationIdContainersLogsGet[];\n 'GetCorporationsCorporationIdContracts': CorporationsCorporationIdContractsGet[];\n 'GetCorporationsCorporationIdContractsContractIdBids': CorporationsCorporationIdContractsContractIdBidsGet[];\n 'GetCorporationsCorporationIdContractsContractIdItems': CorporationsCorporationIdContractsContractIdItemsGet[];\n 'GetCorporationsCorporationIdCustomsOffices': CorporationsCorporationIdCustomsOfficesGet[];\n 'GetCorporationsCorporationIdDivisions': CorporationsCorporationIdDivisionsGet;\n 'GetCorporationsCorporationIdFacilities': CorporationsCorporationIdFacilitiesGet[];\n 'GetCorporationsCorporationIdFwStats': CorporationsCorporationIdFwStatsGet;\n 'GetCorporationsCorporationIdIcons': CorporationsCorporationIdIconsGet;\n 'GetCorporationsCorporationIdIndustryJobs': CorporationsCorporationIdIndustryJobsGet[];\n 'GetCorporationsCorporationIdKillmailsRecent': CorporationsCorporationIdKillmailsRecentGet[];\n 'GetCorporationsCorporationIdMedals': CorporationsCorporationIdMedalsGet[];\n 'GetCorporationsCorporationIdMedalsIssued': CorporationsCorporationIdMedalsIssuedGet[];\n 'GetCorporationsCorporationIdMembersTitles': CorporationsCorporationIdMembersTitlesGet[];\n 'GetCorporationsCorporationIdMembertracking': CorporationsCorporationIdMembertrackingGet[];\n 'GetCorporationsCorporationIdOrders': CorporationsCorporationIdOrdersGet[];\n 'GetCorporationsCorporationIdOrdersHistory': CorporationsCorporationIdOrdersHistoryGet[];\n 'GetCorporationsCorporationIdRoles': CorporationsCorporationIdRolesGet[];\n 'GetCorporationsCorporationIdRolesHistory': CorporationsCorporationIdRolesHistoryGet[];\n 'GetCorporationsCorporationIdShareholders': CorporationsCorporationIdShareholdersGet[];\n 'GetCorporationsCorporationIdStandings': CorporationsCorporationIdStandingsGet[];\n 'GetCorporationsCorporationIdStarbases': CorporationsCorporationIdStarbasesGet[];\n 'GetCorporationsCorporationIdStarbasesStarbaseId': CorporationsCorporationIdStarbasesStarbaseIdGet;\n 'GetCorporationsCorporationIdStructures': CorporationsCorporationIdStructuresGet[];\n 'GetCorporationsCorporationIdTitles': CorporationsCorporationIdTitlesGet[];\n 'GetCorporationsCorporationIdWallets': CorporationsCorporationIdWalletsGet[];\n 'GetCorporationsCorporationIdWalletsDivisionJournal': CorporationsCorporationIdWalletsDivisionJournalGet[];\n 'GetCorporationsCorporationIdWalletsDivisionTransactions': CorporationsCorporationIdWalletsDivisionTransactionsGet[];\n 'GetCorporationsFreelanceJobsListing': CorporationsFreelanceJobsListing;\n 'GetCorporationsFreelanceJobsParticipants': CorporationsFreelanceJobsParticipants;\n 'GetCorporationsProjectsContribution': CorporationsProjectsContribution;\n 'GetCorporationsProjectsContributors': CorporationsProjectsContributors;\n 'GetCorporationsProjectsDetail': CorporationsProjectsDetail;\n 'GetCorporationsProjectsListing': CorporationsProjectsListing;\n 'GetCorporationsStructuresSkyhooksDetail': CorporationsStructuresSkyhooksDetail;\n 'GetCorporationsStructuresSkyhooksListing': CorporationsStructuresSkyhooksListing;\n 'GetCorporationsStructuresSovereigntyHubsDetail': CorporationsStructuresSovereigntyHubsDetail;\n 'GetCorporationsStructuresSovereigntyHubsListing': CorporationsStructuresSovereigntyHubsListing;\n 'GetCosmeticsSkinr': CosmeticsSkinr;\n 'GetDogmaAttributesAttributeId': DogmaAttributesAttributeIdGet;\n 'GetDogmaDynamicItemsTypeIdItemId': DogmaDynamicItemsTypeIdItemIdGet;\n 'GetDogmaEffectsEffectId': DogmaEffectsEffectIdGet;\n 'GetFleetsFleetId': FleetsFleetIdGet;\n 'GetFleetsFleetIdMembers': FleetsFleetIdMembersGet[];\n 'GetFleetsFleetIdWings': FleetsFleetIdWingsGet[];\n 'GetFreelanceJobsDetail': FreelanceJobsDetail;\n 'GetFreelanceJobsListing': FreelanceJobsListing;\n 'GetFwLeaderboards': FwLeaderboardsGet;\n 'GetFwLeaderboardsCharacters': FwLeaderboardsCharactersGet;\n 'GetFwLeaderboardsCorporations': FwLeaderboardsCorporationsGet;\n 'GetFwStats': FwStatsGet[];\n 'GetFwSystems': FwSystemsGet[];\n 'GetFwWars': FwWarsGet[];\n 'GetIncursions': IncursionsGet[];\n 'GetIndustryFacilities': IndustryFacilitiesGet[];\n 'GetIndustrySystems': IndustrySystemsGet[];\n 'GetInsurancePrices': InsurancePricesGet[];\n 'GetKillmailsKillmailIdKillmailHash': KillmailsKillmailIdKillmailHashGet;\n 'GetLoyaltyStoresCorporationIdOffers': LoyaltyStoresCorporationIdOffersGet[];\n 'GetMarketsGroupsMarketGroupId': MarketsGroupsMarketGroupIdGet;\n 'GetMarketsPrices': MarketsPricesGet[];\n 'GetMarketsRegionIdHistory': MarketsRegionIdHistoryGet[];\n 'GetMarketsRegionIdOrders': MarketsRegionIdOrdersGet[];\n 'GetMarketsStructuresStructureId': MarketsStructuresStructureIdGet[];\n 'GetMetaChangelog': MetaChangelog;\n 'GetMetaCompatibilityDates': MetaCompatibilityDates;\n 'GetMetaName': MetaName;\n 'GetMetaStatus': MetaStatus;\n 'GetMilitaryCampaignsDetail': MilitaryCampaignsDetail;\n 'GetMilitaryCampaignsListing': MilitaryCampaignsListing;\n 'GetMilitaryCampaignsObjectivesDetail': MilitaryCampaignsObjectivesDetail;\n 'GetMilitaryCampaignsObjectivesListing': MilitaryCampaignsObjectivesListing;\n 'GetParagonHubSkinr': ParagonHubSkinr;\n 'GetParagonHubSkinrAlliances': ParagonHubSkinrAlliances;\n 'GetParagonHubSkinrCharacters': ParagonHubSkinrCharacters;\n 'GetParagonHubSkinrCorporations': ParagonHubSkinrCorporations;\n 'GetSkyhooksRaidable': SkyhooksRaidable;\n 'GetSovereigntyCampaigns': SovereigntyCampaignsGet[];\n 'GetSovereigntySystems': SovereigntySystems;\n 'GetStatus': Status;\n 'GetUniverseAncestries': UniverseAncestriesGet[];\n 'GetUniverseAsteroidBeltsAsteroidBeltId': UniverseAsteroidBeltsAsteroidBeltIdGet;\n 'GetUniverseBloodlines': UniverseBloodlinesGet[];\n 'GetUniverseCategoriesCategoryId': UniverseCategoriesCategoryIdGet;\n 'GetUniverseConstellationsConstellationId': UniverseConstellationsConstellationIdGet;\n 'GetUniverseFactions': UniverseFactionsGet[];\n 'GetUniverseGraphicsGraphicId': UniverseGraphicsGraphicIdGet;\n 'GetUniverseGroupsGroupId': UniverseGroupsGroupIdGet;\n 'GetUniverseMoonsMoonId': UniverseMoonsMoonIdGet;\n 'GetUniversePlanetsPlanetId': UniversePlanetsPlanetIdGet;\n 'GetUniverseRaces': UniverseRacesGet[];\n 'GetUniverseRegionsRegionId': UniverseRegionsRegionIdGet;\n 'GetUniverseSchematicsSchematicId': UniverseSchematicsSchematicIdGet;\n 'GetUniverseStargatesStargateId': UniverseStargatesStargateIdGet;\n 'GetUniverseStarsStarId': UniverseStarsStarIdGet;\n 'GetUniverseStationsStationId': UniverseStationsStationIdGet;\n 'GetUniverseStructuresStructureId': UniverseStructuresStructureIdGet;\n 'GetUniverseSystemJumps': UniverseSystemJumpsGet[];\n 'GetUniverseSystemKills': UniverseSystemKillsGet[];\n 'GetUniverseSystemsSystemId': UniverseSystemsSystemIdGet;\n 'GetUniverseTypesTypeId': UniverseTypesTypeIdGet;\n 'GetWarsWarId': WarsWarIdGet;\n 'GetWarsWarIdKillmails': WarsWarIdKillmailsGet[];\n 'PostCharactersAffiliation': CharactersAffiliationPost[];\n 'PostCharactersCharacterIdAssetsLocations': CharactersCharacterIdAssetsLocationsPost[];\n 'PostCharactersCharacterIdAssetsNames': CharactersCharacterIdAssetsNamesPost[];\n 'PostCorporationsCorporationIdAssetsLocations': CorporationsCorporationIdAssetsLocationsPost[];\n 'PostCorporationsCorporationIdAssetsNames': CorporationsCorporationIdAssetsNamesPost[];\n 'PostRoute': Route;\n 'PostUniverseIds': UniverseIdsPost;\n 'PostUniverseNames': UniverseNamesPost[];\n}\n","import type { FetchLike } from '../core/ApiClient';\nimport { USER_AGENT } from '../core/constants';\nimport { SsoError, TokenRevokedError } from './errors';\n\nexport const DEFAULT_SSO_BASE_URL = 'https://login.eveonline.com';\n\nexport interface EveSsoClientConfig {\n /** The application's client id from developers.eveonline.com. */\n clientId: string;\n /**\n * The application's client secret. Omit for a public (PKCE) client; token\n * requests then identify the application by `client_id` in the form body.\n */\n clientSecret?: string | undefined;\n /** Redirect URI registered for the application. Used by {@link EveSsoClient.getAuthorizationUrl}. */\n callbackUrl?: string | undefined;\n /** Override the SSO host, for tests or a proxy. Defaults to https://login.eveonline.com. */\n ssoBaseUrl?: string | undefined;\n /** Custom fetch implementation. Defaults to `globalThis.fetch` resolved at call time. */\n fetch?: FetchLike | undefined;\n}\n\n/** A successful response from the SSO token endpoint. */\nexport interface SsoTokenResponse {\n accessToken: string;\n refreshToken: string;\n /** Lifetime of `accessToken` in seconds, as reported by SSO. */\n expiresIn: number;\n tokenType: string;\n}\n\nexport interface AuthorizationUrlOptions {\n /** Scopes to request. */\n scopes: readonly string[];\n /** Opaque value echoed back on the callback; use {@link generateState}. */\n state: string;\n /** PKCE challenge for public clients; see {@link generatePkcePair}. */\n codeChallenge?: string | undefined;\n /** Overrides `callbackUrl` from the config. */\n redirectUri?: string | undefined;\n}\n\nexport interface ExchangeCodeOptions {\n /** PKCE verifier that produced the challenge sent in the authorization URL. */\n codeVerifier?: string | undefined;\n /**\n * The redirect URI that was sent in the authorization request. Defaults to\n * the configured `callbackUrl`; when neither is set the field is omitted.\n */\n redirectUri?: string | undefined;\n}\n\nexport interface RefreshOptions {\n /** Request a subset of the originally granted scopes. */\n scopes?: readonly string[] | undefined;\n}\n\ninterface SsoTokenJson {\n access_token?: unknown;\n refresh_token?: unknown;\n expires_in?: unknown;\n token_type?: unknown;\n}\n\ninterface SsoErrorJson {\n error?: unknown;\n error_description?: unknown;\n}\n\n/** Which OAuth2 grant a token request carried; decides how `invalid_grant` is classified. */\ntype GrantType = 'authorization_code' | 'refresh_token';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Minimal client for the EVE SSO OAuth2 endpoints: building the login URL,\n * exchanging an authorization code, refreshing, and revoking.\n *\n * Supports confidential clients (HTTP Basic with the client secret) and\n * public clients (PKCE with `client_id` in the body). No JWT signature\n * verification is performed; tokens are trusted because they arrive directly\n * from SSO over TLS.\n */\nexport class EveSsoClient {\n private readonly clientId: string;\n private readonly clientSecret?: string | undefined;\n private readonly callbackUrl?: string | undefined;\n private readonly baseUrl: string;\n private readonly fetchFn?: FetchLike | undefined;\n\n constructor(config: EveSsoClientConfig) {\n if (!config.clientId) {\n throw new Error('EveSsoClient requires a clientId');\n }\n this.clientId = config.clientId;\n this.clientSecret = config.clientSecret;\n this.callbackUrl = config.callbackUrl;\n this.baseUrl = (config.ssoBaseUrl ?? DEFAULT_SSO_BASE_URL).replace(\n /\\/$/,\n '',\n );\n this.fetchFn = config.fetch;\n }\n\n /** True when a client secret is configured (confidential client). */\n isConfidential(): boolean {\n return this.clientSecret !== undefined && this.clientSecret !== '';\n }\n\n get tokenUrl(): string {\n return `${this.baseUrl}/v2/oauth/token`;\n }\n\n get authorizeUrl(): string {\n return `${this.baseUrl}/v2/oauth/authorize`;\n }\n\n get revokeUrl(): string {\n return `${this.baseUrl}/v2/oauth/revoke`;\n }\n\n /** Build the URL to send a player to for login. */\n getAuthorizationUrl(options: AuthorizationUrlOptions): string {\n const redirectUri = options.redirectUri ?? this.callbackUrl;\n if (!redirectUri) {\n throw new Error(\n 'getAuthorizationUrl requires a redirectUri or a configured callbackUrl',\n );\n }\n const url = new URL(this.authorizeUrl);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('redirect_uri', redirectUri);\n url.searchParams.set('client_id', this.clientId);\n url.searchParams.set('scope', options.scopes.join(' '));\n url.searchParams.set('state', options.state);\n if (options.codeChallenge) {\n url.searchParams.set('code_challenge', options.codeChallenge);\n url.searchParams.set('code_challenge_method', 'S256');\n }\n return url.toString();\n }\n\n /** Exchange the authorization code from the callback for tokens. */\n async exchangeCode(\n code: string,\n options: ExchangeCodeOptions = {},\n ): Promise<SsoTokenResponse> {\n const form = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n });\n // OAuth2 (RFC 6749 §4.1.3) requires the token request to repeat the\n // redirect_uri that was sent in the authorization request.\n const redirectUri = options.redirectUri ?? this.callbackUrl;\n if (redirectUri) {\n form.set('redirect_uri', redirectUri);\n }\n if (options.codeVerifier) {\n form.set('code_verifier', options.codeVerifier);\n }\n return this.tokenRequest(form, 'authorization_code');\n }\n\n /** Obtain a new access token (and rotated refresh token) from a refresh token. */\n async refresh(\n refreshToken: string,\n options: RefreshOptions = {},\n ): Promise<SsoTokenResponse> {\n const form = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n });\n if (options.scopes && options.scopes.length > 0) {\n form.set('scope', options.scopes.join(' '));\n }\n return this.tokenRequest(form, 'refresh_token');\n }\n\n /** Revoke a refresh token so it can no longer be used. */\n async revoke(\n token: string,\n tokenTypeHint: 'refresh_token' | 'access_token' = 'refresh_token',\n ): Promise<void> {\n const form = new URLSearchParams({\n token_type_hint: tokenTypeHint,\n token,\n });\n const response = await this.post(this.revokeUrl, form);\n if (!response.ok) {\n throw await this.errorFromResponse(response);\n }\n }\n\n private async tokenRequest(\n form: URLSearchParams,\n grant: GrantType,\n ): Promise<SsoTokenResponse> {\n const response = await this.post(this.tokenUrl, form);\n if (!response.ok) {\n throw await this.errorFromResponse(response, grant);\n }\n // A proxy or outage page can answer 2xx with HTML, an empty body, or a\n // JSON value that is not an object. All of those are SSO faults to the\n // caller, so they surface as SsoError rather than a raw parser error.\n let parsed: unknown;\n try {\n parsed = await response.json();\n } catch {\n throw new SsoError(\n response.status,\n 'invalid_response',\n 'Token response body was not valid JSON',\n );\n }\n if (!isRecord(parsed)) {\n throw new SsoError(\n response.status,\n 'invalid_response',\n 'Token response body was not a JSON object',\n );\n }\n const json = parsed as SsoTokenJson;\n if (\n typeof json.access_token !== 'string' ||\n typeof json.refresh_token !== 'string'\n ) {\n throw new SsoError(\n response.status,\n 'invalid_response',\n 'Token response did not include access_token and refresh_token',\n );\n }\n return {\n accessToken: json.access_token,\n refreshToken: json.refresh_token,\n expiresIn: typeof json.expires_in === 'number' ? json.expires_in : 0,\n tokenType:\n typeof json.token_type === 'string' ? json.token_type : 'Bearer',\n };\n }\n\n private async post(url: string, form: URLSearchParams): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n 'User-Agent': USER_AGENT,\n };\n if (this.isConfidential()) {\n const credentials = Buffer.from(\n `${this.clientId}:${this.clientSecret}`,\n ).toString('base64');\n headers['Authorization'] = `Basic ${credentials}`;\n } else {\n form.set('client_id', this.clientId);\n }\n const fetchFn = this.fetchFn ?? globalThis.fetch;\n return fetchFn(url, { method: 'POST', headers, body: form.toString() });\n }\n\n /**\n * Map a non-2xx SSO response to an error. `invalid_grant` means \"the\n * refresh token is dead\" only for a refresh grant; on a code exchange (or\n * a revoke) it describes the login code or request, so it stays an\n * `SsoError` and does not trigger the re-authentication path.\n */\n private async errorFromResponse(\n response: Response,\n grant?: GrantType,\n ): Promise<Error> {\n let errorCode = 'unknown';\n let description: string | undefined;\n try {\n const json: unknown = await response.json();\n if (isRecord(json)) {\n const body = json as SsoErrorJson;\n if (typeof body.error === 'string') errorCode = body.error;\n if (typeof body.error_description === 'string') {\n description = body.error_description;\n }\n }\n } catch {\n // Non-JSON body; keep the defaults.\n }\n if (errorCode === 'invalid_grant' && grant === 'refresh_token') {\n return new TokenRevokedError(\n `EVE SSO rejected the refresh token (invalid_grant)${\n description ? `: ${description}` : ''\n }`,\n );\n }\n return new SsoError(response.status, errorCode, description);\n }\n}\n","export const DEFAULT_CONCURRENCY = 5;\n\nexport interface ConcurrencyOptions {\n /**\n * Maximum number of workers running at once. Defaults to 5. A value that\n * is not a finite number falls back to the default; fractions are floored\n * and anything below one runs a single worker.\n */\n concurrency?: number | undefined;\n /**\n * Called after each item settles with the running completed count. An\n * exception thrown by the callback is discarded so it cannot stop the run\n * or leave later items without a result.\n */\n onProgress?: ((completed: number, total: number) => void) | undefined;\n}\n\nfunction resolveLimit(requested: number | undefined): number {\n if (typeof requested !== 'number' || !Number.isFinite(requested)) {\n return DEFAULT_CONCURRENCY;\n }\n return Math.max(1, Math.floor(requested));\n}\n\nexport type SettledResult<T> =\n { status: 'fulfilled'; value: T } | { status: 'rejected'; reason: unknown };\n\n/**\n * Run `worker` over every item with at most `concurrency` invocations in\n * flight at once. Results are returned in input order and every item settles\n * independently: a rejection is captured, never thrown.\n */\nexport async function runWithConcurrency<T, R>(\n items: readonly T[],\n worker: (item: T, index: number) => Promise<R>,\n options: ConcurrencyOptions = {},\n): Promise<SettledResult<R>[]> {\n const limit = resolveLimit(options.concurrency);\n // Every index is written before this returns (at least one worker drains\n // the queue, and both outcomes assign), so the array ends dense without\n // presizing it.\n const results: SettledResult<R>[] = [];\n let nextIndex = 0;\n let completed = 0;\n\n async function runOne(): Promise<void> {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n const item = items[index] as T;\n try {\n const value = await worker(item, index);\n results[index] = { status: 'fulfilled', value };\n } catch (reason: unknown) {\n results[index] = { status: 'rejected', reason };\n }\n completed++;\n if (options.onProgress) {\n try {\n options.onProgress(completed, items.length);\n } catch {\n // Progress reporting is advisory; see ConcurrencyOptions.onProgress.\n }\n }\n }\n }\n\n const workers = Array.from({ length: Math.min(limit, items.length) }, () =>\n runOne(),\n );\n await Promise.all(workers);\n return results;\n}\n","import { TokenDecodeError } from './errors';\n\n/** Claims EVE SSO places in an access token. Only the ones the manager reads are typed. */\nexport interface EveJwtClaims {\n /** `CHARACTER:EVE:<characterId>` */\n sub: string;\n /** Character name. */\n name?: string | undefined;\n /** Granted scopes: a single string, or an array when more than one. */\n scp?: string | string[] | undefined;\n /** Expiry as epoch seconds. */\n exp?: number | undefined;\n /** Issued-at as epoch seconds. */\n iat?: number | undefined;\n /** Owner hash; changes on character transfer. */\n owner?: string | undefined;\n iss?: string | undefined;\n aud?: string | string[] | undefined;\n [claim: string]: unknown;\n}\n\n/** Identity and lifetime information extracted from an EVE SSO access token. */\nexport interface DecodedAccessToken {\n characterId: number;\n characterName: string;\n scopes: string[];\n /** Epoch milliseconds, or undefined when the token carries no `exp`. */\n expiresAt?: number;\n ownerHash?: string;\n claims: EveJwtClaims;\n}\n\nfunction base64UrlDecode(segment: string): string {\n return Buffer.from(segment, 'base64url').toString('utf8');\n}\n\n/**\n * Decode the payload of a JWT without verifying its signature.\n *\n * Tokens reach the manager directly from SSO over TLS, so the payload is\n * trusted for the purpose of learning which character it belongs to. Do not\n * use this to authenticate tokens presented by third parties.\n */\nexport function decodeJwtPayload(token: string): EveJwtClaims {\n const parts = token.split('.');\n if (parts.length !== 3 || !parts[1]) {\n throw new TokenDecodeError(\n 'Access token is not a JWT (expected three dot-separated segments)',\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(base64UrlDecode(parts[1]));\n } catch {\n throw new TokenDecodeError('Access token payload is not valid JSON');\n }\n if (typeof parsed !== 'object' || parsed === null) {\n throw new TokenDecodeError('Access token payload is not an object');\n }\n return parsed as EveJwtClaims;\n}\n\n/** Parse the character id out of an SSO `sub` claim (`CHARACTER:EVE:123`). */\nexport function parseCharacterId(sub: unknown): number {\n if (typeof sub !== 'string') {\n throw new TokenDecodeError('Access token has no sub claim');\n }\n const match = /^CHARACTER:EVE:(\\d+)$/.exec(sub);\n if (!match) {\n throw new TokenDecodeError(\n `Access token sub claim is not a character subject: ${sub}`,\n );\n }\n return Number(match[1]);\n}\n\n/** Normalise the `scp` claim, which SSO emits as a string for one scope and an array otherwise. */\nexport function parseScopes(scp: unknown): string[] {\n if (Array.isArray(scp)) {\n return scp.filter((s): s is string => typeof s === 'string');\n }\n if (typeof scp === 'string') {\n return scp.split(' ').filter((s) => s.length > 0);\n }\n return [];\n}\n\n/** Decode an EVE SSO access token into the fields the token manager stores. */\nexport function decodeAccessToken(token: string): DecodedAccessToken {\n const claims = decodeJwtPayload(token);\n const characterId = parseCharacterId(claims.sub);\n return {\n characterId,\n characterName: typeof claims.name === 'string' ? claims.name : '',\n scopes: parseScopes(claims.scp),\n ...(typeof claims.exp === 'number' && { expiresAt: claims.exp * 1000 }),\n ...(typeof claims.owner === 'string' && { ownerHash: claims.owner }),\n claims,\n };\n}\n","import type { ITokenStorage, StoredToken } from '../types';\n\n/**\n * In-memory {@link ITokenStorage}. Tokens live only as long as the process.\n * Useful for tests, CLIs that log in on every run, and as a cache in front of\n * a durable store.\n */\nexport class MemoryTokenStorage implements ITokenStorage {\n private readonly tokens = new Map<number, StoredToken>();\n\n constructor(initial: readonly StoredToken[] = []) {\n for (const token of initial) {\n this.tokens.set(token.characterId, {\n ...token,\n scopes: [...token.scopes],\n });\n }\n }\n\n get(characterId: number): Promise<StoredToken | null> {\n const token = this.tokens.get(characterId);\n return Promise.resolve(\n token ? { ...token, scopes: [...token.scopes] } : null,\n );\n }\n\n set(characterId: number, token: StoredToken): Promise<void> {\n this.tokens.set(characterId, { ...token, scopes: [...token.scopes] });\n return Promise.resolve();\n }\n\n delete(characterId: number): Promise<void> {\n this.tokens.delete(characterId);\n return Promise.resolve();\n }\n\n list(): Promise<StoredToken[]> {\n return Promise.resolve(\n Array.from(this.tokens.values(), (token) => ({\n ...token,\n scopes: [...token.scopes],\n })),\n );\n }\n\n /** Remove every token. */\n clear(): void {\n this.tokens.clear();\n }\n\n get size(): number {\n return this.tokens.size;\n }\n}\n","import { EsiClient, EsiClientConfig } from '../EsiClient';\nimport type { FetchLike, TokenProvider } from '../core/ApiClient';\nimport type { ILogger } from '../core/logger/ILogger';\nimport type { Identity } from '../core/ports/Identity';\nimport { getLogger } from '../core/logger/loggerUtil';\nimport { redactingLogger } from '../core/logger/redactLog';\nimport { runWithConcurrency } from '../core/util/concurrency';\nimport {\n EveSsoClient,\n SsoTokenResponse,\n AuthorizationUrlOptions,\n ExchangeCodeOptions,\n} from './EveSsoClient';\nimport { CharacterNotFoundError, SsoError, TokenRevokedError } from './errors';\nimport { decodeAccessToken, DecodedAccessToken } from './jwt';\nimport { MemoryTokenStorage } from './storage/MemoryTokenStorage';\nimport type { ITokenStorage, StoredToken } from './types';\n\nexport interface EsiTokenManagerConfig {\n /** The application's SSO client id. */\n clientId: string;\n /** The application's SSO client secret. Omit for a public (PKCE) client. */\n clientSecret?: string | undefined;\n /** Redirect URI registered for the application. */\n callbackUrl?: string | undefined;\n /** Where tokens are persisted. Defaults to {@link MemoryTokenStorage}. */\n storage?: ITokenStorage | undefined;\n /** Pre-built SSO client. When given, `clientId`, `clientSecret`, `callbackUrl` and `fetch` are ignored for SSO calls. */\n ssoClient?: EveSsoClient | undefined;\n /** Custom fetch for SSO calls. Defaults to `globalThis.fetch`. */\n fetch?: FetchLike | undefined;\n /**\n * How long before expiry a token counts as stale, in milliseconds.\n * Defaults to 60 000 (one minute).\n */\n refreshSkewMs?: number | undefined;\n /**\n * When true (the default), {@link EsiTokenManager.getToken} refreshes a\n * stale token before returning it. When false it returns the stored token\n * as-is and refresh only happens through {@link EsiTokenManager.refresh},\n * {@link EsiTokenManager.refreshAll}, or the 401 path of a created client.\n */\n autoRefresh?: boolean | undefined;\n /** Called after a token is refreshed and persisted. */\n onRefresh?: ((token: StoredToken) => void) | undefined;\n /** Called when a refresh fails for a reason other than revocation. */\n onRefreshError?: ((characterId: number, error: Error) => void) | undefined;\n /** Called when SSO reports a character's refresh token as invalid. */\n onRevoked?: ((characterId: number) => void) | undefined;\n /**\n * Logger for refresh activity. Defaults to the library logger, resolved at\n * each log call so a later global `setLogger()` applies.\n */\n logger?: ILogger | undefined;\n /** Clock override for tests. */\n now?: (() => number) | undefined;\n}\n\nexport interface AddCharacterOptions extends ExchangeCodeOptions {\n /**\n * When the character already has a stored token, revoke its refresh token\n * at SSO before replacing it. Defaults to false.\n */\n revokeReplaced?: boolean | undefined;\n}\n\nexport interface RemoveCharacterOptions {\n /** Revoke the refresh token at SSO before deleting it. Defaults to false. */\n revoke?: boolean | undefined;\n}\n\nexport interface RefreshAllOptions {\n /** Maximum simultaneous SSO requests. Defaults to 5. */\n concurrency?: number | undefined;\n /**\n * Only refresh tokens that expire within this many milliseconds (after\n * applying the refresh skew). Omit to refresh every token.\n */\n expiringWithinMs?: number | undefined;\n /** Abort the run; remaining tokens are reported as skipped. */\n signal?: AbortSignal | undefined;\n /**\n * Progress callback, invoked after each token settles. A callback that\n * throws does not stop the run; the exception is discarded.\n */\n onProgress?: ((completed: number, total: number) => void) | undefined;\n}\n\nexport type RefreshStatus = 'refreshed' | 'skipped' | 'failed' | 'revoked';\n\nexport interface RefreshResult {\n characterId: number;\n status: RefreshStatus;\n /** New expiry in epoch milliseconds, when refreshed. */\n expiresAt?: number;\n /** The error, when failed or revoked. */\n error?: Error;\n /** True when the failure was an SSO 429 or 5xx and can be retried later. */\n retryable?: boolean;\n /** Why the token was skipped. */\n reason?: 'not-stale' | 'aborted';\n}\n\n/** Lightweight view of a stored character, without the secrets. */\nexport interface CharacterSummary {\n characterId: number;\n characterName: string;\n scopes: string[];\n expiresAt: number;\n revoked: boolean;\n}\n\n/** EsiClient options a manager-created client accepts; token fields are supplied by the manager. */\nexport type ManagedClientConfig = Omit<\n EsiClientConfig,\n 'accessToken' | 'onTokenRefresh'\n>;\n\n/**\n * Keeps one valid SSO token per character on top of a pluggable\n * {@link ITokenStorage}, refreshing ahead of expiry, coalescing concurrent\n * refreshes, persisting rotated refresh tokens, and recording revocations so\n * SSO is not hammered with a dead refresh token.\n */\nexport class EsiTokenManager {\n private readonly storage: ITokenStorage;\n private readonly sso: EveSsoClient;\n private readonly refreshSkewMs: number;\n private readonly autoRefresh: boolean;\n /** The logger passed in config, if any; see `logger` below. */\n private readonly configuredLogger: ILogger | undefined;\n private readonly now: () => number;\n private readonly hooks: Pick<\n EsiTokenManagerConfig,\n 'onRefresh' | 'onRefreshError' | 'onRevoked'\n >;\n private readonly inFlight = new Map<number, Promise<StoredToken>>();\n /**\n * Per-character write generation. Bumped whenever a record is replaced or\n * removed so a refresh that was already waiting on SSO can tell its result\n * is stale and must not be persisted over the newer state.\n */\n private readonly generations = new Map<number, number>();\n /** One `Identity` per character, so `esi.as()` returns one view per character. */\n private readonly identities = new Map<number, Identity>();\n\n /**\n * Resolved at each log call rather than at construction, so a global\n * `setLogger()` made after the manager was built still reaches it. Lines\n * are redacted like the pipeline's, since an SSO error message can carry\n * a URL.\n */\n private get logger(): ILogger {\n return redactingLogger(this.configuredLogger ?? getLogger());\n }\n\n constructor(config: EsiTokenManagerConfig) {\n this.storage = config.storage ?? new MemoryTokenStorage();\n this.sso =\n config.ssoClient ??\n new EveSsoClient({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n callbackUrl: config.callbackUrl,\n fetch: config.fetch,\n });\n this.refreshSkewMs = config.refreshSkewMs ?? 60_000;\n this.autoRefresh = config.autoRefresh ?? true;\n this.configuredLogger = config.logger;\n this.now = config.now ?? (() => Date.now());\n this.hooks = {\n onRefresh: config.onRefresh,\n onRefreshError: config.onRefreshError,\n onRevoked: config.onRevoked,\n };\n }\n\n /** The SSO client used for all token traffic. */\n getSsoClient(): EveSsoClient {\n return this.sso;\n }\n\n /** The storage adapter backing this manager. */\n getStorage(): ITokenStorage {\n return this.storage;\n }\n\n /** Build the SSO login URL. See {@link EveSsoClient.getAuthorizationUrl}. */\n getAuthorizationUrl(options: AuthorizationUrlOptions): string {\n return this.sso.getAuthorizationUrl(options);\n }\n\n /**\n * Exchange an authorization code and store the resulting token under the\n * character it belongs to. An existing token for that character is\n * replaced; storage never holds two entries for one character.\n */\n async addCharacter(\n code: string,\n options: AddCharacterOptions = {},\n ): Promise<StoredToken> {\n const response = await this.sso.exchangeCode(code, {\n codeVerifier: options.codeVerifier,\n redirectUri: options.redirectUri,\n });\n return this.storeResponse(response, {\n revokeReplaced: options.revokeReplaced,\n });\n }\n\n /**\n * Import tokens obtained elsewhere (a previous library version, another\n * tool, a migration). The character identity is decoded from the access\n * token; `expiresIn` is in seconds and defaults to the JWT `exp` claim.\n */\n async importToken(token: {\n accessToken: string;\n refreshToken: string;\n expiresIn?: number | undefined;\n }): Promise<StoredToken> {\n return this.storeResponse({\n accessToken: token.accessToken,\n refreshToken: token.refreshToken,\n expiresIn: token.expiresIn ?? 0,\n tokenType: 'Bearer',\n });\n }\n\n /** Delete a character's token, optionally revoking it at SSO first. */\n async removeCharacter(\n characterId: number,\n options: RemoveCharacterOptions = {},\n ): Promise<void> {\n const stored = await this.storage.get(characterId);\n if (!stored) return;\n if (options.revoke && !stored.revokedAt) {\n await this.sso.revoke(stored.refreshToken);\n }\n await this.storage.delete(characterId);\n this.bumpGeneration(characterId);\n this.inFlight.delete(characterId);\n }\n\n /** The stored record for a character, or null. */\n async getStoredToken(characterId: number): Promise<StoredToken | null> {\n return this.storage.get(characterId);\n }\n\n /** Every stored token. */\n async listTokens(): Promise<StoredToken[]> {\n return this.storage.list();\n }\n\n /** Every stored character without its secrets. */\n async listCharacters(): Promise<CharacterSummary[]> {\n const tokens = await this.storage.list();\n return tokens.map((t) => ({\n characterId: t.characterId,\n characterName: t.characterName,\n scopes: [...t.scopes],\n expiresAt: t.expiresAt,\n revoked: t.revokedAt !== undefined,\n }));\n }\n\n /** True when the stored token grants every listed scope. */\n async hasScopes(\n characterId: number,\n scopes: readonly string[],\n ): Promise<boolean> {\n const stored = await this.storage.get(characterId);\n if (!stored) return false;\n const granted = new Set(stored.scopes);\n return scopes.every((s) => granted.has(s));\n }\n\n /**\n * A usable access token for the character. With `autoRefresh` on, a token\n * inside the refresh skew is refreshed first.\n *\n * @throws CharacterNotFoundError when no token is stored\n * @throws TokenRevokedError when the character's refresh token is revoked\n */\n async getToken(characterId: number): Promise<string> {\n const stored = await this.requireStored(characterId);\n if (stored.revokedAt !== undefined) {\n throw new TokenRevokedError(\n `Refresh token for character ${characterId} was revoked; add the character again`,\n characterId,\n );\n }\n if (this.autoRefresh && this.isStale(stored)) {\n const refreshed = await this.refresh(characterId);\n return refreshed.accessToken;\n }\n return stored.accessToken;\n }\n\n /**\n * Refresh a character's token through SSO regardless of expiry. Concurrent\n * calls for the same character share one SSO request.\n */\n refresh(characterId: number): Promise<StoredToken> {\n const pending = this.inFlight.get(characterId);\n if (pending) return pending;\n\n const run: Promise<StoredToken> = this.doRefresh(characterId).finally(\n () => {\n // Only clear our own slot: a newer refresh may have replaced it.\n if (this.inFlight.get(characterId) === run) {\n this.inFlight.delete(characterId);\n }\n },\n );\n this.inFlight.set(characterId, run);\n return run;\n }\n\n /**\n * Refresh stored tokens with bounded concurrency. Per-character failures\n * never reject: each character gets its own {@link RefreshResult}. The one\n * rejection is a failing `storage.list()`, because with no records there\n * is no character to attribute the fault to and a silent empty run would\n * hide a broken store from a scheduler.\n */\n async refreshAll(options: RefreshAllOptions = {}): Promise<RefreshResult[]> {\n const tokens = await this.storage.list();\n const settled = await runWithConcurrency(\n tokens,\n (token) => this.refreshOne(token, options),\n { concurrency: options.concurrency, onProgress: options.onProgress },\n );\n return settled.map((entry, index) =>\n entry.status === 'fulfilled'\n ? entry.value\n : {\n characterId: tokens[index]!.characterId,\n status: 'failed',\n error: toError(entry.reason),\n retryable: false,\n },\n );\n }\n\n /**\n * A {@link TokenProvider} bound to a character, for `onTokenRefresh`. Every\n * invocation refreshes through SSO (coalesced), because the client only\n * calls it after ESI has rejected the current token.\n */\n tokenProviderFor(characterId: number): TokenProvider {\n return async () => {\n const refreshed = await this.refresh(characterId);\n return refreshed.accessToken;\n };\n }\n\n /**\n * The character as an `Identity` for `esi.as()` on the shared\n * runtime (`@lgriffin/esi.ts/client`). Before each request the view gets\n * the stored token, refreshed first when it is stale; after a 401 it gets a\n * token refreshed through SSO. Nothing is looked up until a request needs\n * it, so an unknown character fails at the request, not here. The same\n * object comes back for the same character, so `esi.as()` memoises one\n * view per character rather than one per call.\n */\n identity(characterId: number): Identity {\n const known = this.identities.get(characterId);\n if (known) return known;\n const identity: Identity = Object.freeze({\n characterId,\n accessToken: () => this.getToken(characterId),\n refreshAccessToken: async () =>\n (await this.refresh(characterId)).accessToken,\n });\n this.identities.set(characterId, identity);\n return identity;\n }\n\n /**\n * An {@link EsiClient} whose access token and refresh provider are bound to\n * the character. The token is validated (and refreshed if stale) first.\n *\n * @deprecated Since 11.0.0; removal is 12.0.0 at the earliest. Each client\n * this returns has its own rate limiter, error budget and cache. Build one\n * runtime with `createEsi({ userAgent })` from `@lgriffin/esi.ts/client` and\n * call `esi.as(this.identity(characterId))` for a per-character view over\n * it; `esi.shutdown()` replaces each client's `shutdown()`. See\n * guides/MULTI-CHARACTER.md, \"Moving from `EsiTokenManager.createClient`\".\n *\n * @example\n * ```ts\n * // Before\n * const client = await tokens.createClient(id, { userAgent });\n * await client.wallet.getCharacterWallet(id);\n * // After\n * const esi = createEsi({ userAgent }); // once per application\n * await esi.as(tokens.identity(id)).character(id).wallet.get();\n * ```\n */\n async createClient(\n characterId: number,\n config: ManagedClientConfig = {},\n ): Promise<EsiClient> {\n const accessToken = await this.getToken(characterId);\n return new EsiClient({\n ...config,\n accessToken,\n onTokenRefresh: this.tokenProviderFor(characterId),\n });\n }\n\n // ── internals ───────────────────────────────────────────────────────\n\n private isStale(token: StoredToken, withinMs: number = 0): boolean {\n return token.expiresAt - this.refreshSkewMs <= this.now() + withinMs;\n }\n\n private async requireStored(characterId: number): Promise<StoredToken> {\n const stored = await this.storage.get(characterId);\n if (!stored) throw new CharacterNotFoundError(characterId);\n return stored;\n }\n\n private generationOf(characterId: number): number {\n return this.generations.get(characterId) ?? 0;\n }\n\n private bumpGeneration(characterId: number): void {\n this.generations.set(characterId, this.generationOf(characterId) + 1);\n }\n\n /**\n * After an SSO round trip, decide whether the refresh still owns the\n * character's record. Returns null when it does. When the record was\n * replaced meanwhile, returns the current record so the caller hands out\n * the newer credentials; when it was removed, throws CharacterNotFoundError.\n */\n private async supersededBy(\n characterId: number,\n generation: number,\n ): Promise<StoredToken | null> {\n if (this.generationOf(characterId) === generation) return null;\n const current = await this.storage.get(characterId);\n if (!current) throw new CharacterNotFoundError(characterId);\n this.logger.debug(\n `Discarding stale refresh for character ${characterId}; token was replaced while the refresh was in flight`,\n );\n return current;\n }\n\n private async doRefresh(characterId: number): Promise<StoredToken> {\n const stored = await this.requireStored(characterId);\n if (stored.revokedAt !== undefined) {\n throw new TokenRevokedError(\n `Refresh token for character ${characterId} was revoked; add the character again`,\n characterId,\n );\n }\n const generation = this.generationOf(characterId);\n let response: SsoTokenResponse;\n try {\n response = await this.sso.refresh(stored.refreshToken);\n } catch (err: unknown) {\n if (err instanceof TokenRevokedError) {\n // A revocation of a token that has since been replaced says nothing\n // about the replacement; a removed character has nothing to mark.\n const superseded = await this.supersededBy(characterId, generation);\n if (superseded) return superseded;\n const revoked = {\n ...stored,\n revokedAt: this.now(),\n updatedAt: this.now(),\n };\n await this.storage.set(characterId, revoked);\n this.logger.warn(\n `SSO revoked refresh token for character ${characterId}`,\n );\n this.hooks.onRevoked?.(characterId);\n throw new TokenRevokedError(err.message, characterId);\n }\n const error = toError(err);\n this.logger.error(\n `Token refresh failed for character ${characterId}: ${error.message}`,\n );\n this.hooks.onRefreshError?.(characterId, error);\n throw error;\n }\n const superseded = await this.supersededBy(characterId, generation);\n if (superseded) return superseded;\n const updated = this.buildStoredToken(response, stored);\n await this.storage.set(characterId, updated);\n this.logger.debug(`Refreshed token for character ${characterId}`);\n this.hooks.onRefresh?.(updated);\n return updated;\n }\n\n private async refreshOne(\n token: StoredToken,\n options: RefreshAllOptions,\n ): Promise<RefreshResult> {\n const { characterId } = token;\n if (options.signal?.aborted) {\n return { characterId, status: 'skipped', reason: 'aborted' };\n }\n if (token.revokedAt !== undefined) {\n return {\n characterId,\n status: 'revoked',\n error: new TokenRevokedError(\n `Refresh token for character ${characterId} was revoked`,\n characterId,\n ),\n retryable: false,\n };\n }\n if (\n options.expiringWithinMs !== undefined &&\n !this.isStale(token, options.expiringWithinMs)\n ) {\n return { characterId, status: 'skipped', reason: 'not-stale' };\n }\n try {\n const refreshed = await this.refresh(characterId);\n return {\n characterId,\n status: 'refreshed',\n expiresAt: refreshed.expiresAt,\n };\n } catch (err: unknown) {\n const error = toError(err);\n if (error instanceof TokenRevokedError) {\n return { characterId, status: 'revoked', error, retryable: false };\n }\n return {\n characterId,\n status: 'failed',\n error,\n retryable: error instanceof SsoError && error.isRetryable(),\n };\n }\n }\n\n private async storeResponse(\n response: SsoTokenResponse,\n options: { revokeReplaced?: boolean | undefined } = {},\n ): Promise<StoredToken> {\n const token = this.buildStoredToken(response);\n const existing = await this.storage.get(token.characterId);\n if (existing) {\n const missing = existing.scopes.filter((s) => !token.scopes.includes(s));\n if (missing.length > 0) {\n this.logger.warn(\n `Replacing token for character ${token.characterId} drops scopes: ${missing.join(' ')}`,\n );\n }\n if (options.revokeReplaced && !existing.revokedAt) {\n await this.sso.revoke(existing.refreshToken);\n }\n }\n await this.storage.set(token.characterId, token);\n this.bumpGeneration(token.characterId);\n this.inFlight.delete(token.characterId);\n return token;\n }\n\n /**\n * Build the record to persist. When adding a character the access token\n * must decode, because it is the only source of the character id. On a\n * refresh the identity is already known, so a token that does not decode\n * (a proxy, a future SSO format) keeps the previous record's identity.\n */\n private buildStoredToken(\n response: SsoTokenResponse,\n previous?: StoredToken,\n ): StoredToken {\n let decoded: Partial<DecodedAccessToken> = {};\n try {\n decoded = decodeAccessToken(response.accessToken);\n } catch (err: unknown) {\n if (!previous) throw err;\n this.logger.debug(\n `Refreshed access token for character ${previous.characterId} did not decode as a JWT; keeping stored identity`,\n );\n }\n const now = this.now();\n const expiresAt =\n response.expiresIn > 0\n ? now + response.expiresIn * 1000\n : (decoded.expiresAt ?? now);\n const scopes =\n decoded.scopes && decoded.scopes.length > 0\n ? decoded.scopes\n : (previous?.scopes ?? []);\n const token: StoredToken = {\n characterId: decoded.characterId ?? previous!.characterId,\n characterName: decoded.characterName || previous?.characterName || '',\n accessToken: response.accessToken,\n refreshToken: response.refreshToken,\n expiresAt,\n scopes,\n updatedAt: now,\n };\n const ownerHash = decoded.ownerHash ?? previous?.ownerHash;\n if (ownerHash !== undefined) token.ownerHash = ownerHash;\n return token;\n }\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport type { ITokenStorage, StoredToken } from '../types';\n\nconst FILE_FORMAT_VERSION = 1;\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\n/**\n * Accept a persisted entry only when it has the full StoredToken shape. A\n * partially corrupt record (a numeric id but no scopes, say) would otherwise\n * be cached and crash the first get() or list() that copies it.\n */\nfunction isStoredToken(value: unknown): value is StoredToken {\n if (typeof value !== 'object' || value === null) return false;\n const t = value as Record<string, unknown>;\n return (\n typeof t.characterId === 'number' &&\n typeof t.characterName === 'string' &&\n typeof t.accessToken === 'string' &&\n typeof t.refreshToken === 'string' &&\n typeof t.expiresAt === 'number' &&\n typeof t.updatedAt === 'number' &&\n isStringArray(t.scopes) &&\n (t.ownerHash === undefined || typeof t.ownerHash === 'string') &&\n (t.revokedAt === undefined || typeof t.revokedAt === 'number')\n );\n}\n\ninterface TokenFile {\n version: number;\n tokens: Record<string, StoredToken>;\n}\n\nexport interface FileTokenStorageOptions {\n /**\n * POSIX permission bits for the token file. Defaults to `0o600` (owner\n * read/write only). Ignored on platforms without POSIX modes.\n */\n mode?: number | undefined;\n}\n\n/**\n * JSON-file {@link ITokenStorage} for single-process applications.\n *\n * Writes go to a sibling temporary file that is renamed over the target, so a\n * crash mid-write leaves the previous file intact. Writes are serialised\n * within the process. Two processes sharing one file are not supported: each\n * would rotate refresh tokens the other cannot see.\n */\nexport class FileTokenStorage implements ITokenStorage {\n private readonly filePath: string;\n private readonly mode: number;\n private cache: Map<number, StoredToken> | null = null;\n private loading: Promise<Map<number, StoredToken>> | null = null;\n /** Bumped by invalidate() so a read that began earlier cannot repopulate the cache. */\n private loadGeneration = 0;\n private writeChain: Promise<void> = Promise.resolve();\n\n constructor(filePath: string, options: FileTokenStorageOptions = {}) {\n this.filePath = path.resolve(filePath);\n this.mode = options.mode ?? 0o600;\n }\n\n /** Absolute path of the backing file. */\n get path(): string {\n return this.filePath;\n }\n\n async get(characterId: number): Promise<StoredToken | null> {\n const tokens = await this.load();\n const token = tokens.get(characterId);\n return token ? { ...token, scopes: [...token.scopes] } : null;\n }\n\n async set(characterId: number, token: StoredToken): Promise<void> {\n const tokens = await this.load();\n tokens.set(characterId, { ...token, scopes: [...token.scopes] });\n await this.persist(tokens);\n }\n\n async delete(characterId: number): Promise<void> {\n const tokens = await this.load();\n if (tokens.delete(characterId)) {\n await this.persist(tokens);\n }\n }\n\n async list(): Promise<StoredToken[]> {\n const tokens = await this.load();\n return Array.from(tokens.values(), (token) => ({\n ...token,\n scopes: [...token.scopes],\n }));\n }\n\n /** Drop the in-memory copy so the next call re-reads the file. */\n invalidate(): void {\n this.loadGeneration++;\n this.cache = null;\n this.loading = null;\n }\n\n /**\n * Load once; overlapping first calls share the same read so none of them\n * clobbers another's map. A read that started before invalidate() still\n * resolves for its own callers but neither becomes the cache nor clears a\n * newer in-flight read.\n */\n private load(): Promise<Map<number, StoredToken>> {\n if (this.cache) return Promise.resolve(this.cache);\n if (!this.loading) {\n const generation = this.loadGeneration;\n const pending: Promise<Map<number, StoredToken>> = this.readFile()\n .then((map) => {\n if (this.loadGeneration === generation) this.cache = map;\n return map;\n })\n .finally(() => {\n if (this.loading === pending) this.loading = null;\n });\n this.loading = pending;\n }\n return this.loading;\n }\n\n private async readFile(): Promise<Map<number, StoredToken>> {\n let raw: string;\n try {\n raw = await fs.readFile(this.filePath, 'utf8');\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return new Map();\n }\n throw err;\n }\n const parsed = JSON.parse(raw) as Partial<TokenFile>;\n const map = new Map<number, StoredToken>();\n const entries: Record<string, unknown> = parsed.tokens ?? {};\n for (const token of Object.values(entries)) {\n if (isStoredToken(token)) {\n map.set(token.characterId, token);\n }\n }\n return map;\n }\n\n private persist(tokens: Map<number, StoredToken>): Promise<void> {\n const snapshot: TokenFile = {\n version: FILE_FORMAT_VERSION,\n tokens: {},\n };\n for (const [id, token] of tokens) {\n snapshot.tokens[String(id)] = token;\n }\n const run = async (): Promise<void> => {\n const dir = path.dirname(this.filePath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = `${this.filePath}.${process.pid}.${Date.now()}.tmp`;\n await fs.writeFile(tmp, JSON.stringify(snapshot, null, 2), {\n encoding: 'utf8',\n mode: this.mode,\n });\n await fs.rename(tmp, this.filePath);\n };\n this.writeChain = this.writeChain.then(run, run);\n return this.writeChain;\n }\n}\n","import { createHash, randomBytes } from 'crypto';\n\n/**\n * A PKCE verifier/challenge pair for the authorization-code flow of a public\n * client (one that cannot hold a client secret).\n */\nexport interface PkcePair {\n /** Random secret sent with the token request as `code_verifier`. */\n codeVerifier: string;\n /** `BASE64URL(SHA256(codeVerifier))`, sent in the authorization URL. */\n codeChallenge: string;\n /** Always `S256`; EVE SSO does not accept the plain method. */\n codeChallengeMethod: 'S256';\n}\n\n/** Generate a 32-byte base64url code verifier (43 characters). */\nexport function generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/** Derive the S256 code challenge for a verifier. */\nexport function codeChallengeFromVerifier(codeVerifier: string): string {\n return createHash('sha256').update(codeVerifier).digest('base64url');\n}\n\n/** Generate a verifier and its challenge in one call. */\nexport function generatePkcePair(): PkcePair {\n const codeVerifier = generateCodeVerifier();\n return {\n codeVerifier,\n codeChallenge: codeChallengeFromVerifier(codeVerifier),\n codeChallengeMethod: 'S256',\n };\n}\n\n/** Generate an unguessable OAuth2 `state` value. */\nexport function generateState(): string {\n return randomBytes(16).toString('base64url');\n}\n"]}
|