Skip to content

Commit d4e45a4

Browse files
Merge master into feature/serverlessland
2 parents de4c2a0 + 0b2bccd commit d4e45a4

File tree

5 files changed

+80
-35
lines changed

5 files changed

+80
-35
lines changed

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

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,11 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import {
7-
ConversationState,
8-
CursorState,
9-
DocumentSymbol,
10-
SymbolType,
11-
TextDocument,
12-
ChatMessage,
13-
} from '@amzn/codewhisperer-streaming'
6+
import { ConversationState, CursorState, DocumentSymbol, SymbolType, TextDocument } from '@amzn/codewhisperer-streaming'
147
import { AdditionalContentEntryAddition, ChatTriggerType, RelevantTextDocumentAddition, TriggerPayload } from '../model'
158
import { undefinedIfEmpty } from '../../../../shared/utilities/textUtilities'
16-
import { ChatItemType } from '../../../../amazonq/commons/model'
179
import { getLogger } from '../../../../shared/logger/logger'
10+
import { messageToChatMessage } from '../../../../shared/db/chatDb/util'
1811

1912
const fqnNameSizeDownLimit = 1
2013
const fqnNameSizeUpLimit = 256
@@ -158,19 +151,7 @@ export function triggerPayloadToChatRequest(triggerPayload: TriggerPayload): { c
158151
const history =
159152
triggerPayload.history &&
160153
triggerPayload.history.length > 0 &&
161-
(triggerPayload.history.map((chat) =>
162-
chat.type === ('answer' as ChatItemType)
163-
? {
164-
assistantResponseMessage: {
165-
content: chat.body,
166-
},
167-
}
168-
: {
169-
userInputMessage: {
170-
content: chat.body,
171-
},
172-
}
173-
) as ChatMessage[])
154+
triggerPayload.history.map((chat) => messageToChatMessage(chat))
174155

175156
return {
176157
conversationState: {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import { Selection } from 'vscode'
1010
import { TabOpenType } from '../../../amazonq/webview/ui/storages/tabsStorage'
1111
import { CodeReference } from '../../view/connector/connector'
1212
import { Customization } from '../../../codewhisperer/client/codewhispereruserclient'
13-
import { ChatItem, QuickActionCommand } from '@aws/mynah-ui'
13+
import { QuickActionCommand } from '@aws/mynah-ui'
14+
import { Message } from '../../../shared/db/chatDb/util'
1415

1516
export interface TriggerTabIDReceived {
1617
tabID: string
@@ -206,7 +207,7 @@ export interface TriggerPayload {
206207
traceId?: string
207208
contextLengths: ContextLengths
208209
workspaceRulesCount?: number
209-
history?: ChatItem[]
210+
history?: Message[]
210211
}
211212

212213
export type ContextLengths = {

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import * as vscode from 'vscode'
1313
import { Messenger } from './messenger/messenger'
1414
import { Database } from '../../../shared/db/chatDb/chatDb'
1515
import { TabBarButtonClick, SaveChatMessage } from './model'
16-
import { Conversation, Tab } from '../../../shared/db/chatDb/util'
16+
import { Conversation, messageToChatItem, Tab } from '../../../shared/db/chatDb/util'
1717
import { DetailedListItemGroup, MynahIconsType } from '@aws/mynah-ui'
1818

1919
export class TabBarController {
@@ -87,7 +87,9 @@ export class TabBarController {
8787
this.messenger.sendRestoreTabMessage(
8888
selectedTab.historyId,
8989
selectedTab.tabType,
90-
selectedTab.conversations.flatMap((conv: Conversation) => conv.messages),
90+
selectedTab.conversations.flatMap((conv: Conversation) =>
91+
conv.messages.map((message) => messageToChatItem(message))
92+
),
9193
exportTab
9294
)
9395
}

packages/core/src/shared/db/chatDb/chatDb.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
import Loki from 'lokijs'
66
import * as vscode from 'vscode'
77
import { TabType } from '../../../amazonq/webview/ui/storages/tabsStorage'
8-
import { ChatItem, ChatItemType, DetailedListItemGroup } from '@aws/mynah-ui'
8+
import { ChatItemType, DetailedListItemGroup } from '@aws/mynah-ui'
99
import {
1010
ClientType,
1111
Conversation,
1212
FileSystemAdapter,
1313
groupTabsByDate,
14+
Message,
1415
Tab,
1516
TabCollection,
1617
updateOrCreateConversation,
@@ -171,7 +172,7 @@ export class Database {
171172
const tabs = tabCollection.find()
172173
const filteredTabs = tabs.filter((tab: Tab) => {
173174
return tab.conversations.some((conversation: Conversation) => {
174-
return conversation.messages.some((message: ChatItem) => {
175+
return conversation.messages.some((message: Message) => {
175176
return message.body?.toLowerCase().includes(searchTermLower)
176177
})
177178
})
@@ -225,7 +226,7 @@ export class Database {
225226
}
226227
}
227228

228-
addMessage(tabId: string, tabType: TabType, conversationId: string, chatItem: ChatItem) {
229+
addMessage(tabId: string, tabType: TabType, conversationId: string, message: Message) {
229230
if (this.initialized) {
230231
const tabCollection = this.db.getCollection<Tab>(TabCollection)
231232

@@ -238,9 +239,9 @@ export class Database {
238239

239240
const tabData = historyId ? tabCollection.findOne({ historyId }) : undefined
240241
const tabTitle =
241-
(chatItem.type === ('prompt' as ChatItemType) ? chatItem.body : tabData?.title) || 'Amazon Q Chat'
242+
(message.type === ('prompt' as ChatItemType) ? message.body : tabData?.title) || 'Amazon Q Chat'
242243
if (tabData) {
243-
tabData.conversations = updateOrCreateConversation(tabData.conversations, conversationId, chatItem)
244+
tabData.conversations = updateOrCreateConversation(tabData.conversations, conversationId, message)
244245
tabData.updatedAt = new Date()
245246
tabData.title = tabTitle
246247
tabCollection.update(tabData)
@@ -251,7 +252,7 @@ export class Database {
251252
isOpen: true,
252253
tabType: tabType,
253254
title: tabTitle,
254-
conversations: [{ conversationId, clientType: ClientType.VSCode, messages: [chatItem] }],
255+
conversations: [{ conversationId, clientType: ClientType.VSCode, messages: [message] }],
255256
})
256257
}
257258
}

packages/core/src/shared/db/chatDb/util.ts

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,17 @@ import fs from '../../fs/fs'
66
import path from 'path'
77

88
import { TabType } from '../../../amazonq/webview/ui/storages/tabsStorage'
9-
import { ChatItem, ChatItemButton, DetailedListItem, DetailedListItemGroup, MynahIconsType } from '@aws/mynah-ui'
9+
import {
10+
ChatItem,
11+
ChatItemButton,
12+
ChatItemType,
13+
DetailedListItem,
14+
DetailedListItemGroup,
15+
MynahIconsType,
16+
ReferenceTrackerInformation,
17+
SourceLink,
18+
} from '@aws/mynah-ui'
19+
import { ChatMessage, Origin, ToolUse, UserInputMessageContext, UserIntent } from '@amzn/codewhisperer-streaming'
1020

1121
export const TabCollection = 'tabs'
1222

@@ -24,7 +34,7 @@ export type Tab = {
2434
export type Conversation = {
2535
conversationId: string
2636
clientType: ClientType
27-
messages: ChatItem[]
37+
messages: Message[]
2838
}
2939

3040
export enum ClientType {
@@ -33,6 +43,56 @@ export enum ClientType {
3343
CLI = 'CLI',
3444
}
3545

46+
export type Message = {
47+
body: string
48+
type: ChatItemType
49+
codeReference?: ReferenceTrackerInformation[]
50+
relatedContent?: {
51+
title?: string
52+
content: SourceLink[]
53+
}
54+
messageId?: string
55+
userIntent?: UserIntent
56+
origin?: Origin
57+
userInputMessageContext?: UserInputMessageContext
58+
toolUses?: ToolUse[]
59+
}
60+
61+
/**
62+
* Converts Message to CodeWhisperer Streaming ChatMessage
63+
*/
64+
export function messageToChatMessage(msg: Message): ChatMessage {
65+
return msg.type === ('answer' as ChatItemType)
66+
? {
67+
assistantResponseMessage: {
68+
messageId: msg.messageId,
69+
content: msg.body,
70+
references: msg.codeReference || [],
71+
toolUses: msg.toolUses || [],
72+
},
73+
}
74+
: {
75+
userInputMessage: {
76+
content: msg.body,
77+
userIntent: msg.userIntent,
78+
origin: msg.origin || 'IDE',
79+
userInputMessageContext: msg.userInputMessageContext || {},
80+
},
81+
}
82+
}
83+
84+
/**
85+
* Converts Message to MynahUI Chat Item
86+
*/
87+
export function messageToChatItem(msg: Message): ChatItem {
88+
return {
89+
body: msg.body,
90+
type: msg.type as ChatItemType,
91+
codeReference: msg.codeReference,
92+
relatedContent: msg.relatedContent && msg.relatedContent?.content.length > 0 ? msg.relatedContent : undefined,
93+
}
94+
}
95+
3696
/**
3797
*
3898
* This adapter implements the LokiPersistenceAdapter interface for file system operations using web-compatible shared fs utils.
@@ -107,7 +167,7 @@ export class FileSystemAdapter implements LokiPersistenceAdapter {
107167
export function updateOrCreateConversation(
108168
conversations: Conversation[],
109169
conversationId: string,
110-
newMessage: ChatItem
170+
newMessage: Message
111171
): Conversation[] {
112172
const existingConversation = conversations.find((conv) => conv.conversationId === conversationId)
113173

0 commit comments

Comments
 (0)