Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"chat-client": "0.1.51",
"core/aws-lsp-core": "0.0.21",
"server/aws-lsp-antlr4": "0.1.25",
"server/aws-lsp-codewhisperer": "0.0.112",
"server/aws-lsp-codewhisperer": "0.0.114",
"server/aws-lsp-json": "0.1.26",
"server/aws-lsp-partiql": "0.0.23",
"server/aws-lsp-yaml": "0.1.26"
Expand Down
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
Git LFS file not shown
2 changes: 1 addition & 1 deletion app/aws-lsp-codewhisperer-runtimes/src/version.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"agenticChat": "1.64.0"
"agenticChat": "1.66.0"
}
2 changes: 1 addition & 1 deletion chat-client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
},
"dependencies": {
"@aws/chat-client-ui-types": "0.1.68",
"@aws/language-server-runtimes": "^0.3.16",
"@aws/language-server-runtimes": "^0.3.17",
"@aws/language-server-runtimes-types": "^0.1.64",
"@aws/mynah-ui": "^4.40.1"
},
Expand Down
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions server/aws-lsp-codewhisperer/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
# Changelog

## [0.0.114](https://github.com/aws/language-servers/compare/lsp-codewhisperer/v0.0.113...lsp-codewhisperer/v0.0.114) (2026-05-05)


### Bug Fixes

* **amazonq:** route inline chat through getChatResponse for correct API selection ([#2713](https://github.com/aws/language-servers/issues/2713)) ([#2714](https://github.com/aws/language-servers/issues/2714)) ([b6226e7](https://github.com/aws/language-servers/commit/b6226e758d52d8db85c844cab82e6b604566e2ef))

## [0.0.113](https://github.com/aws/language-servers/compare/lsp-codewhisperer/v0.0.112...lsp-codewhisperer/v0.0.113) (2026-04-29)


### Features

* **amazonq:** add consent prompt for workspace-scoped MCP servers ([#2708](https://github.com/aws/language-servers/issues/2708)) ([7b8595a](https://github.com/aws/language-servers/commit/7b8595a4e638562f79d5f71dcf22b0c700490458))


### Bug Fixes

* **amazonq:** improve MCP consent gate reliability and cleanup ([#2711](https://github.com/aws/language-servers/issues/2711)) ([f5aa1a3](https://github.com/aws/language-servers/commit/f5aa1a3b25aa38bfe8dd0e830b5839e1cea1d410))
* deprecate [@workspace](https://github.com/workspace) vector search + fix [@folder](https://github.com/folder) files not appearing in context ([#2698](https://github.com/aws/language-servers/issues/2698)) ([ae7d3fc](https://github.com/aws/language-servers/commit/ae7d3fcd26f57d6cc5d3d26dd5ec79983c4103df))
* guard workspaceFolderManager null reference in updateConfiguration ([#2695](https://github.com/aws/language-servers/issues/2695)) ([dcd7829](https://github.com/aws/language-servers/commit/dcd78298766d09902ba51cb12547780f518d48a9))

## [0.0.112](https://github.com/aws/language-servers/compare/lsp-codewhisperer/v0.0.111...lsp-codewhisperer/v0.0.112) (2026-04-07)


Expand Down
4 changes: 2 additions & 2 deletions server/aws-lsp-codewhisperer/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@aws/lsp-codewhisperer",
"version": "0.0.112",
"version": "0.0.114",
"description": "CodeWhisperer Language Server",
"main": "out/index.js",
"repository": {
Expand Down Expand Up @@ -38,7 +38,7 @@
"@aws-sdk/util-arn-parser": "^3.723.0",
"@aws-sdk/util-retry": "^3.374.0",
"@aws/chat-client-ui-types": "0.1.68",
"@aws/language-server-runtimes": "^0.3.16",
"@aws/language-server-runtimes": "^0.3.17",
"@aws/lsp-core": "^0.0.21",
"@modelcontextprotocol/sdk": "^1.23.0",
"@mozilla/readability": "^0.6.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,11 +257,7 @@ describe('AgenticChatController', () => {
} as any // Using 'as any' to prevent type errors when the Agent interface is updated with new methods

additionalContextProviderStub = sinon.stub(AdditionalContextProvider.prototype, 'getAdditionalContext')
additionalContextProviderStub.callsFake(async (triggerContext, _, context: ContextCommand[]) => {
// When @workspace is in the context, set hasWorkspace flag
if (context && context.some(item => item.command === '@workspace')) {
triggerContext.hasWorkspace = true
}
additionalContextProviderStub.callsFake(async () => {
return []
})
// @ts-ignore
Expand Down Expand Up @@ -1415,60 +1411,6 @@ describe('AgenticChatController', () => {
extractDocumentContextStub.restore()
})

it('parses relevant document and includes as requestInput if @workspace context is included', async () => {
const localProjectContextController = new LocalProjectContextController('client-name', [], logging)
const mockRelevantDocs = [
{ filePath: '/test/1.ts', content: 'text', id: 'id-1', index: 0, vec: [1] },
{ filePath: '/test/2.ts', content: 'text2', id: 'id-2', index: 0, vec: [1] },
]

sinon.stub(LocalProjectContextController, 'getInstance').resolves(localProjectContextController)
sinon.stub(localProjectContextController, 'isIndexingEnabled').returns(true)
sinon.stub(localProjectContextController, 'queryVectorIndex').resolves(mockRelevantDocs)

await chatController.onChatPrompt(
{
tabId: 'tab',
prompt: {
prompt: '@workspace help me understand this code',
escapedPrompt: '@workspace help me understand this code',
},
context: [{ command: '@workspace' }],
},
mockCancellationToken
)

const calledRequestInput: GenerateAssistantResponseCommandInput =
generateAssistantResponseStub.firstCall.firstArg

assert.deepStrictEqual(
calledRequestInput.conversationState?.currentMessage?.userInputMessage?.userInputMessageContext
?.editorState,
{
workspaceFolders: [],
relevantDocuments: [
{
endLine: -1,
path: '/test/1.ts',
relativeFilePath: '1.ts',
startLine: -1,
text: 'text',
type: ContentType.WORKSPACE,
},
{
endLine: -1,
path: '/test/2.ts',
relativeFilePath: '2.ts',
startLine: -1,
text: 'text2',
type: ContentType.WORKSPACE,
},
],
useRelevantDocuments: true,
}
)
})

it('leaves cursorState as undefined if cursorState is not passed', async () => {
const documentContextObject = {
programmingLanguage: 'typescript',
Expand Down Expand Up @@ -2217,8 +2159,8 @@ describe('AgenticChatController', () => {
assert.deepStrictEqual(chatResult, expectedCompleteInlineChatResult)
})

it('returns a ResponseError if sendMessage returns an error', async () => {
sendMessageStub.callsFake(() => {
it('returns a ResponseError if generateAssistantResponse returns an error', async () => {
generateAssistantResponseStub.callsFake(() => {
throw new Error('Error')
})

Expand All @@ -2230,8 +2172,8 @@ describe('AgenticChatController', () => {
assert.ok(chatResult instanceof ResponseError)
})

it('returns a Response error if sendMessage returns an auth error', async () => {
sendMessageStub.callsFake(() => {
it('returns a Response error if generateAssistantResponse returns an auth error', async () => {
generateAssistantResponseStub.callsFake(() => {
throw new Error('Error')
})

Expand All @@ -2247,12 +2189,12 @@ describe('AgenticChatController', () => {
})

it('returns a ResponseError if response streams return an error event', async () => {
sendMessageStub.callsFake(() => {
generateAssistantResponseStub.callsFake(() => {
return Promise.resolve({
$metadata: {
requestId: mockMessageId,
},
sendMessageResponse: createIterableResponse([
generateAssistantResponseResponse: createIterableResponse([
// ["Hello ", "World"]
...mockChatResponseList.slice(1, 3),
{ error: { message: 'some error' } },
Expand All @@ -2271,12 +2213,12 @@ describe('AgenticChatController', () => {
})

it('returns a ResponseError if response streams return an invalid state event', async () => {
sendMessageStub.callsFake(() => {
generateAssistantResponseStub.callsFake(() => {
return Promise.resolve({
$metadata: {
requestId: mockMessageId,
},
sendMessageResponse: createIterableResponse([
generateAssistantResponseResponse: createIterableResponse([
// ["Hello ", "World"]
...mockChatResponseList.slice(1, 3),
{ invalidStateEvent: { message: 'invalid state' } },
Expand Down Expand Up @@ -2337,7 +2279,8 @@ describe('AgenticChatController', () => {
mockCancellationToken
)

const calledRequestInput: SendMessageCommandInput = sendMessageStub.firstCall.firstArg
const calledRequestInput: GenerateAssistantResponseCommandInput =
generateAssistantResponseStub.firstCall.firstArg

assert.strictEqual(
calledRequestInput.conversationState?.currentMessage?.userInputMessage?.userInputMessageContext
Expand All @@ -2362,7 +2305,8 @@ describe('AgenticChatController', () => {
mockCancellationToken
)

const calledRequestInput: SendMessageCommandInput = sendMessageStub.firstCall.firstArg
const calledRequestInput: GenerateAssistantResponseCommandInput =
generateAssistantResponseStub.firstCall.firstArg

assert.strictEqual(
calledRequestInput.conversationState?.currentMessage?.userInputMessage?.userInputMessageContext
Expand All @@ -2388,7 +2332,8 @@ describe('AgenticChatController', () => {
mockCancellationToken
)

const calledRequestInput: SendMessageCommandInput = sendMessageStub.firstCall.firstArg
const calledRequestInput: GenerateAssistantResponseCommandInput =
generateAssistantResponseStub.firstCall.firstArg

assert.deepStrictEqual(
calledRequestInput.conversationState?.currentMessage?.userInputMessage?.userInputMessageContext
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
* Will be deleted or merged.
*/

import * as crypto from 'crypto'

Check warning on line 6 in server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts

View workflow job for this annotation

GitHub Actions / Test

Do not import Node.js builtin module "crypto"

Check warning on line 6 in server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts

View workflow job for this annotation

GitHub Actions / Test (Windows)

Do not import Node.js builtin module "crypto"
import * as path from 'path'

Check warning on line 7 in server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts

View workflow job for this annotation

GitHub Actions / Test

Do not import Node.js builtin module "path"

Check warning on line 7 in server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts

View workflow job for this annotation

GitHub Actions / Test (Windows)

Do not import Node.js builtin module "path"
import * as os from 'os'

Check warning on line 8 in server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts

View workflow job for this annotation

GitHub Actions / Test

Do not import Node.js builtin module "os"

Check warning on line 8 in server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts

View workflow job for this annotation

GitHub Actions / Test (Windows)

Do not import Node.js builtin module "os"
import {
ChatTriggerType,
Origin,
Expand Down Expand Up @@ -37,12 +37,7 @@
SUFFIX_UNDOALL,
SUFFIX_EXPLANATION,
} from './constants/toolConstants'
import {
SendMessageCommandInput,
SendMessageCommandOutput,
ChatCommandInput,
ChatCommandOutput,
} from '../../shared/streamingClientService'
import { SendMessageCommandInput, ChatCommandInput, ChatCommandOutput } from '../../shared/streamingClientService'
import {
Button,
Status,
Expand Down Expand Up @@ -3537,7 +3532,6 @@
if (triggerContext.contextInfo) {
metric.mergeWith({
cwsprChatHasContextList: triggerContext.documentReference?.filePaths?.length ? true : false,
cwsprChatHasWorkspaceContext: triggerContext.hasWorkspace ?? false,
cwsprChatFolderContextCount: triggerContext.contextInfo.contextCount.folderContextCount,
cwsprChatFileContextCount: triggerContext.contextInfo.contextCount.fileContextCount,
cwsprChatRuleContextCount: triggerContext.contextInfo.contextCount.activeRuleContextCount,
Expand Down Expand Up @@ -3777,8 +3771,8 @@
throw new Error('amazonQServiceManager is not initialized')
}

const client = this.#serviceManager.getStreamingClient()
response = await client.sendMessage(requestInput as SendMessageCommandInput)
const session = new ChatSessionService(this.#serviceManager, this.#features.lsp, this.#features.logging)
response = await session.getChatResponse(requestInput)
this.#log('Response for inline chat', JSON.stringify(response.$metadata), JSON.stringify(response))
} catch (err) {
if (err instanceof AmazonQServicePendingSigninError || err instanceof AmazonQServicePendingProfileError) {
Expand Down Expand Up @@ -4698,14 +4692,21 @@
}

async #processSendMessageResponseForInlineChat(
response: SendMessageCommandOutput,
response: ChatCommandOutput,
metric: Metric<AddMessageEvent>,
partialResultToken?: string | number
): Promise<Result<ChatResultWithMetadata, string>> {
const requestId = response.$metadata.requestId!
const chatEventParser = new ChatEventParser(requestId, metric)

for await (const chatEvent of response.sendMessageResponse!) {
let chatEventStream = undefined
if ('generateAssistantResponseResponse' in response) {
chatEventStream = response.generateAssistantResponseResponse
} else if ('sendMessageResponse' in response) {
chatEventStream = response.sendMessageResponse
}

for await (const chatEvent of chatEventStream!) {
const result = chatEventParser.processPartialEvent(chatEvent)

// terminate early when there is an error
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -326,27 +326,6 @@ describe('AdditionalContextProvider', () => {
assert.strictEqual(triggerContext.cursorState, undefined)
})

it('should set hasWorkspace flag when @workspace is present', async () => {
const mockWorkspaceFolder = {
uri: URI.file('/workspace').toString(),
name: 'test',
}
sinon.stub(workspaceUtils, 'getWorkspaceFolderPaths').returns(['/workspace'])
const triggerContext: TriggerContext = {
workspaceFolder: mockWorkspaceFolder,
}

const workspaceContext = [{ id: '@workspace', command: 'Workspace', label: 'folder' }]
;(chatHistoryDb.getPinnedContext as sinon.SinonStub).returns(workspaceContext)

fsExistsStub.resolves(false)
getContextCommandPromptStub.resolves([])

await provider.getAdditionalContext(triggerContext, 'tab1')

assert.strictEqual(triggerContext.hasWorkspace, true)
})

it('should count context types correctly', async () => {
const mockWorkspaceFolder = {
uri: URI.file('/workspace').toString(),
Expand Down
Loading
Loading