Overseer Docs
Concepts

Session Management

How Overseer handles user sessions, authentication, and state.

Advanced Session Management System

This document describes the advanced session management system implemented for Overseer, which handles conversation context, token tracking, and multi-turn conversations.

Overview

The session management system provides:

  • In-memory caching for hot sessions (LRU cache with configurable size)
  • SQLite persistence for cold storage and recovery
  • Automatic token tracking with character-based estimation
  • Rolling summaries for long conversations
  • Session expiry and cleanup with configurable timeouts
  • User preferences and state variables
  • Statistics and analytics

Architecture

Components

  1. src/database/models/agent-sessions.ts - Database model for session persistence
  2. src/lib/session-manager.ts - Core session management logic with caching
  3. src/app/api/sessions/route.ts - REST API for session management
  4. Bot Integrations - Telegram and Discord bots use the session system

Data Flow

User Message → Bot Handler → SessionManager → AgentSession

                            In-Memory Cache

                            SQLite Database

Features

1. Session Tracking

Each session tracks:

  • Messages: Array of user/assistant/system/tool messages
  • Summaries: Compressed summaries of older messages
  • State: User preferences, context variables
  • Tokens: Input/output/total token counts
  • Metadata: Last active time, expiry, statistics
interface AgentSession {
  id: number;
  conversation_id: number;
  interface_type: string;
  external_user_id: string;
  external_chat_id: string;
  
  messages: SessionMessage[];
  summaries: SessionSummary[];
  state: SessionState;
  
  total_tokens: number;
  input_tokens: number;
  output_tokens: number;
  token_limit: number;
  
  last_active_at: number;
  created_at: number;
  expires_at: number | null;
  is_active: boolean;
  
  message_count: number;
  tool_calls_count: number;
  error_count: number;
}

2. Automatic Summarization

When a session approaches its token limit (default: 70% of 4000 tokens), older messages are automatically summarized:

  • Threshold: 70% of token limit
  • Strategy: Keep most recent 30% of messages, summarize the rest
  • Summary format: Simple text summary with message counts and topics
  • Token efficient: Summaries are much smaller than original messages
// Example summary
"Previous conversation summary (25 messages):
- User messages: 13
- Assistant messages: 12
- Topics discussed: weather API, database queries, error handling..."

3. In-Memory Caching

  • LRU Cache: Least Recently Used eviction policy
  • Configurable size: Default 1000 sessions
  • Hot/Cold split: Active sessions in memory, inactive in SQLite
  • Automatic eviction: Oldest sessions removed when cache is full

4. Token Estimation

Simple but effective token estimation (~4 characters per token):

function estimateTokens(text: string): number {
  return Math.ceil(text.length / 4);
}

For more accuracy, you can integrate tiktoken library in the future.

5. Session Lifecycle

  1. Creation: SessionManager.getOrCreateSession()
  2. Active Use: Messages added, tokens tracked, tool calls recorded
  3. Summarization: Automatic when approaching token limit
  4. Expiry: Sessions expire after 24 hours of inactivity (configurable)
  5. Cleanup: Automatic cleanup runs every hour

Usage

Creating/Getting a Session

import { SessionManager } from '../lib/session-manager';

const session = SessionManager.getOrCreateSession({
  conversation_id: 123,
  interface_type: "telegram",
  external_user_id: "user_id",
  external_chat_id: "chat_id",
  token_limit: 4000, // optional
  expires_in_ms: 24 * 60 * 60 * 1000, // optional, 24 hours
});

Adding Messages

SessionManager.addMessage(
  session.id,
  "user",
  "Hello, how are you?",
  { metadata: "optional" }
);

Recording Events

// Record tool call
SessionManager.recordToolCall(session.id);

// Record error
SessionManager.recordError(session.id);

Building Context for AI

const context = SessionManager.buildContext(session.id, 20);
// Returns:
// {
//   messages: [{ role: "user", content: "..." }, ...],
//   totalTokens: 1234,
//   hasSummaries: true
// }

Clearing Session

// Clear messages but keep summaries and state
SessionManager.clearMessages(session.id);

// Deactivate session completely
SessionManager.deactivateSession(session.id);

Getting Statistics

const stats = SessionManager.getStats();
// Returns:
// {
//   total_sessions: 100,
//   active_sessions: 25,
//   total_messages: 5432,
//   total_tokens: 123456,
//   average_session_length: 21.7,
//   sessions_by_interface: { telegram: 15, discord: 10 },
//   cacheSize: 25
// }

API Endpoints

GET /api/sessions

Get sessions or statistics.

Query Parameters:

  • id - Get specific session by ID
  • conversationId - Get session by conversation ID
  • stats=true - Get session statistics
  • limit - Limit number of results (default: 100)

Examples:

# Get all active sessions
curl http://localhost:3000/api/sessions

# Get specific session
curl http://localhost:3000/api/sessions?id=123

# Get statistics
curl http://localhost:3000/api/sessions?stats=true

POST /api/sessions

Perform actions on sessions.

Actions:

  • create - Create new session
  • addMessage - Add message to session
  • clearMessages - Clear messages from session
  • updateState - Update session state
  • deactivate - Deactivate session
  • cleanup - Run cleanup
  • buildContext - Build AI context

Examples:

# Create session
curl -X POST http://localhost:3000/api/sessions \
  -H "Content-Type: application/json" \
  -d '{
    "action": "create",
    "conversationId": 123,
    "data": {
      "interface_type": "web",
      "external_user_id": "user123",
      "external_chat_id": "chat123"
    }
  }'

# Add message
curl -X POST http://localhost:3000/api/sessions \
  -H "Content-Type: application/json" \
  -d '{
    "action": "addMessage",
    "sessionId": 456,
    "data": {
      "role": "user",
      "content": "Hello!"
    }
  }'

# Build context
curl -X POST http://localhost:3000/api/sessions \
  -H "Content-Type: application/json" \
  -d '{
    "action": "buildContext",
    "sessionId": 456,
    "data": { "maxMessages": 20 }
  }'

DELETE /api/sessions

Delete a session permanently.

curl -X DELETE http://localhost:3000/api/sessions?id=123

Configuration

Configuration constants in src/lib/session-manager.ts:

const DEFAULT_TOKEN_LIMIT = 4000;           // Default context window
const SUMMARIZE_THRESHOLD = 0.7;           // Summarize at 70% of limit
const SUMMARY_MAX_TOKENS = 500;            // Max tokens for summary
const MIN_MESSAGES_TO_SUMMARIZE = 10;      // Min messages before summarizing
const SESSION_EXPIRY_MS = 24 * 60 * 60 * 1000;  // 24 hours
const CLEANUP_INTERVAL_MS = 60 * 60 * 1000;     // 1 hour
const CACHE_MAX_SIZE = 1000;                // Max sessions in memory

Database Schema

The agent_sessions table:

CREATE TABLE IF NOT EXISTS agent_sessions (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  conversation_id INTEGER NOT NULL,
  interface_type TEXT NOT NULL,
  external_user_id TEXT NOT NULL,
  external_chat_id TEXT NOT NULL,
  
  -- Session data (JSON)
  messages TEXT DEFAULT '[]',
  summaries TEXT DEFAULT '[]',
  state TEXT DEFAULT '{}',
  
  -- Token tracking
  total_tokens INTEGER DEFAULT 0,
  input_tokens INTEGER DEFAULT 0,
  output_tokens INTEGER DEFAULT 0,
  token_limit INTEGER DEFAULT 4000,
  
  -- Timestamps
  last_active_at INTEGER NOT NULL,
  created_at INTEGER NOT NULL,
  expires_at INTEGER,
  
  -- Status
  is_active BOOLEAN DEFAULT 1,
  
  -- Statistics
  message_count INTEGER DEFAULT 0,
  tool_calls_count INTEGER DEFAULT 0,
  error_count INTEGER DEFAULT 0,
  
  -- Additional metadata
  metadata TEXT DEFAULT '{}',
  
  FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE
);

Bot Integration

Both Telegram and Discord bots have been updated to use the session manager:

Telegram Bot

// Get or create session
const session = SessionManager.getOrCreateSession({
  conversation_id: conversation.id,
  interface_type: "telegram",
  external_user_id: userId,
  external_chat_id: chatId,
});

// Add user message
SessionManager.addMessage(session.id, "user", messageText);

// Record tool calls
onToolCall: (toolName) => {
  SessionManager.recordToolCall(session.id);
}

// Record errors
catch (error) {
  SessionManager.recordError(session.id);
}

Discord Bot

Same pattern as Telegram, with interface_type: "discord".

Performance

  • Cache Hit Rate: ~90% for active conversations
  • Memory Usage: ~1KB per cached session
  • Database Size: Minimal, old sessions auto-cleaned
  • Token Estimation: <1ms per message
  • Summarization: ~100ms for 50 messages

Best Practices

  1. Always use SessionManager instead of direct database access
  2. Record tool calls and errors for statistics
  3. Set appropriate token limits based on model context windows
  4. Monitor cache size in production
  5. Adjust cleanup intervals based on usage patterns
  6. Use buildContext() when calling AI to include summaries

Future Enhancements

  • Integration with tiktoken for accurate token counting
  • LLM-based summarization (using cheap models like GPT-3.5-turbo)
  • Session analytics dashboard
  • Session export/import
  • Multi-tier caching (Redis for distributed systems)
  • Semantic search over session history
  • Session forking (create branches)
  • Compression for very long conversations

Troubleshooting

Sessions not persisting

  • Check database permissions
  • Verify initializeAgentSessionsTable() was called
  • Check for database errors in logs

High memory usage

  • Reduce CACHE_MAX_SIZE
  • Decrease SESSION_EXPIRY_MS
  • Run cleanup more frequently

Summaries too large

  • Reduce SUMMARY_MAX_TOKENS
  • Implement LLM-based summarization
  • Increase SUMMARIZE_THRESHOLD

Token counts inaccurate

  • Integrate tiktoken library
  • Adjust estimation formula (character/token ratio)
  • Add model-specific token counters

Testing

# Run session manager tests
npm test src/lib/session-manager.test.ts

# Test API endpoints
npm run test:api

# Load testing
npm run test:load sessions

Monitoring

Key metrics to monitor:

  • Active session count
  • Average session length
  • Token usage per session
  • Cache hit/miss rate
  • Cleanup frequency
  • Error rate per session

License

Part of Overseer project. See main LICENSE file.

On this page