in server/aws-lsp-codewhisperer/src/language-server/agenticChat/context/agenticChatTriggerContext.ts [97:215]
async getChatParamsFromTrigger(
params: ChatParams | InlineChatParams,
triggerContext: TriggerContext,
chatTriggerType: ChatTriggerType,
customizationArn?: string,
chatResultStream?: AgenticChatResultStream,
profileArn?: string,
history: ChatMessage[] = [],
tools: BedrockTools = [],
additionalContent?: AdditionalContentEntryAddition[]
): Promise<GenerateAssistantResponseCommandInput> {
const { prompt } = params
const defaultEditorState = { workspaceFolders: workspaceUtils.getWorkspaceFolderPaths(this.#lsp) }
const hasWorkspace = 'context' in params ? params.context?.some(c => c.command === '@workspace') : false
let promptContent = prompt.escapedPrompt ?? prompt.prompt
// When the user adds @sage context, ** gets prepended and appended to the prompt because of markdown.
// This intereferes with routing logic thus we need to remove it
if (promptContent && promptContent.includes('@sage')) {
promptContent = promptContent.replace(/\*\*@sage\*\*/g, '@sage')
}
if (hasWorkspace) {
promptContent = promptContent?.replace(/^@workspace\/?/, '')
}
// Get workspace documents if @workspace is used
let relevantDocuments = hasWorkspace
? await this.#getRelevantDocuments(promptContent ?? '', chatResultStream)
: []
const workspaceFileList = mergeRelevantTextDocuments(relevantDocuments)
triggerContext.documentReference = triggerContext.documentReference
? mergeFileLists(triggerContext.documentReference, workspaceFileList)
: workspaceFileList
// Process additionalContent items if present
if (additionalContent) {
for (const item of additionalContent) {
// Determine programming language from file extension or type
let programmingLanguage: ProgrammingLanguage | undefined = undefined
if (item.relativePath) {
const ext = path.extname(item.relativePath).toLowerCase()
const language = languageByExtension[ext]
if (language) {
programmingLanguage = { languageName: language }
}
}
const filteredType =
item.type === 'file'
? ContentType.FILE
: item.type === 'rule' || item.type === 'prompt'
? ContentType.PROMPT
: item.type === 'code'
? ContentType.CODE
: undefined
// Create the relevant text document
const relevantTextDocument: RelevantTextDocumentAddition = {
text: item.innerContext,
path: item.path,
relativeFilePath: item.relativePath,
programmingLanguage: programmingLanguage,
type: filteredType,
startLine: item.startLine || -1,
endLine: item.endLine || -1,
}
relevantDocuments.push(relevantTextDocument)
}
}
const useRelevantDocuments = relevantDocuments.length !== 0
const data: GenerateAssistantResponseCommandInput = {
conversationState: {
chatTriggerType: chatTriggerType,
currentMessage: {
userInputMessage: {
content: promptContent,
userInputMessageContext:
triggerContext.cursorState && triggerContext.relativeFilePath
? {
editorState: {
cursorState: triggerContext.cursorState,
document: {
text: triggerContext.text,
programmingLanguage: triggerContext.programmingLanguage,
relativeFilePath: triggerContext.relativeFilePath,
},
relevantDocuments: useRelevantDocuments ? relevantDocuments : undefined,
useRelevantDocuments: useRelevantDocuments,
...defaultEditorState,
},
tools,
envState: this.#mapPlatformToEnvState(process.platform),
}
: {
tools,
editorState: {
relevantDocuments: useRelevantDocuments ? relevantDocuments : undefined,
useRelevantDocuments: useRelevantDocuments,
...defaultEditorState,
},
envState: this.#mapPlatformToEnvState(process.platform),
},
userIntent: triggerContext.userIntent,
origin: 'IDE',
},
},
customizationArn,
history,
},
profileArn,
}
return data
}