Skip to content

Commit d1185ca

Browse files
Merge main into feature/web-search
2 parents cb6e67d + 8be2d47 commit d1185ca

File tree

7 files changed

+74
-13
lines changed

7 files changed

+74
-13
lines changed

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"chat-client": "0.1.47",
33
"core/aws-lsp-core": "0.0.20",
44
"server/aws-lsp-antlr4": "0.1.24",
5-
"server/aws-lsp-codewhisperer": "0.0.103",
5+
"server/aws-lsp-codewhisperer": "0.0.104",
66
"server/aws-lsp-json": "0.1.25",
77
"server/aws-lsp-partiql": "0.0.22",
88
"server/aws-lsp-yaml": "0.1.25"

integration-tests/atx-transform-server/src/tests/atxTransformInteg.test.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,18 @@ describe('ATX .NET Transform Integration Tests', () => {
5959
const TOKEN_REFRESH_INTERVAL_MS = 25 * 60 * 1000
6060

6161
async function refreshToken(): Promise<void> {
62-
console.log('[Token Refresh] Refreshing SSO token...')
63-
testSsoToken = refreshTokenFromSecretsManager()
64-
await client.sendRequest('aws/credentials/token/update', {
65-
data: { token: testSsoToken },
66-
credentialkey: 'atx-bearer',
67-
metadata: { sso: { startUrl } },
68-
})
69-
console.log('[Token Refresh] Token updated successfully')
62+
try {
63+
console.log('[Token Refresh] Refreshing SSO token...')
64+
testSsoToken = refreshTokenFromSecretsManager()
65+
await client.sendRequest('aws/credentials/token/update', {
66+
data: { token: testSsoToken },
67+
credentialkey: 'atx-bearer',
68+
metadata: { sso: { startUrl } },
69+
})
70+
console.log('[Token Refresh] Token updated successfully')
71+
} catch (error) {
72+
console.error('[Token Refresh] Failed:', error)
73+
}
7074
}
7175

7276
function buildStartTransformRequest(jobName: string, sourceFiles: string[]) {
@@ -211,7 +215,9 @@ describe('ATX .NET Transform Integration Tests', () => {
211215
console.log(`Poll ${i + 1}: Status = ${jobStatus}`)
212216

213217
if (jobStatus === 'FAILED') {
214-
console.log('FAILED - Reason:', job.FailureReason || result?.ErrorString || 'unknown')
218+
const reason = job.FailureReason || result?.ErrorString || 'unknown'
219+
console.log('FAILED - Reason:', reason)
220+
throw new Error(`Job failed: ${reason}`)
215221
}
216222

217223
if (jobStatus === 'AWAITING_HUMAN_INPUT' && planPath) break

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/aws-lsp-codewhisperer/CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# Changelog
22

3+
## [0.0.104](https://github.com/aws/language-servers/compare/lsp-codewhisperer/v0.0.103...lsp-codewhisperer/v0.0.104) (2026-02-05)
4+
5+
6+
### Bug Fixes
7+
8+
* add OAuth client support to MCP manager ([#2607](https://github.com/aws/language-servers/issues/2607)) ([81c1e08](https://github.com/aws/language-servers/commit/81c1e089750e90efb4ea302279a915b08eddc0ad))
9+
* Add optional `x-amzn-qt-test-id` header to ATX Transform API requests for test traffic classification. ([#2602](https://github.com/aws/language-servers/issues/2602)) ([2321687](https://github.com/aws/language-servers/commit/2321687b1b6ae7e5c4fdc9fcd15792cd54f138c9))
10+
* add programming language to chatInteractWithMessageEvent ([#2605](https://github.com/aws/language-servers/issues/2605)) ([af86c21](https://github.com/aws/language-servers/commit/af86c218af8f904a806ca43c8695fcb6053e347c))
11+
* **amazonq:** disable WCS feature by default ([#2604](https://github.com/aws/language-servers/issues/2604)) ([990f727](https://github.com/aws/language-servers/commit/990f7273d39925beba46035597a7d84983eff19f))
12+
* **amazonq:** fix for tool permissions in allowed paths per tool ([#2601](https://github.com/aws/language-servers/issues/2601)) ([01ea0d7](https://github.com/aws/language-servers/commit/01ea0d74404baae14462e5557f488b22085bb8d3))
13+
314
## [0.0.103](https://github.com/aws/language-servers/compare/lsp-codewhisperer/v0.0.102...lsp-codewhisperer/v0.0.103) (2026-01-26)
415

516

server/aws-lsp-codewhisperer/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@aws/lsp-codewhisperer",
3-
"version": "0.0.103",
3+
"version": "0.0.104",
44
"description": "CodeWhisperer Language Server",
55
"main": "out/index.js",
66
"repository": {

server/aws-lsp-codewhisperer/src/language-server/agenticChat/tools/mcp/mcpManager.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,21 @@ export class McpManager {
518518
try {
519519
const headResp = await fetch(base, { method: 'HEAD', headers })
520520
const www = headResp.headers.get('www-authenticate') || ''
521-
needsOAuth = headResp.status === 401 || headResp.status === 403 || /bearer/i.test(www)
521+
this.features.logging.info(`MCP: HEAD response status: ${headResp.status}`)
522+
523+
if (headResp.status === 401 || headResp.status === 403 || /bearer/i.test(www)) {
524+
needsOAuth = true
525+
this.features.logging.info(`MCP: OAuth detected via HEAD (${headResp.status})`)
526+
} else if (headResp.status === 405 || headResp.status === 404) {
527+
// HEAD not supported (405) or endpoint not found for HEAD (404), try POST-based OAuth detection
528+
this.features.logging.info(
529+
`MCP: HEAD returned ${headResp.status}, trying POST-based OAuth detection`
530+
)
531+
needsOAuth = await this.detectOAuthFromPostError(base, headers)
532+
if (needsOAuth) {
533+
this.features.logging.info(`MCP: OAuth detected via POST error`)
534+
}
535+
}
522536
} catch {
523537
this.features.logging.info(`MCP: HEAD not available`)
524538
}
@@ -1489,6 +1503,30 @@ export class McpManager {
14891503
return Array.from(serverNames)
14901504
}
14911505

1506+
/**
1507+
* Detect OAuth requirement from POST error response
1508+
* Used when HEAD method returns 405 (Method Not Allowed)
1509+
*/
1510+
private async detectOAuthFromPostError(url: URL, headers: Record<string, string>): Promise<boolean> {
1511+
try {
1512+
const testPayload = { jsonrpc: '2.0', method: 'initialize', id: 1 }
1513+
const response = await fetch(url, {
1514+
method: 'POST',
1515+
headers: { ...headers, 'Content-Type': 'application/json' },
1516+
body: JSON.stringify(testPayload),
1517+
})
1518+
1519+
if (response.status === 401) {
1520+
const errorText = await response.text()
1521+
// Check for OAuth-related error messages
1522+
return /bearer|token|auth|missing.*auth/i.test(errorText)
1523+
}
1524+
} catch (e) {
1525+
// Ignore errors, assume no OAuth required
1526+
}
1527+
return false
1528+
}
1529+
14921530
/**
14931531
* Get all builtin tool names
14941532
*/

server/aws-lsp-codewhisperer/src/language-server/netTransform/atxTransformHandler.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ export class ATXTransformHandler {
141141
}
142142
args.request.headers['Authorization'] = `Bearer ${bearerToken}`
143143

144+
// Add test classification header if running in test mode
145+
const testId = process.env.ATX_TEST_ID
146+
if (testId) {
147+
args.request.headers['x-amzn-qt-test-id'] = testId
148+
}
149+
144150
if (applicationUrl) {
145151
const cleanOrigin = applicationUrl.endsWith('/') ? applicationUrl.slice(0, -1) : applicationUrl
146152
args.request.headers['Origin'] = cleanOrigin

0 commit comments

Comments
 (0)