never executed always true always false
    1 module PureClaw.Agent.Memory
    2   ( -- * Memory integration
    3     autoRecall
    4   , autoSave
    5   ) where
    6 
    7 import Data.Text (Text)
    8 import Data.Text qualified as T
    9 
   10 import Data.Map.Strict qualified as Map
   11 
   12 import PureClaw.Core.Types
   13 import PureClaw.Handles.Log
   14 import PureClaw.Handles.Memory
   15 
   16 -- | Minimum message length to trigger auto-save (characters).
   17 minSaveLength :: Int
   18 minSaveLength = 50
   19 
   20 -- | Automatically recall relevant memories for a user message.
   21 -- Returns formatted context to prepend to the system prompt, or
   22 -- Nothing if no relevant memories are found.
   23 autoRecall :: MemoryHandle -> LogHandle -> Text -> IO (Maybe Text)
   24 autoRecall mh logger query = do
   25   results <- _mh_search mh query defaultSearchConfig { _sc_maxResults = 3 }
   26   if null results
   27     then pure Nothing
   28     else do
   29       _lh_logDebug logger $ "Recalled " <> T.pack (show (length results)) <> " memories"
   30       let formatted = T.unlines
   31             [ "## Relevant memories"
   32             , ""
   33             , T.intercalate "\n\n" [ _sr_content r | r <- results ]
   34             ]
   35       pure (Just formatted)
   36 
   37 -- | Automatically save an assistant response to memory if it's
   38 -- long enough to be worth remembering.
   39 autoSave :: MemoryHandle -> LogHandle -> Text -> IO ()
   40 autoSave mh logger content
   41   | T.length content < minSaveLength = pure ()
   42   | otherwise = do
   43       let source = MemorySource
   44             { _ms_content  = content
   45             , _ms_metadata = Map.empty
   46             }
   47       result <- _mh_save mh source
   48       case result of
   49         Nothing -> pure ()
   50         Just mid -> _lh_logDebug logger $ "Auto-saved memory: " <> unMemoryId mid