From 120cfa2b491eb2ee076bdb8910e7dd29e7bb82ef Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Mon, 9 Jun 2025 15:51:02 -0400 Subject: [PATCH 01/49] refactor(runtimes): modify CredentialsProvider Interface --- package-lock.json | 38 --------------- runtimes/runtimes/auth/auth.test.ts | 63 ++++++++++++------------- runtimes/runtimes/auth/auth.ts | 69 ++++++++++++++++------------ runtimes/runtimes/standalone.test.ts | 2 + runtimes/server-interface/auth.ts | 5 +- 5 files changed, 74 insertions(+), 103 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1dd2783..75a84922 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1235,7 +1235,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -1249,7 +1248,6 @@ }, "node_modules/aws-sdk": { "version": "2.1692.0", - "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -1272,7 +1270,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "dev": true, "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -1285,7 +1282,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "dev": true, "funding": [ { "type": "github", @@ -1342,7 +1338,6 @@ }, "node_modules/buffer": { "version": "4.9.2", - "dev": true, "license": "MIT", "dependencies": { "base64-js": "^1.0.2", @@ -1358,12 +1353,10 @@ }, "node_modules/buffer/node_modules/isarray": { "version": "1.0.0", - "dev": true, "license": "MIT" }, "node_modules/call-bind": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -1711,7 +1704,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -1798,7 +1790,6 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -1809,7 +1800,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1837,7 +1827,6 @@ }, "node_modules/events": { "version": "1.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.x" @@ -1927,7 +1916,6 @@ }, "node_modules/for-each": { "version": "0.3.3", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.1.3" @@ -1953,7 +1941,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1969,7 +1956,6 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2051,7 +2037,6 @@ }, "node_modules/gopd": { "version": "1.1.0", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -2073,7 +2058,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -2084,7 +2068,6 @@ }, "node_modules/has-proto": { "version": "1.1.0", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7" @@ -2098,7 +2081,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2109,7 +2091,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -2123,7 +2104,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2164,7 +2144,6 @@ }, "node_modules/ieee754": { "version": "1.1.13", - "dev": true, "license": "BSD-3-Clause" }, "node_modules/ignore": { @@ -2226,7 +2205,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -2251,7 +2229,6 @@ }, "node_modules/is-arguments": { "version": "1.1.1", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -2285,7 +2262,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2330,7 +2306,6 @@ }, "node_modules/is-generator-function": { "version": "1.0.10", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -2416,7 +2391,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" @@ -2462,7 +2436,6 @@ }, "node_modules/jmespath": { "version": "0.16.0", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">= 0.6.0" @@ -3022,7 +2995,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3133,12 +3105,10 @@ }, "node_modules/punycode": { "version": "1.3.2", - "dev": true, "license": "MIT" }, "node_modules/querystring": { "version": "0.2.0", - "dev": true, "engines": { "node": ">=0.4.x" } @@ -3315,7 +3285,6 @@ }, "node_modules/sax": { "version": "1.2.1", - "dev": true, "license": "ISC" }, "node_modules/semver": { @@ -3342,7 +3311,6 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -3965,7 +3933,6 @@ }, "node_modules/url": { "version": "0.10.3", - "dev": true, "license": "MIT", "dependencies": { "punycode": "1.3.2", @@ -3974,7 +3941,6 @@ }, "node_modules/util": { "version": "0.12.5", - "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -4043,7 +4009,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.16", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -4099,7 +4064,6 @@ }, "node_modules/xml2js": { "version": "0.6.2", - "dev": true, "license": "MIT", "dependencies": { "sax": ">=0.6.0", @@ -4111,7 +4075,6 @@ }, "node_modules/xmlbuilder": { "version": "11.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=4.0" @@ -4225,7 +4188,6 @@ "@types/node": "^22.15.17", "@types/node-forge": "^1.3.11", "assert": "^2.0.0", - "aws-sdk": "^2.1692.0", "copyfiles": "^2.4.1", "husky": "^9.1.7", "json-schema-to-typescript": "^15.0.4", diff --git a/runtimes/runtimes/auth/auth.test.ts b/runtimes/runtimes/auth/auth.test.ts index ab6a9296..d4401d53 100644 --- a/runtimes/runtimes/auth/auth.test.ts +++ b/runtimes/runtimes/auth/auth.test.ts @@ -128,15 +128,15 @@ describe('Auth', () => { const auth = new Auth(serverLspConnectionMock, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials('iam')) + assert(!credentialsProvider.hasCredentials()) await authHandlers.iamUpdateHandler(updateRequest) - assert(credentialsProvider.hasCredentials('iam')) - assert.deepEqual(credentialsProvider.getCredentials('iam'), iamCredentials) + assert(credentialsProvider.hasCredentials() && credentialsProvider.getCredentialsType() === 'iam') + assert.deepEqual(credentialsProvider.getCredentials(), iamCredentials) authHandlers.iamDeleteHandler() - assert(!credentialsProvider.hasCredentials('iam')) - assert(credentialsProvider.getCredentials('iam') === undefined) + assert(!credentialsProvider.hasCredentials()) + assert(credentialsProvider.getCredentials() === undefined) }) it('Handles Set Bearer credentials request when parameters sent by position', async () => { @@ -147,7 +147,7 @@ describe('Auth', () => { const auth = new Auth(serverConnection, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials('bearer')) + assert(!credentialsProvider.hasCredentials()) // @ts-ignore await clientConnection.sendRequest( @@ -156,8 +156,8 @@ describe('Auth', () => { updateRequest ) - assert(credentialsProvider.hasCredentials('bearer')) - assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) + assert(credentialsProvider.hasCredentials() && credentialsProvider.getCredentialsType() === 'bearer') + assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) }) it('Handles Set Bearer credentials request', async () => { @@ -168,12 +168,12 @@ describe('Auth', () => { const auth = new Auth(serverConnection, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials('bearer')) + assert(!credentialsProvider.hasCredentials()) await clientConnection.sendRequest(credentialsProtocolMethodNames.bearerCredentialsUpdate, updateRequest) - assert(credentialsProvider.hasCredentials('bearer')) - assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) + assert(credentialsProvider.hasCredentials() && credentialsProvider.getCredentialsType() === 'bearer') + assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) }) it('Updates connection metadata on receiving Set Bearer credentials request with metadata', async () => { @@ -238,7 +238,7 @@ describe('Auth', () => { await clientConnection.sendRequest(credentialsProtocolMethodNames.bearerCredentialsUpdate, updateRequest) assert.deepEqual(credentialsProvider.getConnectionMetadata(), undefined) - assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) + assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) }) it('Handles Bearer credentials delete request', done => { @@ -249,11 +249,11 @@ describe('Auth', () => { const auth = new Auth(serverConnection, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials('bearer')) + assert(!credentialsProvider.hasCredentials()) serverConnection.onNotification(credentialsProtocolMethodNames.bearerCredentialsDelete, () => { - assert(!credentialsProvider.hasCredentials('bearer')) - assert(credentialsProvider.getCredentials('bearer') === undefined) + assert(!credentialsProvider.hasCredentials()) + assert(credentialsProvider.getCredentials() === undefined) done() }) clientConnection.sendNotification(credentialsProtocolMethodNames.bearerCredentialsDelete, updateRequest) @@ -272,7 +272,7 @@ describe('Auth', () => { const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() await assert.rejects(authHandlers.iamUpdateHandler(updateIamRequest), /Invalid IAM credentials/) - assert(!credentialsProvider.getCredentials('iam')) + assert(!credentialsProvider.getCredentials()) }) it('Rejects when bearer credentials are invalid', async () => { @@ -287,7 +287,7 @@ describe('Auth', () => { const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() await assert.rejects(authHandlers.bearerUpdateHandler(updateBearerRequest), /Invalid bearer credentials/) - assert(!credentialsProvider.getCredentials('bearer')) + assert(!credentialsProvider.getCredentials()) }) describe('Credentials provider', () => { @@ -301,12 +301,12 @@ describe('Auth', () => { await authHandlers.iamUpdateHandler(updateIamRequest) - let creds: any = credentialsProvider.getCredentials('iam') + let creds: any = credentialsProvider.getCredentials() const initialAccessKey = creds.accessKeyId assert.throws(() => (creds.accessKeyId = 'anotherKey'), /Cannot assign to read only property/) creds = {} - assert((credentialsProvider.getCredentials('iam') as IamCredentials).accessKeyId === initialAccessKey) + assert((credentialsProvider.getCredentials() as IamCredentials).accessKeyId === initialAccessKey) }) it('Prevents modifying Bearer credentials object', async () => { @@ -320,25 +320,20 @@ describe('Auth', () => { await authHandlers.bearerUpdateHandler(updateBearerRequest) - let creds: any = credentialsProvider.getCredentials('bearer') + let creds: any = credentialsProvider.getCredentials() const initialToken = creds.token assert.throws(() => (creds.token = 'anotherToken'), /Cannot assign to read only property/) creds = {} - assert((credentialsProvider.getCredentials('bearer') as BearerCredentials).token === initialToken) + assert((credentialsProvider.getCredentials() as BearerCredentials).token === initialToken) }) it('Throws on unsupported type', async () => { const auth = new Auth(serverLspConnectionMock, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert.throws( - () => credentialsProvider.hasCredentials('unsupported_type' as CredentialsType), - /Unsupported credentials type/ - ) - assert.throws( - () => credentialsProvider.getCredentials('unsupported_type' as CredentialsType), - /Unsupported credentials type/ - ) + // TODO: Add test for Unsupported credentials + assert.throws(() => credentialsProvider.hasCredentials(), /Unsupported credentials type/) + assert.throws(() => credentialsProvider.getCredentials(), /Unsupported credentials type/) }) it('getConnectionType return builderId', async () => { @@ -411,7 +406,7 @@ describe('Auth', () => { await assert.rejects(authHandlers.iamUpdateHandler(updateIamRequest), /No encryption key/) - assert(!credentialsProvider.getCredentials('iam')) + assert(!credentialsProvider.getCredentials()) }) it('Handles encrypted IAM credentials', async () => { @@ -429,7 +424,7 @@ describe('Auth', () => { encrypted: true, } await authHandlers.iamUpdateHandler(updateIamRequest) - assert.deepEqual(credentialsProvider.getCredentials('iam'), iamCredentials) + assert.deepEqual(credentialsProvider.getCredentials(), iamCredentials) }) it('Handles encrypted bearer credentials', async () => { @@ -447,7 +442,7 @@ describe('Auth', () => { encrypted: true, } await authHandlers.bearerUpdateHandler(updateBearerRequest) - assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) + assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) }) it('Rejects if encryption algorithm is not direct A256GCM', async () => { @@ -468,7 +463,7 @@ describe('Auth', () => { authHandlers.bearerUpdateHandler(updateBearerRequest), /Header Parameter value not allowed/ ) - assert(!credentialsProvider.getCredentials('bearer')) + assert(!credentialsProvider.getCredentials()) }) it('Verifies JWT claims', async () => { @@ -491,7 +486,7 @@ describe('Auth', () => { authHandlers.bearerUpdateHandler(updateBearerRequest), /"exp" claim timestamp check failed/ ) - assert(!credentialsProvider.getCredentials('bearer')) + assert(!credentialsProvider.getCredentials()) }) }) }) diff --git a/runtimes/runtimes/auth/auth.ts b/runtimes/runtimes/auth/auth.ts index acfa5557..4e056c3b 100644 --- a/runtimes/runtimes/auth/auth.ts +++ b/runtimes/runtimes/auth/auth.ts @@ -32,8 +32,9 @@ export function isBearerCredentials(credentials: Credentials): credentials is Be } export class Auth { - private iamCredentials: IamCredentials | undefined - private bearerCredentials: BearerCredentials | undefined + private currentCredentials: IamCredentials | BearerCredentials | undefined + // private iamCredentials: IamCredentials | undefined + // private bearerCredentials: BearerCredentials | undefined private credentialsProvider: CredentialsProvider private connectionMetadata: ConnectionMetadata | undefined @@ -54,24 +55,26 @@ export class Auth { } this.lspRouter = lspRouter this.credentialsProvider = { - getCredentials: (type: CredentialsType): Credentials | undefined => { - if (type === 'iam') { - return this.iamCredentials + getCredentials: (): Credentials | undefined => { + if (this.currentCredentials === undefined) { + throw new Error(`Credentials undefined`) + } else { + return this.currentCredentials } - if (type === 'bearer') { - return this.bearerCredentials - } - throw new Error(`Unsupported credentials type: ${type}`) }, - hasCredentials: (type: CredentialsType): boolean => { - if (type === 'iam') { - return this.iamCredentials !== undefined - } - if (type === 'bearer') { - return this.bearerCredentials !== undefined + hasCredentials: (): boolean => { + return this.currentCredentials !== undefined + }, + + getCredentialsType: (): CredentialsType | undefined => { + if (this.currentCredentials === undefined) { + throw new Error(`Credentials undefined`) + } else if (isIamCredentials(this.currentCredentials)) { + return 'iam' + } else { + return 'bearer' } - throw new Error(`Unsupported credentials type: ${type}`) }, getConnectionMetadata: () => { @@ -114,15 +117,19 @@ export class Auth { this.setCredentials(iamCredentials) this.connection.console.info('Runtime: Successfully saved IAM credentials') } else { - this.iamCredentials = undefined + this.currentCredentials = undefined throw new Error('Invalid IAM credentials') } }) this.connection.onNotification(iamCredentialsDeleteNotificationType, () => { - this.iamCredentials = undefined - this.lspRouter.onCredentialsDeletion('iam') - this.connection.console.info('Runtime: Deleted IAM credentials') + if (this.currentCredentials !== undefined && isIamCredentials(this.currentCredentials)) { + this.currentCredentials = undefined + this.lspRouter.onCredentialsDeletion('iam') + this.connection.console.info('Runtime: Deleted IAM credentials') + } else { + throw new Error('Attempt to delete IAM credentials when it does not exist') + } }) } @@ -139,16 +146,20 @@ export class Auth { await this.handleBearerCredentialsMetadata(request.metadata) this.connection.console.info('Runtime: Successfully saved bearer credentials') } else { - this.bearerCredentials = undefined + this.currentCredentials = undefined throw new Error('Invalid bearer credentials') } }) this.connection.onNotification(bearerCredentialsDeleteNotificationType, () => { - this.bearerCredentials = undefined - this.connectionMetadata = undefined - this.lspRouter.onCredentialsDeletion('bearer') - this.connection.console.info('Runtime: Deleted bearer credentials') + if (this.currentCredentials !== undefined && isBearerCredentials(this.currentCredentials)) { + this.currentCredentials = undefined + this.connectionMetadata = undefined + this.lspRouter.onCredentialsDeletion('bearer') + this.connection.console.info('Runtime: Deleted bearer credentials') + } else { + throw new Error('Attempt to delete Bearer credentials when it does not exist') + } }) } @@ -166,12 +177,12 @@ export class Auth { private setCredentials(creds: Credentials) { if (this.areValidCredentials(creds)) { if (isIamCredentials(creds)) { - this.iamCredentials = creds as IamCredentials + this.currentCredentials = creds as IamCredentials // Prevent modifying credentials by implementors - Object.freeze(this.iamCredentials) + Object.freeze(this.currentCredentials) } else { - this.bearerCredentials = creds as BearerCredentials - Object.freeze(this.bearerCredentials) + this.currentCredentials = creds as BearerCredentials + Object.freeze(this.currentCredentials) } } } diff --git a/runtimes/runtimes/standalone.test.ts b/runtimes/runtimes/standalone.test.ts index 2f536dc6..ae982148 100644 --- a/runtimes/runtimes/standalone.test.ts +++ b/runtimes/runtimes/standalone.test.ts @@ -53,6 +53,7 @@ describe('standalone', () => { authStub.getCredentialsProvider.returns({ hasCredentials: sinon.stub().returns(false), getCredentials: sinon.stub().returns(undefined), + getCredentialsType: sinon.stub().returns(undefined), getConnectionMetadata: sinon.stub().returns(undefined), getConnectionType: sinon.stub().returns('none'), onCredentialsDeleted: sinon.stub(), @@ -91,6 +92,7 @@ describe('standalone', () => { authStub.getCredentialsProvider.returns({ hasCredentials: sinon.stub().returns(false), getCredentials: sinon.stub().returns(undefined), + getCredentialsType: sinon.stub().returns(undefined), getConnectionMetadata: sinon.stub().returns(undefined), getConnectionType: sinon.stub().returns('none'), onCredentialsDeleted: sinon.stub(), diff --git a/runtimes/server-interface/auth.ts b/runtimes/server-interface/auth.ts index e7f991f9..921e78ca 100644 --- a/runtimes/server-interface/auth.ts +++ b/runtimes/server-interface/auth.ts @@ -8,8 +8,9 @@ export type Credentials = IamCredentials | BearerCredentials export type SsoConnectionType = 'builderId' | 'identityCenter' | 'none' export interface CredentialsProvider { - hasCredentials: (type: CredentialsType) => boolean - getCredentials: (type: CredentialsType) => Credentials | undefined + hasCredentials: () => boolean + getCredentials: () => Credentials | undefined + getCredentialsType: () => CredentialsType | undefined getConnectionMetadata: () => ConnectionMetadata | undefined getConnectionType: () => SsoConnectionType onCredentialsDeleted: (handler: (type: CredentialsType) => void) => void From 1153438ac15eff8377f17ab1f9c6dfa2bb6f297c Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 10 Jun 2025 15:27:42 -0400 Subject: [PATCH 02/49] feat(runtimes): add STS credential types to identity management --- runtimes/protocol/identity-management.ts | 76 +++++++++++++++++++++--- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 1c19d89b..40c33425 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -1,4 +1,5 @@ import { + IamCredentials, LSPErrorCodes, ProgressType, ProtocolNotificationType, @@ -76,6 +77,11 @@ export interface SsoSession { } } +export interface IamSession { + name: string + credentials: IamCredentials +} + export type ListProfilesParams = { // Intentionally left blank } @@ -83,6 +89,7 @@ export type ListProfilesParams = { export interface ListProfilesResult { profiles: Profile[] ssoSessions: SsoSession[] + iamSessions: IamSession[] } // Potential error codes: E_UNKNOWN | E_TIMEOUT | E_RUNTIME_NOT_SUPPORTED | E_CANNOT_READ_SHARED_CONFIG @@ -112,6 +119,7 @@ export const updateProfileOptionsDefaults = { export interface UpdateProfileParams { profile: Profile ssoSession?: SsoSession + iamSession?: IamSession options?: UpdateProfileOptions } @@ -131,7 +139,7 @@ export const updateProfileRequestType = new ProtocolRequestType< >('aws/identity/updateProfile') // getSsoToken -export type SsoTokenId = string // Opaque identifier +export type CredentialId = string // Opaque identifier export type IamIdentityCenterSsoTokenSourceKind = 'IamIdentityCenter' export type AwsBuilderIdSsoTokenSourceKind = 'AwsBuilderId' @@ -199,7 +207,7 @@ export interface GetSsoTokenParams { } export interface SsoToken { - id: SsoTokenId + id: CredentialId accessToken: string // This field is encrypted with JWT like 'update' // Additional fields captured in token cache file may be added here in the future } @@ -218,9 +226,37 @@ export const getSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/getSsoToken') +// getStsCredential +export interface StsCredentials { + id: CredentialId + credentials: IamCredentials +} + +export interface GetStsCredentialOptions { + loginOnInvalidToken?: boolean +} + +export interface GetStsCredentialParams { + clientName: string + options: GetStsCredentialOptions +} + +export interface GetStsCredentialResult { + stsCredential: StsCredentials + updateCredentialsParams: UpdateCredentialsParams +} + +export const getStsCredentialRequestType = new ProtocolRequestType< + GetStsCredentialParams, + GetStsCredentialResult, + never, + AwsResponseError, + void +>('aws/identity/getStsCredential') + // invalidateSsoToken export interface InvalidateSsoTokenParams { - ssoTokenId: SsoTokenId + ssoTokenId: CredentialId } export interface InvalidateSsoTokenResult { @@ -236,22 +272,48 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/invalidateSsoToken') +// invalidateStsCredential +export interface InvalidateStsCredentialParams { + stsCredential: CredentialId +} + +export interface InvalidateStsCredentialResult { + // Intentionally left blank +} + +export const invalidateStsCredentialRequestType = new ProtocolRequestType< + InvalidateStsCredentialParams, + InvalidateStsCredentialResult, + never, + AwsResponseError, + void +>('aws/identity/invalidateStsCredential') + // ssoTokenChanged export type Expired = 'Expired' export type Refreshed = 'Refreshed' -export type SsoTokenChangedKind = Refreshed | Expired +export type CredentialChangedKind = Refreshed | Expired -export const SsoTokenChangedKind = { +export const CredentialChangedKind = { Expired: 'Expired', Refreshed: 'Refreshed', } as const export interface SsoTokenChangedParams { - kind: SsoTokenChangedKind - ssoTokenId: SsoTokenId + kind: CredentialChangedKind + ssoTokenId: CredentialId +} + +export interface StsCredentialChangedParams { + kind: CredentialChangedKind + stsCredentialId: CredentialId } export const ssoTokenChangedRequestType = new ProtocolNotificationType( 'aws/identity/ssoTokenChanged' ) + +export const stsCredentialChangedRequestType = new ProtocolNotificationType( + 'aws/identity/stsCredentialChanged' +) From 54e04695cf7fb742a7d1a8e2bf898b1e478ef322 Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Wed, 11 Jun 2025 14:52:49 -0400 Subject: [PATCH 03/49] fix(runtimes): fix credentialsType --- runtimes/server-interface/auth.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtimes/server-interface/auth.ts b/runtimes/server-interface/auth.ts index 921e78ca..472a9180 100644 --- a/runtimes/server-interface/auth.ts +++ b/runtimes/server-interface/auth.ts @@ -3,7 +3,7 @@ import { IamCredentials, BearerCredentials, ConnectionMetadata } from '../protoc // Exports for Capability implementor export { IamCredentials, BearerCredentials, ConnectionMetadata } -export type CredentialsType = 'iam' | 'bearer' +export type CredentialsType = 'iam' | 'bearer' | undefined export type Credentials = IamCredentials | BearerCredentials export type SsoConnectionType = 'builderId' | 'identityCenter' | 'none' From 3ddab3cfafe886fc3a9426dbd4b30fd30d0d4923 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Wed, 11 Jun 2025 15:22:58 -0400 Subject: [PATCH 04/49] fix(runtimes): fix iamSessions --- runtimes/protocol/identity-management.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 40c33425..b3bfecfe 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -89,7 +89,6 @@ export type ListProfilesParams = { export interface ListProfilesResult { profiles: Profile[] ssoSessions: SsoSession[] - iamSessions: IamSession[] } // Potential error codes: E_UNKNOWN | E_TIMEOUT | E_RUNTIME_NOT_SUPPORTED | E_CANNOT_READ_SHARED_CONFIG @@ -274,7 +273,7 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< // invalidateStsCredential export interface InvalidateStsCredentialParams { - stsCredential: CredentialId + stsCredentialId: CredentialId } export interface InvalidateStsCredentialResult { From 027a29b07b4390dc21d98c13c90e241e70619ae5 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 12 Jun 2025 14:05:13 -0400 Subject: [PATCH 05/49] fix(runtimes): remove error throwing from credentials provider --- runtimes/runtimes/auth/auth.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtimes/runtimes/auth/auth.ts b/runtimes/runtimes/auth/auth.ts index 4e056c3b..ccfbceea 100644 --- a/runtimes/runtimes/auth/auth.ts +++ b/runtimes/runtimes/auth/auth.ts @@ -57,7 +57,7 @@ export class Auth { this.credentialsProvider = { getCredentials: (): Credentials | undefined => { if (this.currentCredentials === undefined) { - throw new Error(`Credentials undefined`) + return undefined } else { return this.currentCredentials } @@ -69,7 +69,7 @@ export class Auth { getCredentialsType: (): CredentialsType | undefined => { if (this.currentCredentials === undefined) { - throw new Error(`Credentials undefined`) + return undefined } else if (isIamCredentials(this.currentCredentials)) { return 'iam' } else { From 024cdd69bdbc77a488aaf40f2b797654d5d63d4e Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Fri, 13 Jun 2025 15:31:29 -0400 Subject: [PATCH 06/49] feat(runtimes): add IAM credentials profile --- runtimes/protocol/identity-management.ts | 86 +++++++++++------------- 1 file changed, 40 insertions(+), 46 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index b3bfecfe..3b9a9a87 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -48,14 +48,15 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' +export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', + IamCredentialProfile: 'IamCredentialProfile', Unknown: 'Unknown', } as const -// Profile and SsoSession use 'settings' property as namescope for their settings to avoid future +// Profile and Session use 'settings' property as namescope for their settings to avoid future // name conflicts with 'kinds', 'name', and future properties as well as making some setting // iteration operations easier. @@ -65,6 +66,9 @@ export interface Profile { settings?: { region?: string sso_session?: string + aws_access_key_id?: string + aws_secret_access_key?: string + aws_session_token?: string } } @@ -77,11 +81,6 @@ export interface SsoSession { } } -export interface IamSession { - name: string - credentials: IamCredentials -} - export type ListProfilesParams = { // Intentionally left blank } @@ -118,7 +117,6 @@ export const updateProfileOptionsDefaults = { export interface UpdateProfileParams { profile: Profile ssoSession?: SsoSession - iamSession?: IamSession options?: UpdateProfileOptions } @@ -225,33 +223,29 @@ export const getSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/getSsoToken') -// getStsCredential -export interface StsCredentials { - id: CredentialId - credentials: IamCredentials -} - -export interface GetStsCredentialOptions { +// getIamCredential +export interface GetIamCredentialOptions { loginOnInvalidToken?: boolean } -export interface GetStsCredentialParams { +export interface GetIamCredentialParams { clientName: string - options: GetStsCredentialOptions + options: GetIamCredentialOptions } -export interface GetStsCredentialResult { - stsCredential: StsCredentials +export interface GetIamCredentialResult { + id: CredentialId + credentials: IamCredentials updateCredentialsParams: UpdateCredentialsParams } -export const getStsCredentialRequestType = new ProtocolRequestType< - GetStsCredentialParams, - GetStsCredentialResult, +export const getIamCredentialRequestType = new ProtocolRequestType< + GetIamCredentialParams, + GetIamCredentialResult, never, AwsResponseError, void ->('aws/identity/getStsCredential') +>('aws/identity/getIamCredential') // invalidateSsoToken export interface InvalidateSsoTokenParams { @@ -272,21 +266,21 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< >('aws/identity/invalidateSsoToken') // invalidateStsCredential -export interface InvalidateStsCredentialParams { - stsCredentialId: CredentialId -} - -export interface InvalidateStsCredentialResult { - // Intentionally left blank -} - -export const invalidateStsCredentialRequestType = new ProtocolRequestType< - InvalidateStsCredentialParams, - InvalidateStsCredentialResult, - never, - AwsResponseError, - void ->('aws/identity/invalidateStsCredential') +// export interface InvalidateStsCredentialParams { +// stsCredentialId: CredentialId +// } + +// export interface InvalidateStsCredentialResult { +// // Intentionally left blank +// } + +// export const invalidateStsCredentialRequestType = new ProtocolRequestType< +// InvalidateStsCredentialParams, +// InvalidateStsCredentialResult, +// never, +// AwsResponseError, +// void +// >('aws/identity/invalidateStsCredential') // ssoTokenChanged export type Expired = 'Expired' @@ -304,15 +298,15 @@ export interface SsoTokenChangedParams { ssoTokenId: CredentialId } -export interface StsCredentialChangedParams { - kind: CredentialChangedKind - stsCredentialId: CredentialId -} - export const ssoTokenChangedRequestType = new ProtocolNotificationType( 'aws/identity/ssoTokenChanged' ) -export const stsCredentialChangedRequestType = new ProtocolNotificationType( - 'aws/identity/stsCredentialChanged' -) +// export interface StsCredentialChangedParams { +// kind: CredentialChangedKind +// stsCredentialId: CredentialId +// } + +// export const stsCredentialChangedRequestType = new ProtocolNotificationType( +// 'aws/identity/stsCredentialChanged' +// ) From e778b84fff077f82afded85992883d00bd3b6a3f Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Fri, 13 Jun 2025 15:31:29 -0400 Subject: [PATCH 07/49] feat(runtimes): add onGetIamCredential endpoint to identity server --- runtimes/protocol/identity-management.ts | 88 +++++++++---------- runtimes/runtimes/base-runtime.ts | 2 + runtimes/runtimes/standalone.ts | 36 ++++++++ .../server-interface/identity-management.ts | 6 ++ 4 files changed, 85 insertions(+), 47 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index b3bfecfe..48f34dbf 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -48,14 +48,15 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' +export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', + IamCredentialProfile: 'IamCredentialProfile', Unknown: 'Unknown', } as const -// Profile and SsoSession use 'settings' property as namescope for their settings to avoid future +// Profile and Session use 'settings' property as namescope for their settings to avoid future // name conflicts with 'kinds', 'name', and future properties as well as making some setting // iteration operations easier. @@ -65,6 +66,9 @@ export interface Profile { settings?: { region?: string sso_session?: string + aws_access_key_id?: string + aws_secret_access_key?: string + aws_session_token?: string } } @@ -77,11 +81,6 @@ export interface SsoSession { } } -export interface IamSession { - name: string - credentials: IamCredentials -} - export type ListProfilesParams = { // Intentionally left blank } @@ -118,7 +117,6 @@ export const updateProfileOptionsDefaults = { export interface UpdateProfileParams { profile: Profile ssoSession?: SsoSession - iamSession?: IamSession options?: UpdateProfileOptions } @@ -225,33 +223,29 @@ export const getSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/getSsoToken') -// getStsCredential -export interface StsCredentials { - id: CredentialId - credentials: IamCredentials -} - -export interface GetStsCredentialOptions { +// getIamCredential +export interface GetIamCredentialOptions { loginOnInvalidToken?: boolean } -export interface GetStsCredentialParams { - clientName: string - options: GetStsCredentialOptions +export interface GetIamCredentialParams { + profileName: string + options: GetIamCredentialOptions } -export interface GetStsCredentialResult { - stsCredential: StsCredentials +export interface GetIamCredentialResult { + id: CredentialId + credentials: IamCredentials updateCredentialsParams: UpdateCredentialsParams } -export const getStsCredentialRequestType = new ProtocolRequestType< - GetStsCredentialParams, - GetStsCredentialResult, +export const getIamCredentialRequestType = new ProtocolRequestType< + GetIamCredentialParams, + GetIamCredentialResult, never, AwsResponseError, void ->('aws/identity/getStsCredential') +>('aws/identity/getIamCredential') // invalidateSsoToken export interface InvalidateSsoTokenParams { @@ -272,21 +266,21 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< >('aws/identity/invalidateSsoToken') // invalidateStsCredential -export interface InvalidateStsCredentialParams { - stsCredentialId: CredentialId -} - -export interface InvalidateStsCredentialResult { - // Intentionally left blank -} - -export const invalidateStsCredentialRequestType = new ProtocolRequestType< - InvalidateStsCredentialParams, - InvalidateStsCredentialResult, - never, - AwsResponseError, - void ->('aws/identity/invalidateStsCredential') +// export interface InvalidateStsCredentialParams { +// stsCredentialId: CredentialId +// } + +// export interface InvalidateStsCredentialResult { +// // Intentionally left blank +// } + +// export const invalidateStsCredentialRequestType = new ProtocolRequestType< +// InvalidateStsCredentialParams, +// InvalidateStsCredentialResult, +// never, +// AwsResponseError, +// void +// >('aws/identity/invalidateStsCredential') // ssoTokenChanged export type Expired = 'Expired' @@ -304,15 +298,15 @@ export interface SsoTokenChangedParams { ssoTokenId: CredentialId } -export interface StsCredentialChangedParams { - kind: CredentialChangedKind - stsCredentialId: CredentialId -} - export const ssoTokenChangedRequestType = new ProtocolNotificationType( 'aws/identity/ssoTokenChanged' ) -export const stsCredentialChangedRequestType = new ProtocolNotificationType( - 'aws/identity/stsCredentialChanged' -) +// export interface StsCredentialChangedParams { +// kind: CredentialChangedKind +// stsCredentialId: CredentialId +// } + +// export const stsCredentialChangedRequestType = new ProtocolNotificationType( +// 'aws/identity/stsCredentialChanged' +// ) diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index 30b3ae3e..3716a004 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -74,6 +74,7 @@ import { observe } from './lsp' import { LspRouter } from './lsp/router/lspRouter' import { LspServer } from './lsp/router/lspServer' import { + getIamCredentialRequestType, getSsoTokenRequestType, invalidateSsoTokenRequestType, listProfilesRequestType, @@ -183,6 +184,7 @@ export const baseRuntime = (connections: { reader: MessageReader; writer: Messag onListProfiles: handler => lspConnection.onRequest(listProfilesRequestType, handler), onUpdateProfile: handler => lspConnection.onRequest(updateProfileRequestType, handler), onGetSsoToken: handler => lspConnection.onRequest(getSsoTokenRequestType, handler), + onGetIamCredential: handler => lspConnection.onRequest(getIamCredentialRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), } diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index ad2f3cbf..cdee2646 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -28,6 +28,9 @@ import { didWriteFileNotificationType, didAppendFileNotificationType, didCreateDirectoryNotificationType, + getIamCredentialRequestType, + GetIamCredentialParams, + IamCredentials, } from '../protocol' import { ProposedFeatures, createConnection } from 'vscode-languageserver/node' import { @@ -315,6 +318,39 @@ export const standalone = (props: RuntimeProps) => { } } + return result + } + ), + onGetIamCredential: handler => + lspConnection.onRequest( + getIamCredentialRequestType, + async (params: GetIamCredentialParams, token: CancellationToken) => { + const result = await handler(params, token) + + // Encrypt the IAM credential before sending to client + if (result && !(result instanceof Error) && encryptionKey) { + const credentials: IamCredentials = { + accessKeyId: await encryptObjectWithKey(result.credentials.accessKeyId, encryptionKey), + secretAccessKey: await encryptObjectWithKey( + result.credentials.secretAccessKey, + encryptionKey + ), + ...(result.credentials.sessionToken + ? { + sessionToken: await encryptObjectWithKey( + result.credentials.sessionToken, + encryptionKey + ), + } + : {}), + } + result.credentials = credentials + if (!result.updateCredentialsParams.encrypted) { + result.updateCredentialsParams.data = credentials + result.updateCredentialsParams.encrypted = true + } + } + return result } ), diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index 5dd1a72a..8240701b 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -1,5 +1,7 @@ import { AwsResponseError, + GetIamCredentialParams, + GetIamCredentialResult, GetSsoTokenParams, GetSsoTokenResult, InvalidateSsoTokenParams, @@ -27,6 +29,10 @@ export type IdentityManagement = { handler: RequestHandler ) => void + onGetIamCredential: ( + handler: RequestHandler + ) => void + onInvalidateSsoToken: ( handler: RequestHandler ) => void From 3e4b9016d6e3636e29c405e19f7515aed3f69e3f Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Fri, 13 Jun 2025 19:06:10 -0400 Subject: [PATCH 08/49] feat(runtimes): add in IamLogout Logic and handlers --- runtimes/protocol/identity-management.ts | 17 +++++++++++++++++ runtimes/runtimes/auth/auth.test.ts | 4 ++-- runtimes/runtimes/base-runtime.ts | 2 ++ runtimes/runtimes/standalone.ts | 2 ++ .../server-interface/identity-management.ts | 6 ++++++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 48f34dbf..ce5d29e8 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -265,6 +265,23 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/invalidateSsoToken') +export interface InvalidateIamCredentialParams { + iamCredentialsId: CredentialId +} + +export interface InvalidateIamCredentialResult { + // Intentionally left blank +} + +// Pontential error codes: E_UNKNOWN | E_TIMEOUT | E_CANNOT_READ_SSO_CACHE | E_CANNOT_WRITE_SSO_CACHE | E_INVALID_TOKEN +export const invalidateIamCredentialRequestType = new ProtocolRequestType< + InvalidateIamCredentialParams, + InvalidateIamCredentialResult, + never, + AwsResponseError, + void +>('aws/identity/invalidateIamToken') + // invalidateStsCredential // export interface InvalidateStsCredentialParams { // stsCredentialId: CredentialId diff --git a/runtimes/runtimes/auth/auth.test.ts b/runtimes/runtimes/auth/auth.test.ts index d4401d53..aab287c2 100644 --- a/runtimes/runtimes/auth/auth.test.ts +++ b/runtimes/runtimes/auth/auth.test.ts @@ -332,8 +332,8 @@ describe('Auth', () => { const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() // TODO: Add test for Unsupported credentials - assert.throws(() => credentialsProvider.hasCredentials(), /Unsupported credentials type/) - assert.throws(() => credentialsProvider.getCredentials(), /Unsupported credentials type/) + // assert.throws(() => credentialsProvider.hasCredentials(), /Unsupported credentials type/) + // assert.throws(() => credentialsProvider.getCredentials(), /Unsupported credentials type/) }) it('getConnectionType return builderId', async () => { diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index 3716a004..a7d0a1e7 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -76,6 +76,7 @@ import { LspServer } from './lsp/router/lspServer' import { getIamCredentialRequestType, getSsoTokenRequestType, + invalidateIamCredentialRequestType, invalidateSsoTokenRequestType, listProfilesRequestType, ssoTokenChangedRequestType, @@ -186,6 +187,7 @@ export const baseRuntime = (connections: { reader: MessageReader; writer: Messag onGetSsoToken: handler => lspConnection.onRequest(getSsoTokenRequestType, handler), onGetIamCredential: handler => lspConnection.onRequest(getIamCredentialRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), + onInvalidateIamCredential: handler => lspConnection.onRequest(invalidateIamCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), } diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index cdee2646..5f621b24 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -51,6 +51,7 @@ import { getSsoTokenRequestType, IdentityManagement, invalidateSsoTokenRequestType, + invalidateIamCredentialRequestType, listProfilesRequestType, ssoTokenChangedRequestType, updateProfileRequestType, @@ -355,6 +356,7 @@ export const standalone = (props: RuntimeProps) => { } ), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), + onInvalidateIamCredential: handler => lspConnection.onRequest(invalidateIamCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), } diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index 8240701b..8d546dbc 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -6,6 +6,8 @@ import { GetSsoTokenResult, InvalidateSsoTokenParams, InvalidateSsoTokenResult, + InvalidateIamCredentialParams, + InvalidateIamCredentialResult, ListProfilesParams, ListProfilesResult, SsoTokenChangedParams, @@ -37,5 +39,9 @@ export type IdentityManagement = { handler: RequestHandler ) => void + onInvalidateIamCredential: ( + handler: RequestHandler + ) => void + sendSsoTokenChanged: (params: SsoTokenChangedParams) => void } From c645ef83a73f00f439a5d61dd4dab493b7943742 Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Mon, 16 Jun 2025 15:20:40 -0400 Subject: [PATCH 09/49] fix(runtimes): delete iam profile when logout --- runtimes/protocol/identity-management.ts | 18 +++++++++++++++++- runtimes/runtimes/base-runtime.ts | 6 ++++++ runtimes/runtimes/standalone.ts | 2 ++ .../server-interface/identity-management.ts | 12 +++++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index ce5d29e8..b5cde88f 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -124,6 +124,14 @@ export interface UpdateProfileResult { // Intentionally left blank } +export interface DeleteProfileParams { + profileName: string +} + +export interface DeleteProfileResult { + // Intentionally left blank +} + // Potential error codes: E_UNKNOWN | E_TIMEOUT | E_RUNTIME_NOT_SUPPORTED | E_CANNOT_READ_SHARED_CONFIG // E_CANNOT_WRITE_SHARED_CONFIG | E_CANNOT_CREATE_PROFILE | E_CANNOT_OVERWRITE_PROFILE | E_CANNOT_CREATE_SSO_SESSION // E_CANNOT_OVERWRITE_SSO_SESSION | E_INVALID_PROFILE | E_INVALID_SSO_SESSION @@ -135,6 +143,14 @@ export const updateProfileRequestType = new ProtocolRequestType< void >('aws/identity/updateProfile') +export const deleteProfileRequestType = new ProtocolRequestType< + DeleteProfileParams, + DeleteProfileResult, + never, + AwsResponseError, + void +>('aws/identity/deleteProfile') + // getSsoToken export type CredentialId = string // Opaque identifier @@ -280,7 +296,7 @@ export const invalidateIamCredentialRequestType = new ProtocolRequestType< never, AwsResponseError, void ->('aws/identity/invalidateIamToken') +>('aws/identity/invalidateIamCredential') // invalidateStsCredential // export interface InvalidateStsCredentialParams { diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index a7d0a1e7..7dda7a54 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -51,6 +51,7 @@ import { buttonClickRequestType, listMcpServersRequestType, mcpServerClickRequestType, + RequestHandler, } from '../protocol' import { createConnection } from 'vscode-languageserver/browser' import { @@ -74,6 +75,10 @@ import { observe } from './lsp' import { LspRouter } from './lsp/router/lspRouter' import { LspServer } from './lsp/router/lspServer' import { + AwsResponseError, + DeleteProfileParams, + deleteProfileRequestType, + DeleteProfileResult, getIamCredentialRequestType, getSsoTokenRequestType, invalidateIamCredentialRequestType, @@ -184,6 +189,7 @@ export const baseRuntime = (connections: { reader: MessageReader; writer: Messag const identityManagement: IdentityManagement = { onListProfiles: handler => lspConnection.onRequest(listProfilesRequestType, handler), onUpdateProfile: handler => lspConnection.onRequest(updateProfileRequestType, handler), + onDeleteProfile: handler => lspConnection.onRequest(deleteProfileRequestType, handler), onGetSsoToken: handler => lspConnection.onRequest(getSsoTokenRequestType, handler), onGetIamCredential: handler => lspConnection.onRequest(getIamCredentialRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index 5f621b24..3d073e5d 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -31,6 +31,7 @@ import { getIamCredentialRequestType, GetIamCredentialParams, IamCredentials, + deleteProfileRequestType, } from '../protocol' import { ProposedFeatures, createConnection } from 'vscode-languageserver/node' import { @@ -355,6 +356,7 @@ export const standalone = (props: RuntimeProps) => { return result } ), + onDeleteProfile: handler => lspConnection.onRequest(deleteProfileRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), onInvalidateIamCredential: handler => lspConnection.onRequest(invalidateIamCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index 8d546dbc..aec5cbd0 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -13,6 +13,8 @@ import { SsoTokenChangedParams, UpdateProfileParams, UpdateProfileResult, + DeleteProfileParams, + DeleteProfileResult, } from '../protocol/identity-management' import { RequestHandler } from '../protocol' @@ -35,12 +37,20 @@ export type IdentityManagement = { handler: RequestHandler ) => void + onDeleteProfile: ( + handler: RequestHandler + ) => void + onInvalidateSsoToken: ( handler: RequestHandler ) => void onInvalidateIamCredential: ( - handler: RequestHandler + handler: RequestHandler< + InvalidateIamCredentialParams, + InvalidateIamCredentialResult | undefined | null, + AwsResponseError + > ) => void sendSsoTokenChanged: (params: SsoTokenChangedParams) => void From ed32392d6992a046b30c500b83b07518a4d9b747 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 17 Jun 2025 17:27:41 -0400 Subject: [PATCH 10/49] fix(runtimes): fix IAM credentials encryption --- runtimes/runtimes/standalone.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index 3d073e5d..00ee4054 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -331,7 +331,7 @@ export const standalone = (props: RuntimeProps) => { // Encrypt the IAM credential before sending to client if (result && !(result instanceof Error) && encryptionKey) { - const credentials: IamCredentials = { + result.credentials = { accessKeyId: await encryptObjectWithKey(result.credentials.accessKeyId, encryptionKey), secretAccessKey: await encryptObjectWithKey( result.credentials.secretAccessKey, @@ -346,9 +346,11 @@ export const standalone = (props: RuntimeProps) => { } : {}), } - result.credentials = credentials if (!result.updateCredentialsParams.encrypted) { - result.updateCredentialsParams.data = credentials + result.updateCredentialsParams.data = await encryptObjectWithKey( + { data: result.updateCredentialsParams.data }, + encryptionKey + ) result.updateCredentialsParams.encrypted = true } } From d6ef1c545f9186814a59fd7df8cc3fd4a808a1f8 Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Thu, 19 Jun 2025 13:55:34 -0400 Subject: [PATCH 11/49] fix(runtimes): fix circular dependency --- runtimes/protocol/inlineCompletionWithReferences.ts | 4 ++-- runtimes/protocol/inlineCompletions.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/runtimes/protocol/inlineCompletionWithReferences.ts b/runtimes/protocol/inlineCompletionWithReferences.ts index 7a59d9dd..b3e05cd1 100644 --- a/runtimes/protocol/inlineCompletionWithReferences.ts +++ b/runtimes/protocol/inlineCompletionWithReferences.ts @@ -3,12 +3,12 @@ import { InlineCompletionItemWithReferences, LogInlineCompletionSessionResultsParams, InlineCompletionRegistrationOptions, - ProtocolNotificationType, - ProtocolRequestType, InlineCompletionParams, PartialResultParams, } from './lsp' +import { ProtocolNotificationType, ProtocolRequestType } from 'vscode-languageserver-protocol' + export type InlineCompletionWithReferencesParams = InlineCompletionParams & PartialResultParams export const inlineCompletionWithReferencesRequestType = new ProtocolRequestType< diff --git a/runtimes/protocol/inlineCompletions.ts b/runtimes/protocol/inlineCompletions.ts index c05f814b..d31f89ec 100644 --- a/runtimes/protocol/inlineCompletions.ts +++ b/runtimes/protocol/inlineCompletions.ts @@ -2,10 +2,11 @@ import { InlineCompletionItem, InlineCompletionList, InlineCompletionParams, - ProtocolRequestType, InlineCompletionRegistrationOptions, } from './lsp' +import { ProtocolRequestType } from 'vscode-languageserver-protocol' + /** * inlineCompletionRequestType defines the custom method that the language client * requests from the server to provide inline completion recommendations. From a8121c530782f61b30a72a71b8660c316f0960a9 Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Thu, 19 Jun 2025 13:55:34 -0400 Subject: [PATCH 12/49] refactor(runtimes): split SsoTokenChangedKind and CredentialsChangedKind --- runtimes/protocol/identity-management.ts | 16 ++++++++++++---- .../protocol/inlineCompletionWithReferences.ts | 4 ++-- runtimes/protocol/inlineCompletions.ts | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index b5cde88f..d30e6275 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -319,15 +319,15 @@ export const invalidateIamCredentialRequestType = new ProtocolRequestType< export type Expired = 'Expired' export type Refreshed = 'Refreshed' -export type CredentialChangedKind = Refreshed | Expired +export type SsoTokenChangedKind = Refreshed | Expired -export const CredentialChangedKind = { +export const SsoTokenChangedKind = { Expired: 'Expired', Refreshed: 'Refreshed', } as const export interface SsoTokenChangedParams { - kind: CredentialChangedKind + kind: SsoTokenChangedKind ssoTokenId: CredentialId } @@ -335,8 +335,16 @@ export const ssoTokenChangedRequestType = new ProtocolNotificationType Date: Tue, 1 Jul 2025 14:21:56 -0400 Subject: [PATCH 13/49] feat: add sts credentials support --- package-lock.json | 2461 ++++++++++++++++------ package.json | 3 + runtimes/protocol/identity-management.ts | 2 + runtimes/runtimes/auth/auth.ts | 11 +- runtimes/server-interface/auth.ts | 10 + types/auth.ts | 1 + 6 files changed, 1838 insertions(+), 650 deletions(-) diff --git a/package-lock.json b/package-lock.json index fda41094..fad823a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,9 @@ "runtimes", "chat-client-ui-types" ], + "dependencies": { + "@aws-sdk/client-sts": "^3.835.0" + }, "devDependencies": { "@commitlint/cli": "^19.8.1", "@commitlint/config-conventional": "^19.8.0", @@ -62,981 +65,2077 @@ "url": "https://github.com/sponsors/philsturgeon" } }, - "node_modules/@aws/chat-client-ui-types": { - "resolved": "chat-client-ui-types", - "link": true - }, - "node_modules/@aws/language-server-runtimes": { - "resolved": "runtimes", - "link": true - }, - "node_modules/@aws/language-server-runtimes-types": { - "resolved": "types", - "link": true + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@commitlint/cli": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz", - "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/format": "^19.8.1", - "@commitlint/lint": "^19.8.1", - "@commitlint/load": "^19.8.1", - "@commitlint/read": "^19.8.1", - "@commitlint/types": "^19.8.1", - "tinyexec": "^1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=14.0.0" } }, - "node_modules/@commitlint/cli/node_modules/cliui": { - "version": "8.0.1", - "dev": true, - "license": "ISC", + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/@commitlint/cli/node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true, - "license": "MIT" + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } }, - "node_modules/@commitlint/cli/node_modules/yargs": { - "version": "17.7.2", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@commitlint/cli/node_modules/yargs-parser": { - "version": "21.1.1", - "dev": true, - "license": "ISC", + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/@commitlint/config-conventional": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", - "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/types": "^19.8.0", - "conventional-changelog-conventionalcommits": "^7.0.2" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=14.0.0" } }, - "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "dev": true, - "license": "ISC", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "compare-func": "^2.0.0" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=14.0.0" } }, - "node_modules/@commitlint/config-validator": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", - "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/client-sso": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.840.0.tgz", + "integrity": "sha512-3Zp+FWN2hhmKdpS0Ragi5V2ZPsZNScE3jlbgoJjzjI/roHZqO+e3/+XFN4TlM0DsPKYJNp+1TAjmhxN6rOnfYA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/types": "^19.8.1", - "ajv": "^8.11.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.840.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.840.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.840.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.840.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.6.0", + "@smithy/fetch-http-handler": "^5.0.4", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.13", + "@smithy/middleware-retry": "^4.1.14", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.0.6", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.21", + "@smithy/util-defaults-mode-node": "^4.0.21", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/ensure": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", - "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/client-sts": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.840.0.tgz", + "integrity": "sha512-h+mu89Wk81Ne+B624GT/pBM5VjuAZueSeQNixhgtQ1QHi6bZzrpz8+lvMSibKO+kXFyQsTLzkyibbxnhLpWQZA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/types": "^19.8.1", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.840.0", + "@aws-sdk/credential-provider-node": "3.840.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.840.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.840.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.840.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.6.0", + "@smithy/fetch-http-handler": "^5.0.4", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.13", + "@smithy/middleware-retry": "^4.1.14", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.0.6", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.21", + "@smithy/util-defaults-mode-node": "^4.0.21", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/execute-rule": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", - "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/core": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.840.0.tgz", + "integrity": "sha512-x3Zgb39tF1h2XpU+yA4OAAQlW6LVEfXNlSedSYJ7HGKXqA/E9h3rWQVpYfhXXVVsLdYXdNw5KBUkoAoruoZSZA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/core": "^3.6.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/format": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", - "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.840.0.tgz", + "integrity": "sha512-EzF6VcJK7XvQ/G15AVEfJzN2mNXU8fcVpXo4bRyr1S6t2q5zx6UPH/XjDbn18xyUmOq01t+r8gG+TmHEVo18fA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0" + "@aws-sdk/core": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/format/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.840.0.tgz", + "integrity": "sha512-wbnUiPGLVea6mXbUh04fu+VJmGkQvmToPeTYdHE8eRZq3NRDi3t3WltT+jArLBKD/4NppRpMjf2ju4coMCz91g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/fetch-http-handler": "^5.0.4", + "@smithy/node-http-handler": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.2", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@commitlint/is-ignored": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", - "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.840.0.tgz", + "integrity": "sha512-7F290BsWydShHb+7InXd+IjJc3mlEIm9I0R57F/Pjl1xZB69MdkhVGCnuETWoBt4g53ktJd6NEjzm/iAhFXFmw==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/types": "^19.8.1", - "semver": "^7.6.0" + "@aws-sdk/core": "3.840.0", + "@aws-sdk/credential-provider-env": "3.840.0", + "@aws-sdk/credential-provider-http": "3.840.0", + "@aws-sdk/credential-provider-process": "3.840.0", + "@aws-sdk/credential-provider-sso": "3.840.0", + "@aws-sdk/credential-provider-web-identity": "3.840.0", + "@aws-sdk/nested-clients": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/lint": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", - "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.840.0.tgz", + "integrity": "sha512-KufP8JnxA31wxklLm63evUPSFApGcH8X86z3mv9SRbpCm5ycgWIGVCTXpTOdgq6rPZrwT9pftzv2/b4mV/9clg==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/is-ignored": "^19.8.1", - "@commitlint/parse": "^19.8.1", - "@commitlint/rules": "^19.8.1", - "@commitlint/types": "^19.8.1" + "@aws-sdk/credential-provider-env": "3.840.0", + "@aws-sdk/credential-provider-http": "3.840.0", + "@aws-sdk/credential-provider-ini": "3.840.0", + "@aws-sdk/credential-provider-process": "3.840.0", + "@aws-sdk/credential-provider-sso": "3.840.0", + "@aws-sdk/credential-provider-web-identity": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/load": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", - "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.840.0.tgz", + "integrity": "sha512-HkDQWHy8tCI4A0Ps2NVtuVYMv9cB4y/IuD/TdOsqeRIAT12h8jDb98BwQPNLAImAOwOWzZJ8Cu0xtSpX7CQhMw==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/execute-rule": "^19.8.1", - "@commitlint/resolve-extends": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", - "cosmiconfig": "^9.0.0", - "cosmiconfig-typescript-loader": "^6.1.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" + "@aws-sdk/core": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.840.0.tgz", + "integrity": "sha512-2qgdtdd6R0Z1y0KL8gzzwFUGmhBHSUx4zy85L2XV1CXhpRNwV71SVWJqLDVV5RVWVf9mg50Pm3AWrUC0xb0pcA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.840.0", + "@aws-sdk/core": "3.840.0", + "@aws-sdk/token-providers": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.840.0.tgz", + "integrity": "sha512-dpEeVXG8uNZSmVXReE4WP0lwoioX2gstk4RnUgrdUE3YaPq8A+hJiVAyc3h+cjDeIqfbsQbZm9qFetKC2LF9dQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.840.0", + "@aws-sdk/nested-clients": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@commitlint/message": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", - "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", + "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/parse": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", - "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", + "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/types": "^19.8.1", - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-parser": "^5.0.0" + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/read": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", - "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", + "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/top-level": "^19.8.1", - "@commitlint/types": "^19.8.1", - "git-raw-commits": "^4.0.0", - "minimist": "^1.2.8", - "tinyexec": "^1.0.0" + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/read/node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true, - "license": "MIT" + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.840.0.tgz", + "integrity": "sha512-hiiMf7BP5ZkAFAvWRcK67Mw/g55ar7OCrvrynC92hunx/xhMkrgSLM0EXIZ1oTn3uql9kH/qqGF0nqsK6K555A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.840.0", + "@smithy/core": "^3.6.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", - "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.840.0.tgz", + "integrity": "sha512-LXYYo9+n4hRqnRSIMXLBb+BLz+cEmjMtTudwK1BF6Bn2RfdDv29KuyeDRrPCS3TwKl7ZKmXUmE9n5UuHAPfBpA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/types": "^19.8.1", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.840.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.840.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.840.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.840.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.6.0", + "@smithy/fetch-http-handler": "^5.0.4", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.13", + "@smithy/middleware-retry": "^4.1.14", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.0.6", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.21", + "@smithy/util-defaults-mode-node": "^4.0.21", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/rules": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", - "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", + "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/ensure": "^19.8.1", - "@commitlint/message": "^19.8.1", - "@commitlint/to-lines": "^19.8.1", - "@commitlint/types": "^19.8.1" + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/to-lines": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", - "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/token-providers": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.840.0.tgz", + "integrity": "sha512-6BuTOLTXvmgwjK7ve7aTg9JaWFdM5UoMolLVPMyh3wTv9Ufalh8oklxYHUBIxsKkBGO2WiHXytveuxH6tAgTYg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.840.0", + "@aws-sdk/nested-clients": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/top-level": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", - "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "license": "Apache-2.0", "dependencies": { - "find-up": "^7.0.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/top-level/node_modules/find-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", - "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.840.0.tgz", + "integrity": "sha512-eqE9ROdg/Kk0rj3poutyRCFauPDXIf/WSvCqFiRDDVi6QOnCv/M0g2XW8/jSvkJlOyaXkNCptapIp6BeeFFGYw==", + "license": "Apache-2.0", "dependencies": { - "locate-path": "^7.2.0", - "path-exists": "^5.0.0", - "unicorn-magic": "^0.1.0" + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "@smithy/util-endpoints": "^3.0.6", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", + "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@commitlint/top-level/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", + "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "license": "Apache-2.0", "dependencies": { - "p-locate": "^6.0.0" + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.840.0.tgz", + "integrity": "sha512-Fy5JUEDQU1tPm2Yw/YqRYYc27W5+QD/J4mYvQvdWjUGZLB5q3eLFMGD35Uc28ZFoGMufPr4OCxK/bRfWROBRHQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@commitlint/top-level/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.821.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", + "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/chat-client-ui-types": { + "resolved": "chat-client-ui-types", + "link": true + }, + "node_modules/@aws/language-server-runtimes": { + "resolved": "runtimes", + "link": true + }, + "node_modules/@aws/language-server-runtimes-types": { + "resolved": "types", + "link": true + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/top-level/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz", + "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" + "@commitlint/format": "^19.8.1", + "@commitlint/lint": "^19.8.1", + "@commitlint/load": "^19.8.1", + "@commitlint/read": "^19.8.1", + "@commitlint/types": "^19.8.1", + "tinyexec": "^1.0.0", + "yargs": "^17.0.0" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "bin": { + "commitlint": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=v18" } }, - "node_modules/@commitlint/top-level/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "8.0.1", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "node_modules/@commitlint/cli/node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", + "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.0", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", + "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.1", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/ensure": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", + "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.1", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", + "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", + "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.1", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", + "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.1", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/lint": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", + "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^19.8.1", + "@commitlint/parse": "^19.8.1", + "@commitlint/rules": "^19.8.1", + "@commitlint/types": "^19.8.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", + "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^19.8.1", + "@commitlint/execute-rule": "^19.8.1", + "@commitlint/resolve-extends": "^19.8.1", + "@commitlint/types": "^19.8.1", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^6.1.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/message": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", + "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", + "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^19.8.1", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", + "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^19.8.1", + "@commitlint/types": "^19.8.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^1.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read/node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", + "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^19.8.1", + "@commitlint/types": "^19.8.1", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", + "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^19.8.1", + "@commitlint/message": "^19.8.1", + "@commitlint/to-lines": "^19.8.1", + "@commitlint/types": "^19.8.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", + "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", + "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", + "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.200.0.tgz", + "integrity": "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/sdk-logs": "0.200.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", + "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.200.0.tgz", + "integrity": "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-transformer": "0.200.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.200.0.tgz", + "integrity": "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-logs": "0.200.0", + "@opentelemetry/sdk-metrics": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.200.0.tgz", + "integrity": "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", + "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.30.0.tgz", + "integrity": "sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "lodash.get": "^4.4.2", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/@commitlint/types": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", - "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", "dev": true, - "license": "MIT", + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@smithy/abort-controller": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", + "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "license": "Apache-2.0", "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=18.0.0" } }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/@smithy/config-resolver": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", + "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", + "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@smithy/middleware-serde": "^4.0.8", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-stream": "^4.2.2", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=18.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", + "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 8" + "node": ">=18.0.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/fetch-http-handler": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", + "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", + "node_modules/@smithy/hash-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", + "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "node_modules/@smithy/invalid-dependency": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", + "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.3.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.200.0.tgz", - "integrity": "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g==", + "node_modules/@smithy/middleware-content-length": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", + "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-exporter-base": "0.200.0", - "@opentelemetry/otlp-transformer": "0.200.0", - "@opentelemetry/sdk-logs": "0.200.0" + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", - "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", + "node_modules/@smithy/middleware-endpoint": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", + "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-exporter-base": "0.200.0", - "@opentelemetry/otlp-transformer": "0.200.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/sdk-metrics": "2.0.0" + "@smithy/core": "^3.6.0", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "node_modules/@smithy/middleware-retry": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.14.tgz", + "integrity": "sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", + "@smithy/service-error-classification": "^4.0.6", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "node_modules/@smithy/middleware-serde": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", + "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.200.0.tgz", - "integrity": "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ==", + "node_modules/@smithy/middleware-stack": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", + "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-transformer": "0.200.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.200.0.tgz", - "integrity": "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw==", + "node_modules/@smithy/node-config-provider": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", + "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/sdk-logs": "0.200.0", - "@opentelemetry/sdk-metrics": "2.0.0", - "@opentelemetry/sdk-trace-base": "2.0.0", - "protobufjs": "^7.3.0" + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "node_modules/@smithy/node-http-handler": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", + "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@smithy/abort-controller": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "node_modules/@smithy/property-provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", + "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", + "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/resources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", + "node_modules/@smithy/querystring-builder": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", + "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@smithy/types": "^4.3.1", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", + "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "node_modules/@smithy/service-error-classification": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", + "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "@smithy/types": "^4.3.1" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.200.0.tgz", - "integrity": "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA==", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", + "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "node_modules/@smithy/signature-v4": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", + "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", + "node_modules/@smithy/smithy-client": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", + "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1" + "@smithy/core": "^3.6.0", + "@smithy/middleware-endpoint": "^4.1.13", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", + "node_modules/@smithy/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", + "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", - "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", + "node_modules/@smithy/url-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", + "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@smithy/querystring-parser": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=18.0.0" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.30.0.tgz", - "integrity": "sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==", + "node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14" + "node": ">=18.0.0" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", + "node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "license": "Apache-2.0", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", "dependencies": { - "type-detect": "4.0.8" + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^3.0.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.2", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.21.tgz", + "integrity": "sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA==", + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^3.0.1", - "lodash.get": "^4.4.2", - "type-detect": "^4.1.0" + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@sinonjs/samsam/node_modules/type-detect": { - "version": "4.1.0", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.21.tgz", + "integrity": "sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.1.4", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.5", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=4" + "node": ">=18.0.0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@smithy/abort-controller": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.2.tgz", - "integrity": "sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==", + "node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/node-http-handler": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz", - "integrity": "sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==", + "node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.2", - "@smithy/protocol-http": "^5.1.0", - "@smithy/querystring-builder": "^4.0.2", - "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/protocol-http": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.0.tgz", - "integrity": "sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==", + "node_modules/@smithy/util-middleware": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", + "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/querystring-builder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz", - "integrity": "sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==", + "node_modules/@smithy/util-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", + "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.2.0", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/service-error-classification": "^4.0.6", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/types": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz", - "integrity": "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==", + "node_modules/@smithy/util-stream": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", + "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", "license": "Apache-2.0", "dependencies": { + "@smithy/fetch-http-handler": "^5.0.4", + "@smithy/node-http-handler": "^4.0.6", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { @@ -1055,6 +2154,19 @@ "node": ">=18.0.0" } }, + "node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@types/chai": { "version": "5.0.1", "dev": true, @@ -1421,6 +2533,12 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.0.1", "dev": true, @@ -2034,6 +3152,28 @@ "version": "3.0.3", "license": "BSD-3-Clause" }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -4033,6 +5173,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/supports-color": { "version": "8.1.1", "dev": true, @@ -4476,6 +5628,19 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "license": "MIT", diff --git a/package.json b/package.json index fd98c3fb..1e94cb87 100644 --- a/package.json +++ b/package.json @@ -75,5 +75,8 @@ "bracketSpacing": true, "arrowParens": "avoid", "endOfLine": "lf" + }, + "dependencies": { + "@aws-sdk/client-sts": "^3.835.0" } } diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index d30e6275..1cb3aa4e 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -69,6 +69,7 @@ export interface Profile { aws_access_key_id?: string aws_secret_access_key?: string aws_session_token?: string + role_arn?: string } } @@ -241,6 +242,7 @@ export const getSsoTokenRequestType = new ProtocolRequestType< // getIamCredential export interface GetIamCredentialOptions { + generateSts?: boolean loginOnInvalidToken?: boolean } diff --git a/runtimes/runtimes/auth/auth.ts b/runtimes/runtimes/auth/auth.ts index ccfbceea..4f94c841 100644 --- a/runtimes/runtimes/auth/auth.ts +++ b/runtimes/runtimes/auth/auth.ts @@ -31,10 +31,17 @@ export function isBearerCredentials(credentials: Credentials): credentials is Be return (credentials as BearerCredentials)?.token !== undefined } +export function hasStsProperties(credentials: IamCredentials): boolean { + return credentials.sessionToken !== undefined && credentials.expiration !== undefined +} + +export function isExpired(credentials: IamCredentials): boolean { + if (!credentials.expiration) return false + return Date.now() >= credentials.expiration.getTime() +} + export class Auth { private currentCredentials: IamCredentials | BearerCredentials | undefined - // private iamCredentials: IamCredentials | undefined - // private bearerCredentials: BearerCredentials | undefined private credentialsProvider: CredentialsProvider private connectionMetadata: ConnectionMetadata | undefined diff --git a/runtimes/server-interface/auth.ts b/runtimes/server-interface/auth.ts index 472a9180..f4b9a138 100644 --- a/runtimes/server-interface/auth.ts +++ b/runtimes/server-interface/auth.ts @@ -7,6 +7,16 @@ export type CredentialsType = 'iam' | 'bearer' | undefined export type Credentials = IamCredentials | BearerCredentials export type SsoConnectionType = 'builderId' | 'identityCenter' | 'none' +// Helper functions for credential type detection +export function hasStsProperties(credentials: IamCredentials): boolean { + return credentials.sessionToken !== undefined && credentials.expiration !== undefined +} + +export function isExpiredCredentials(credentials: IamCredentials): boolean { + if (!credentials.expiration) return false + return Date.now() >= credentials.expiration.getTime() +} + export interface CredentialsProvider { hasCredentials: () => boolean getCredentials: () => Credentials | undefined diff --git a/types/auth.ts b/types/auth.ts index 86a26f76..ead8e1d4 100644 --- a/types/auth.ts +++ b/types/auth.ts @@ -2,6 +2,7 @@ export type IamCredentials = { readonly accessKeyId: string readonly secretAccessKey: string readonly sessionToken?: string + readonly expiration?: Date } export type BearerCredentials = { From 90c6b3db0296e93632a5813004c3576491f68479 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 1 Jul 2025 16:16:30 -0400 Subject: [PATCH 14/49] feat: replace profile deletion with iam invalidation --- runtimes/protocol/identity-management.ts | 21 +++---------------- runtimes/runtimes/base-runtime.ts | 4 ---- runtimes/runtimes/standalone.ts | 2 -- .../server-interface/identity-management.ts | 6 ------ 4 files changed, 3 insertions(+), 30 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 1cb3aa4e..301f62c1 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -48,11 +48,12 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' +export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' | 'EmptyProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', IamCredentialProfile: 'IamCredentialProfile', + EmptyProfile: 'EmptyProfile', Unknown: 'Unknown', } as const @@ -125,14 +126,6 @@ export interface UpdateProfileResult { // Intentionally left blank } -export interface DeleteProfileParams { - profileName: string -} - -export interface DeleteProfileResult { - // Intentionally left blank -} - // Potential error codes: E_UNKNOWN | E_TIMEOUT | E_RUNTIME_NOT_SUPPORTED | E_CANNOT_READ_SHARED_CONFIG // E_CANNOT_WRITE_SHARED_CONFIG | E_CANNOT_CREATE_PROFILE | E_CANNOT_OVERWRITE_PROFILE | E_CANNOT_CREATE_SSO_SESSION // E_CANNOT_OVERWRITE_SSO_SESSION | E_INVALID_PROFILE | E_INVALID_SSO_SESSION @@ -144,14 +137,6 @@ export const updateProfileRequestType = new ProtocolRequestType< void >('aws/identity/updateProfile') -export const deleteProfileRequestType = new ProtocolRequestType< - DeleteProfileParams, - DeleteProfileResult, - never, - AwsResponseError, - void ->('aws/identity/deleteProfile') - // getSsoToken export type CredentialId = string // Opaque identifier @@ -248,7 +233,7 @@ export interface GetIamCredentialOptions { export interface GetIamCredentialParams { profileName: string - options: GetIamCredentialOptions + options?: GetIamCredentialOptions } export interface GetIamCredentialResult { diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index 7e4e474d..e742adab 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -83,9 +83,6 @@ import { LspRouter } from './lsp/router/lspRouter' import { LspServer } from './lsp/router/lspServer' import { AwsResponseError, - DeleteProfileParams, - deleteProfileRequestType, - DeleteProfileResult, getIamCredentialRequestType, getSsoTokenRequestType, invalidateIamCredentialRequestType, @@ -205,7 +202,6 @@ export const baseRuntime = (connections: { reader: MessageReader; writer: Messag const identityManagement: IdentityManagement = { onListProfiles: handler => lspConnection.onRequest(listProfilesRequestType, handler), onUpdateProfile: handler => lspConnection.onRequest(updateProfileRequestType, handler), - onDeleteProfile: handler => lspConnection.onRequest(deleteProfileRequestType, handler), onGetSsoToken: handler => lspConnection.onRequest(getSsoTokenRequestType, handler), onGetIamCredential: handler => lspConnection.onRequest(getIamCredentialRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index b881851a..d28b4c3d 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -31,7 +31,6 @@ import { getIamCredentialRequestType, GetIamCredentialParams, IamCredentials, - deleteProfileRequestType, ShowOpenDialogParams, ShowOpenDialogRequestType, } from '../protocol' @@ -360,7 +359,6 @@ export const standalone = (props: RuntimeProps) => { return result } ), - onDeleteProfile: handler => lspConnection.onRequest(deleteProfileRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), onInvalidateIamCredential: handler => lspConnection.onRequest(invalidateIamCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index aec5cbd0..30d77ca9 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -13,8 +13,6 @@ import { SsoTokenChangedParams, UpdateProfileParams, UpdateProfileResult, - DeleteProfileParams, - DeleteProfileResult, } from '../protocol/identity-management' import { RequestHandler } from '../protocol' @@ -37,10 +35,6 @@ export type IdentityManagement = { handler: RequestHandler ) => void - onDeleteProfile: ( - handler: RequestHandler - ) => void - onInvalidateSsoToken: ( handler: RequestHandler ) => void From f8b21f0e9f8237faced33f4b0d25eb97e74e0724 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 1 Jul 2025 17:55:46 -0400 Subject: [PATCH 15/49] refactor: rename loginOnInvalidToken and add STS error codes --- runtimes/protocol/identity-management.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 301f62c1..c22ca9cb 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -16,11 +16,15 @@ export const AwsErrorCodes = { E_CANNOT_OVERWRITE_SSO_SESSION: 'E_CANNOT_OVERWRITE_SSO_SESSION', E_CANNOT_READ_SHARED_CONFIG: 'E_CANNOT_READ_SHARED_CONFIG', E_CANNOT_READ_SSO_CACHE: 'E_CANNOT_READ_SSO_CACHE', + E_CANNOT_READ_STS_CACHE: 'E_CANNOT_READ_STS_CACHE', E_CANNOT_REFRESH_SSO_TOKEN: 'E_CANNOT_REFRESH_SSO_TOKEN', + E_CANNOT_REFRESH_STS_CREDENTIAL: 'E_CANNOT_REFRESH_STS_CREDENTIAL', E_CANNOT_REGISTER_CLIENT: 'E_CANNOT_REGISTER_CLIENT', E_CANNOT_CREATE_SSO_TOKEN: 'E_CANNOT_CREATE_SSO_TOKEN', + E_CANNOT_CREATE_STS_CREDENTIAL: 'E_CANNOT_CREATE_STS_CREDENTIAL', E_CANNOT_WRITE_SHARED_CONFIG: 'E_CANNOT_WRITE_SHARED_CONFIG', E_CANNOT_WRITE_SSO_CACHE: 'E_CANNOT_WRITE_SSO_CACHE', + E_CANNOT_WRITE_STS_CACHE: 'E_CANNOT_WRITE_STS_CACHE', E_ENCRYPTION_REQUIRED: 'E_ENCRYPTION_REQUIRED', E_INVALID_PROFILE: 'E_INVALID_PROFILE', E_INVALID_SSO_CLIENT: 'E_INVALID_SSO_CLIENT', @@ -30,6 +34,7 @@ export const AwsErrorCodes = { E_RUNTIME_NOT_SUPPORTED: 'E_RUNTIME_NOT_SUPPORTED', E_SSO_SESSION_NOT_FOUND: 'E_SSO_SESSION_NOT_FOUND', E_SSO_TOKEN_EXPIRED: 'E_SSO_TOKEN_EXPIRED', + E_STS_CREDENTIAL_EXPIRED: 'E_STS_CREDENTIAL_EXPIRED', E_SSO_TOKEN_SOURCE_NOT_SUPPORTED: 'E_SSO_TOKEN_SOURCE_NOT_SUPPORTED', E_TIMEOUT: 'E_TIMEOUT', E_UNKNOWN: 'E_UNKNOWN', @@ -227,10 +232,13 @@ export const getSsoTokenRequestType = new ProtocolRequestType< // getIamCredential export interface GetIamCredentialOptions { - generateSts?: boolean - loginOnInvalidToken?: boolean + loginOnInvalidStsCredential?: boolean } +export const getIamCredentialOptionsDefaults = { + loginOnInvalidStsCredential: true, +} satisfies GetIamCredentialOptions + export interface GetIamCredentialParams { profileName: string options?: GetIamCredentialOptions From 154146129ae39fec45922a776cd481b091a99f6a Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Wed, 2 Jul 2025 09:50:59 -0400 Subject: [PATCH 16/49] refactor: rename GetIamCredentialOptions fields --- runtimes/protocol/identity-management.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index c22ca9cb..e2f7cfc9 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -30,6 +30,7 @@ export const AwsErrorCodes = { E_INVALID_SSO_CLIENT: 'E_INVALID_SSO_CLIENT', E_INVALID_SSO_SESSION: 'E_INVALID_SSO_SESSION', E_INVALID_SSO_TOKEN: 'E_INVALID_SSO_TOKEN', + E_INVALID_STS_CREDENTIAL: 'E_INVALID_STS_CREDENTIAL', E_PROFILE_NOT_FOUND: 'E_PROFILE_NOT_FOUND', E_RUNTIME_NOT_SUPPORTED: 'E_RUNTIME_NOT_SUPPORTED', E_SSO_SESSION_NOT_FOUND: 'E_SSO_SESSION_NOT_FOUND', @@ -232,11 +233,13 @@ export const getSsoTokenRequestType = new ProtocolRequestType< // getIamCredential export interface GetIamCredentialOptions { - loginOnInvalidStsCredential?: boolean + assumeRole?: boolean + generateOnInvalidStsCredential?: boolean } export const getIamCredentialOptionsDefaults = { - loginOnInvalidStsCredential: true, + assumeRole: false, + generateOnInvalidStsCredential: true, } satisfies GetIamCredentialOptions export interface GetIamCredentialParams { From bee060550a6f7bf85c8c5e32bc6c4cf8c48e3daa Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Wed, 2 Jul 2025 10:37:02 -0400 Subject: [PATCH 17/49] refactor: remove assumeRole option --- runtimes/protocol/identity-management.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index e2f7cfc9..096f5284 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -233,12 +233,10 @@ export const getSsoTokenRequestType = new ProtocolRequestType< // getIamCredential export interface GetIamCredentialOptions { - assumeRole?: boolean generateOnInvalidStsCredential?: boolean } export const getIamCredentialOptionsDefaults = { - assumeRole: false, generateOnInvalidStsCredential: true, } satisfies GetIamCredentialOptions From 8c6a6362b42093b92d20b4e3a064f297919ed9c9 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Wed, 2 Jul 2025 11:19:35 -0400 Subject: [PATCH 18/49] chore: revert package json --- package-lock.json | 2479 ++++++++++++--------------------------------- package.json | 3 - 2 files changed, 657 insertions(+), 1825 deletions(-) diff --git a/package-lock.json b/package-lock.json index fad823a3..fda41094 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,6 @@ "runtimes", "chat-client-ui-types" ], - "dependencies": { - "@aws-sdk/client-sts": "^3.835.0" - }, "devDependencies": { "@commitlint/cli": "^19.8.1", "@commitlint/config-conventional": "^19.8.0", @@ -65,2087 +62,979 @@ "url": "https://github.com/sponsors/philsturgeon" } }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } + "node_modules/@aws/chat-client-ui-types": { + "resolved": "chat-client-ui-types", + "link": true }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", + "node_modules/@aws/language-server-runtimes": { + "resolved": "runtimes", + "link": true + }, + "node_modules/@aws/language-server-runtimes-types": { + "resolved": "types", + "link": true + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", + "node_modules/@commitlint/cli": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz", + "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" + "@commitlint/format": "^19.8.1", + "@commitlint/lint": "^19.8.1", + "@commitlint/load": "^19.8.1", + "@commitlint/read": "^19.8.1", + "@commitlint/types": "^19.8.1", + "tinyexec": "^1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=v18" } }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" + "node": ">=12" } }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } + "node_modules/@commitlint/cli/node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", + "node_modules/@commitlint/config-conventional": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", + "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" + "@commitlint/types": "^19.8.0", + "conventional-changelog-conventionalcommits": "^7.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.840.0.tgz", - "integrity": "sha512-3Zp+FWN2hhmKdpS0Ragi5V2ZPsZNScE3jlbgoJjzjI/roHZqO+e3/+XFN4TlM0DsPKYJNp+1TAjmhxN6rOnfYA==", - "license": "Apache-2.0", + "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=16" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.840.0.tgz", - "integrity": "sha512-h+mu89Wk81Ne+B624GT/pBM5VjuAZueSeQNixhgtQ1QHi6bZzrpz8+lvMSibKO+kXFyQsTLzkyibbxnhLpWQZA==", - "license": "Apache-2.0", + "node_modules/@commitlint/config-validator": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", + "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/credential-provider-node": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@commitlint/types": "^19.8.1", + "ajv": "^8.11.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/core": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.840.0.tgz", - "integrity": "sha512-x3Zgb39tF1h2XpU+yA4OAAQlW6LVEfXNlSedSYJ7HGKXqA/E9h3rWQVpYfhXXVVsLdYXdNw5KBUkoAoruoZSZA==", - "license": "Apache-2.0", + "node_modules/@commitlint/ensure": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", + "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.6.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" + "@commitlint/types": "^19.8.1", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.840.0.tgz", - "integrity": "sha512-EzF6VcJK7XvQ/G15AVEfJzN2mNXU8fcVpXo4bRyr1S6t2q5zx6UPH/XjDbn18xyUmOq01t+r8gG+TmHEVo18fA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/execute-rule": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", + "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.840.0.tgz", - "integrity": "sha512-wbnUiPGLVea6mXbUh04fu+VJmGkQvmToPeTYdHE8eRZq3NRDi3t3WltT+jArLBKD/4NppRpMjf2ju4coMCz91g==", - "license": "Apache-2.0", + "node_modules/@commitlint/format": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", + "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", - "tslib": "^2.6.2" + "@commitlint/types": "^19.8.1", + "chalk": "^5.3.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.840.0.tgz", - "integrity": "sha512-7F290BsWydShHb+7InXd+IjJc3mlEIm9I0R57F/Pjl1xZB69MdkhVGCnuETWoBt4g53ktJd6NEjzm/iAhFXFmw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/credential-provider-env": "3.840.0", - "@aws-sdk/credential-provider-http": "3.840.0", - "@aws-sdk/credential-provider-process": "3.840.0", - "@aws-sdk/credential-provider-sso": "3.840.0", - "@aws-sdk/credential-provider-web-identity": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.840.0.tgz", - "integrity": "sha512-KufP8JnxA31wxklLm63evUPSFApGcH8X86z3mv9SRbpCm5ycgWIGVCTXpTOdgq6rPZrwT9pftzv2/b4mV/9clg==", - "license": "Apache-2.0", + "node_modules/@commitlint/is-ignored": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", + "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/credential-provider-env": "3.840.0", - "@aws-sdk/credential-provider-http": "3.840.0", - "@aws-sdk/credential-provider-ini": "3.840.0", - "@aws-sdk/credential-provider-process": "3.840.0", - "@aws-sdk/credential-provider-sso": "3.840.0", - "@aws-sdk/credential-provider-web-identity": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@commitlint/types": "^19.8.1", + "semver": "^7.6.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.840.0.tgz", - "integrity": "sha512-HkDQWHy8tCI4A0Ps2NVtuVYMv9cB4y/IuD/TdOsqeRIAT12h8jDb98BwQPNLAImAOwOWzZJ8Cu0xtSpX7CQhMw==", - "license": "Apache-2.0", + "node_modules/@commitlint/lint": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", + "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@commitlint/is-ignored": "^19.8.1", + "@commitlint/parse": "^19.8.1", + "@commitlint/rules": "^19.8.1", + "@commitlint/types": "^19.8.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.840.0.tgz", - "integrity": "sha512-2qgdtdd6R0Z1y0KL8gzzwFUGmhBHSUx4zy85L2XV1CXhpRNwV71SVWJqLDVV5RVWVf9mg50Pm3AWrUC0xb0pcA==", - "license": "Apache-2.0", + "node_modules/@commitlint/load": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", + "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/client-sso": "3.840.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/token-providers": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@commitlint/config-validator": "^19.8.1", + "@commitlint/execute-rule": "^19.8.1", + "@commitlint/resolve-extends": "^19.8.1", + "@commitlint/types": "^19.8.1", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^6.1.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.840.0.tgz", - "integrity": "sha512-dpEeVXG8uNZSmVXReE4WP0lwoioX2gstk4RnUgrdUE3YaPq8A+hJiVAyc3h+cjDeIqfbsQbZm9qFetKC2LF9dQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/message": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", + "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.840.0.tgz", - "integrity": "sha512-hiiMf7BP5ZkAFAvWRcK67Mw/g55ar7OCrvrynC92hunx/xhMkrgSLM0EXIZ1oTn3uql9kH/qqGF0nqsK6K555A==", - "license": "Apache-2.0", + "node_modules/@commitlint/parse": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", + "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@smithy/core": "^3.6.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@commitlint/types": "^19.8.1", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.840.0.tgz", - "integrity": "sha512-LXYYo9+n4hRqnRSIMXLBb+BLz+cEmjMtTudwK1BF6Bn2RfdDv29KuyeDRrPCS3TwKl7ZKmXUmE9n5UuHAPfBpA==", - "license": "Apache-2.0", + "node_modules/@commitlint/read": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", + "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@commitlint/top-level": "^19.8.1", + "@commitlint/types": "^19.8.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^1.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@commitlint/read/node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.840.0.tgz", - "integrity": "sha512-6BuTOLTXvmgwjK7ve7aTg9JaWFdM5UoMolLVPMyh3wTv9Ufalh8oklxYHUBIxsKkBGO2WiHXytveuxH6tAgTYg==", - "license": "Apache-2.0", + "node_modules/@commitlint/resolve-extends": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", + "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@commitlint/config-validator": "^19.8.1", + "@commitlint/types": "^19.8.1", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", - "license": "Apache-2.0", + "node_modules/@commitlint/rules": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", + "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@commitlint/ensure": "^19.8.1", + "@commitlint/message": "^19.8.1", + "@commitlint/to-lines": "^19.8.1", + "@commitlint/types": "^19.8.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.840.0.tgz", - "integrity": "sha512-eqE9ROdg/Kk0rj3poutyRCFauPDXIf/WSvCqFiRDDVi6QOnCv/M0g2XW8/jSvkJlOyaXkNCptapIp6BeeFFGYw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/util-endpoints": "^3.0.6", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/to-lines": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", + "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", - "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", - "license": "Apache-2.0", + "node_modules/@commitlint/top-level": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", + "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "find-up": "^7.0.0" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", - "tslib": "^2.6.2" + "node": ">=v18" } }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.840.0.tgz", - "integrity": "sha512-Fy5JUEDQU1tPm2Yw/YqRYYc27W5+QD/J4mYvQvdWjUGZLB5q3eLFMGD35Uc28ZFoGMufPr4OCxK/bRfWROBRHQ==", - "license": "Apache-2.0", + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "node": ">=18" }, - "engines": { - "node": ">=18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@aws/chat-client-ui-types": { - "resolved": "chat-client-ui-types", - "link": true - }, - "node_modules/@aws/language-server-runtimes": { - "resolved": "runtimes", - "link": true - }, - "node_modules/@aws/language-server-runtimes-types": { - "resolved": "types", - "link": true - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/cli": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz", - "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==", + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/format": "^19.8.1", - "@commitlint/lint": "^19.8.1", - "@commitlint/load": "^19.8.1", - "@commitlint/read": "^19.8.1", - "@commitlint/types": "^19.8.1", - "tinyexec": "^1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/cli/node_modules/cliui": { - "version": "8.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@commitlint/cli/node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/cli/node_modules/yargs": { - "version": "17.7.2", + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@commitlint/cli/node_modules/yargs-parser": { - "version": "21.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", - "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.0", - "conventional-changelog-conventionalcommits": "^7.0.2" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", - "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/ensure": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", - "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", - "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/format": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", - "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/format/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/is-ignored": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", - "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "semver": "^7.6.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/lint": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", - "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/is-ignored": "^19.8.1", - "@commitlint/parse": "^19.8.1", - "@commitlint/rules": "^19.8.1", - "@commitlint/types": "^19.8.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", - "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/execute-rule": "^19.8.1", - "@commitlint/resolve-extends": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", - "cosmiconfig": "^9.0.0", - "cosmiconfig-typescript-loader": "^6.1.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/message": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", - "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/parse": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", - "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-parser": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/read": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", - "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/top-level": "^19.8.1", - "@commitlint/types": "^19.8.1", - "git-raw-commits": "^4.0.0", - "minimist": "^1.2.8", - "tinyexec": "^1.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/read/node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", - "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/types": "^19.8.1", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/rules": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", - "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/ensure": "^19.8.1", - "@commitlint/message": "^19.8.1", - "@commitlint/to-lines": "^19.8.1", - "@commitlint/types": "^19.8.1" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", - "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/top-level": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", - "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^7.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/top-level/node_modules/find-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", - "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.2.0", - "path-exists": "^5.0.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@commitlint/top-level/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/types": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", - "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.200.0.tgz", - "integrity": "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g==", - "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-exporter-base": "0.200.0", - "@opentelemetry/otlp-transformer": "0.200.0", - "@opentelemetry/sdk-logs": "0.200.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", - "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-exporter-base": "0.200.0", - "@opentelemetry/otlp-transformer": "0.200.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/sdk-metrics": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.200.0.tgz", - "integrity": "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-transformer": "0.200.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.200.0.tgz", - "integrity": "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw==", - "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/sdk-logs": "0.200.0", - "@opentelemetry/sdk-metrics": "2.0.0", - "@opentelemetry/sdk-trace-base": "2.0.0", - "protobufjs": "^7.3.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.200.0.tgz", - "integrity": "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA==", - "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", - "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/resources": "2.0.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", - "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", - "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.30.0.tgz", - "integrity": "sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "lodash.get": "^4.4.2", - "type-detect": "^4.1.0" - } - }, - "node_modules/@sinonjs/samsam/node_modules/type-detect": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", - "license": "Apache-2.0", + "node_modules/@commitlint/types": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", + "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "tslib": "^2.6.2" + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=v18" } }, - "node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", - "license": "Apache-2.0", + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=18.0.0" + "node": ">= 8" } }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">= 8" } }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", - "license": "Apache-2.0", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=18.0.0" + "node": ">= 8" } }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "node_modules/@opentelemetry/api": { + "version": "1.9.0", "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" - }, "engines": { - "node": ">=18.0.0" + "node": ">=8.0.0" } }, - "node_modules/@smithy/middleware-retry": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.14.tgz", - "integrity": "sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@opentelemetry/api": "^1.3.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=8.0.0" } }, - "node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.200.0.tgz", + "integrity": "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g==", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/sdk-logs": "0.200.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", + "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, - "node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.200.0.tgz", + "integrity": "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ==", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-transformer": "0.200.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.200.0.tgz", + "integrity": "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw==", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", - "tslib": "^2.6.2" + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-logs": "0.200.0", + "@opentelemetry/sdk-metrics": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0", + "protobufjs": "^7.3.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "node_modules/@opentelemetry/resources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", + "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.1", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.200.0.tgz", + "integrity": "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA==", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", - "tslib": "^2.6.2" + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.1.tgz", + "integrity": "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.1", + "@opentelemetry/resources": "2.0.1" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, - "node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.1.tgz", + "integrity": "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", - "license": "Apache-2.0", + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", + "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", "dependencies": { - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.30.0.tgz", + "integrity": "sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==", "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "tslib": "^2.6.2" - }, "engines": { - "node": ">=18.0.0" + "node": ">=14" } }, - "node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", - "license": "Apache-2.0", + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "license": "BSD-3-Clause", "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.21.tgz", - "integrity": "sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA==", - "license": "Apache-2.0", + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "type-detect": "4.0.8" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.21.tgz", - "integrity": "sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA==", - "license": "Apache-2.0", + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", - "license": "Apache-2.0", + "node_modules/@sinonjs/samsam": { + "version": "8.0.2", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, + "@sinonjs/commons": "^3.0.1", + "lodash.get": "^4.4.2", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=4" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@smithy/abort-controller": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.2.tgz", + "integrity": "sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-middleware": { + "node_modules/@smithy/node-http-handler": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz", + "integrity": "sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/querystring-builder": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "node_modules/@smithy/protocol-http": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.0.tgz", + "integrity": "sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "node_modules/@smithy/querystring-builder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz", + "integrity": "sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.2.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "node_modules/@smithy/types": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.2.0.tgz", + "integrity": "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2154,13 +1043,12 @@ "node": ">=18.0.0" } }, - "node_modules/@smithy/util-utf8": { + "node_modules/@smithy/util-uri-escape": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { @@ -2533,12 +1421,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "2.0.1", "dev": true, @@ -3152,28 +2034,6 @@ "version": "3.0.3", "license": "BSD-3-Clause" }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -5173,18 +4033,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, "node_modules/supports-color": { "version": "8.1.1", "dev": true, @@ -5628,19 +4476,6 @@ "version": "1.0.2", "license": "MIT" }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "license": "MIT", diff --git a/package.json b/package.json index 1e94cb87..fd98c3fb 100644 --- a/package.json +++ b/package.json @@ -75,8 +75,5 @@ "bracketSpacing": true, "arrowParens": "avoid", "endOfLine": "lf" - }, - "dependencies": { - "@aws-sdk/client-sts": "^3.835.0" } } From 62133371d84d17c74b3e68b6f6d1f371c8da7839 Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Wed, 2 Jul 2025 17:11:31 -0400 Subject: [PATCH 19/49] feat(runtimes): enable sts invalidation --- runtimes/protocol/identity-management.ts | 35 +++++-------------- runtimes/runtimes/base-runtime.ts | 5 +-- runtimes/runtimes/standalone.ts | 6 ++-- .../server-interface/identity-management.ts | 13 ++++--- 4 files changed, 24 insertions(+), 35 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 096f5284..78b5a6c1 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -277,39 +277,22 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/invalidateSsoToken') -export interface InvalidateIamCredentialParams { - iamCredentialsId: CredentialId +// invalidateStsCredential +export interface InvalidateStsCredentialParams { + profileName: string } -export interface InvalidateIamCredentialResult { +export interface InvalidateStsCredentialResult { // Intentionally left blank } -// Pontential error codes: E_UNKNOWN | E_TIMEOUT | E_CANNOT_READ_SSO_CACHE | E_CANNOT_WRITE_SSO_CACHE | E_INVALID_TOKEN -export const invalidateIamCredentialRequestType = new ProtocolRequestType< - InvalidateIamCredentialParams, - InvalidateIamCredentialResult, +export const invalidateStsCredentialRequestType = new ProtocolRequestType< + InvalidateStsCredentialParams, + InvalidateStsCredentialResult, never, AwsResponseError, void ->('aws/identity/invalidateIamCredential') - -// invalidateStsCredential -// export interface InvalidateStsCredentialParams { -// stsCredentialId: CredentialId -// } - -// export interface InvalidateStsCredentialResult { -// // Intentionally left blank -// } - -// export const invalidateStsCredentialRequestType = new ProtocolRequestType< -// InvalidateStsCredentialParams, -// InvalidateStsCredentialResult, -// never, -// AwsResponseError, -// void -// >('aws/identity/invalidateStsCredential') +>('aws/identity/invalidateStsCredential') // ssoTokenChanged export type Expired = 'Expired' @@ -331,7 +314,7 @@ export const ssoTokenChangedRequestType = new ProtocolNotificationType lspConnection.onRequest(getSsoTokenRequestType, handler), onGetIamCredential: handler => lspConnection.onRequest(getIamCredentialRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), - onInvalidateIamCredential: handler => lspConnection.onRequest(invalidateIamCredentialRequestType, handler), + onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), + // sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), } // Set up auth without encryption diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index d28b4c3d..9da4ee6f 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -33,6 +33,7 @@ import { IamCredentials, ShowOpenDialogParams, ShowOpenDialogRequestType, + // stsCredentialChangedRequestType, } from '../protocol' import { ProposedFeatures, createConnection } from 'vscode-languageserver/node' import { @@ -53,7 +54,7 @@ import { getSsoTokenRequestType, IdentityManagement, invalidateSsoTokenRequestType, - invalidateIamCredentialRequestType, + invalidateStsCredentialRequestType, listProfilesRequestType, ssoTokenChangedRequestType, updateProfileRequestType, @@ -360,8 +361,9 @@ export const standalone = (props: RuntimeProps) => { } ), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), - onInvalidateIamCredential: handler => lspConnection.onRequest(invalidateIamCredentialRequestType, handler), + onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), + // sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), } const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index 30d77ca9..dc38be9c 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -6,11 +6,12 @@ import { GetSsoTokenResult, InvalidateSsoTokenParams, InvalidateSsoTokenResult, - InvalidateIamCredentialParams, - InvalidateIamCredentialResult, + InvalidateStsCredentialParams, + InvalidateStsCredentialResult, ListProfilesParams, ListProfilesResult, SsoTokenChangedParams, + // StsCredentialChangedParams, UpdateProfileParams, UpdateProfileResult, } from '../protocol/identity-management' @@ -39,13 +40,15 @@ export type IdentityManagement = { handler: RequestHandler ) => void - onInvalidateIamCredential: ( + onInvalidateStsCredential: ( handler: RequestHandler< - InvalidateIamCredentialParams, - InvalidateIamCredentialResult | undefined | null, + InvalidateStsCredentialParams, + InvalidateStsCredentialResult | undefined | null, AwsResponseError > ) => void sendSsoTokenChanged: (params: SsoTokenChangedParams) => void + + // sendStsCredentialChanged: (params: StsCredentialChangedParams) => void } From 6e2c22abcff71a3d66e04e676578c379e3c6a548 Mon Sep 17 00:00:00 2001 From: Yuxian Zhang Date: Thu, 3 Jul 2025 13:25:21 -0400 Subject: [PATCH 20/49] feat(runtimes): enable sts autorefresh --- runtimes/protocol/identity-management.ts | 32 +++++++++---------- runtimes/runtimes/base-runtime.ts | 3 +- runtimes/runtimes/standalone.ts | 4 +-- .../server-interface/identity-management.ts | 4 +-- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 78b5a6c1..73890dcb 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -314,19 +314,19 @@ export const ssoTokenChangedRequestType = new ProtocolNotificationType( -// 'aws/identity/stsCredentialChanged' -// ) +// stsCredentialChanged +export type StsCredentialChangedKind = Refreshed | Expired + +export const StsCredentialChangedKind = { + Expired: 'Expired', + Refreshed: 'Refreshed', +} as const + +export interface StsCredentialChangedParams { + kind: StsCredentialChangedKind + stsCredentialId: CredentialId +} + +export const stsCredentialChangedRequestType = new ProtocolNotificationType( + 'aws/identity/stsCredentialChanged' +) diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index c815171b..6e39d881 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -90,6 +90,7 @@ import { listProfilesRequestType, ssoTokenChangedRequestType, updateProfileRequestType, + stsCredentialChangedRequestType, } from '../protocol/identity-management' import { IdentityManagement } from '../server-interface/identity-management' import { WebBase64Encoding } from './encoding' @@ -207,7 +208,7 @@ export const baseRuntime = (connections: { reader: MessageReader; writer: Messag onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), - // sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), + sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), } // Set up auth without encryption diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index 9da4ee6f..c52e132d 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -33,7 +33,7 @@ import { IamCredentials, ShowOpenDialogParams, ShowOpenDialogRequestType, - // stsCredentialChangedRequestType, + stsCredentialChangedRequestType, } from '../protocol' import { ProposedFeatures, createConnection } from 'vscode-languageserver/node' import { @@ -363,7 +363,7 @@ export const standalone = (props: RuntimeProps) => { onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), - // sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), + sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), } const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index dc38be9c..28e79ebb 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -11,7 +11,7 @@ import { ListProfilesParams, ListProfilesResult, SsoTokenChangedParams, - // StsCredentialChangedParams, + StsCredentialChangedParams, UpdateProfileParams, UpdateProfileResult, } from '../protocol/identity-management' @@ -50,5 +50,5 @@ export type IdentityManagement = { sendSsoTokenChanged: (params: SsoTokenChangedParams) => void - // sendStsCredentialChanged: (params: StsCredentialChangedParams) => void + sendStsCredentialChanged: (params: StsCredentialChangedParams) => void } From 99d4a83f0a4ce5d591000a108144d21b5d300ca3 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 7 Jul 2025 09:45:20 -0400 Subject: [PATCH 21/49] refactor: revert unnecessary changes --- runtimes/runtimes/auth/auth.test.ts | 63 ++++++++++++++++------------- runtimes/runtimes/auth/auth.ts | 25 ++++++++---- runtimes/server-interface/auth.ts | 14 +------ 3 files changed, 53 insertions(+), 49 deletions(-) diff --git a/runtimes/runtimes/auth/auth.test.ts b/runtimes/runtimes/auth/auth.test.ts index aab287c2..ab6a9296 100644 --- a/runtimes/runtimes/auth/auth.test.ts +++ b/runtimes/runtimes/auth/auth.test.ts @@ -128,15 +128,15 @@ describe('Auth', () => { const auth = new Auth(serverLspConnectionMock, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials()) + assert(!credentialsProvider.hasCredentials('iam')) await authHandlers.iamUpdateHandler(updateRequest) - assert(credentialsProvider.hasCredentials() && credentialsProvider.getCredentialsType() === 'iam') - assert.deepEqual(credentialsProvider.getCredentials(), iamCredentials) + assert(credentialsProvider.hasCredentials('iam')) + assert.deepEqual(credentialsProvider.getCredentials('iam'), iamCredentials) authHandlers.iamDeleteHandler() - assert(!credentialsProvider.hasCredentials()) - assert(credentialsProvider.getCredentials() === undefined) + assert(!credentialsProvider.hasCredentials('iam')) + assert(credentialsProvider.getCredentials('iam') === undefined) }) it('Handles Set Bearer credentials request when parameters sent by position', async () => { @@ -147,7 +147,7 @@ describe('Auth', () => { const auth = new Auth(serverConnection, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials()) + assert(!credentialsProvider.hasCredentials('bearer')) // @ts-ignore await clientConnection.sendRequest( @@ -156,8 +156,8 @@ describe('Auth', () => { updateRequest ) - assert(credentialsProvider.hasCredentials() && credentialsProvider.getCredentialsType() === 'bearer') - assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) + assert(credentialsProvider.hasCredentials('bearer')) + assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) }) it('Handles Set Bearer credentials request', async () => { @@ -168,12 +168,12 @@ describe('Auth', () => { const auth = new Auth(serverConnection, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials()) + assert(!credentialsProvider.hasCredentials('bearer')) await clientConnection.sendRequest(credentialsProtocolMethodNames.bearerCredentialsUpdate, updateRequest) - assert(credentialsProvider.hasCredentials() && credentialsProvider.getCredentialsType() === 'bearer') - assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) + assert(credentialsProvider.hasCredentials('bearer')) + assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) }) it('Updates connection metadata on receiving Set Bearer credentials request with metadata', async () => { @@ -238,7 +238,7 @@ describe('Auth', () => { await clientConnection.sendRequest(credentialsProtocolMethodNames.bearerCredentialsUpdate, updateRequest) assert.deepEqual(credentialsProvider.getConnectionMetadata(), undefined) - assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) + assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) }) it('Handles Bearer credentials delete request', done => { @@ -249,11 +249,11 @@ describe('Auth', () => { const auth = new Auth(serverConnection, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - assert(!credentialsProvider.hasCredentials()) + assert(!credentialsProvider.hasCredentials('bearer')) serverConnection.onNotification(credentialsProtocolMethodNames.bearerCredentialsDelete, () => { - assert(!credentialsProvider.hasCredentials()) - assert(credentialsProvider.getCredentials() === undefined) + assert(!credentialsProvider.hasCredentials('bearer')) + assert(credentialsProvider.getCredentials('bearer') === undefined) done() }) clientConnection.sendNotification(credentialsProtocolMethodNames.bearerCredentialsDelete, updateRequest) @@ -272,7 +272,7 @@ describe('Auth', () => { const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() await assert.rejects(authHandlers.iamUpdateHandler(updateIamRequest), /Invalid IAM credentials/) - assert(!credentialsProvider.getCredentials()) + assert(!credentialsProvider.getCredentials('iam')) }) it('Rejects when bearer credentials are invalid', async () => { @@ -287,7 +287,7 @@ describe('Auth', () => { const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() await assert.rejects(authHandlers.bearerUpdateHandler(updateBearerRequest), /Invalid bearer credentials/) - assert(!credentialsProvider.getCredentials()) + assert(!credentialsProvider.getCredentials('bearer')) }) describe('Credentials provider', () => { @@ -301,12 +301,12 @@ describe('Auth', () => { await authHandlers.iamUpdateHandler(updateIamRequest) - let creds: any = credentialsProvider.getCredentials() + let creds: any = credentialsProvider.getCredentials('iam') const initialAccessKey = creds.accessKeyId assert.throws(() => (creds.accessKeyId = 'anotherKey'), /Cannot assign to read only property/) creds = {} - assert((credentialsProvider.getCredentials() as IamCredentials).accessKeyId === initialAccessKey) + assert((credentialsProvider.getCredentials('iam') as IamCredentials).accessKeyId === initialAccessKey) }) it('Prevents modifying Bearer credentials object', async () => { @@ -320,20 +320,25 @@ describe('Auth', () => { await authHandlers.bearerUpdateHandler(updateBearerRequest) - let creds: any = credentialsProvider.getCredentials() + let creds: any = credentialsProvider.getCredentials('bearer') const initialToken = creds.token assert.throws(() => (creds.token = 'anotherToken'), /Cannot assign to read only property/) creds = {} - assert((credentialsProvider.getCredentials() as BearerCredentials).token === initialToken) + assert((credentialsProvider.getCredentials('bearer') as BearerCredentials).token === initialToken) }) it('Throws on unsupported type', async () => { const auth = new Auth(serverLspConnectionMock, lspRouter) const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() - // TODO: Add test for Unsupported credentials - // assert.throws(() => credentialsProvider.hasCredentials(), /Unsupported credentials type/) - // assert.throws(() => credentialsProvider.getCredentials(), /Unsupported credentials type/) + assert.throws( + () => credentialsProvider.hasCredentials('unsupported_type' as CredentialsType), + /Unsupported credentials type/ + ) + assert.throws( + () => credentialsProvider.getCredentials('unsupported_type' as CredentialsType), + /Unsupported credentials type/ + ) }) it('getConnectionType return builderId', async () => { @@ -406,7 +411,7 @@ describe('Auth', () => { await assert.rejects(authHandlers.iamUpdateHandler(updateIamRequest), /No encryption key/) - assert(!credentialsProvider.getCredentials()) + assert(!credentialsProvider.getCredentials('iam')) }) it('Handles encrypted IAM credentials', async () => { @@ -424,7 +429,7 @@ describe('Auth', () => { encrypted: true, } await authHandlers.iamUpdateHandler(updateIamRequest) - assert.deepEqual(credentialsProvider.getCredentials(), iamCredentials) + assert.deepEqual(credentialsProvider.getCredentials('iam'), iamCredentials) }) it('Handles encrypted bearer credentials', async () => { @@ -442,7 +447,7 @@ describe('Auth', () => { encrypted: true, } await authHandlers.bearerUpdateHandler(updateBearerRequest) - assert.deepEqual(credentialsProvider.getCredentials(), bearerCredentials) + assert.deepEqual(credentialsProvider.getCredentials('bearer'), bearerCredentials) }) it('Rejects if encryption algorithm is not direct A256GCM', async () => { @@ -463,7 +468,7 @@ describe('Auth', () => { authHandlers.bearerUpdateHandler(updateBearerRequest), /Header Parameter value not allowed/ ) - assert(!credentialsProvider.getCredentials()) + assert(!credentialsProvider.getCredentials('bearer')) }) it('Verifies JWT claims', async () => { @@ -486,7 +491,7 @@ describe('Auth', () => { authHandlers.bearerUpdateHandler(updateBearerRequest), /"exp" claim timestamp check failed/ ) - assert(!credentialsProvider.getCredentials()) + assert(!credentialsProvider.getCredentials('bearer')) }) }) }) diff --git a/runtimes/runtimes/auth/auth.ts b/runtimes/runtimes/auth/auth.ts index 4f94c841..fe825f52 100644 --- a/runtimes/runtimes/auth/auth.ts +++ b/runtimes/runtimes/auth/auth.ts @@ -22,12 +22,12 @@ import { OperationalTelemetryProvider, TELEMETRY_SCOPES } from '../operational-t export const BUILDER_ID_START_URL = 'https://view.awsapps.com/start' -export function isIamCredentials(credentials: Credentials): credentials is IamCredentials { +export function isIamCredentials(credentials?: Credentials): credentials is IamCredentials { const iamCredentials = credentials as IamCredentials return iamCredentials?.accessKeyId !== undefined && iamCredentials?.secretAccessKey !== undefined } -export function isBearerCredentials(credentials: Credentials): credentials is BearerCredentials { +export function isBearerCredentials(credentials?: Credentials): credentials is BearerCredentials { return (credentials as BearerCredentials)?.token !== undefined } @@ -62,15 +62,24 @@ export class Auth { } this.lspRouter = lspRouter this.credentialsProvider = { - getCredentials: (): Credentials | undefined => { - if (this.currentCredentials === undefined) { - return undefined - } else { - return this.currentCredentials + getCredentials: (type?: CredentialsType): Credentials | undefined => { + if ( + (type === 'iam' && !isIamCredentials(this.currentCredentials)) || + (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) + ) { + throw new Error(`Current credentials do not match the type: ${type}`) } + return this.currentCredentials }, - hasCredentials: (): boolean => { + hasCredentials: (type?: CredentialsType): boolean => { + // If the requested and actual credentials types are different, return false + if ( + (type === 'iam' && !isIamCredentials(this.currentCredentials)) || + (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) + ) { + return false + } return this.currentCredentials !== undefined }, diff --git a/runtimes/server-interface/auth.ts b/runtimes/server-interface/auth.ts index f4b9a138..2715491f 100644 --- a/runtimes/server-interface/auth.ts +++ b/runtimes/server-interface/auth.ts @@ -7,19 +7,9 @@ export type CredentialsType = 'iam' | 'bearer' | undefined export type Credentials = IamCredentials | BearerCredentials export type SsoConnectionType = 'builderId' | 'identityCenter' | 'none' -// Helper functions for credential type detection -export function hasStsProperties(credentials: IamCredentials): boolean { - return credentials.sessionToken !== undefined && credentials.expiration !== undefined -} - -export function isExpiredCredentials(credentials: IamCredentials): boolean { - if (!credentials.expiration) return false - return Date.now() >= credentials.expiration.getTime() -} - export interface CredentialsProvider { - hasCredentials: () => boolean - getCredentials: () => Credentials | undefined + hasCredentials: (type?: CredentialsType) => boolean + getCredentials: (type?: CredentialsType) => Credentials | undefined getCredentialsType: () => CredentialsType | undefined getConnectionMetadata: () => ConnectionMetadata | undefined getConnectionType: () => SsoConnectionType From 04501312b028ab39f2d2083a78a81737c05e6944 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 7 Jul 2025 10:16:58 -0400 Subject: [PATCH 22/49] fix: pass local unit tests --- runtimes/runtimes/auth/auth.ts | 36 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/runtimes/runtimes/auth/auth.ts b/runtimes/runtimes/auth/auth.ts index fe825f52..d2e7daf8 100644 --- a/runtimes/runtimes/auth/auth.ts +++ b/runtimes/runtimes/auth/auth.ts @@ -63,24 +63,30 @@ export class Auth { this.lspRouter = lspRouter this.credentialsProvider = { getCredentials: (type?: CredentialsType): Credentials | undefined => { - if ( - (type === 'iam' && !isIamCredentials(this.currentCredentials)) || - (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) - ) { - throw new Error(`Current credentials do not match the type: ${type}`) + if (!type || type === 'iam' || type === 'bearer') { + if ( + (type === 'iam' && !isIamCredentials(this.currentCredentials)) || + (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) + ) { + return undefined + } + return this.currentCredentials } - return this.currentCredentials + throw new Error(`Unsupported credentials type: ${type}`) }, hasCredentials: (type?: CredentialsType): boolean => { - // If the requested and actual credentials types are different, return false - if ( - (type === 'iam' && !isIamCredentials(this.currentCredentials)) || - (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) - ) { - return false + if (!type || type === 'iam' || type === 'bearer') { + // If the requested and actual credentials types are different, return false + if ( + (type === 'iam' && !isIamCredentials(this.currentCredentials)) || + (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) + ) { + return false + } + return this.currentCredentials !== undefined } - return this.currentCredentials !== undefined + throw new Error(`Unsupported credentials type: ${type}`) }, getCredentialsType: (): CredentialsType | undefined => { @@ -88,8 +94,10 @@ export class Auth { return undefined } else if (isIamCredentials(this.currentCredentials)) { return 'iam' - } else { + } else if (isBearerCredentials(this.currentCredentials)) { return 'bearer' + } else { + throw new Error(`Unexpected credentials type`) } }, From 22f77b025969df10bbc75b4fb59a2e554387c3d1 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 7 Jul 2025 12:03:34 -0400 Subject: [PATCH 23/49] feat(runtimes): add support for IAM and STS credentials management --- runtimes/protocol/identity-management.ts | 87 +++++++++++++++++-- runtimes/runtimes/base-runtime.ts | 7 ++ runtimes/runtimes/standalone.ts | 42 +++++++++ .../server-interface/identity-management.ts | 19 ++++ types/auth.ts | 1 + 5 files changed, 150 insertions(+), 6 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 1c19d89b..73890dcb 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -1,4 +1,5 @@ import { + IamCredentials, LSPErrorCodes, ProgressType, ProtocolNotificationType, @@ -15,20 +16,26 @@ export const AwsErrorCodes = { E_CANNOT_OVERWRITE_SSO_SESSION: 'E_CANNOT_OVERWRITE_SSO_SESSION', E_CANNOT_READ_SHARED_CONFIG: 'E_CANNOT_READ_SHARED_CONFIG', E_CANNOT_READ_SSO_CACHE: 'E_CANNOT_READ_SSO_CACHE', + E_CANNOT_READ_STS_CACHE: 'E_CANNOT_READ_STS_CACHE', E_CANNOT_REFRESH_SSO_TOKEN: 'E_CANNOT_REFRESH_SSO_TOKEN', + E_CANNOT_REFRESH_STS_CREDENTIAL: 'E_CANNOT_REFRESH_STS_CREDENTIAL', E_CANNOT_REGISTER_CLIENT: 'E_CANNOT_REGISTER_CLIENT', E_CANNOT_CREATE_SSO_TOKEN: 'E_CANNOT_CREATE_SSO_TOKEN', + E_CANNOT_CREATE_STS_CREDENTIAL: 'E_CANNOT_CREATE_STS_CREDENTIAL', E_CANNOT_WRITE_SHARED_CONFIG: 'E_CANNOT_WRITE_SHARED_CONFIG', E_CANNOT_WRITE_SSO_CACHE: 'E_CANNOT_WRITE_SSO_CACHE', + E_CANNOT_WRITE_STS_CACHE: 'E_CANNOT_WRITE_STS_CACHE', E_ENCRYPTION_REQUIRED: 'E_ENCRYPTION_REQUIRED', E_INVALID_PROFILE: 'E_INVALID_PROFILE', E_INVALID_SSO_CLIENT: 'E_INVALID_SSO_CLIENT', E_INVALID_SSO_SESSION: 'E_INVALID_SSO_SESSION', E_INVALID_SSO_TOKEN: 'E_INVALID_SSO_TOKEN', + E_INVALID_STS_CREDENTIAL: 'E_INVALID_STS_CREDENTIAL', E_PROFILE_NOT_FOUND: 'E_PROFILE_NOT_FOUND', E_RUNTIME_NOT_SUPPORTED: 'E_RUNTIME_NOT_SUPPORTED', E_SSO_SESSION_NOT_FOUND: 'E_SSO_SESSION_NOT_FOUND', E_SSO_TOKEN_EXPIRED: 'E_SSO_TOKEN_EXPIRED', + E_STS_CREDENTIAL_EXPIRED: 'E_STS_CREDENTIAL_EXPIRED', E_SSO_TOKEN_SOURCE_NOT_SUPPORTED: 'E_SSO_TOKEN_SOURCE_NOT_SUPPORTED', E_TIMEOUT: 'E_TIMEOUT', E_UNKNOWN: 'E_UNKNOWN', @@ -47,14 +54,16 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' +export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' | 'EmptyProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', + IamCredentialProfile: 'IamCredentialProfile', + EmptyProfile: 'EmptyProfile', Unknown: 'Unknown', } as const -// Profile and SsoSession use 'settings' property as namescope for their settings to avoid future +// Profile and Session use 'settings' property as namescope for their settings to avoid future // name conflicts with 'kinds', 'name', and future properties as well as making some setting // iteration operations easier. @@ -64,6 +73,10 @@ export interface Profile { settings?: { region?: string sso_session?: string + aws_access_key_id?: string + aws_secret_access_key?: string + aws_session_token?: string + role_arn?: string } } @@ -131,7 +144,7 @@ export const updateProfileRequestType = new ProtocolRequestType< >('aws/identity/updateProfile') // getSsoToken -export type SsoTokenId = string // Opaque identifier +export type CredentialId = string // Opaque identifier export type IamIdentityCenterSsoTokenSourceKind = 'IamIdentityCenter' export type AwsBuilderIdSsoTokenSourceKind = 'AwsBuilderId' @@ -199,7 +212,7 @@ export interface GetSsoTokenParams { } export interface SsoToken { - id: SsoTokenId + id: CredentialId accessToken: string // This field is encrypted with JWT like 'update' // Additional fields captured in token cache file may be added here in the future } @@ -218,9 +231,37 @@ export const getSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/getSsoToken') +// getIamCredential +export interface GetIamCredentialOptions { + generateOnInvalidStsCredential?: boolean +} + +export const getIamCredentialOptionsDefaults = { + generateOnInvalidStsCredential: true, +} satisfies GetIamCredentialOptions + +export interface GetIamCredentialParams { + profileName: string + options?: GetIamCredentialOptions +} + +export interface GetIamCredentialResult { + id: CredentialId + credentials: IamCredentials + updateCredentialsParams: UpdateCredentialsParams +} + +export const getIamCredentialRequestType = new ProtocolRequestType< + GetIamCredentialParams, + GetIamCredentialResult, + never, + AwsResponseError, + void +>('aws/identity/getIamCredential') + // invalidateSsoToken export interface InvalidateSsoTokenParams { - ssoTokenId: SsoTokenId + ssoTokenId: CredentialId } export interface InvalidateSsoTokenResult { @@ -236,6 +277,23 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< void >('aws/identity/invalidateSsoToken') +// invalidateStsCredential +export interface InvalidateStsCredentialParams { + profileName: string +} + +export interface InvalidateStsCredentialResult { + // Intentionally left blank +} + +export const invalidateStsCredentialRequestType = new ProtocolRequestType< + InvalidateStsCredentialParams, + InvalidateStsCredentialResult, + never, + AwsResponseError, + void +>('aws/identity/invalidateStsCredential') + // ssoTokenChanged export type Expired = 'Expired' export type Refreshed = 'Refreshed' @@ -249,9 +307,26 @@ export const SsoTokenChangedKind = { export interface SsoTokenChangedParams { kind: SsoTokenChangedKind - ssoTokenId: SsoTokenId + ssoTokenId: CredentialId } export const ssoTokenChangedRequestType = new ProtocolNotificationType( 'aws/identity/ssoTokenChanged' ) + +// stsCredentialChanged +export type StsCredentialChangedKind = Refreshed | Expired + +export const StsCredentialChangedKind = { + Expired: 'Expired', + Refreshed: 'Refreshed', +} as const + +export interface StsCredentialChangedParams { + kind: StsCredentialChangedKind + stsCredentialId: CredentialId +} + +export const stsCredentialChangedRequestType = new ProtocolNotificationType( + 'aws/identity/stsCredentialChanged' +) diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index debc5508..ea21a265 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -83,11 +83,15 @@ import { observe } from './lsp' import { LspRouter } from './lsp/router/lspRouter' import { LspServer } from './lsp/router/lspServer' import { + AwsResponseError, + getIamCredentialRequestType, getSsoTokenRequestType, + invalidateStsCredentialRequestType, invalidateSsoTokenRequestType, listProfilesRequestType, ssoTokenChangedRequestType, updateProfileRequestType, + stsCredentialChangedRequestType, } from '../protocol/identity-management' import { IdentityManagement } from '../server-interface/identity-management' import { WebBase64Encoding } from './encoding' @@ -202,8 +206,11 @@ export const baseRuntime = (connections: { reader: MessageReader; writer: Messag onListProfiles: handler => lspConnection.onRequest(listProfilesRequestType, handler), onUpdateProfile: handler => lspConnection.onRequest(updateProfileRequestType, handler), onGetSsoToken: handler => lspConnection.onRequest(getSsoTokenRequestType, handler), + onGetIamCredential: handler => lspConnection.onRequest(getIamCredentialRequestType, handler), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), + onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), + sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), } // Set up auth without encryption diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index 53a10921..3a36f25b 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -28,8 +28,12 @@ import { didWriteFileNotificationType, didAppendFileNotificationType, didCreateDirectoryNotificationType, + getIamCredentialRequestType, + GetIamCredentialParams, + IamCredentials, ShowOpenDialogParams, ShowOpenDialogRequestType, + stsCredentialChangedRequestType, } from '../protocol' import { ProposedFeatures, createConnection } from 'vscode-languageserver/node' import { @@ -50,6 +54,7 @@ import { getSsoTokenRequestType, IdentityManagement, invalidateSsoTokenRequestType, + invalidateStsCredentialRequestType, listProfilesRequestType, ssoTokenChangedRequestType, updateProfileRequestType, @@ -317,11 +322,48 @@ export const standalone = (props: RuntimeProps) => { } } + return result + } + ), + onGetIamCredential: handler => + lspConnection.onRequest( + getIamCredentialRequestType, + async (params: GetIamCredentialParams, token: CancellationToken) => { + const result = await handler(params, token) + + // Encrypt the IAM credential before sending to client + if (result && !(result instanceof Error) && encryptionKey) { + result.credentials = { + accessKeyId: await encryptObjectWithKey(result.credentials.accessKeyId, encryptionKey), + secretAccessKey: await encryptObjectWithKey( + result.credentials.secretAccessKey, + encryptionKey + ), + ...(result.credentials.sessionToken + ? { + sessionToken: await encryptObjectWithKey( + result.credentials.sessionToken, + encryptionKey + ), + } + : {}), + } + if (!result.updateCredentialsParams.encrypted) { + result.updateCredentialsParams.data = await encryptObjectWithKey( + { data: result.updateCredentialsParams.data }, + encryptionKey + ) + result.updateCredentialsParams.encrypted = true + } + } + return result } ), onInvalidateSsoToken: handler => lspConnection.onRequest(invalidateSsoTokenRequestType, handler), + onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), + sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), } const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index 5dd1a72a..28e79ebb 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -1,12 +1,17 @@ import { AwsResponseError, + GetIamCredentialParams, + GetIamCredentialResult, GetSsoTokenParams, GetSsoTokenResult, InvalidateSsoTokenParams, InvalidateSsoTokenResult, + InvalidateStsCredentialParams, + InvalidateStsCredentialResult, ListProfilesParams, ListProfilesResult, SsoTokenChangedParams, + StsCredentialChangedParams, UpdateProfileParams, UpdateProfileResult, } from '../protocol/identity-management' @@ -27,9 +32,23 @@ export type IdentityManagement = { handler: RequestHandler ) => void + onGetIamCredential: ( + handler: RequestHandler + ) => void + onInvalidateSsoToken: ( handler: RequestHandler ) => void + onInvalidateStsCredential: ( + handler: RequestHandler< + InvalidateStsCredentialParams, + InvalidateStsCredentialResult | undefined | null, + AwsResponseError + > + ) => void + sendSsoTokenChanged: (params: SsoTokenChangedParams) => void + + sendStsCredentialChanged: (params: StsCredentialChangedParams) => void } diff --git a/types/auth.ts b/types/auth.ts index 86a26f76..ead8e1d4 100644 --- a/types/auth.ts +++ b/types/auth.ts @@ -2,6 +2,7 @@ export type IamCredentials = { readonly accessKeyId: string readonly secretAccessKey: string readonly sessionToken?: string + readonly expiration?: Date } export type BearerCredentials = { From d9c4753fe84f6b8f64e17338d386e5d82e8bb401 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 7 Jul 2025 12:21:40 -0400 Subject: [PATCH 24/49] chore: undo unnecessary changes --- runtimes/protocol/identity-management.ts | 2 +- runtimes/runtimes/base-runtime.ts | 1 - types/auth.ts | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 73890dcb..61c83008 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -63,7 +63,7 @@ export const ProfileKind = { Unknown: 'Unknown', } as const -// Profile and Session use 'settings' property as namescope for their settings to avoid future +// Profile and SsoSession use 'settings' property as namescope for their settings to avoid future // name conflicts with 'kinds', 'name', and future properties as well as making some setting // iteration operations easier. diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index ea21a265..3deb3cf9 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -83,7 +83,6 @@ import { observe } from './lsp' import { LspRouter } from './lsp/router/lspRouter' import { LspServer } from './lsp/router/lspServer' import { - AwsResponseError, getIamCredentialRequestType, getSsoTokenRequestType, invalidateStsCredentialRequestType, diff --git a/types/auth.ts b/types/auth.ts index ead8e1d4..86a26f76 100644 --- a/types/auth.ts +++ b/types/auth.ts @@ -2,7 +2,6 @@ export type IamCredentials = { readonly accessKeyId: string readonly secretAccessKey: string readonly sessionToken?: string - readonly expiration?: Date } export type BearerCredentials = { From 9b072f7757910b6cffdf62dad00118a7ce4f985c Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 7 Jul 2025 12:25:21 -0400 Subject: [PATCH 25/49] refactor(runtimes): make type parameter optional in credentialsProvider --- runtimes/runtimes/auth/auth.ts | 93 +++++++++++++++++++--------- runtimes/runtimes/standalone.test.ts | 2 + runtimes/server-interface/auth.ts | 5 +- types/auth.ts | 1 + 4 files changed, 70 insertions(+), 31 deletions(-) diff --git a/runtimes/runtimes/auth/auth.ts b/runtimes/runtimes/auth/auth.ts index acfa5557..d2e7daf8 100644 --- a/runtimes/runtimes/auth/auth.ts +++ b/runtimes/runtimes/auth/auth.ts @@ -22,18 +22,26 @@ import { OperationalTelemetryProvider, TELEMETRY_SCOPES } from '../operational-t export const BUILDER_ID_START_URL = 'https://view.awsapps.com/start' -export function isIamCredentials(credentials: Credentials): credentials is IamCredentials { +export function isIamCredentials(credentials?: Credentials): credentials is IamCredentials { const iamCredentials = credentials as IamCredentials return iamCredentials?.accessKeyId !== undefined && iamCredentials?.secretAccessKey !== undefined } -export function isBearerCredentials(credentials: Credentials): credentials is BearerCredentials { +export function isBearerCredentials(credentials?: Credentials): credentials is BearerCredentials { return (credentials as BearerCredentials)?.token !== undefined } +export function hasStsProperties(credentials: IamCredentials): boolean { + return credentials.sessionToken !== undefined && credentials.expiration !== undefined +} + +export function isExpired(credentials: IamCredentials): boolean { + if (!credentials.expiration) return false + return Date.now() >= credentials.expiration.getTime() +} + export class Auth { - private iamCredentials: IamCredentials | undefined - private bearerCredentials: BearerCredentials | undefined + private currentCredentials: IamCredentials | BearerCredentials | undefined private credentialsProvider: CredentialsProvider private connectionMetadata: ConnectionMetadata | undefined @@ -54,26 +62,45 @@ export class Auth { } this.lspRouter = lspRouter this.credentialsProvider = { - getCredentials: (type: CredentialsType): Credentials | undefined => { - if (type === 'iam') { - return this.iamCredentials - } - if (type === 'bearer') { - return this.bearerCredentials + getCredentials: (type?: CredentialsType): Credentials | undefined => { + if (!type || type === 'iam' || type === 'bearer') { + if ( + (type === 'iam' && !isIamCredentials(this.currentCredentials)) || + (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) + ) { + return undefined + } + return this.currentCredentials } throw new Error(`Unsupported credentials type: ${type}`) }, - hasCredentials: (type: CredentialsType): boolean => { - if (type === 'iam') { - return this.iamCredentials !== undefined - } - if (type === 'bearer') { - return this.bearerCredentials !== undefined + hasCredentials: (type?: CredentialsType): boolean => { + if (!type || type === 'iam' || type === 'bearer') { + // If the requested and actual credentials types are different, return false + if ( + (type === 'iam' && !isIamCredentials(this.currentCredentials)) || + (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) + ) { + return false + } + return this.currentCredentials !== undefined } throw new Error(`Unsupported credentials type: ${type}`) }, + getCredentialsType: (): CredentialsType | undefined => { + if (this.currentCredentials === undefined) { + return undefined + } else if (isIamCredentials(this.currentCredentials)) { + return 'iam' + } else if (isBearerCredentials(this.currentCredentials)) { + return 'bearer' + } else { + throw new Error(`Unexpected credentials type`) + } + }, + getConnectionMetadata: () => { return this.connectionMetadata }, @@ -114,15 +141,19 @@ export class Auth { this.setCredentials(iamCredentials) this.connection.console.info('Runtime: Successfully saved IAM credentials') } else { - this.iamCredentials = undefined + this.currentCredentials = undefined throw new Error('Invalid IAM credentials') } }) this.connection.onNotification(iamCredentialsDeleteNotificationType, () => { - this.iamCredentials = undefined - this.lspRouter.onCredentialsDeletion('iam') - this.connection.console.info('Runtime: Deleted IAM credentials') + if (this.currentCredentials !== undefined && isIamCredentials(this.currentCredentials)) { + this.currentCredentials = undefined + this.lspRouter.onCredentialsDeletion('iam') + this.connection.console.info('Runtime: Deleted IAM credentials') + } else { + throw new Error('Attempt to delete IAM credentials when it does not exist') + } }) } @@ -139,16 +170,20 @@ export class Auth { await this.handleBearerCredentialsMetadata(request.metadata) this.connection.console.info('Runtime: Successfully saved bearer credentials') } else { - this.bearerCredentials = undefined + this.currentCredentials = undefined throw new Error('Invalid bearer credentials') } }) this.connection.onNotification(bearerCredentialsDeleteNotificationType, () => { - this.bearerCredentials = undefined - this.connectionMetadata = undefined - this.lspRouter.onCredentialsDeletion('bearer') - this.connection.console.info('Runtime: Deleted bearer credentials') + if (this.currentCredentials !== undefined && isBearerCredentials(this.currentCredentials)) { + this.currentCredentials = undefined + this.connectionMetadata = undefined + this.lspRouter.onCredentialsDeletion('bearer') + this.connection.console.info('Runtime: Deleted bearer credentials') + } else { + throw new Error('Attempt to delete Bearer credentials when it does not exist') + } }) } @@ -166,12 +201,12 @@ export class Auth { private setCredentials(creds: Credentials) { if (this.areValidCredentials(creds)) { if (isIamCredentials(creds)) { - this.iamCredentials = creds as IamCredentials + this.currentCredentials = creds as IamCredentials // Prevent modifying credentials by implementors - Object.freeze(this.iamCredentials) + Object.freeze(this.currentCredentials) } else { - this.bearerCredentials = creds as BearerCredentials - Object.freeze(this.bearerCredentials) + this.currentCredentials = creds as BearerCredentials + Object.freeze(this.currentCredentials) } } } diff --git a/runtimes/runtimes/standalone.test.ts b/runtimes/runtimes/standalone.test.ts index 7abc0878..63b1c77e 100644 --- a/runtimes/runtimes/standalone.test.ts +++ b/runtimes/runtimes/standalone.test.ts @@ -53,6 +53,7 @@ describe('standalone', () => { authStub.getCredentialsProvider.returns({ hasCredentials: sinon.stub().returns(false), getCredentials: sinon.stub().returns(undefined), + getCredentialsType: sinon.stub().returns(undefined), getConnectionMetadata: sinon.stub().returns(undefined), getConnectionType: sinon.stub().returns('none'), onCredentialsDeleted: sinon.stub(), @@ -91,6 +92,7 @@ describe('standalone', () => { authStub.getCredentialsProvider.returns({ hasCredentials: sinon.stub().returns(false), getCredentials: sinon.stub().returns(undefined), + getCredentialsType: sinon.stub().returns(undefined), getConnectionMetadata: sinon.stub().returns(undefined), getConnectionType: sinon.stub().returns('none'), onCredentialsDeleted: sinon.stub(), diff --git a/runtimes/server-interface/auth.ts b/runtimes/server-interface/auth.ts index e7f991f9..6b0cfa81 100644 --- a/runtimes/server-interface/auth.ts +++ b/runtimes/server-interface/auth.ts @@ -8,8 +8,9 @@ export type Credentials = IamCredentials | BearerCredentials export type SsoConnectionType = 'builderId' | 'identityCenter' | 'none' export interface CredentialsProvider { - hasCredentials: (type: CredentialsType) => boolean - getCredentials: (type: CredentialsType) => Credentials | undefined + hasCredentials: (type?: CredentialsType) => boolean + getCredentials: (type?: CredentialsType) => Credentials | undefined + getCredentialsType: () => CredentialsType | undefined getConnectionMetadata: () => ConnectionMetadata | undefined getConnectionType: () => SsoConnectionType onCredentialsDeleted: (handler: (type: CredentialsType) => void) => void diff --git a/types/auth.ts b/types/auth.ts index 86a26f76..ead8e1d4 100644 --- a/types/auth.ts +++ b/types/auth.ts @@ -2,6 +2,7 @@ export type IamCredentials = { readonly accessKeyId: string readonly secretAccessKey: string readonly sessionToken?: string + readonly expiration?: Date } export type BearerCredentials = { From db626ab8fa1b0cd57b7003581f52e9d7cd8a5758 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 7 Jul 2025 18:09:11 -0400 Subject: [PATCH 26/49] fix: re-add IamCredentials change --- types/auth.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/types/auth.ts b/types/auth.ts index 86a26f76..ead8e1d4 100644 --- a/types/auth.ts +++ b/types/auth.ts @@ -2,6 +2,7 @@ export type IamCredentials = { readonly accessKeyId: string readonly secretAccessKey: string readonly sessionToken?: string + readonly expiration?: Date } export type BearerCredentials = { From b093aec91e3d992b5b8e186d156342bd9958f8c7 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 8 Jul 2025 12:19:10 -0400 Subject: [PATCH 27/49] feat: add credential_process to profile fields --- runtimes/protocol/identity-management.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 73890dcb..2d2f3540 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -77,6 +77,7 @@ export interface Profile { aws_secret_access_key?: string aws_session_token?: string role_arn?: string + credential_process?: string } } From ee1427971eff66430dddb715d43380b16f397039 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Wed, 9 Jul 2025 09:52:24 -0400 Subject: [PATCH 28/49] refactor: revert empty profile --- runtimes/protocol/identity-management.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 2d2f3540..dfb63fe4 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -54,12 +54,11 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' | 'EmptyProfile' +export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', IamCredentialProfile: 'IamCredentialProfile', - EmptyProfile: 'EmptyProfile', Unknown: 'Unknown', } as const From 306c2b0290eb17545f926a89ef99db8479dcb237 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Wed, 9 Jul 2025 09:56:45 -0400 Subject: [PATCH 29/49] chore: revert EmptyProfile change --- runtimes/protocol/identity-management.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 61c83008..dfb63fe4 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -54,16 +54,15 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' | 'EmptyProfile' +export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', IamCredentialProfile: 'IamCredentialProfile', - EmptyProfile: 'EmptyProfile', Unknown: 'Unknown', } as const -// Profile and SsoSession use 'settings' property as namescope for their settings to avoid future +// Profile and Session use 'settings' property as namescope for their settings to avoid future // name conflicts with 'kinds', 'name', and future properties as well as making some setting // iteration operations easier. @@ -77,6 +76,7 @@ export interface Profile { aws_secret_access_key?: string aws_session_token?: string role_arn?: string + credential_process?: string } } From de57f17aae83bb7684e00efe539669de271bb666 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Wed, 9 Jul 2025 11:55:49 -0400 Subject: [PATCH 30/49] feat: add support for IAM MFA --- runtimes/protocol/identity-management.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index dfb63fe4..92a50e50 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -77,6 +77,7 @@ export interface Profile { aws_session_token?: string role_arn?: string credential_process?: string + mfa_serial?: string } } @@ -242,6 +243,7 @@ export const getIamCredentialOptionsDefaults = { export interface GetIamCredentialParams { profileName: string + mfaCode?: string options?: GetIamCredentialOptions } From a63c53b2f8ef94018fec723a84a53fcc394397b9 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 10 Jul 2025 14:08:07 -0400 Subject: [PATCH 31/49] refactor: split IamCredentialProfile into multiple profiles --- runtimes/protocol/identity-management.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 92a50e50..c5d6f36c 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -54,11 +54,20 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' +export type ProfileKind = + | 'Unknown' + | 'SsoTokenProfile' + | 'IamUserProfile' + | 'RoleSourceProfile' + | 'RoleInstanceProfile' + | 'ProcessProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', - IamCredentialProfile: 'IamCredentialProfile', + IamUserProfile: 'IamUserProfile', + RoleSourceProfile: 'RoleSourceProfile', + RoleInstanceProfile: 'RoleInstanceProfile', + ProcessProfile: 'ProcessProfile', Unknown: 'Unknown', } as const @@ -76,7 +85,10 @@ export interface Profile { aws_secret_access_key?: string aws_session_token?: string role_arn?: string + role_session_name?: string credential_process?: string + credential_source?: string + source_profile?: string mfa_serial?: string } } From fbfb2d622eaa755e3f46eacab28a81175db3f5ab Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 10 Jul 2025 14:08:07 -0400 Subject: [PATCH 32/49] refactor: split IamCredentialProfile into multiple profiles --- runtimes/protocol/identity-management.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index dfb63fe4..fb0e1d63 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -54,11 +54,20 @@ export class AwsResponseError extends ResponseError { } // listProfiles -export type ProfileKind = 'Unknown' | 'SsoTokenProfile' | 'IamCredentialProfile' +export type ProfileKind = + | 'Unknown' + | 'SsoTokenProfile' + | 'IamUserProfile' + | 'RoleSourceProfile' + | 'RoleInstanceProfile' + | 'ProcessProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', - IamCredentialProfile: 'IamCredentialProfile', + IamUserProfile: 'IamUserProfile', + RoleSourceProfile: 'RoleSourceProfile', + RoleInstanceProfile: 'RoleInstanceProfile', + ProcessProfile: 'ProcessProfile', Unknown: 'Unknown', } as const @@ -76,7 +85,11 @@ export interface Profile { aws_secret_access_key?: string aws_session_token?: string role_arn?: string + role_session_name?: string credential_process?: string + credential_source?: string + source_profile?: string + mfa_serial?: string } } From 56fc78a44c5887460201eee38c00c7b7e0bc65e7 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 10 Jul 2025 14:12:49 -0400 Subject: [PATCH 33/49] chore: revert comment --- runtimes/protocol/identity-management.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index fb0e1d63..87127bad 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -71,7 +71,7 @@ export const ProfileKind = { Unknown: 'Unknown', } as const -// Profile and Session use 'settings' property as namescope for their settings to avoid future +// Profile and SsoSession use 'settings' property as namescope for their settings to avoid future // name conflicts with 'kinds', 'name', and future properties as well as making some setting // iteration operations easier. From 939241ba2366ca79656b5a038dcebd2d3b6b0a5d Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 10 Jul 2025 17:36:54 -0400 Subject: [PATCH 34/49] feat: add mfaCode to getIamCredentialParams --- runtimes/protocol/identity-management.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 87127bad..f5bb8f03 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -255,6 +255,7 @@ export const getIamCredentialOptionsDefaults = { export interface GetIamCredentialParams { profileName: string + mfaCode?: string options?: GetIamCredentialOptions } From e69aa7c76d7e0521f3615ff940b32eb544230a53 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 10 Jul 2025 18:09:56 -0400 Subject: [PATCH 35/49] refactor: prefix IAM-related profiles with 'Iam' --- runtimes/protocol/identity-management.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index c5d6f36c..abf10945 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -58,16 +58,16 @@ export type ProfileKind = | 'Unknown' | 'SsoTokenProfile' | 'IamUserProfile' - | 'RoleSourceProfile' - | 'RoleInstanceProfile' - | 'ProcessProfile' + | 'IamRoleSourceProfile' + | 'IamRoleInstanceProfile' + | 'IamProcessProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', IamUserProfile: 'IamUserProfile', - RoleSourceProfile: 'RoleSourceProfile', - RoleInstanceProfile: 'RoleInstanceProfile', - ProcessProfile: 'ProcessProfile', + IamRoleSourceProfile: 'IamRoleSourceProfile', + IamRoleInstanceProfile: 'IamRoleInstanceProfile', + IamProcessProfile: 'IamProcessProfile', Unknown: 'Unknown', } as const From 52b509b51d6c928f496f21ef920c0d8ed0edf0cb Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 10 Jul 2025 18:09:56 -0400 Subject: [PATCH 36/49] refactor: prefix IAM-related profiles with 'Iam' --- runtimes/protocol/identity-management.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index f5bb8f03..39df6ea5 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -58,16 +58,16 @@ export type ProfileKind = | 'Unknown' | 'SsoTokenProfile' | 'IamUserProfile' - | 'RoleSourceProfile' - | 'RoleInstanceProfile' - | 'ProcessProfile' + | 'IamRoleSourceProfile' + | 'IamRoleInstanceProfile' + | 'IamProcessProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', IamUserProfile: 'IamUserProfile', - RoleSourceProfile: 'RoleSourceProfile', - RoleInstanceProfile: 'RoleInstanceProfile', - ProcessProfile: 'ProcessProfile', + IamRoleSourceProfile: 'IamRoleSourceProfile', + IamRoleInstanceProfile: 'IamRoleInstanceProfile', + IamProcessProfile: 'IamProcessProfile', Unknown: 'Unknown', } as const From 13974a30378c73fc53f9116e1cf85a660e8ba7cd Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 10 Jul 2025 18:18:00 -0400 Subject: [PATCH 37/49] chore: revert comment change --- runtimes/protocol/identity-management.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index abf10945..39df6ea5 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -71,7 +71,7 @@ export const ProfileKind = { Unknown: 'Unknown', } as const -// Profile and Session use 'settings' property as namescope for their settings to avoid future +// Profile and SsoSession use 'settings' property as namescope for their settings to avoid future // name conflicts with 'kinds', 'name', and future properties as well as making some setting // iteration operations easier. From d38dbb72f173db1a6da967609c2d7c93906b0458 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Fri, 11 Jul 2025 10:09:33 -0400 Subject: [PATCH 38/49] refactor: move encryption into separate function and split credential id --- runtimes/protocol/identity-management.ts | 14 ++--- .../runtimes/auth/standalone/encryption.ts | 43 ++++++++++++++++ runtimes/runtimes/standalone.ts | 51 +++---------------- 3 files changed, 57 insertions(+), 51 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 39df6ea5..973c9bb3 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -157,7 +157,7 @@ export const updateProfileRequestType = new ProtocolRequestType< >('aws/identity/updateProfile') // getSsoToken -export type CredentialId = string // Opaque identifier +export type SsoTokenId = string // Opaque identifier export type IamIdentityCenterSsoTokenSourceKind = 'IamIdentityCenter' export type AwsBuilderIdSsoTokenSourceKind = 'AwsBuilderId' @@ -225,7 +225,7 @@ export interface GetSsoTokenParams { } export interface SsoToken { - id: CredentialId + id: SsoTokenId accessToken: string // This field is encrypted with JWT like 'update' // Additional fields captured in token cache file may be added here in the future } @@ -245,6 +245,8 @@ export const getSsoTokenRequestType = new ProtocolRequestType< >('aws/identity/getSsoToken') // getIamCredential +export type IamCredentialId = string // Opaque identifier + export interface GetIamCredentialOptions { generateOnInvalidStsCredential?: boolean } @@ -260,7 +262,7 @@ export interface GetIamCredentialParams { } export interface GetIamCredentialResult { - id: CredentialId + id: IamCredentialId credentials: IamCredentials updateCredentialsParams: UpdateCredentialsParams } @@ -275,7 +277,7 @@ export const getIamCredentialRequestType = new ProtocolRequestType< // invalidateSsoToken export interface InvalidateSsoTokenParams { - ssoTokenId: CredentialId + ssoTokenId: SsoTokenId } export interface InvalidateSsoTokenResult { @@ -321,7 +323,7 @@ export const SsoTokenChangedKind = { export interface SsoTokenChangedParams { kind: SsoTokenChangedKind - ssoTokenId: CredentialId + ssoTokenId: SsoTokenId } export const ssoTokenChangedRequestType = new ProtocolNotificationType( @@ -338,7 +340,7 @@ export const StsCredentialChangedKind = { export interface StsCredentialChangedParams { kind: StsCredentialChangedKind - stsCredentialId: CredentialId + stsCredentialId: IamCredentialId } export const stsCredentialChangedRequestType = new ProtocolNotificationType( diff --git a/runtimes/runtimes/auth/standalone/encryption.ts b/runtimes/runtimes/auth/standalone/encryption.ts index ebe576dd..4f9dbb5b 100644 --- a/runtimes/runtimes/auth/standalone/encryption.ts +++ b/runtimes/runtimes/auth/standalone/encryption.ts @@ -1,5 +1,6 @@ import { Readable } from 'stream' import { CompactEncrypt } from 'jose' +import { GetIamCredentialResult, GetSsoTokenResult } from '../../../protocol' export function shouldWaitForEncryptionKey(): boolean { return process.argv.some(arg => arg === '--set-credentials-encryption-key') @@ -98,6 +99,48 @@ export function encryptObjectWithKey(request: Object, key: string, alg?: string, .encrypt(keyBuffer) } +/** + * Encrypts the SSO access tokens inside the result object with the provided key + */ +export async function encryptSsoResultWithKey(request: GetSsoTokenResult, key: string): Promise { + if (request.ssoToken.accessToken) { + request.ssoToken.accessToken = await encryptObjectWithKey(request.ssoToken.accessToken, key) + } + if (request.updateCredentialsParams.data && !request.updateCredentialsParams.encrypted) { + request.updateCredentialsParams.data = await encryptObjectWithKey( + // decodeCredentialsRequestToken expects nested 'data' fields + { data: request.updateCredentialsParams.data }, + key + ) + request.updateCredentialsParams.encrypted = true + } + return request +} + +/** + * Encrypts the IAM credentials inside the result object with the provided key + */ +export async function encryptIamResultWithKey( + request: GetIamCredentialResult, + key: string +): Promise { + request.credentials = { + accessKeyId: await encryptObjectWithKey(request.credentials.accessKeyId, key), + secretAccessKey: await encryptObjectWithKey(request.credentials.secretAccessKey, key), + ...(request.credentials.sessionToken + ? { sessionToken: await encryptObjectWithKey(request.credentials.sessionToken, key) } + : {}), + } + if (!request.updateCredentialsParams.encrypted) { + request.updateCredentialsParams.data = await encryptObjectWithKey( + { data: request.updateCredentialsParams.data }, + key + ) + request.updateCredentialsParams.encrypted = true + } + return request +} + /** * Check if a message is an encrypted JWE message with the provided key management algorithm and encoding * As per RFC-7516: diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index 3a36f25b..74a33071 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -30,15 +30,16 @@ import { didCreateDirectoryNotificationType, getIamCredentialRequestType, GetIamCredentialParams, - IamCredentials, ShowOpenDialogParams, ShowOpenDialogRequestType, stsCredentialChangedRequestType, } from '../protocol' import { ProposedFeatures, createConnection } from 'vscode-languageserver/node' import { + encryptIamResultWithKey, EncryptionInitialization, encryptObjectWithKey, + encryptSsoResultWithKey, readEncryptionDetails, shouldWaitForEncryptionKey, validateEncryptionDetails, @@ -302,26 +303,10 @@ export const standalone = (props: RuntimeProps) => { lspConnection.onRequest( getSsoTokenRequestType, async (params: GetSsoTokenParams, token: CancellationToken) => { - const result = await handler(params, token) - - // Encrypt SsoToken.accessToken before sending to client + let result = await handler(params, token) if (result && !(result instanceof Error) && encryptionKey) { - if (result.ssoToken.accessToken) { - result.ssoToken.accessToken = await encryptObjectWithKey( - result.ssoToken.accessToken, - encryptionKey - ) - } - if (result.updateCredentialsParams.data && !result.updateCredentialsParams.encrypted) { - result.updateCredentialsParams.data = await encryptObjectWithKey( - // decodeCredentialsRequestToken expects nested 'data' fields - { data: result.updateCredentialsParams.data }, - encryptionKey - ) - result.updateCredentialsParams.encrypted = true - } + result = await encryptSsoResultWithKey(result, encryptionKey) } - return result } ), @@ -329,34 +314,10 @@ export const standalone = (props: RuntimeProps) => { lspConnection.onRequest( getIamCredentialRequestType, async (params: GetIamCredentialParams, token: CancellationToken) => { - const result = await handler(params, token) - - // Encrypt the IAM credential before sending to client + let result = await handler(params, token) if (result && !(result instanceof Error) && encryptionKey) { - result.credentials = { - accessKeyId: await encryptObjectWithKey(result.credentials.accessKeyId, encryptionKey), - secretAccessKey: await encryptObjectWithKey( - result.credentials.secretAccessKey, - encryptionKey - ), - ...(result.credentials.sessionToken - ? { - sessionToken: await encryptObjectWithKey( - result.credentials.sessionToken, - encryptionKey - ), - } - : {}), - } - if (!result.updateCredentialsParams.encrypted) { - result.updateCredentialsParams.data = await encryptObjectWithKey( - { data: result.updateCredentialsParams.data }, - encryptionKey - ) - result.updateCredentialsParams.encrypted = true - } + result = await encryptIamResultWithKey(result, encryptionKey) } - return result } ), From 0ef95ace9fea4eef483fc56cbfdc5079bf9e65bb Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Fri, 11 Jul 2025 11:17:53 -0400 Subject: [PATCH 39/49] feat: add external_id field to profile --- runtimes/protocol/identity-management.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 973c9bb3..c2643674 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -90,6 +90,7 @@ export interface Profile { credential_source?: string source_profile?: string mfa_serial?: string + external_id?: string } } From 5fb131fa00863c0bcb5f2b075f26f39d841c31b7 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 14 Jul 2025 10:53:37 -0400 Subject: [PATCH 40/49] feat: optionalize permission validation in GetIamCredentialOptions --- runtimes/protocol/identity-management.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index c2643674..481ad02d 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -250,10 +250,12 @@ export type IamCredentialId = string // Opaque identifier export interface GetIamCredentialOptions { generateOnInvalidStsCredential?: boolean + validatePermissions?: boolean } export const getIamCredentialOptionsDefaults = { generateOnInvalidStsCredential: true, + validatePermissions: true, } satisfies GetIamCredentialOptions export interface GetIamCredentialParams { From e6e02204201c8f7e87d106a75d6a6e7d8f10f8a5 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 14 Jul 2025 16:23:15 -0400 Subject: [PATCH 41/49] refactor: move MFA code retrieval into separate request --- runtimes/protocol/identity-management.ts | 19 ++++++++++++++++++- runtimes/runtimes/base-runtime.ts | 2 ++ runtimes/runtimes/standalone.ts | 2 ++ .../server-interface/identity-management.ts | 4 ++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 481ad02d..a8b3b3d7 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -37,6 +37,7 @@ export const AwsErrorCodes = { E_SSO_TOKEN_EXPIRED: 'E_SSO_TOKEN_EXPIRED', E_STS_CREDENTIAL_EXPIRED: 'E_STS_CREDENTIAL_EXPIRED', E_SSO_TOKEN_SOURCE_NOT_SUPPORTED: 'E_SSO_TOKEN_SOURCE_NOT_SUPPORTED', + E_MFA_REQUIRED: 'E_MFA_REQUIRED', E_TIMEOUT: 'E_TIMEOUT', E_UNKNOWN: 'E_UNKNOWN', E_CANCELLED: 'E_CANCELLED', @@ -260,7 +261,6 @@ export const getIamCredentialOptionsDefaults = { export interface GetIamCredentialParams { profileName: string - mfaCode?: string options?: GetIamCredentialOptions } @@ -278,6 +278,23 @@ export const getIamCredentialRequestType = new ProtocolRequestType< void >('aws/identity/getIamCredential') +// getMfaCode +export interface GetMfaCodeParams { + // Intentionally left blank +} + +export interface GetMfaCodeResult { + code: string +} + +export const getMfaCodeRequestType = new ProtocolRequestType< + GetMfaCodeParams, + GetMfaCodeResult, + never, + AwsResponseError, + void +>('aws/identity/getMfaCode') + // invalidateSsoToken export interface InvalidateSsoTokenParams { ssoTokenId: SsoTokenId diff --git a/runtimes/runtimes/base-runtime.ts b/runtimes/runtimes/base-runtime.ts index 3deb3cf9..116808d4 100644 --- a/runtimes/runtimes/base-runtime.ts +++ b/runtimes/runtimes/base-runtime.ts @@ -91,6 +91,7 @@ import { ssoTokenChangedRequestType, updateProfileRequestType, stsCredentialChangedRequestType, + getMfaCodeRequestType, } from '../protocol/identity-management' import { IdentityManagement } from '../server-interface/identity-management' import { WebBase64Encoding } from './encoding' @@ -210,6 +211,7 @@ export const baseRuntime = (connections: { reader: MessageReader; writer: Messag onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), + sendGetMfaCode: params => lspConnection.sendRequest(getMfaCodeRequestType, params), } // Set up auth without encryption diff --git a/runtimes/runtimes/standalone.ts b/runtimes/runtimes/standalone.ts index 74a33071..60c79b4c 100644 --- a/runtimes/runtimes/standalone.ts +++ b/runtimes/runtimes/standalone.ts @@ -33,6 +33,7 @@ import { ShowOpenDialogParams, ShowOpenDialogRequestType, stsCredentialChangedRequestType, + getMfaCodeRequestType, } from '../protocol' import { ProposedFeatures, createConnection } from 'vscode-languageserver/node' import { @@ -325,6 +326,7 @@ export const standalone = (props: RuntimeProps) => { onInvalidateStsCredential: handler => lspConnection.onRequest(invalidateStsCredentialRequestType, handler), sendSsoTokenChanged: params => lspConnection.sendNotification(ssoTokenChangedRequestType, params), sendStsCredentialChanged: params => lspConnection.sendNotification(stsCredentialChangedRequestType, params), + sendGetMfaCode: params => lspConnection.sendRequest(getMfaCodeRequestType, params), } const credentialsProvider: CredentialsProvider = auth.getCredentialsProvider() diff --git a/runtimes/server-interface/identity-management.ts b/runtimes/server-interface/identity-management.ts index 28e79ebb..6e0de534 100644 --- a/runtimes/server-interface/identity-management.ts +++ b/runtimes/server-interface/identity-management.ts @@ -10,10 +10,12 @@ import { InvalidateStsCredentialResult, ListProfilesParams, ListProfilesResult, + GetMfaCodeParams, SsoTokenChangedParams, StsCredentialChangedParams, UpdateProfileParams, UpdateProfileResult, + GetMfaCodeResult, } from '../protocol/identity-management' import { RequestHandler } from '../protocol' @@ -51,4 +53,6 @@ export type IdentityManagement = { sendSsoTokenChanged: (params: SsoTokenChangedParams) => void sendStsCredentialChanged: (params: StsCredentialChangedParams) => void + + sendGetMfaCode: (params: GetMfaCodeParams) => Promise } From f308b8836efd7ecbbdd46806ab61e3b88ed8dc89 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Mon, 14 Jul 2025 17:55:38 -0400 Subject: [PATCH 42/49] fix: add parameters to mfa request --- runtimes/protocol/identity-management.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index a8b3b3d7..89d6a20c 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -280,7 +280,8 @@ export const getIamCredentialRequestType = new ProtocolRequestType< // getMfaCode export interface GetMfaCodeParams { - // Intentionally left blank + mfaSerial: string + profileName: string } export interface GetMfaCodeResult { From 27135392f38c4cd82c5650637af3436ff60540b3 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 15 Jul 2025 14:53:13 -0400 Subject: [PATCH 43/49] fix: naming changes --- runtimes/protocol/identity-management.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 89d6a20c..a6c6613e 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -58,17 +58,17 @@ export class AwsResponseError extends ResponseError { export type ProfileKind = | 'Unknown' | 'SsoTokenProfile' - | 'IamUserProfile' - | 'IamRoleSourceProfile' - | 'IamRoleInstanceProfile' - | 'IamProcessProfile' + | 'IamCredentialsProfile' + | 'IamSourceProfileProfile' + | 'IamCredentialSourceProfile' + | 'IamCredentialProcessProfile' export const ProfileKind = { SsoTokenProfile: 'SsoTokenProfile', - IamUserProfile: 'IamUserProfile', - IamRoleSourceProfile: 'IamRoleSourceProfile', - IamRoleInstanceProfile: 'IamRoleInstanceProfile', - IamProcessProfile: 'IamProcessProfile', + IamCredentialsProfile: 'IamCredentialsProfile', + IamSourceProfileProfile: 'IamSourceProfileProfile', + IamCredentialSourceProfile: 'IamCredentialSourceProfile', + IamCredentialProcessProfile: 'IamCredentialProcessProfile', Unknown: 'Unknown', } as const @@ -92,6 +92,8 @@ export interface Profile { source_profile?: string mfa_serial?: string external_id?: string + credential_cache?: string + credential_cache_location?: string } } @@ -250,12 +252,12 @@ export const getSsoTokenRequestType = new ProtocolRequestType< export type IamCredentialId = string // Opaque identifier export interface GetIamCredentialOptions { - generateOnInvalidStsCredential?: boolean + callStsOnInvalidIamCredential?: boolean validatePermissions?: boolean } export const getIamCredentialOptionsDefaults = { - generateOnInvalidStsCredential: true, + callStsOnInvalidIamCredential: true, validatePermissions: true, } satisfies GetIamCredentialOptions From 5eb1ac33ea38b311070a9f52d6a3d33d38664645 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Thu, 17 Jul 2025 12:29:57 -0400 Subject: [PATCH 44/49] fix: incorporate PR feedback --- runtimes/protocol/identity-management.ts | 34 ++++++++++++++++--- .../runtimes/auth/standalone/encryption.ts | 10 +++--- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index a6c6613e..99616127 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -38,11 +38,33 @@ export const AwsErrorCodes = { E_STS_CREDENTIAL_EXPIRED: 'E_STS_CREDENTIAL_EXPIRED', E_SSO_TOKEN_SOURCE_NOT_SUPPORTED: 'E_SSO_TOKEN_SOURCE_NOT_SUPPORTED', E_MFA_REQUIRED: 'E_MFA_REQUIRED', + E_PERMISSION_DENIED: 'E_PERMISSION_DENIED', E_TIMEOUT: 'E_TIMEOUT', E_UNKNOWN: 'E_UNKNOWN', E_CANCELLED: 'E_CANCELLED', } as const +// Permissions +export const PermissionSets = { + Q: [ + 'q:StartConversation', + 'q:SendMessage', + 'q:GetConversation', + 'q:ListConversations', + 'q:UpdateConversation', + 'q:DeleteConversation', + 'q:PassRequest', + 'q:StartTroubleshootingAnalysis', + 'q:StartTroubleshootingResolutionExplanation', + 'q:GetTroubleshootingResults', + 'q:UpdateTroubleshootingCommandResult', + 'q:GetIdentityMetaData', + 'q:GenerateCodeFromCommands', + 'q:UsePlugin', + 'codewhisperer:GenerateRecommendations', + ], +} + export interface AwsResponseErrorData { awsErrorCode: string } @@ -253,12 +275,12 @@ export type IamCredentialId = string // Opaque identifier export interface GetIamCredentialOptions { callStsOnInvalidIamCredential?: boolean - validatePermissions?: boolean + permissionSet?: string[] } export const getIamCredentialOptionsDefaults = { callStsOnInvalidIamCredential: true, - validatePermissions: true, + permissionSet: PermissionSets.Q, } satisfies GetIamCredentialOptions export interface GetIamCredentialParams { @@ -266,9 +288,13 @@ export interface GetIamCredentialParams { options?: GetIamCredentialOptions } -export interface GetIamCredentialResult { - id: IamCredentialId +export interface IamCredential { + id: string credentials: IamCredentials +} + +export interface GetIamCredentialResult { + credential: IamCredential updateCredentialsParams: UpdateCredentialsParams } diff --git a/runtimes/runtimes/auth/standalone/encryption.ts b/runtimes/runtimes/auth/standalone/encryption.ts index 4f9dbb5b..f5f3475b 100644 --- a/runtimes/runtimes/auth/standalone/encryption.ts +++ b/runtimes/runtimes/auth/standalone/encryption.ts @@ -124,11 +124,11 @@ export async function encryptIamResultWithKey( request: GetIamCredentialResult, key: string ): Promise { - request.credentials = { - accessKeyId: await encryptObjectWithKey(request.credentials.accessKeyId, key), - secretAccessKey: await encryptObjectWithKey(request.credentials.secretAccessKey, key), - ...(request.credentials.sessionToken - ? { sessionToken: await encryptObjectWithKey(request.credentials.sessionToken, key) } + request.credential.credentials = { + accessKeyId: await encryptObjectWithKey(request.credential.credentials.accessKeyId, key), + secretAccessKey: await encryptObjectWithKey(request.credential.credentials.secretAccessKey, key), + ...(request.credential.credentials.sessionToken + ? { sessionToken: await encryptObjectWithKey(request.credential.credentials.sessionToken, key) } : {}), } if (!request.updateCredentialsParams.encrypted) { From 38ab93b429ff268d25d969cb879e7d755331af2d Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Fri, 18 Jul 2025 10:56:44 -0400 Subject: [PATCH 45/49] fix: change IamCredential fields --- runtimes/protocol/identity-management.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 99616127..0152fd7b 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -289,7 +289,8 @@ export interface GetIamCredentialParams { } export interface IamCredential { - id: string + id: IamCredentialId + kinds: ProfileKind[] credentials: IamCredentials } @@ -344,7 +345,7 @@ export const invalidateSsoTokenRequestType = new ProtocolRequestType< // invalidateStsCredential export interface InvalidateStsCredentialParams { - profileName: string + iamCredentialId: IamCredentialId } export interface InvalidateStsCredentialResult { From b1a13dfb7bf5c6291360637362de3d89b9d2c95c Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 22 Jul 2025 14:00:49 -0400 Subject: [PATCH 46/49] fix: add error message for failed caller identity --- runtimes/protocol/identity-management.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 0152fd7b..39430c07 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -37,6 +37,7 @@ export const AwsErrorCodes = { E_SSO_TOKEN_EXPIRED: 'E_SSO_TOKEN_EXPIRED', E_STS_CREDENTIAL_EXPIRED: 'E_STS_CREDENTIAL_EXPIRED', E_SSO_TOKEN_SOURCE_NOT_SUPPORTED: 'E_SSO_TOKEN_SOURCE_NOT_SUPPORTED', + E_CALLER_IDENTITY_NOT_FOUND: 'E_CALLER_IDENTITY_NOT_FOUND', E_MFA_REQUIRED: 'E_MFA_REQUIRED', E_PERMISSION_DENIED: 'E_PERMISSION_DENIED', E_TIMEOUT: 'E_TIMEOUT', From 30e3c7f70db93746d410b941c08dba9256bb79fd Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Tue, 22 Jul 2025 15:38:12 -0400 Subject: [PATCH 47/49] refactor: undo changes to Auth --- runtimes/runtimes/auth/auth.ts | 93 +++++++++------------------- runtimes/runtimes/standalone.test.ts | 2 - runtimes/server-interface/auth.ts | 7 +-- 3 files changed, 32 insertions(+), 70 deletions(-) diff --git a/runtimes/runtimes/auth/auth.ts b/runtimes/runtimes/auth/auth.ts index d2e7daf8..acfa5557 100644 --- a/runtimes/runtimes/auth/auth.ts +++ b/runtimes/runtimes/auth/auth.ts @@ -22,26 +22,18 @@ import { OperationalTelemetryProvider, TELEMETRY_SCOPES } from '../operational-t export const BUILDER_ID_START_URL = 'https://view.awsapps.com/start' -export function isIamCredentials(credentials?: Credentials): credentials is IamCredentials { +export function isIamCredentials(credentials: Credentials): credentials is IamCredentials { const iamCredentials = credentials as IamCredentials return iamCredentials?.accessKeyId !== undefined && iamCredentials?.secretAccessKey !== undefined } -export function isBearerCredentials(credentials?: Credentials): credentials is BearerCredentials { +export function isBearerCredentials(credentials: Credentials): credentials is BearerCredentials { return (credentials as BearerCredentials)?.token !== undefined } -export function hasStsProperties(credentials: IamCredentials): boolean { - return credentials.sessionToken !== undefined && credentials.expiration !== undefined -} - -export function isExpired(credentials: IamCredentials): boolean { - if (!credentials.expiration) return false - return Date.now() >= credentials.expiration.getTime() -} - export class Auth { - private currentCredentials: IamCredentials | BearerCredentials | undefined + private iamCredentials: IamCredentials | undefined + private bearerCredentials: BearerCredentials | undefined private credentialsProvider: CredentialsProvider private connectionMetadata: ConnectionMetadata | undefined @@ -62,43 +54,24 @@ export class Auth { } this.lspRouter = lspRouter this.credentialsProvider = { - getCredentials: (type?: CredentialsType): Credentials | undefined => { - if (!type || type === 'iam' || type === 'bearer') { - if ( - (type === 'iam' && !isIamCredentials(this.currentCredentials)) || - (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) - ) { - return undefined - } - return this.currentCredentials + getCredentials: (type: CredentialsType): Credentials | undefined => { + if (type === 'iam') { + return this.iamCredentials } - throw new Error(`Unsupported credentials type: ${type}`) - }, - - hasCredentials: (type?: CredentialsType): boolean => { - if (!type || type === 'iam' || type === 'bearer') { - // If the requested and actual credentials types are different, return false - if ( - (type === 'iam' && !isIamCredentials(this.currentCredentials)) || - (type === 'bearer' && !isBearerCredentials(this.currentCredentials)) - ) { - return false - } - return this.currentCredentials !== undefined + if (type === 'bearer') { + return this.bearerCredentials } throw new Error(`Unsupported credentials type: ${type}`) }, - getCredentialsType: (): CredentialsType | undefined => { - if (this.currentCredentials === undefined) { - return undefined - } else if (isIamCredentials(this.currentCredentials)) { - return 'iam' - } else if (isBearerCredentials(this.currentCredentials)) { - return 'bearer' - } else { - throw new Error(`Unexpected credentials type`) + hasCredentials: (type: CredentialsType): boolean => { + if (type === 'iam') { + return this.iamCredentials !== undefined } + if (type === 'bearer') { + return this.bearerCredentials !== undefined + } + throw new Error(`Unsupported credentials type: ${type}`) }, getConnectionMetadata: () => { @@ -141,19 +114,15 @@ export class Auth { this.setCredentials(iamCredentials) this.connection.console.info('Runtime: Successfully saved IAM credentials') } else { - this.currentCredentials = undefined + this.iamCredentials = undefined throw new Error('Invalid IAM credentials') } }) this.connection.onNotification(iamCredentialsDeleteNotificationType, () => { - if (this.currentCredentials !== undefined && isIamCredentials(this.currentCredentials)) { - this.currentCredentials = undefined - this.lspRouter.onCredentialsDeletion('iam') - this.connection.console.info('Runtime: Deleted IAM credentials') - } else { - throw new Error('Attempt to delete IAM credentials when it does not exist') - } + this.iamCredentials = undefined + this.lspRouter.onCredentialsDeletion('iam') + this.connection.console.info('Runtime: Deleted IAM credentials') }) } @@ -170,20 +139,16 @@ export class Auth { await this.handleBearerCredentialsMetadata(request.metadata) this.connection.console.info('Runtime: Successfully saved bearer credentials') } else { - this.currentCredentials = undefined + this.bearerCredentials = undefined throw new Error('Invalid bearer credentials') } }) this.connection.onNotification(bearerCredentialsDeleteNotificationType, () => { - if (this.currentCredentials !== undefined && isBearerCredentials(this.currentCredentials)) { - this.currentCredentials = undefined - this.connectionMetadata = undefined - this.lspRouter.onCredentialsDeletion('bearer') - this.connection.console.info('Runtime: Deleted bearer credentials') - } else { - throw new Error('Attempt to delete Bearer credentials when it does not exist') - } + this.bearerCredentials = undefined + this.connectionMetadata = undefined + this.lspRouter.onCredentialsDeletion('bearer') + this.connection.console.info('Runtime: Deleted bearer credentials') }) } @@ -201,12 +166,12 @@ export class Auth { private setCredentials(creds: Credentials) { if (this.areValidCredentials(creds)) { if (isIamCredentials(creds)) { - this.currentCredentials = creds as IamCredentials + this.iamCredentials = creds as IamCredentials // Prevent modifying credentials by implementors - Object.freeze(this.currentCredentials) + Object.freeze(this.iamCredentials) } else { - this.currentCredentials = creds as BearerCredentials - Object.freeze(this.currentCredentials) + this.bearerCredentials = creds as BearerCredentials + Object.freeze(this.bearerCredentials) } } } diff --git a/runtimes/runtimes/standalone.test.ts b/runtimes/runtimes/standalone.test.ts index 63b1c77e..7abc0878 100644 --- a/runtimes/runtimes/standalone.test.ts +++ b/runtimes/runtimes/standalone.test.ts @@ -53,7 +53,6 @@ describe('standalone', () => { authStub.getCredentialsProvider.returns({ hasCredentials: sinon.stub().returns(false), getCredentials: sinon.stub().returns(undefined), - getCredentialsType: sinon.stub().returns(undefined), getConnectionMetadata: sinon.stub().returns(undefined), getConnectionType: sinon.stub().returns('none'), onCredentialsDeleted: sinon.stub(), @@ -92,7 +91,6 @@ describe('standalone', () => { authStub.getCredentialsProvider.returns({ hasCredentials: sinon.stub().returns(false), getCredentials: sinon.stub().returns(undefined), - getCredentialsType: sinon.stub().returns(undefined), getConnectionMetadata: sinon.stub().returns(undefined), getConnectionType: sinon.stub().returns('none'), onCredentialsDeleted: sinon.stub(), diff --git a/runtimes/server-interface/auth.ts b/runtimes/server-interface/auth.ts index 2715491f..e7f991f9 100644 --- a/runtimes/server-interface/auth.ts +++ b/runtimes/server-interface/auth.ts @@ -3,14 +3,13 @@ import { IamCredentials, BearerCredentials, ConnectionMetadata } from '../protoc // Exports for Capability implementor export { IamCredentials, BearerCredentials, ConnectionMetadata } -export type CredentialsType = 'iam' | 'bearer' | undefined +export type CredentialsType = 'iam' | 'bearer' export type Credentials = IamCredentials | BearerCredentials export type SsoConnectionType = 'builderId' | 'identityCenter' | 'none' export interface CredentialsProvider { - hasCredentials: (type?: CredentialsType) => boolean - getCredentials: (type?: CredentialsType) => Credentials | undefined - getCredentialsType: () => CredentialsType | undefined + hasCredentials: (type: CredentialsType) => boolean + getCredentials: (type: CredentialsType) => Credentials | undefined getConnectionMetadata: () => ConnectionMetadata | undefined getConnectionType: () => SsoConnectionType onCredentialsDeleted: (handler: (type: CredentialsType) => void) => void From c851573e08f9dbd9f8fac970bb1a96f158f2b2c6 Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Fri, 25 Jul 2025 09:59:26 -0400 Subject: [PATCH 48/49] fix: add mfaSerial to MfaCode output --- runtimes/protocol/identity-management.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 39430c07..1e0c7ed7 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -310,12 +310,13 @@ export const getIamCredentialRequestType = new ProtocolRequestType< // getMfaCode export interface GetMfaCodeParams { - mfaSerial: string profileName: string + mfaSerial?: string } export interface GetMfaCodeResult { code: string + mfaSerial: string } export const getMfaCodeRequestType = new ProtocolRequestType< From c44382fbf3db09b96b02f76c791b4de03700ac1b Mon Sep 17 00:00:00 2001 From: Ramon Li Date: Fri, 25 Jul 2025 17:20:54 -0400 Subject: [PATCH 49/49] feat: add credential override --- runtimes/protocol/identity-management.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runtimes/protocol/identity-management.ts b/runtimes/protocol/identity-management.ts index 1e0c7ed7..69f93bc5 100644 --- a/runtimes/protocol/identity-management.ts +++ b/runtimes/protocol/identity-management.ts @@ -277,11 +277,13 @@ export type IamCredentialId = string // Opaque identifier export interface GetIamCredentialOptions { callStsOnInvalidIamCredential?: boolean permissionSet?: string[] + credentialOverride?: IamCredentials } export const getIamCredentialOptionsDefaults = { callStsOnInvalidIamCredential: true, permissionSet: PermissionSets.Q, + credentialOverride: undefined, } satisfies GetIamCredentialOptions export interface GetIamCredentialParams {