@@ -91,6 +91,7 @@ interface ActiveModuleState {
9191 getCalculationStageState : ReturnType < typeof vi . fn > ;
9292 updateEffectAndCommit : ReturnType < typeof vi . fn > ;
9393 } ;
94+ setDebugTextReadMode : ReturnType < typeof vi . fn > ;
9495 loggerInfo : ReturnType < typeof vi . fn > ;
9596 loggerWarn : ReturnType < typeof vi . fn > ;
9697 loggerError : ReturnType < typeof vi . fn > ;
@@ -114,6 +115,7 @@ interface WebSocketRuntimeHarness {
114115 } > ;
115116 layers : Array < { id : string } > ;
116117 } ;
118+ setDebugTextReadMode : ReturnType < typeof vi . fn > ;
117119 updateEffectAndCommit : ReturnType < typeof vi . fn > ;
118120 webgalParserParse : ReturnType < typeof vi . fn > ;
119121 WebGAL : Record < string , any > ;
@@ -196,6 +198,11 @@ vi.doMock('@/Core/Modules/stage/stageStateManager', () => ({
196198 return getActiveModuleState ( ) . stageStateManager ;
197199 } ,
198200} ) ) ;
201+ vi . doMock ( '@/Core/Modules/readHistory' , ( ) => ( {
202+ get setDebugTextReadMode ( ) {
203+ return getActiveModuleState ( ) . setDebugTextReadMode ;
204+ } ,
205+ } ) ) ;
199206vi . doMock ( '@/Core/Modules/stage/stageInterface' , ( ) => ( {
200207 baseTransform : {
201208 position : { x : 0 , y : 0 } ,
@@ -300,6 +307,7 @@ async function setupWebSocketRuntimeHarness(): Promise<WebSocketRuntimeHarness>
300307 const nextSentence = vi . fn ( ) ;
301308 const resetStage = vi . fn ( ) ;
302309 const updateEffectAndCommit = stageStateManager . updateEffectAndCommit ;
310+ const setDebugTextReadMode = vi . fn ( ) ;
303311
304312 activeModuleState = {
305313 webgalStore,
@@ -315,6 +323,7 @@ async function setupWebSocketRuntimeHarness(): Promise<WebSocketRuntimeHarness>
315323 resetStage,
316324 updateEffectAndCommit,
317325 stageStateManager,
326+ setDebugTextReadMode,
318327 loggerInfo : vi . fn ( ) ,
319328 loggerWarn : vi . fn ( ) ,
320329 loggerError : vi . fn ( ) ,
@@ -341,6 +350,7 @@ async function setupWebSocketRuntimeHarness(): Promise<WebSocketRuntimeHarness>
341350 runScript,
342351 socket,
343352 stageState,
353+ setDebugTextReadMode,
344354 updateEffectAndCommit,
345355 webgalParserParse,
346356 WebGAL,
@@ -601,6 +611,29 @@ describe('startPreviewSyncRuntime runtime behavior', () => {
601611 } ) ;
602612 } ) ;
603613
614+ it ( 'applies text read mode updates through the v1 protocol and replies with a success envelope' , async ( ) => {
615+ const harness = await setupWebSocketRuntimeHarness ( ) ;
616+
617+ await completeRegisterPreviewHandshake ( harness ) ;
618+
619+ harness . socket . emitMessage (
620+ JSON . stringify (
621+ createRequestEnvelope ( 'preview.command.set-text-read-mode' , 'req-set-text-read-mode' , {
622+ isRead : true ,
623+ } ) ,
624+ ) ,
625+ ) ;
626+ await flushMicrotasks ( ) ;
627+
628+ expect ( harness . setDebugTextReadMode ) . toHaveBeenCalledWith ( true ) ;
629+ expect ( parseSentEnvelope ( harness . socket , 3 ) ) . toEqual ( {
630+ kind : 'response' ,
631+ type : 'preview.command.set-text-read-mode' ,
632+ requestId : 'req-set-text-read-mode' ,
633+ payload : { } ,
634+ } ) ;
635+ } ) ;
636+
604637 it ( 're-registers with the same identity and re-publishes ready plus snapshot after reconnect' , async ( ) => {
605638 const harness = await setupWebSocketRuntimeHarness ( ) ;
606639
0 commit comments