@@ -298,4 +298,182 @@ void testUpdateWorkingMemoryData() throws Exception {
298298 assertEquals ("new_value" , response .getData ().get ("new_field" ));
299299 assertEquals ("active" , response .getData ().get ("status" )); // Should still exist
300300 }
301+
302+ @ Test
303+ void testAppendMessagesWithTokens () throws Exception {
304+ String sessionId = "append-tokens-test-" + UUID .randomUUID ();
305+ String namespace = "integration-test" ;
306+
307+ // Create initial working memory with some tokens
308+ WorkingMemory initialMemory = WorkingMemory .builder ()
309+ .sessionId (sessionId )
310+ .namespace (namespace )
311+ .messages (Collections .singletonList (
312+ MemoryMessage .builder ().role ("user" ).content ("Hello" ).build ()))
313+ .tokens (100 )
314+ .build ();
315+
316+ client .workingMemory ().putWorkingMemory (sessionId , initialMemory , namespace , null , null , null );
317+
318+ // Verify initial tokens
319+ WorkingMemoryResponse initial = client .workingMemory ()
320+ .getWorkingMemory (sessionId , namespace , null , null , null );
321+ assertEquals (100 , initial .getTokens ());
322+
323+ // Append messages with updated token count
324+ List <MemoryMessage > newMessages = Collections .singletonList (
325+ MemoryMessage .builder ().role ("assistant" ).content ("Hi there! How can I help?" ).build ());
326+
327+ WorkingMemoryResponse response = client .workingMemory ()
328+ .appendMessagesToWorkingMemory (sessionId , newMessages , namespace , null , null , null , 250 );
329+
330+ assertNotNull (response );
331+ assertEquals (250 , response .getTokens ());
332+ assertTrue (response .getMessages ().size () >= 2 );
333+
334+ // Verify tokens persisted
335+ WorkingMemoryResponse retrieved = client .workingMemory ()
336+ .getWorkingMemory (sessionId , namespace , null , null , null );
337+ assertEquals (250 , retrieved .getTokens ());
338+ }
339+
340+ @ Test
341+ void testAppendMessagesPreservesExistingTokens () throws Exception {
342+ String sessionId = "preserve-tokens-test-" + UUID .randomUUID ();
343+ String namespace = "integration-test" ;
344+
345+ // Create initial working memory with tokens
346+ WorkingMemory initialMemory = WorkingMemory .builder ()
347+ .sessionId (sessionId )
348+ .namespace (namespace )
349+ .messages (Collections .singletonList (
350+ MemoryMessage .builder ().role ("user" ).content ("Hello" ).build ()))
351+ .tokens (150 )
352+ .build ();
353+
354+ client .workingMemory ().putWorkingMemory (sessionId , initialMemory , namespace , null , null , null );
355+
356+ // Append messages WITHOUT specifying tokens (should preserve existing 150)
357+ List <MemoryMessage > newMessages = Collections .singletonList (
358+ MemoryMessage .builder ().role ("assistant" ).content ("Hi!" ).build ());
359+
360+ WorkingMemoryResponse response = client .workingMemory ()
361+ .appendMessagesToWorkingMemory (sessionId , newMessages , namespace , null , null , null );
362+
363+ assertNotNull (response );
364+ assertEquals (150 , response .getTokens ()); // Should preserve existing
365+ assertTrue (response .getMessages ().size () >= 2 );
366+
367+ // Verify tokens persisted
368+ WorkingMemoryResponse retrieved = client .workingMemory ()
369+ .getWorkingMemory (sessionId , namespace , null , null , null );
370+ assertEquals (150 , retrieved .getTokens ());
371+ }
372+
373+ @ Test
374+ void testAppendMessagesWithTtl () throws Exception {
375+ String sessionId = "append-ttl-test-" + UUID .randomUUID ();
376+ String namespace = "integration-test" ;
377+
378+ // Create initial working memory with TTL
379+ WorkingMemory initialMemory = WorkingMemory .builder ()
380+ .sessionId (sessionId )
381+ .namespace (namespace )
382+ .messages (Collections .singletonList (
383+ MemoryMessage .builder ().role ("user" ).content ("Hello" ).build ()))
384+ .ttlSeconds (1800 ) // 30 minutes
385+ .build ();
386+
387+ client .workingMemory ().putWorkingMemory (sessionId , initialMemory , namespace , null , null , null );
388+
389+ // Verify initial TTL
390+ WorkingMemoryResponse initial = client .workingMemory ()
391+ .getWorkingMemory (sessionId , namespace , null , null , null );
392+ assertEquals (Integer .valueOf (1800 ), initial .getTtlSeconds ());
393+
394+ // Append messages with new TTL (restart to 1 hour)
395+ List <MemoryMessage > newMessages = Collections .singletonList (
396+ MemoryMessage .builder ().role ("assistant" ).content ("Hi there!" ).build ());
397+
398+ WorkingMemoryResponse response = client .workingMemory ()
399+ .appendMessagesToWorkingMemory (sessionId , newMessages , namespace , null , null , null , null , 3600 );
400+
401+ assertNotNull (response );
402+ assertEquals (Integer .valueOf (3600 ), response .getTtlSeconds ());
403+ assertTrue (response .getMessages ().size () >= 2 );
404+
405+ // Verify TTL persisted
406+ WorkingMemoryResponse retrieved = client .workingMemory ()
407+ .getWorkingMemory (sessionId , namespace , null , null , null );
408+ assertEquals (Integer .valueOf (3600 ), retrieved .getTtlSeconds ());
409+ }
410+
411+ @ Test
412+ void testAppendMessagesPreservesExistingTtl () throws Exception {
413+ String sessionId = "preserve-ttl-test-" + UUID .randomUUID ();
414+ String namespace = "integration-test" ;
415+
416+ // Create initial working memory with TTL
417+ WorkingMemory initialMemory = WorkingMemory .builder ()
418+ .sessionId (sessionId )
419+ .namespace (namespace )
420+ .messages (Collections .singletonList (
421+ MemoryMessage .builder ().role ("user" ).content ("Hello" ).build ()))
422+ .ttlSeconds (1800 ) // 30 minutes
423+ .build ();
424+
425+ client .workingMemory ().putWorkingMemory (sessionId , initialMemory , namespace , null , null , null );
426+
427+ // Append messages WITHOUT specifying TTL (should preserve existing)
428+ List <MemoryMessage > newMessages = Collections .singletonList (
429+ MemoryMessage .builder ().role ("assistant" ).content ("Hi!" ).build ());
430+
431+ WorkingMemoryResponse response = client .workingMemory ()
432+ .appendMessagesToWorkingMemory (sessionId , newMessages , namespace , null , null , null );
433+
434+ assertNotNull (response );
435+ assertEquals (Integer .valueOf (1800 ), response .getTtlSeconds ()); // Should preserve existing
436+ assertTrue (response .getMessages ().size () >= 2 );
437+
438+ // Verify TTL persisted
439+ WorkingMemoryResponse retrieved = client .workingMemory ()
440+ .getWorkingMemory (sessionId , namespace , null , null , null );
441+ assertEquals (Integer .valueOf (1800 ), retrieved .getTtlSeconds ());
442+ }
443+
444+ @ Test
445+ void testAppendMessagesWithTokensAndTtl () throws Exception {
446+ String sessionId = "append-tokens-ttl-test-" + UUID .randomUUID ();
447+ String namespace = "integration-test" ;
448+
449+ // Create initial working memory with tokens and TTL
450+ WorkingMemory initialMemory = WorkingMemory .builder ()
451+ .sessionId (sessionId )
452+ .namespace (namespace )
453+ .messages (Collections .singletonList (
454+ MemoryMessage .builder ().role ("user" ).content ("Hello" ).build ()))
455+ .tokens (100 )
456+ .ttlSeconds (1800 )
457+ .build ();
458+
459+ client .workingMemory ().putWorkingMemory (sessionId , initialMemory , namespace , null , null , null );
460+
461+ // Append messages with both new tokens and new TTL
462+ List <MemoryMessage > newMessages = Collections .singletonList (
463+ MemoryMessage .builder ().role ("assistant" ).content ("Hi there!" ).build ());
464+
465+ WorkingMemoryResponse response = client .workingMemory ()
466+ .appendMessagesToWorkingMemory (sessionId , newMessages , namespace , null , null , null , 250 , 3600 );
467+
468+ assertNotNull (response );
469+ assertEquals (250 , response .getTokens ());
470+ assertEquals (Integer .valueOf (3600 ), response .getTtlSeconds ());
471+ assertTrue (response .getMessages ().size () >= 2 );
472+
473+ // Verify both persisted
474+ WorkingMemoryResponse retrieved = client .workingMemory ()
475+ .getWorkingMemory (sessionId , namespace , null , null , null );
476+ assertEquals (250 , retrieved .getTokens ());
477+ assertEquals (Integer .valueOf (3600 ), retrieved .getTtlSeconds ());
478+ }
301479}
0 commit comments