@@ -235,23 +235,48 @@ type DispatchTelegramMessageParams = {
235235type TelegramReasoningLevel = "off" | "on" | "stream" ;
236236
237237type TelegramTranscriptMirrorPayload = { text ?: string ; mediaUrls ?: string [ ] } ;
238+ type TelegramSessionStore = ReturnType < typeof loadSessionStore > ;
239+ type FreshTelegramSessionStoreLoader = ( ( agentId : string ) => {
240+ storePath : string ;
241+ store : TelegramSessionStore ;
242+ } ) & {
243+ clear : ( ) => void ;
244+ } ;
245+
246+ function createFreshTelegramSessionStoreLoader ( params : {
247+ cfg : OpenClawConfig ;
248+ telegramDeps : TelegramBotDeps ;
249+ } ) : FreshTelegramSessionStoreLoader {
250+ const storesByPath = new Map < string , TelegramSessionStore > ( ) ;
251+ const load = ( ( agentId : string ) => {
252+ const storePath = params . telegramDeps . resolveStorePath ( params . cfg . session ?. store , { agentId } ) ;
253+ const cachedStore = storesByPath . get ( storePath ) ;
254+ if ( cachedStore ) {
255+ return { storePath, store : cachedStore } ;
256+ }
257+ const store = ( params . telegramDeps . loadSessionStore ?? loadSessionStore ) ( storePath , {
258+ skipCache : true ,
259+ } ) ;
260+ storesByPath . set ( storePath , store ) ;
261+ return { storePath, store } ;
262+ } ) as FreshTelegramSessionStoreLoader ;
263+ load . clear = ( ) => storesByPath . clear ( ) ;
264+ return load ;
265+ }
238266
239267function resolveTelegramReasoningLevel ( params : {
240268 cfg : OpenClawConfig ;
241269 sessionKey ?: string ;
242270 agentId : string ;
243- telegramDeps : TelegramBotDeps ;
271+ loadFreshSessionStore : FreshTelegramSessionStoreLoader ;
244272} ) : TelegramReasoningLevel {
245- const { cfg, sessionKey, agentId, telegramDeps } = params ;
273+ const { cfg, sessionKey, agentId } = params ;
246274 const configDefault = resolveTelegramConfigReasoningDefault ( cfg , agentId ) ;
247275 if ( ! sessionKey ) {
248276 return configDefault ;
249277 }
250278 try {
251- const storePath = telegramDeps . resolveStorePath ( cfg . session ?. store , { agentId } ) ;
252- const store = ( telegramDeps . loadSessionStore ?? loadSessionStore ) ( storePath , {
253- skipCache : true ,
254- } ) ;
279+ const { store } = params . loadFreshSessionStore ( agentId ) ;
255280 const entry = resolveSessionStoreEntry ( { store, sessionKey } ) . existing ;
256281 const level = entry ?. reasoningLevel ;
257282 if ( level === "on" || level === "stream" || level === "off" ) {
@@ -285,19 +310,14 @@ async function mirrorTelegramAssistantReplyToTranscript(params: {
285310 cfg : OpenClawConfig ;
286311 route : TelegramMessageContext [ "route" ] ;
287312 sessionKey : string ;
288- telegramDeps : TelegramBotDeps ;
313+ loadFreshSessionStore : FreshTelegramSessionStoreLoader ;
289314 payload : TelegramTranscriptMirrorPayload ;
290315} ) {
291316 const text = resolveTelegramMirroredTranscriptText ( params . payload ) ;
292317 if ( ! text ) {
293318 return ;
294319 }
295- const storePath = params . telegramDeps . resolveStorePath ( params . cfg . session ?. store , {
296- agentId : params . route . agentId ,
297- } ) ;
298- const store = ( params . telegramDeps . loadSessionStore ?? loadSessionStore ) ( storePath , {
299- skipCache : true ,
300- } ) ;
320+ const { storePath, store } = params . loadFreshSessionStore ( params . route . agentId ) ;
301321 const sessionEntry = resolveSessionStoreEntry ( {
302322 store,
303323 sessionKey : params . sessionKey ,
@@ -384,6 +404,7 @@ export const dispatchTelegramMessage = async ({
384404 const dispatchStartedAt = Date . now ( ) ;
385405 const telegramDeps =
386406 injectedTelegramDeps ?? ( await import ( "./bot-deps.js" ) ) . defaultTelegramBotDeps ;
407+ const loadFreshSessionStore = createFreshTelegramSessionStoreLoader ( { cfg, telegramDeps } ) ;
387408 const {
388409 ctxPayload,
389410 msg,
@@ -499,7 +520,7 @@ export const dispatchTelegramMessage = async ({
499520 cfg,
500521 sessionKey : ctxPayload . SessionKey ,
501522 agentId : route . agentId ,
502- telegramDeps ,
523+ loadFreshSessionStore ,
503524 } ) ;
504525 const forceBlockStreamingForReasoning = resolvedReasoningLevel === "on" ;
505526 const streamReasoningDraft = resolvedReasoningLevel === "stream" ;
@@ -960,12 +981,7 @@ export const dispatchTelegramMessage = async ({
960981 return undefined ;
961982 }
962983 try {
963- const storePath = telegramDeps . resolveStorePath ( cfg . session ?. store , {
964- agentId : route . agentId ,
965- } ) ;
966- const store = ( telegramDeps . loadSessionStore ?? loadSessionStore ) ( storePath , {
967- skipCache : true ,
968- } ) ;
984+ const { storePath, store } = loadFreshSessionStore ( route . agentId ) ;
969985 const sessionEntry = resolveSessionStoreEntry ( {
970986 store,
971987 sessionKey,
@@ -1020,7 +1036,7 @@ export const dispatchTelegramMessage = async ({
10201036 cfg,
10211037 route,
10221038 sessionKey,
1023- telegramDeps ,
1039+ loadFreshSessionStore ,
10241040 payload,
10251041 } ) ;
10261042 }
@@ -1285,12 +1301,7 @@ export const dispatchTelegramMessage = async ({
12851301
12861302 if ( isDmTopic ) {
12871303 try {
1288- const storePath = telegramDeps . resolveStorePath ( cfg . session ?. store , {
1289- agentId : route . agentId ,
1290- } ) ;
1291- const store = ( telegramDeps . loadSessionStore ?? loadSessionStore ) ( storePath , {
1292- skipCache : true ,
1293- } ) ;
1304+ const { store } = loadFreshSessionStore ( route . agentId ) ;
12941305 const sessionKey = ctxPayload . SessionKey ;
12951306 if ( sessionKey ) {
12961307 const entry = resolveSessionStoreEntry ( { store, sessionKey } ) . existing ;
@@ -1302,6 +1313,7 @@ export const dispatchTelegramMessage = async ({
13021313 logVerbose ( `auto-topic-label: session store error: ${ formatErrorMessage ( err ) } ` ) ;
13031314 }
13041315 }
1316+ loadFreshSessionStore . clear ( ) ;
13051317
13061318 if ( statusReactionController && ! isRoomEvent ) {
13071319 void statusReactionController . setThinking ( ) ;
0 commit comments