Session management, conversation history, and checkpoints
65
51%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Passed
No known issues
Optimize this skill with Tessl
npx tessl skill review --optimize ./src/skills/bundled/sessions/SKILL.mdManage conversation sessions, history, checkpoints, and resets across channels.
/new Start new conversation
/reset Reset current session
/session View session info
/session list List active sessions/checkpoint save "before refactor" Save checkpoint
/checkpoint list List checkpoints
/checkpoint restore <id> Restore checkpoint
/checkpoint delete <id> Delete checkpoint/history View conversation history
/history export Export as markdown
/history clear Clear history (keeps session)/session scope main Use main session
/session scope channel Per-channel sessions
/session scope peer Per-user sessions
/session reset-time 00:00 Set daily reset time
/session idle-reset 30 Reset after 30 min idleimport { createSessionManager } from 'clodds/sessions';
const sessions = createSessionManager({
// Session scope
scope: 'per-channel-peer', // 'main' | 'per-peer' | 'per-channel-peer'
// Auto-reset
dailyResetHour: 0, // Reset at midnight
idleResetMinutes: 30, // Reset after 30 min idle
// Storage
storage: 'sqlite',
dbPath: './sessions.db',
// Encryption
encryptTranscripts: true,
encryptionKey: process.env.SESSION_KEY,
});const session = await sessions.getOrCreateSession({
userId: 'user-123',
channelId: 'telegram-456',
peerId: 'peer-789',
});
console.log(`Session ID: ${session.id}`);
console.log(`Created: ${session.createdAt}`);
console.log(`Messages: ${session.messageCount}`);
console.log(`Last activity: ${session.lastActivityAt}`);// Add user message
await sessions.addMessage({
sessionId: session.id,
role: 'user',
content: 'What is my portfolio value?',
});
// Add assistant message
await sessions.addMessage({
sessionId: session.id,
role: 'assistant',
content: 'Your portfolio is worth $10,234.56',
usage: {
inputTokens: 500,
outputTokens: 200,
},
});// Get conversation history
const history = await sessions.getHistory(session.id, {
limit: 50,
format: 'messages', // 'messages' | 'markdown' | 'text'
});
for (const msg of history) {
console.log(`[${msg.role}] ${msg.content}`);
}// Clear conversation but keep session
await sessions.clearHistory(session.id);// Full reset (new session)
await sessions.reset({
userId: 'user-123',
channelId: 'telegram-456',
});// Save checkpoint
const checkpoint = await sessions.saveCheckpoint({
sessionId: session.id,
name: 'Before major change',
description: 'Saving state before refactoring trading strategy',
});
console.log(`Checkpoint ID: ${checkpoint.id}`);
console.log(`Messages saved: ${checkpoint.messageCount}`);
// List checkpoints
const checkpoints = await sessions.listCheckpoints(session.id);
for (const cp of checkpoints) {
console.log(`${cp.id}: ${cp.name} (${cp.messageCount} messages)`);
}
// Restore checkpoint
await sessions.restoreCheckpoint(checkpoint.id);
// Delete checkpoint
await sessions.deleteCheckpoint(checkpoint.id);// Export as markdown
const markdown = await sessions.export(session.id, {
format: 'markdown',
includeMetadata: true,
});
// Export as JSON
const json = await sessions.export(session.id, {
format: 'json',
});// Delete old sessions
await sessions.cleanup({
olderThan: '30d', // Delete sessions older than 30 days
keepCheckpoints: true,
});| Scope | Description | Use Case |
|---|---|---|
main | Single global session | Personal use |
per-peer | Session per user | Multi-user, shared channels |
per-channel-peer | Session per user per channel | Full isolation |
| Trigger | Behavior |
|---|---|
| Daily reset | New session at configured hour |
| Idle reset | New session after inactivity |
| Manual reset | User runs /new or /reset |
When encryptTranscripts: true:
// Get context-aware history (for LLM)
const context = await sessions.getContextHistory({
sessionId: session.id,
maxTokens: 100000, // Fit in context window
strategy: 'smart', // 'recent' | 'smart' | 'summarize'
});
// 'smart' keeps system messages + recent + important messages
// 'summarize' compresses old messages into summaries2a8c94e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.