1010
1111import hashlib
1212import json
13- import logging
1413import os
1514from typing import Any
1615
1716from bub import hookimpl
1817from bub .envelope import content_of
18+ from loguru import logger
1919
2020from .client import NmemClient , NmemError
2121
22- logger = logging .getLogger (__name__ )
23-
2422# ---------------------------------------------------------------------------
2523# Behavioural guidance injected into the system prompt.
2624# Cost: ~50 tokens. Adjusts when session_context is on to avoid redundant
@@ -138,7 +136,7 @@ async def _load_memory(self, message) -> tuple[str, list[dict[str, Any]]]:
138136 # mem.context or mem.search on demand.
139137 return "" , []
140138 if not self .client .is_available ():
141- logger .debug ("nmem not in PATH, skipping memory load" )
139+ logger .warning ("nmem not in PATH, skipping memory load" )
142140 return "" , []
143141
144142 # Session context mode: fetch WM + recalled memories
@@ -147,15 +145,15 @@ async def _load_memory(self, message) -> tuple[str, list[dict[str, Any]]]:
147145 wm = await self .client .read_working_memory ()
148146 working_memory = wm .get ("content" , "" )
149147 except Exception as exc :
150- logger .debug ("working memory read failed: %s " , exc )
148+ logger .warning ("working memory read failed: {} " , exc )
151149
152150 # Recall: search for memories relevant to the current message
153151 query = content_of (message )
154152 if query and len (query .strip ()) > 3 :
155153 try :
156154 recalled = await self .client .search (query [:500 ], limit = 5 )
157155 except Exception as exc :
158- logger .debug ("recall search failed: %s " , exc )
156+ logger .warning ("recall search failed: {} " , exc )
159157
160158 return working_memory , recalled
161159
@@ -171,20 +169,20 @@ async def save_state(self, session_id, state, message, model_output) -> None:
171169 if not self .client .is_available ():
172170 return
173171
174- try :
175- user_content = content_of (message )
176- if not user_content or not model_output :
177- return
172+ user_content = content_of (message )
173+ if not user_content or not model_output :
174+ return
178175
179- digest = hashlib .sha1 (session_id .encode ()).hexdigest ()[:10 ]
180- thread_id = f"bub-{ digest } "
176+ digest = hashlib .sha1 (session_id .encode ()).hexdigest ()[:10 ]
177+ thread_id = f"bub-{ digest } "
181178
182- messages = [
183- {"role" : "user" , "content" : user_content [:800 ]},
184- {"role" : "assistant" , "content" : str (model_output )[:800 ]},
185- ]
186- messages_json = json .dumps (messages )
179+ messages = [
180+ {"role" : "user" , "content" : user_content [:800 ]},
181+ {"role" : "assistant" , "content" : str (model_output )[:800 ]},
182+ ]
183+ messages_json = json .dumps (messages )
187184
185+ try :
188186 if thread_id in self ._known_threads :
189187 await self .client .append_thread (thread_id , messages_json )
190188 else :
@@ -200,7 +198,7 @@ async def save_state(self, session_id, state, message, model_output) -> None:
200198 self ._known_threads .add (thread_id )
201199 except Exception as exc :
202200 # save_state must never raise — it runs in a finally block
203- logger .debug ("session capture failed: %s " , exc )
201+ logger .warning ("session capture failed: {} " , exc )
204202
205203
206204plugin = NowledgeMemPlugin ()
0 commit comments