@@ -21,7 +21,7 @@ import {
2121import { randomUUID } from "crypto" ;
2222import _dedent from "dedent" ;
2323import { ANSWER_TAG , FILE_REFERENCE_PREFIX } from "@/features/chat/constants" ;
24- import { Source } from "@/features/chat/types" ;
24+ import { FileSource , Source } from "@/features/chat/types" ;
2525import { addLineNumbers , fileReferenceToString , formatAttachmentsForPrompt , getAnswerPartFromAssistantMessage , getTurnProgressState , getUserMessageAttachments , getUserMessageText } from "@/features/chat/utils" ;
2626import { createTools } from "./tools" ;
2727import { getConnectedMcpClients } from "@/ee/features/chat/mcp/mcpClientFactory" ;
@@ -551,6 +551,29 @@ interface AgentOptions {
551551 orgId ?: number ;
552552}
553553
554+ export const sliceFileSourceForPrompt = (
555+ source : string ,
556+ range : FileSource [ 'range' ] ,
557+ ) : { source : string ; lineOffset : number } | undefined => {
558+ if ( ! range ) {
559+ return { source, lineOffset : 1 } ;
560+ }
561+
562+ const lines = source . split ( '\n' ) ;
563+ if (
564+ range . startLine < 1 ||
565+ range . endLine < range . startLine ||
566+ range . endLine > lines . length
567+ ) {
568+ return undefined ;
569+ }
570+
571+ return {
572+ source : lines . slice ( range . startLine - 1 , range . endLine ) . join ( '\n' ) ,
573+ lineOffset : range . startLine ,
574+ } ;
575+ } ;
576+
554577const createAgentStream = async ( {
555578 model,
556579 promptCacheStrategy,
@@ -591,12 +614,20 @@ const createAgentStream = async ({
591614 return undefined ;
592615 }
593616
617+ const selectedSource = sliceFileSourceForPrompt ( fileSource . source , source . range ) ;
618+ if ( ! selectedSource ) {
619+ logger . warn ( `Ignoring invalid selected range for ${ source . repo } :${ source . path } ` ) ;
620+ return undefined ;
621+ }
622+
594623 return {
595624 path : fileSource . path ,
596- source : fileSource . source ,
625+ source : selectedSource . source ,
597626 repo : fileSource . repo ,
598627 language : fileSource . language ,
599628 revision : source . revision ,
629+ lineOffset : selectedSource . lineOffset ,
630+ range : source . range ,
600631 } ;
601632 } ) )
602633 ) . filter ( ( source ) => source !== undefined ) ;
@@ -999,8 +1030,8 @@ const createPrompt = ({
9991030 <files>
10001031 The user has mentioned the following files, which are automatically included for analysis.
10011032
1002- ${ files . map ( file => `<file path="${ file . path } " repository="${ file . repo } " language="${ file . language } " revision="${ file . revision } ">
1003- ${ addLineNumbers ( file . source ) }
1033+ ${ files . map ( file => `<file path="${ file . path } " repository="${ file . repo } " language="${ file . language } " revision="${ file . revision } "${ file . range ? ` selected_lines=" ${ file . range . startLine } - ${ file . range . endLine } "` : '' } >
1034+ ${ addLineNumbers ( file . source , file . lineOffset ) }
10041035 </file>` ) . join ( '\n\n' ) }
10051036 </files>
10061037 ` ) ;
0 commit comments