Skip to content

Commit 96f76c3

Browse files
committed
feat(amazonq): Use Chat History DB instead of in-memory store
1 parent 90dfc71 commit 96f76c3

File tree

6 files changed

+248
-370
lines changed

6 files changed

+248
-370
lines changed

packages/core/src/codewhispererChat/clients/chat/v0/chat.ts

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,15 @@ import { createQDeveloperStreamingClient } from '../../../../shared/clients/qDev
1616
import { UserWrittenCodeTracker } from '../../../../codewhisperer/tracker/userWrittenCodeTracker'
1717
import { DocumentReference, PromptMessage } from '../../../controllers/chat/model'
1818
import { FsWriteBackup } from '../../../../codewhispererChat/tools/fsWrite'
19+
import { randomUUID } from '../../../../shared/crypto'
1920

2021
export type ToolUseWithError = {
2122
toolUse: ToolUse
2223
error: Error | undefined
2324
}
24-
import { getLogger } from '../../../../shared/logger/logger'
25-
import { randomUUID } from '../../../../shared/crypto'
2625

2726
export class ChatSession {
28-
private sessionId?: string
27+
private sessionId: string
2928
/**
3029
* _readFiles = list of files read from the project to gather context before generating response.
3130
* _showDiffOnFileWrite = Controls whether to show diff view (true) or file context view (false) to the user
@@ -50,7 +49,7 @@ export class ChatSession {
5049
// TODO: doesn't handle the edge case when two files share the same relativePath string but from different root
5150
// e.g. root_a/file1 vs root_b/file1
5251
relativePathToWorkspaceRoot: Map<string, string> = new Map()
53-
public get sessionIdentifier(): string | undefined {
52+
public get sessionIdentifier(): string {
5453
return this.sessionId
5554
}
5655
public get messageIdToUpdate(): string | undefined {
@@ -105,13 +104,14 @@ export class ChatSession {
105104

106105
constructor() {
107106
this.createNewTokenSource()
107+
this.sessionId = randomUUID()
108108
}
109109

110110
createNewTokenSource() {
111111
this.tokenSource = new vscode.CancellationTokenSource()
112112
}
113113

114-
public setSessionID(id?: string) {
114+
public setSessionID(id: string) {
115115
this.sessionId = id
116116
}
117117
public get readFiles(): DocumentReference[] {
@@ -148,14 +148,6 @@ export class ChatSession {
148148
)
149149
}
150150

151-
const responseStream = response.sendMessageResponse
152-
for await (const event of responseStream) {
153-
if ('messageMetadataEvent' in event) {
154-
this.sessionId = event.messageMetadataEvent?.conversationId
155-
break
156-
}
157-
}
158-
159151
UserWrittenCodeTracker.instance.onQFeatureInvoked()
160152
return response
161153
}
@@ -170,12 +162,6 @@ export class ChatSession {
170162
)
171163
}
172164

173-
this.sessionId = response.conversationId
174-
if (this.sessionId?.length === 0) {
175-
getLogger().debug(`Session ID: ${this.sessionId} is empty. Generating random UUID`)
176-
this.sessionId = randomUUID()
177-
}
178-
179165
UserWrittenCodeTracker.instance.onQFeatureInvoked()
180166

181167
return response

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

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ import { amazonQTabSuffix } from '../../../shared/constants'
9696
import { OutputKind } from '../../tools/toolShared'
9797
import { ToolUtils, Tool, ToolType } from '../../tools/toolUtils'
9898
import { ChatStream } from '../../tools/chatStream'
99-
import { ChatHistoryStorage } from '../../storages/chatHistoryStorage'
10099
import { tempDirPath } from '../../../shared/filesystemUtilities'
101100
import { Database } from '../../../shared/db/chatDb/chatDb'
102101
import { TabBarController } from './tabBarController'
102+
import { messageToChatMessage } from '../../../shared/db/chatDb/util'
103103

104104
export interface ChatControllerMessagePublishers {
105105
readonly processPromptChatMessage: MessagePublisher<PromptMessage>
@@ -174,7 +174,6 @@ export class ChatController {
174174
private readonly userIntentRecognizer: UserIntentRecognizer
175175
private readonly telemetryHelper: CWCTelemetryHelper
176176
private userPromptsWatcher: vscode.FileSystemWatcher | undefined
177-
private readonly chatHistoryStorage: ChatHistoryStorage
178177
private chatHistoryDb = Database.getInstance()
179178
private cancelTokenSource: vscode.CancellationTokenSource = new vscode.CancellationTokenSource()
180179

@@ -194,7 +193,6 @@ export class ChatController {
194193
this.editorContentController = new EditorContentController()
195194
this.promptGenerator = new PromptsGenerator()
196195
this.userIntentRecognizer = new UserIntentRecognizer()
197-
this.chatHistoryStorage = new ChatHistoryStorage()
198196
this.tabBarController = new TabBarController(this.messenger)
199197

200198
onDidChangeAmazonQVisibility((visible) => {
@@ -416,7 +414,7 @@ export class ChatController {
416414
const session = this.sessionStorage.getSession(message.tabID)
417415
session.tokenSource.cancel()
418416
this.messenger.sendEmptyMessage(message.tabID, '', undefined)
419-
this.chatHistoryStorage.getTabHistory(message.tabID).clearRecentHistory()
417+
this.chatHistoryDb.clearRecentHistory(message.tabID)
420418
}
421419

422420
private async processTriggerTabIDReceived(message: TriggerTabIDReceived) {
@@ -473,7 +471,6 @@ export class ChatController {
473471

474472
private async processTabCloseMessage(message: TabClosedMessage) {
475473
this.sessionStorage.deleteSession(message.tabID)
476-
this.chatHistoryStorage.deleteHistory(message.tabID)
477474
this.triggerEventsStorage.removeTabEvents(message.tabID)
478475
// this.telemetryHelper.recordCloseChat(message.tabID)
479476
this.chatHistoryDb.updateTabOpenState(message.tabID, false)
@@ -1023,7 +1020,7 @@ export class ChatController {
10231020
getLogger().error(`error: ${errorMessage} tabID: ${tabID} requestID: ${requestID}`)
10241021

10251022
this.sessionStorage.deleteSession(tabID)
1026-
this.chatHistoryStorage.getTabHistory(tabID).clear()
1023+
this.chatHistoryDb.clearRecentHistory(tabID)
10271024
}
10281025

10291026
private async processContextMenuCommand(command: EditorContextCommand) {
@@ -1145,7 +1142,6 @@ export class ChatController {
11451142
switch (message.command) {
11461143
case 'clear':
11471144
this.sessionStorage.deleteSession(message.tabID)
1148-
this.chatHistoryStorage.getTabHistory(message.tabID).clear()
11491145
this.triggerEventsStorage.removeTabEvents(message.tabID)
11501146
recordTelemetryChatRunCommand('clear')
11511147
this.chatHistoryDb.clearTab(message.tabID)
@@ -1437,10 +1433,6 @@ export class ChatController {
14371433
}
14381434

14391435
const session = this.sessionStorage.getSession(tabID)
1440-
if (!session.localHistoryHydrated) {
1441-
triggerPayload.history = this.chatHistoryDb.getMessages(triggerEvent.tabID, 10)
1442-
session.localHistoryHydrated = true
1443-
}
14441436
await this.resolveContextCommandPayload(triggerPayload, session)
14451437
triggerPayload.useRelevantDocuments = triggerPayload.context.some(
14461438
(context) => typeof context !== 'string' && context.command === '@workspace'
@@ -1479,16 +1471,14 @@ export class ChatController {
14791471

14801472
const request = triggerPayloadToChatRequest(triggerPayload)
14811473

1482-
const chatHistory = this.chatHistoryStorage.getTabHistory(tabID)
14831474
const currentMessage = request.conversationState.currentMessage
14841475
if (currentMessage) {
1485-
chatHistory.fixHistory(currentMessage)
1476+
this.chatHistoryDb.fixHistory(tabID, currentMessage)
14861477
}
1487-
request.conversationState.history = chatHistory.getHistory()
1488-
1489-
const conversationId = chatHistory.getConversationId() || randomUUID()
1490-
chatHistory.setConversationId(conversationId)
1491-
request.conversationState.conversationId = conversationId
1478+
request.conversationState.history = this.chatHistoryDb
1479+
.getMessages(tabID)
1480+
.map((chat) => messageToChatMessage(chat))
1481+
request.conversationState.conversationId = session.sessionIdentifier
14921482

14931483
triggerPayload.documentReferences = this.mergeRelevantTextDocuments(triggerPayload.relevantTextDocuments)
14941484

@@ -1547,7 +1537,6 @@ export class ChatController {
15471537
this.telemetryHelper.recordStartConversation(triggerEvent, triggerPayload)
15481538

15491539
if (currentMessage && session.sessionIdentifier) {
1550-
chatHistory.appendUserMessage(currentMessage)
15511540
this.chatHistoryDb.addMessage(tabID, 'cwc', session.sessionIdentifier, {
15521541
body: triggerPayload.message,
15531542
type: 'prompt' as any,
@@ -1562,15 +1551,13 @@ export class ChatController {
15621551
response.$metadata.requestId
15631552
} metadata: ${inspect(response.$metadata, { depth: 12 })}`
15641553
)
1565-
15661554
this.cancelTokenSource = new vscode.CancellationTokenSource()
15671555
await this.messenger.sendAIResponse(
15681556
response,
15691557
session,
15701558
tabID,
15711559
triggerID,
15721560
triggerPayload,
1573-
chatHistory,
15741561
this.cancelTokenSource.token
15751562
)
15761563

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ import {
5858
} from '@aws/mynah-ui'
5959
import { Database } from '../../../../shared/db/chatDb/chatDb'
6060
import { TabType } from '../../../../amazonq/webview/ui/storages/tabsStorage'
61-
import { ChatHistoryManager } from '../../../storages/chatHistory'
6261
import { ToolType, ToolUtils } from '../../../tools/toolUtils'
6362
import { ChatStream } from '../../../tools/chatStream'
6463
import path from 'path'
@@ -188,7 +187,6 @@ export class Messenger {
188187
tabID: string,
189188
triggerID: string,
190189
triggerPayload: TriggerPayload,
191-
chatHistoryManager: ChatHistoryManager,
192190
cancelToken: vscode.CancellationToken
193191
) {
194192
let message = ''
@@ -528,17 +526,6 @@ export class Messenger {
528526
)
529527
)
530528

531-
chatHistoryManager.pushAssistantMessage({
532-
assistantResponseMessage: {
533-
messageId: messageID,
534-
content: message,
535-
references: codeReference,
536-
...(toolUse &&
537-
toolUse.input !== undefined &&
538-
toolUse.input !== '' && { toolUses: [{ ...toolUse }] }),
539-
},
540-
})
541-
542529
getLogger().info(
543530
`All events received. requestId=%s counts=%s`,
544531
response.$metadata.requestId,

0 commit comments

Comments
 (0)