@@ -72,6 +72,36 @@ describe('SessionMessageBuffer (in-RAM observation buffer)', () => {
7272 expect ( second . map ( m => m . tool_name ) ) . toEqual ( [ 'Write' ] ) ;
7373 } ) ;
7474
75+ test ( 'resetClaimed re-yields an in-flight message without a durable processing row' , async ( ) => {
76+ const buffer = new SessionMessageBuffer ( ) ;
77+ const controller = new AbortController ( ) ;
78+ const iterator = buffer . drain ( {
79+ sessionDbId : 1 ,
80+ signal : controller . signal ,
81+ idleTimeoutMs : 10_000 ,
82+ } ) ;
83+
84+ const messageId = buffer . enqueue ( 1 , obs ( 'Read' , 'tool-1' ) ) ;
85+
86+ const first = await iterator . next ( ) ;
87+ expect ( first . done ) . toBe ( false ) ;
88+ expect ( first . value . _persistentId ) . toBe ( messageId ) ;
89+ expect ( first . value . toolUseId ) . toBe ( 'tool-1' ) ;
90+ expect ( buffer . getPendingCount ( 1 ) ) . toBe ( 1 ) ;
91+
92+ expect ( buffer . resetClaimed ( 1 ) ) . toBe ( 1 ) ;
93+
94+ const second = await iterator . next ( ) ;
95+ expect ( second . done ) . toBe ( false ) ;
96+ expect ( second . value . _persistentId ) . toBe ( messageId ) ;
97+ expect ( second . value . toolUseId ) . toBe ( 'tool-1' ) ;
98+
99+ expect ( buffer . confirm ( messageId ) ) . toBe ( 1 ) ;
100+ expect ( buffer . getPendingCount ( 1 ) ) . toBe ( 0 ) ;
101+
102+ controller . abort ( ) ;
103+ } ) ;
104+
75105 test ( 'clear empties a session; dispose forgets it' , ( ) => {
76106 const buffer = new SessionMessageBuffer ( ) ;
77107 buffer . enqueue ( 1 , obs ( 'Read' , 'a' ) ) ;
0 commit comments