Skip to content

Commit e2354da

Browse files
authored
context transparency multiple fixes (#17)
* context transparency multiple fixes 1. add manually selected context from prompt into context list 2. fix -1 start/end line edge cases 3. Center selction after clicking on the file * remove console.log
1 parent fe06af6 commit e2354da

File tree

5 files changed

+60
-29
lines changed

5 files changed

+60
-29
lines changed

packages/core/src/amazonq/lsp/lspController.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import fetch from 'node-fetch'
1313
import request from '../../shared/request'
1414
import { LspClient } from './lspClient'
1515
import AdmZip from 'adm-zip'
16-
import { RelevantTextDocument } from '@amzn/codewhisperer-streaming'
1716
import { makeTemporaryToolkitFolder, tryRemoveFolder } from '../../shared/filesystemUtilities'
1817
import { activate as activateLsp } from './lspClient'
1918
import { telemetry } from '../../shared/telemetry/telemetry'
@@ -25,6 +24,7 @@ import { isWeb } from '../../shared/extensionGlobals'
2524
import { getUserAgent } from '../../shared/telemetry/util'
2625
import { isAmazonInternalOs } from '../../shared/vscode/env'
2726
import { sleep } from '../../shared/utilities/timeoutUtils'
27+
import { RelevantTextDocumentAddition } from '../../codewhispererChat/controllers/chat/model'
2828

2929
export interface Chunk {
3030
readonly filePath: string
@@ -282,9 +282,9 @@ export class LspController {
282282
}
283283
}
284284

285-
async query(s: string): Promise<RelevantTextDocument[]> {
285+
async query(s: string): Promise<RelevantTextDocumentAddition[]> {
286286
const chunks: Chunk[] | undefined = await LspClient.instance.queryVectorIndex(s)
287-
const resp: RelevantTextDocument[] = []
287+
const resp: RelevantTextDocumentAddition[] = []
288288
if (chunks) {
289289
for (const chunk of chunks) {
290290
const text = chunk.context ? chunk.context : chunk.content

packages/core/src/amazonq/webview/ui/main.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ export const createMynahUI = (
351351
...(item.relatedContent !== undefined ? { relatedContent: item.relatedContent } : {}),
352352
...(item.followUp !== undefined ? { followUp: item.followUp } : {}),
353353
...(item.fileList !== undefined ? { fileList: item.fileList } : {}),
354+
...(item.header !== undefined ? { header: item.header } : {}),
354355
})
355356
if (
356357
item.messageId !== undefined &&
@@ -381,7 +382,11 @@ export const createMynahUI = (
381382
file.relativeFilePath,
382383
{
383384
label: file.lineRanges
384-
.map((range) => `line ${range.first} - ${range.second}`)
385+
.map((range) =>
386+
range.first === -1 || range.second === -1
387+
? ''
388+
: `line ${range.first} - ${range.second}`
389+
)
385390
.join(', '),
386391
description: file.relativeFilePath,
387392
clickable: true,

packages/core/src/codewhisperer/client/user-service-2.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,12 +1907,6 @@
19071907
"documentSymbols": {
19081908
"shape": "DocumentSymbols",
19091909
"documentation": "<p>DocumentSymbols parsed from a text document</p>"
1910-
},
1911-
"startLine": {
1912-
"shape": "Integer"
1913-
},
1914-
"endLine": {
1915-
"shape": "Integer"
19161910
}
19171911
},
19181912
"documentation": "<p>Represents an IDE retrieved relevant Text Document / File</p>"

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

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
QuickCommandGroupActionClick,
3131
MergedRelevantDocument,
3232
FileClick,
33+
RelevantTextDocumentAddition,
3334
} from './model'
3435
import {
3536
AppToWebViewMessageDispatcher,
@@ -43,7 +44,7 @@ import { EditorContextCommand } from '../../commands/registerCommands'
4344
import { PromptsGenerator } from './prompts/promptsGenerator'
4445
import { TriggerEventsStorage } from '../../storages/triggerEvents'
4546
import { SendMessageRequest } from '@amzn/amazon-q-developer-streaming-client'
46-
import { CodeWhispererStreamingServiceException, RelevantTextDocument } from '@amzn/codewhisperer-streaming'
47+
import { CodeWhispererStreamingServiceException } from '@amzn/codewhisperer-streaming'
4748
import { UserIntentRecognizer } from './userIntent/userIntentRecognizer'
4849
import { CWCTelemetryHelper, recordTelemetryChatRunCommand } from './telemetryHelper'
4950
import { CodeWhispererTracker } from '../../../codewhisperer/tracker/codewhispererTracker'
@@ -600,6 +601,8 @@ export class ChatController {
600601
if (!lineRanges) {
601602
return
602603
}
604+
605+
// TODO: Fix for multiple workspace setup
603606
const projectRoot = workspace.workspaceFolders?.[0]?.uri.fsPath
604607
if (!projectRoot) {
605608
return
@@ -612,15 +615,25 @@ export class ChatController {
612615
const editor = await window.showTextDocument(document, ViewColumn.Active)
613616

614617
// Create multiple selections based on line ranges
615-
const selections: Selection[] = lineRanges.map(({ first, second }) => {
616-
const startPosition = new Position(first - 1, 0) // Convert 1-based to 0-based
617-
const endPosition = new Position(second - 1, document.lineAt(second - 1).range.end.character)
618-
return new Selection(startPosition.line, startPosition.character, endPosition.line, endPosition.character)
619-
})
618+
const selections: Selection[] = lineRanges
619+
.filter(({ first, second }) => first !== -1 && second !== -1)
620+
.map(({ first, second }) => {
621+
const startPosition = new Position(first - 1, 0) // Convert 1-based to 0-based
622+
const endPosition = new Position(second - 1, document.lineAt(second - 1).range.end.character)
623+
return new Selection(
624+
startPosition.line,
625+
startPosition.character,
626+
endPosition.line,
627+
endPosition.character
628+
)
629+
})
620630

621631
// Apply multiple selections to the editor using the new API
622-
editor.selection = selections[0] // Set the first selection as active
623-
editor.selections = selections // Apply multiple selections
632+
if (selections.length > 0) {
633+
editor.selection = selections[0] // Set the first selection as active
634+
editor.selections = selections // Apply multiple selections
635+
editor.revealRange(selections[0], vscode.TextEditorRevealType.InCenter)
636+
}
624637
}
625638

626639
private processException(e: any, tabID: string) {
@@ -868,22 +881,24 @@ export class ChatController {
868881
this.messenger.sendStaticTextResponse(responseType, triggerID, tabID)
869882
}
870883

871-
private async resolveContextCommandPayload(triggerPayload: TriggerPayload) {
884+
private async resolveContextCommandPayload(triggerPayload: TriggerPayload): Promise<string[]> {
872885
if (triggerPayload.context === undefined || triggerPayload.context.length === 0) {
873-
return
886+
return []
874887
}
875888
const contextCommands: ContextCommandItem[] = []
889+
const relativePaths: string[] = []
876890
for (const context of triggerPayload.context) {
877891
if (typeof context !== 'string' && context.route && context.route.length === 2) {
878892
contextCommands.push({
879893
workspaceFolder: context.route?.[0] || '',
880894
type: context.icon === 'folder' ? 'folder' : 'file',
881895
relativePath: context.route?.[1] || '',
882896
})
897+
relativePaths.push(context.route[1])
883898
}
884899
}
885900
if (contextCommands.length === 0) {
886-
return
901+
return []
887902
}
888903
const prompts = await LspClient.instance.getContextCommandPrompt(contextCommands)
889904
if (prompts.length > 0) {
@@ -902,6 +917,7 @@ export class ChatController {
902917
`Retrieved chunks of additional context count: ${triggerPayload.additionalContents.length} `
903918
)
904919
}
920+
return relativePaths
905921
}
906922

907923
private async generateResponse(
@@ -937,7 +953,7 @@ export class ChatController {
937953
return
938954
}
939955

940-
await this.resolveContextCommandPayload(triggerPayload)
956+
const relativePaths = await this.resolveContextCommandPayload(triggerPayload)
941957
// TODO: resolve the context into real context up to 90k
942958
triggerPayload.useRelevantDocuments = false
943959
if (triggerPayload.message) {
@@ -988,11 +1004,24 @@ export class ChatController {
9881004

9891005
session.currentContextId++
9901006
session.contexts.set(session.currentContextId, new Map())
991-
if (triggerPayload.mergedRelevantDocuments) {
992-
for (const doc of triggerPayload.mergedRelevantDocuments) {
993-
const currentContext = session.contexts.get(session.currentContextId)
994-
if (currentContext) {
995-
currentContext.set(doc.relativeFilePath, doc.lineRanges)
1007+
if (triggerPayload.mergedRelevantDocuments !== undefined) {
1008+
const relativePathsOfMergedRelevantDocuments = triggerPayload.mergedRelevantDocuments.map(
1009+
(doc) => doc.relativeFilePath
1010+
)
1011+
for (const relativePath of relativePaths) {
1012+
if (!relativePathsOfMergedRelevantDocuments.includes(relativePath)) {
1013+
triggerPayload.mergedRelevantDocuments.push({
1014+
relativeFilePath: relativePath,
1015+
lineRanges: [{ first: -1, second: -1 }],
1016+
})
1017+
}
1018+
}
1019+
if (triggerPayload.mergedRelevantDocuments) {
1020+
for (const doc of triggerPayload.mergedRelevantDocuments) {
1021+
const currentContext = session.contexts.get(session.currentContextId)
1022+
if (currentContext) {
1023+
currentContext.set(doc.relativeFilePath, doc.lineRanges)
1024+
}
9961025
}
9971026
}
9981027
}
@@ -1037,7 +1066,7 @@ export class ChatController {
10371066
}
10381067

10391068
private mergeRelevantTextDocuments(
1040-
documents: RelevantTextDocument[] | undefined
1069+
documents: RelevantTextDocumentAddition[] | undefined
10411070
): MergedRelevantDocument[] | undefined {
10421071
if (documents === undefined) {
10431072
return undefined

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,16 @@ export interface TriggerPayload {
187187
readonly userIntent: UserIntent | undefined
188188
readonly customization: Customization
189189
readonly context?: string[] | QuickActionCommand[]
190-
relevantTextDocuments?: RelevantTextDocument[]
190+
relevantTextDocuments?: RelevantTextDocumentAddition[]
191191
additionalContents?: AdditionalContentEntry[]
192192
mergedRelevantDocuments?: MergedRelevantDocument[]
193193
useRelevantDocuments?: boolean
194194
traceId?: string
195195
}
196196

197+
// TODO move this to API definition (or just use this across the codebase)
198+
export type RelevantTextDocumentAddition = RelevantTextDocument & { startLine: number; endLine: number }
199+
197200
export interface MergedRelevantDocument {
198201
readonly relativeFilePath: string
199202
readonly lineRanges: Array<{ first: number; second: number }>

0 commit comments

Comments
 (0)