@@ -136,30 +136,37 @@ func (sm *StdioSessionManager) GetSession(key SessionKey) (*StdioSession, bool)
136
136
137
137
if ok {
138
138
now := time .Now ()
139
+ lastAccessed := session .lastAccessed .Load ()
139
140
session .lastAccessed .Store (& now )
140
141
142
+ internal .LogTraceWithFields ("session_manager" , "Session accessed" , map [string ]interface {}{
143
+ "sessionID" : key .SessionID ,
144
+ "server" : key .ServerName ,
145
+ "user" : key .UserEmail ,
146
+ "lastAccessed" : lastAccessed ,
147
+ "timeSinceAccess" : now .Sub (* lastAccessed ).String (),
148
+ })
149
+
141
150
select {
142
151
case <- session .ctx .Done ():
143
152
// Process died, remove it
153
+ internal .LogTraceWithFields ("session_manager" , "Session context cancelled, removing" , map [string ]interface {}{
154
+ "sessionID" : key .SessionID ,
155
+ "server" : key .ServerName ,
156
+ "user" : key .UserEmail ,
157
+ })
144
158
sm .RemoveSession (key )
145
159
return nil , false
146
160
default :
147
161
return session , true
148
162
}
149
163
}
150
164
151
- // Debug: log all sessions when not found
152
- sm .mu .RLock ()
153
- internal .LogWarnWithFields ("session_manager" , "Session not found" , map [string ]interface {}{
154
- "looking_for" : key ,
155
- "total_sessions" : len (sm .sessions ),
165
+ internal .LogTraceWithFields ("session_manager" , "Session not found" , map [string ]interface {}{
166
+ "sessionID" : key .SessionID ,
167
+ "server" : key .ServerName ,
168
+ "user" : key .UserEmail ,
156
169
})
157
- for k := range sm .sessions {
158
- internal .LogWarnWithFields ("session_manager" , "Existing session" , map [string ]interface {}{
159
- "key" : k ,
160
- })
161
- }
162
- sm .mu .RUnlock ()
163
170
164
171
return nil , false
165
172
}
@@ -170,7 +177,13 @@ func (sm *StdioSessionManager) RemoveSession(key SessionKey) {
170
177
session , ok := sm .sessions [key ]
171
178
if ok {
172
179
delete (sm .sessions , key )
180
+ internal .LogTraceWithFields ("session_manager" , "Removing session from map" , map [string ]interface {}{
181
+ "sessionID" : key .SessionID ,
182
+ "server" : key .ServerName ,
183
+ "user" : key .UserEmail ,
184
+ })
173
185
}
186
+ sessionCount := len (sm .sessions )
174
187
sm .mu .Unlock ()
175
188
176
189
if ok {
@@ -192,6 +205,16 @@ func (sm *StdioSessionManager) RemoveSession(key SessionKey) {
192
205
"server" : key .ServerName ,
193
206
"user" : key .UserEmail ,
194
207
})
208
+
209
+ internal .LogTraceWithFields ("session_manager" , "Session removed with details" , map [string ]interface {}{
210
+ "sessionID" : key .SessionID ,
211
+ "server" : key .ServerName ,
212
+ "user" : key .UserEmail ,
213
+ "created" : session .created ,
214
+ "duration" : time .Since (session .created ).String (),
215
+ "lastAccessed" : session .lastAccessed .Load (),
216
+ "remainingSessions" : sessionCount ,
217
+ })
195
218
}
196
219
}
197
220
@@ -261,6 +284,14 @@ func (s *StdioSession) DiscoverAndRegisterCapabilities(
261
284
"server" : serverName ,
262
285
})
263
286
287
+ internal .LogTraceWithFields ("client" , "Starting capability discovery" , map [string ]interface {}{
288
+ "server" : serverName ,
289
+ "sessionID" : session .SessionID (),
290
+ "userEmail" : userEmail ,
291
+ "requiresUserToken" : requiresToken ,
292
+ "hasTokenSetup" : tokenSetup != nil ,
293
+ })
294
+
264
295
// Discover and register tools
265
296
if err := s .client .addToolsToServer (ctx , mcpServer , userEmail , requiresToken , tokenStore , serverName , setupBaseURL , tokenSetup , session ); err != nil {
266
297
return err
@@ -280,6 +311,16 @@ func (s *StdioSession) DiscoverAndRegisterCapabilities(
280
311
"userTokenRequired" : requiresToken ,
281
312
})
282
313
314
+ internal .LogTraceWithFields ("client" , "Capability discovery completed" , map [string ]interface {}{
315
+ "server" : serverName ,
316
+ "sessionID" : session .SessionID (),
317
+ "userEmail" : userEmail ,
318
+ "requiresUserToken" : requiresToken ,
319
+ "toolsRegistered" : true ,
320
+ "promptsRegistered" : true ,
321
+ "resourcesRegistered" : true ,
322
+ })
323
+
283
324
// Start ping task if needed
284
325
if s .client .needPing {
285
326
go s .client .startPingTask (ctx )
@@ -295,6 +336,11 @@ func (sm *StdioSessionManager) checkUserLimits(userEmail string) error {
295
336
return nil
296
337
}
297
338
339
+ if sm .maxPerUser == 0 {
340
+ // 0 means unlimited
341
+ return nil
342
+ }
343
+
298
344
count := sm .getUserSessionCount (userEmail )
299
345
if count >= sm .maxPerUser {
300
346
internal .LogWarnWithFields ("session_manager" , "User session limit exceeded" , map [string ]interface {}{
@@ -306,6 +352,13 @@ func (sm *StdioSessionManager) checkUserLimits(userEmail string) error {
306
352
ErrUserLimitExceeded , userEmail , count , sm .maxPerUser )
307
353
}
308
354
355
+ internal .LogTraceWithFields ("session_manager" , "User session limit check passed" , map [string ]interface {}{
356
+ "user" : userEmail ,
357
+ "currentSessions" : count ,
358
+ "maxPerUser" : sm .maxPerUser ,
359
+ "remaining" : sm .maxPerUser - count ,
360
+ })
361
+
309
362
return nil
310
363
}
311
364
@@ -362,6 +415,16 @@ func (sm *StdioSessionManager) createSession(
362
415
"user" : key .UserEmail ,
363
416
})
364
417
418
+ internal .LogTraceWithFields ("session_manager" , "Session created with details" , map [string ]interface {}{
419
+ "sessionID" : key .SessionID ,
420
+ "server" : key .ServerName ,
421
+ "user" : key .UserEmail ,
422
+ "timeout" : sm .defaultTimeout .String (),
423
+ "maxPerUser" : sm .maxPerUser ,
424
+ "cleanupInterval" : sm .cleanupInterval .String (),
425
+ "totalSessions" : len (sm .sessions ),
426
+ })
427
+
365
428
return session , nil
366
429
}
367
430
@@ -389,14 +452,27 @@ func (sm *StdioSessionManager) cleanupTimedOutSessions() {
389
452
// Find timed out sessions
390
453
sm .mu .RLock ()
391
454
timedOut := make ([]SessionKey , 0 )
455
+ totalSessions := len (sm .sessions )
456
+ activeSessions := 0
392
457
for key , session := range sm .sessions {
393
458
lastAccessed := session .lastAccessed .Load ()
394
459
if lastAccessed != nil && now .Sub (* lastAccessed ) > sm .defaultTimeout {
395
460
timedOut = append (timedOut , key )
461
+ } else {
462
+ activeSessions ++
396
463
}
397
464
}
398
465
sm .mu .RUnlock ()
399
466
467
+ if totalSessions > 0 || len (timedOut ) > 0 {
468
+ internal .LogTraceWithFields ("session_manager" , "Session cleanup cycle" , map [string ]interface {}{
469
+ "totalSessions" : totalSessions ,
470
+ "activeSessions" : activeSessions ,
471
+ "timedOutSessions" : len (timedOut ),
472
+ "timeout" : sm .defaultTimeout .String (),
473
+ })
474
+ }
475
+
400
476
for _ , key := range timedOut {
401
477
internal .LogInfoWithFields ("session_manager" , "Removing timed out session" , map [string ]interface {}{
402
478
"sessionID" : key .SessionID ,
0 commit comments