Skip to content

Commit 94ceedd

Browse files
Merge branch 'feature/agentic-chat' into my-feature-agentic
2 parents 06864a9 + a4627c7 commit 94ceedd

File tree

10 files changed

+245
-291
lines changed

10 files changed

+245
-291
lines changed

packages/core/src/codewhispererChat/controllers/chat/chatRequest/converter.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ export function triggerPayloadToChatRequest(triggerPayload: TriggerPayload): { c
175175
},
176176
chatTriggerType,
177177
customizationArn: customizationArn,
178-
history: triggerPayload.chatHistory,
179178
},
180179
}
181180
}

packages/core/src/codewhispererChat/controllers/chat/controller.ts

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ import {
8282
createSavedPromptCommandId,
8383
aditionalContentNameLimit,
8484
additionalContentInnerContextLimit,
85-
tools,
8685
workspaceChunkMaxSize,
8786
defaultContextLengths,
8887
} from '../../constants'
@@ -368,6 +367,7 @@ export class ChatController {
368367
private async processStopResponseMessage(message: StopResponseMessage) {
369368
const session = this.sessionStorage.getSession(message.tabID)
370369
session.tokenSource.cancel()
370+
this.chatHistoryStorage.getTabHistory(message.tabID).clearRecentHistory()
371371
}
372372

373373
private async processTriggerTabIDReceived(message: TriggerTabIDReceived) {
@@ -650,6 +650,8 @@ export class ChatController {
650650
const session = this.sessionStorage.getSession(tabID)
651651
const toolUse = session.toolUse
652652
if (!toolUse || !toolUse.input) {
653+
// Turn off AgentLoop flag if there's no tool use
654+
this.sessionStorage.setAgentLoopInProgress(tabID, false)
653655
return
654656
}
655657
session.setToolUse(undefined)
@@ -723,7 +725,6 @@ export class ChatController {
723725
customization: getSelectedCustomization(),
724726
toolResults: toolResults,
725727
origin: Origin.IDE,
726-
chatHistory: this.chatHistoryStorage.getTabHistory(tabID).getHistory(),
727728
context: session.context ?? [],
728729
relevantTextDocuments: [],
729730
additionalContents: [],
@@ -899,10 +900,16 @@ export class ChatController {
899900
errorMessage = e.message
900901
}
901902

903+
// Turn off AgentLoop flag in case of exception
904+
if (tabID) {
905+
this.sessionStorage.setAgentLoopInProgress(tabID, false)
906+
}
907+
902908
this.messenger.sendErrorMessage(errorMessage, tabID, requestID)
903909
getLogger().error(`error: ${errorMessage} tabID: ${tabID} requestID: ${requestID}`)
904910

905911
this.sessionStorage.deleteSession(tabID)
912+
this.chatHistoryStorage.getTabHistory(tabID).clearRecentHistory()
906913
}
907914

908915
private async processContextMenuCommand(command: EditorContextCommand) {
@@ -1062,7 +1069,6 @@ export class ChatController {
10621069
codeQuery: lastTriggerEvent.context?.focusAreaContext?.names,
10631070
userIntent: message.userIntent,
10641071
customization: getSelectedCustomization(),
1065-
chatHistory: this.chatHistoryStorage.getTabHistory(message.tabID).getHistory(),
10661072
contextLengths: {
10671073
...defaultContextLengths,
10681074
},
@@ -1111,7 +1117,6 @@ export class ChatController {
11111117
codeQuery: context?.focusAreaContext?.names,
11121118
userIntent: undefined,
11131119
customization: getSelectedCustomization(),
1114-
chatHistory: this.chatHistoryStorage.getTabHistory(message.tabID).getHistory(),
11151120
origin: Origin.IDE,
11161121
context: message.context ?? [],
11171122
relevantTextDocuments: [],
@@ -1293,6 +1298,16 @@ export class ChatController {
12931298
}
12941299

12951300
const tabID = triggerEvent.tabID
1301+
if (this.sessionStorage.isAgentLoopInProgress(tabID)) {
1302+
// If a response is already in progress, stop it first
1303+
const stopResponseMessage: StopResponseMessage = {
1304+
tabID: tabID,
1305+
}
1306+
await this.processStopResponseMessage(stopResponseMessage)
1307+
}
1308+
1309+
// Ensure AgentLoop flag is set to true during response generation
1310+
this.sessionStorage.setAgentLoopInProgress(tabID, true)
12961311

12971312
const credentialsState = await AuthUtil.instance.getChatAuthState()
12981313

@@ -1339,23 +1354,15 @@ export class ChatController {
13391354
triggerPayload.contextLengths.userInputContextLength = triggerPayload.message.length
13401355
triggerPayload.contextLengths.focusFileContextLength = triggerPayload.fileText.length
13411356

1357+
const request = triggerPayloadToChatRequest(triggerPayload)
1358+
13421359
const chatHistory = this.chatHistoryStorage.getTabHistory(tabID)
1343-
const newUserMessage = {
1344-
userInputMessage: {
1345-
content: triggerPayload.message,
1346-
userIntent: triggerPayload.userIntent,
1347-
...(triggerPayload.origin && { origin: triggerPayload.origin }),
1348-
userInputMessageContext: {
1349-
tools: tools,
1350-
...(triggerPayload.toolResults && { toolResults: triggerPayload.toolResults }),
1351-
},
1352-
},
1360+
const currentMessage = request.conversationState.currentMessage
1361+
if (currentMessage) {
1362+
chatHistory.fixHistory(currentMessage)
13531363
}
1354-
const fixedHistoryMessage = chatHistory.fixHistory(newUserMessage)
1355-
if (fixedHistoryMessage.userInputMessage?.userInputMessageContext) {
1356-
triggerPayload.toolResults = fixedHistoryMessage.userInputMessage.userInputMessageContext.toolResults
1357-
}
1358-
const request = triggerPayloadToChatRequest(triggerPayload)
1364+
request.conversationState.history = chatHistory.getHistory()
1365+
13591366
const conversationId = chatHistory.getConversationId() || randomUUID()
13601367
chatHistory.setConversationId(conversationId)
13611368
request.conversationState.conversationId = conversationId
@@ -1409,16 +1416,23 @@ export class ChatController {
14091416
}
14101417
this.telemetryHelper.recordEnterFocusConversation(triggerEvent.tabID)
14111418
this.telemetryHelper.recordStartConversation(triggerEvent, triggerPayload)
1412-
chatHistory.appendUserMessage(fixedHistoryMessage)
1419+
if (currentMessage) {
1420+
chatHistory.appendUserMessage(currentMessage)
1421+
}
14131422

14141423
getLogger().info(
14151424
`response to tab: ${tabID} conversationID: ${session.sessionIdentifier} requestID: ${
14161425
response.$metadata.requestId
14171426
} metadata: ${inspect(response.$metadata, { depth: 12 })}`
14181427
)
14191428
await this.messenger.sendAIResponse(response, session, tabID, triggerID, triggerPayload, chatHistory)
1429+
1430+
// Turn off AgentLoop flag after sending the AI response
1431+
this.sessionStorage.setAgentLoopInProgress(tabID, false)
14201432
} catch (e: any) {
14211433
this.telemetryHelper.recordMessageResponseError(triggerPayload, tabID, getHttpStatusCode(e) ?? 0)
1434+
// Turn off AgentLoop flag in case of exception
1435+
this.sessionStorage.setAgentLoopInProgress(tabID, false)
14221436
// clears session, record telemetry before this call
14231437
this.processException(e, tabID)
14241438
}

packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@ import { ChatItemButton, ChatItemContent, ChatItemFormItem, MynahIconsType, Myna
4343
import { ChatHistoryManager } from '../../../storages/chatHistory'
4444
import { ToolType, ToolUtils } from '../../../tools/toolUtils'
4545
import { ChatStream } from '../../../tools/chatStream'
46-
import { getWorkspaceForFile } from '../../../../shared/utilities/workspaceUtils'
4746
import path from 'path'
4847
import { CommandValidation } from '../../../tools/executeBash'
4948
import { extractErrorInfo } from '../../../../shared/utilities/messageUtil'
49+
import { Change } from 'diff'
50+
import { FsWriteParams } from '../../../tools/fsWrite'
5051

5152
export type StaticTextResponseType = 'quick-action-help' | 'onboarding-help' | 'transform' | 'help'
5253

@@ -219,8 +220,10 @@ export class Messenger {
219220

220221
const tool = ToolUtils.tryFromToolUse(toolUse)
221222
if ('type' in tool) {
223+
let changeList: Change[] | undefined = undefined
222224
if (tool.type === ToolType.FsWrite) {
223225
session.setShowDiffOnFileWrite(true)
226+
changeList = await tool.tool.getDiffChanges()
224227
}
225228
if (
226229
tool.type === ToolType.FsWrite ||
@@ -239,7 +242,8 @@ export class Messenger {
239242
triggerID,
240243
toolUse,
241244
validation,
242-
session.messageIdToUpdate
245+
session.messageIdToUpdate,
246+
changeList
243247
)
244248
await ToolUtils.queueDescription(tool, chatStream)
245249

@@ -323,7 +327,7 @@ export class Messenger {
323327
}
324328
return true
325329
},
326-
{ timeout: 60000, truthy: true }
330+
{ timeout: 600000, truthy: true }
327331
)
328332
.catch((error: any) => {
329333
const errorInfo = extractErrorInfo(error)
@@ -478,7 +482,8 @@ export class Messenger {
478482
triggerID: string,
479483
toolUse: ToolUse | undefined,
480484
validation: CommandValidation,
481-
messageIdToUpdate: string | undefined
485+
messageIdToUpdate: string | undefined,
486+
changeList?: Change[]
482487
) {
483488
const buttons: ChatItemButton[] = []
484489
let fileList: ChatItemContent['fileList'] = undefined
@@ -493,24 +498,29 @@ export class Messenger {
493498
message = validation.warning + message
494499
}
495500
} else if (toolUse?.name === ToolType.FsWrite) {
496-
const absoluteFilePath = (toolUse?.input as any).path
497-
const projectPath = getWorkspaceForFile(absoluteFilePath)
498-
const relativePath = projectPath ? path.relative(projectPath, absoluteFilePath) : absoluteFilePath
501+
const input = toolUse.input as unknown as FsWriteParams
502+
const fileName = path.basename(input.path)
503+
const changes = changeList?.reduce(
504+
(acc, { count = 0, added, removed }) => {
505+
if (added) {
506+
acc.added += count
507+
} else if (removed) {
508+
acc.deleted += count
509+
}
510+
return acc
511+
},
512+
{ added: 0, deleted: 0 }
513+
)
499514
// FileList
500515
fileList = {
501516
fileTreeTitle: '',
502517
hideFileCount: true,
503-
filePaths: [relativePath],
518+
filePaths: [fileName],
504519
details: {
505-
[relativePath]: {
520+
[fileName]: {
506521
// eslint-disable-next-line unicorn/no-null
507522
icon: null,
508-
label: 'Created',
509-
changes: {
510-
added: 36,
511-
deleted: 0,
512-
total: 36,
513-
},
523+
changes: changes,
514524
},
515525
},
516526
}

packages/core/src/codewhispererChat/controllers/chat/model.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import * as vscode from 'vscode'
77
import {
88
AdditionalContentEntry,
9-
ChatMessage,
109
Origin,
1110
RelevantTextDocument,
1211
ToolResult,
@@ -203,7 +202,6 @@ export interface TriggerPayload {
203202
traceId?: string
204203
contextLengths: ContextLengths
205204
workspaceRulesCount?: number
206-
chatHistory?: ChatMessage[]
207205
toolResults?: ToolResult[]
208206
origin?: Origin
209207
}

0 commit comments

Comments
 (0)