@@ -174,6 +174,103 @@ test('handleCodebaseRetrieval completes success path with combined query telemet
174174 }
175175} ) ;
176176
177+ test ( 'handleCodebaseRetrieval annotates retrieval-stage fetch failures' , async ( ) => {
178+ const baseDir = createTempBaseDir ( ) ;
179+ const repoDir = path . join ( baseDir , 'repo' ) ;
180+ fs . mkdirSync ( repoDir , { recursive : true } ) ;
181+
182+ const previousEnv = {
183+ CONTEXTATLAS_BASE_DIR : process . env . CONTEXTATLAS_BASE_DIR ,
184+ MCP_AUTO_INDEX : process . env . MCP_AUTO_INDEX ,
185+ EMBEDDINGS_API_KEY : process . env . EMBEDDINGS_API_KEY ,
186+ EMBEDDINGS_BASE_URL : process . env . EMBEDDINGS_BASE_URL ,
187+ EMBEDDINGS_MODEL : process . env . EMBEDDINGS_MODEL ,
188+ RERANK_API_KEY : process . env . RERANK_API_KEY ,
189+ RERANK_BASE_URL : process . env . RERANK_BASE_URL ,
190+ RERANK_MODEL : process . env . RERANK_MODEL ,
191+ } ;
192+
193+ process . env . CONTEXTATLAS_BASE_DIR = baseDir ;
194+ process . env . MCP_AUTO_INDEX = 'false' ;
195+ process . env . EMBEDDINGS_API_KEY = 'test-key' ;
196+ process . env . EMBEDDINGS_BASE_URL = 'http://127.0.0.1/embeddings' ;
197+ process . env . EMBEDDINGS_MODEL = 'test-embedding-model' ;
198+ process . env . RERANK_API_KEY = 'test-key' ;
199+ process . env . RERANK_BASE_URL = 'http://127.0.0.1/rerank' ;
200+ process . env . RERANK_MODEL = 'test-rerank-model' ;
201+
202+ const projectId = generateProjectId ( repoDir ) ;
203+ const db = initDb ( projectId ) ;
204+ db . close ( ) ;
205+
206+ const originalInit = SearchService . prototype . init ;
207+ const originalBuildContextPack = SearchService . prototype . buildContextPack ;
208+
209+ SearchService . prototype . init = async function initMock ( ) : Promise < void > { } ;
210+ SearchService . prototype . buildContextPack = ( async function buildContextPackMock (
211+ _query ,
212+ onStage ,
213+ ) {
214+ onStage ?.( 'retrieve' ) ;
215+ throw new TypeError ( 'fetch failed' ) ;
216+ } ) as typeof SearchService . prototype . buildContextPack ;
217+
218+ try {
219+ await assert . rejects (
220+ ( ) =>
221+ handleCodebaseRetrieval ( {
222+ repo_path : repoDir ,
223+ information_request : 'SearchService retrieval flow' ,
224+ } ) ,
225+ / r e t r i e v e s t a g e f a i l e d : f e t c h f a i l e d / ,
226+ ) ;
227+ } finally {
228+ SearchService . prototype . init = originalInit ;
229+ SearchService . prototype . buildContextPack = originalBuildContextPack ;
230+ if ( previousEnv . CONTEXTATLAS_BASE_DIR === undefined ) {
231+ delete process . env . CONTEXTATLAS_BASE_DIR ;
232+ } else {
233+ process . env . CONTEXTATLAS_BASE_DIR = previousEnv . CONTEXTATLAS_BASE_DIR ;
234+ }
235+ if ( previousEnv . MCP_AUTO_INDEX === undefined ) {
236+ delete process . env . MCP_AUTO_INDEX ;
237+ } else {
238+ process . env . MCP_AUTO_INDEX = previousEnv . MCP_AUTO_INDEX ;
239+ }
240+ if ( previousEnv . EMBEDDINGS_API_KEY === undefined ) {
241+ delete process . env . EMBEDDINGS_API_KEY ;
242+ } else {
243+ process . env . EMBEDDINGS_API_KEY = previousEnv . EMBEDDINGS_API_KEY ;
244+ }
245+ if ( previousEnv . EMBEDDINGS_BASE_URL === undefined ) {
246+ delete process . env . EMBEDDINGS_BASE_URL ;
247+ } else {
248+ process . env . EMBEDDINGS_BASE_URL = previousEnv . EMBEDDINGS_BASE_URL ;
249+ }
250+ if ( previousEnv . EMBEDDINGS_MODEL === undefined ) {
251+ delete process . env . EMBEDDINGS_MODEL ;
252+ } else {
253+ process . env . EMBEDDINGS_MODEL = previousEnv . EMBEDDINGS_MODEL ;
254+ }
255+ if ( previousEnv . RERANK_API_KEY === undefined ) {
256+ delete process . env . RERANK_API_KEY ;
257+ } else {
258+ process . env . RERANK_API_KEY = previousEnv . RERANK_API_KEY ;
259+ }
260+ if ( previousEnv . RERANK_BASE_URL === undefined ) {
261+ delete process . env . RERANK_BASE_URL ;
262+ } else {
263+ process . env . RERANK_BASE_URL = previousEnv . RERANK_BASE_URL ;
264+ }
265+ if ( previousEnv . RERANK_MODEL === undefined ) {
266+ delete process . env . RERANK_MODEL ;
267+ } else {
268+ process . env . RERANK_MODEL = previousEnv . RERANK_MODEL ;
269+ }
270+ fs . rmSync ( baseDir , { recursive : true , force : true } ) ;
271+ }
272+ } ) ;
273+
177274test ( 'handleCodebaseRetrieval formats default result card with memory and decision context' , async ( ) => {
178275 const baseDir = createTempBaseDir ( ) ;
179276 const repoDir = path . join ( baseDir , 'repo' ) ;
0 commit comments