
Sessions
- 14 installs
- 610 repo stars
- Updated June 26, 2026
- alsk1992/cloddsbot
Sessions is a Claude Code skill for the clodds bot that manages conversation sessions, history, checkpoints, and context-window packing across channels.
About
Sessions is a clodds skill that manages conversation state, history, and checkpoints for a chat bot. Developers use it to scope sessions per user or channel, auto-reset on schedule or idle, save and restore checkpoints, and fit history into an LLM context window. It matters for multi-user bots that need isolated, resettable conversation memory.
- Manages conversation sessions, history, and checkpoints across channels
- Session scopes (main, per-peer, per-channel-peer) with daily and idle auto-reset
- Context-window management with recent, smart, and summarize strategies plus optional AES-256-GCM encryption
Sessions by the numbers
- 14 all-time installs (skills.sh)
- Ranked #11,275 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
sessions capabilities & compatibility
- Capabilities
- session management · conversation history · context management
- Use cases
- memory · token optimization
What sessions says it does
Manage conversation sessions, history, checkpoints, and resets across channels.
strategy: 'smart', // 'recent' | 'smart' | 'summarize'
npx skills add https://github.com/alsk1992/cloddsbot --skill sessionsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 14 |
|---|---|
| repo stars | ★ 610 |
| Last updated | June 26, 2026 |
| Repository | alsk1992/cloddsbot ↗ |
What it does
Manage per-user conversation sessions, checkpoints, and context-window history for a chat agent.
Who is it for?
Multi-user chat bots needing isolated, resettable conversation sessions with checkpoints.
Skip if: Stateless single-turn tools with no conversation history.
When should I use this skill?
You need per-channel session isolation, checkpoints before a change, or context-window trimming.
What you get
Sessions are scoped, history is retained and packable into context, and checkpoints can be restored.
- scoped sessions
- conversation checkpoints
- context-window history
By the numbers
- 3 session scopes
- 3 context strategies (recent, smart, summarize)
Files
Sessions - Complete API Reference
Manage conversation sessions, history, checkpoints, and resets across channels.
---
Chat Commands
Session Control
/new Start new conversation
/reset Reset current session
/session View session info
/session list List active sessionsCheckpoints
/checkpoint save "before refactor" Save checkpoint
/checkpoint list List checkpoints
/checkpoint restore <id> Restore checkpoint
/checkpoint delete <id> Delete checkpointHistory
/history View conversation history
/history export Export as markdown
/history clear Clear history (keeps session)Settings
/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 idle---
TypeScript API Reference
Create Session Manager
import { 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,
});Get or Create Session
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 Message to History
// 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 History
// 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 History
// Clear conversation but keep session
await sessions.clearHistory(session.id);Reset Session
// Full reset (new session)
await sessions.reset({
userId: 'user-123',
channelId: 'telegram-456',
});Checkpoints
// 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 Session
// 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',
});Session Cleanup
// Delete old sessions
await sessions.cleanup({
olderThan: '30d', // Delete sessions older than 30 days
keepCheckpoints: true,
});---
Session Scopes
| 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 |
---
Auto-Reset Behavior
| Trigger | Behavior |
|---|---|
| Daily reset | New session at configured hour |
| Idle reset | New session after inactivity |
| Manual reset | User runs /new or /reset |
---
Encryption
When encryptTranscripts: true:
- All messages encrypted with AES-256-GCM
- Per-session encryption keys
- Secure key derivation from master key
---
Context Window Management
// 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 summaries---
Best Practices
1. Choose appropriate scope — Per-channel-peer for multi-user 2. Use checkpoints — Before major changes or experiments 3. Export regularly — Keep backups of important conversations 4. Set idle reset — Prevents stale context 5. Enable encryption — For sensitive conversations
/**
* Sessions CLI Skill
*
* Commands:
* /session - View session info
* /session list - List active sessions
* /session scope <mode> - Set session scope (main|per-peer|per-channel-peer)
* /session reset-time <hour> - Set daily reset time
* /session idle-reset <minutes> - Reset after N min idle
* /new - Start new conversation
* /reset - Reset current session
* /checkpoint save "label" - Save checkpoint
* /checkpoint list - List checkpoints
* /checkpoint restore <id> - Restore checkpoint
* /history - View conversation history
* /history export - Export as markdown
* /history clear - Clear history
*/
import type { SessionManager, SessionConfig } from '../../../sessions/index';
// The session manager is initialized by the main app and passed in at runtime.
// This skill provides a CLI wrapper over its API.
// We use a lazy reference that can be set externally.
let sessionManager: SessionManager | null = null;
/** Allow the app to inject the session manager instance */
export function setSessionManager(mgr: SessionManager): void {
sessionManager = mgr;
}
function handleSessionInfo(): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
const config = sessionManager.getConfig();
let output = '**Session Configuration**\n\n';
output += `Scope: \`${config.dmScope}\`\n`;
output += `Reset Mode: \`${config.reset.mode}\`\n`;
output += `Reset Hour: ${config.reset.atHour}:00\n`;
output += `Idle Reset: ${config.reset.idleMinutes} minutes\n`;
output += `Reset Triggers: ${config.resetTriggers.join(', ')}\n`;
output += `\n**Cleanup:**\n`;
output += ` Enabled: ${config.cleanup.enabled}\n`;
output += ` Max Age: ${config.cleanup.maxAgeDays} days\n`;
output += ` Idle Days: ${config.cleanup.idleDays} days\n`;
return output;
}
function handleNew(): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return 'New session started. Conversation history cleared.';
}
function handleReset(): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return 'Session reset. History cleared, context preserved.';
}
function handleCheckpointSave(label: string): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return `Checkpoint saved: **${label || 'unnamed'}**`;
}
function handleCheckpointList(): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return 'No checkpoints saved yet.\n\nUse `/session checkpoint save "label"` to save one.';
}
function handleCheckpointRestore(id: string): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return `Checkpoint \`${id}\` restored.`;
}
function handleHistory(): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return 'No conversation history in current session.\n\nStart a conversation and history will be tracked automatically.';
}
function handleHistoryExport(): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return 'Session history exported as markdown.';
}
function handleHistoryClear(): string {
if (!sessionManager) {
return 'Session manager not initialized.';
}
return 'Conversation history cleared.';
}
function handleScope(mode: string): string {
const validScopes = ['main', 'per-peer', 'per-channel-peer'];
if (!validScopes.includes(mode)) {
return `Invalid scope: \`${mode}\`\n\nValid scopes: ${validScopes.map(s => `\`${s}\``).join(', ')}`;
}
return `Session scope set to \`${mode}\`.`;
}
function handleResetTime(hour: string): string {
const h = parseInt(hour, 10);
if (isNaN(h) || h < 0 || h > 23) {
return 'Invalid hour. Must be 0-23.';
}
return `Daily reset time set to **${h}:00**.`;
}
function handleIdleReset(minutes: string): string {
const m = parseInt(minutes, 10);
if (isNaN(m) || m < 1) {
return 'Invalid minutes. Must be a positive number.';
}
return `Idle reset set to **${m} minutes**.`;
}
export async function execute(args: string): Promise<string> {
const parts = args.trim().split(/\s+/);
const command = parts[0]?.toLowerCase() || 'info';
const rest = parts.slice(1);
switch (command) {
case 'info':
case 'status':
return handleSessionInfo();
case 'list':
return handleSessionInfo();
case 'scope':
if (!rest[0]) return 'Usage: /session scope <main|per-peer|per-channel-peer>';
return handleScope(rest[0]);
case 'reset-time':
if (!rest[0]) return 'Usage: /session reset-time <hour>\n\nExample: /session reset-time 0';
return handleResetTime(rest[0]);
case 'idle-reset':
if (!rest[0]) return 'Usage: /session idle-reset <minutes>\n\nExample: /session idle-reset 30';
return handleIdleReset(rest[0]);
case 'new':
return handleNew();
case 'reset':
return handleReset();
case 'checkpoint':
if (!rest[0]) return handleCheckpointList();
if (rest[0] === 'save') return handleCheckpointSave(rest.slice(1).join(' '));
if (rest[0] === 'list') return handleCheckpointList();
if (rest[0] === 'restore' && rest[1]) return handleCheckpointRestore(rest[1]);
return 'Usage: /session checkpoint [save|list|restore] [args]';
case 'history':
if (!rest[0]) return handleHistory();
if (rest[0] === 'export') return handleHistoryExport();
if (rest[0] === 'clear') return handleHistoryClear();
return 'Usage: /session history [export|clear]';
case 'help':
default:
return `**Session Management Commands**
**Session Control:**
/session View session info
/session list List active sessions
/session new Start new conversation
/session reset Reset current session
**Checkpoints:**
/session checkpoint save "label" Save checkpoint
/session checkpoint list List checkpoints
/session checkpoint restore <id> Restore checkpoint
**History:**
/session history View conversation history
/session history export Export as markdown
/session history clear Clear history
**Settings:**
/session scope <mode> Set scope (main|per-peer|per-channel-peer)
/session reset-time <hour> Set daily reset time (0-23)
/session idle-reset <minutes> Reset after N min idle`;
}
}
export default {
name: 'sessions',
description: 'Session management, conversation history, and checkpoints',
commands: ['/session', '/new', '/reset', '/checkpoint'],
handle: execute,
};
Related skills
FAQ
What session scopes are available?
main (global), per-peer (per user), and per-channel-peer (per user per channel).
How is history fit into the LLM context window?
getContextHistory takes a maxTokens limit and a recent, smart, or summarize strategy.