@@ -192,6 +192,21 @@ describe('Hex source retrieval', () => {
192192 await expect ( readHexMcp ( client ( { workspace : OTHER } ) , reference ) ) . rejects . toThrow ( / w o r k s p a c e / i)
193193 } )
194194
195+ it ( 'withholds notebook source when the provider workspace changes during paging' , async ( ) => {
196+ const api = client ( )
197+ let connectedWorkspace = WORKSPACE
198+ const changingWorkspace : ManagedSearchMcpClient = {
199+ async call ( name , args ) {
200+ if ( name === 'get_me' ) return { org : { id : connectedWorkspace } }
201+ const result = await api . call ( name , args )
202+ if ( name === 'list_cells' ) connectedWorkspace = OTHER
203+ return result
204+ } ,
205+ }
206+
207+ await expect ( readHexMcp ( changingWorkspace , reference ) ) . rejects . toThrow ( / w o r k s p a c e / i)
208+ } )
209+
195210 it . each ( [
196211 { ...metadata , id : OTHER } ,
197212 { ...metadata , trashedAt : '2026-01-01T13:00:00Z' } ,
@@ -253,4 +268,24 @@ describe('Hex source retrieval', () => {
253268 )
254269 ) . rejects . toThrow ( / p a g e l i m i t / i)
255270 } )
271+
272+ it ( 'reads a complete eight-page notebook within the managed request budget' , async ( ) => {
273+ const api = client ( {
274+ pages : Array . from ( { length : 8 } , ( _ , index ) => ( {
275+ values : [ cell ( `cell-${ index } ` , 'MARKDOWN' , `Source page ${ index } ` ) ] ,
276+ pagination : { after : index === 7 ? null : `page-${ index } ` } ,
277+ } ) ) ,
278+ } )
279+ let requests = 0
280+ const budgetedClient : ManagedSearchMcpClient = {
281+ call ( name , args ) {
282+ if ( ++ requests > 12 ) throw new Error ( 'Managed request budget exceeded' )
283+ return api . call ( name , args )
284+ } ,
285+ }
286+
287+ const result = await readHexMcp ( budgetedClient , reference )
288+ expect ( result . content ) . toContain ( 'Source page 0' )
289+ expect ( result . content ) . toContain ( 'Source page 7' )
290+ } )
256291} )
0 commit comments