๐ŸŽ Get the FREE AI Skills Starter Guide โ€” Subscribe โ†’
BytesAgainBytesAgain
๐Ÿฆ€ ClawHub

Session Monitor

by @jusaka

Real-time OpenClaw session monitor that tails JSONL transcripts and pushes formatted updates to Telegram as a persistent background process. Use when asked t...

TERMINAL
clawhub install openclaw-session-monitor

๐Ÿ“– About This Skill


name: session-monitor description: "Real-time OpenClaw session monitor that tails JSONL transcripts and pushes formatted updates to Telegram as a persistent background process. Use when asked to monitor, watch, observe, track, spy on, or tail agent sessions, set up a live feed or dashboard of agent activity, deploy a background monitor with Telegram push notifications, or restart/stop/check the monitor. Triggers: monitor sessions, watch agent, start monitor, restart monitor, stop monitor, monitor status, session dashboard, live feed, tail sessions, what is the agent doing, observe agent, track activity, spy on agent, background monitor, push notifications, ็›‘ๆŽงsession, ็›‘ๆŽงagent, ็›ฏ็€agent, ็œ‹็œ‹agentๅœจๅนฒๅ˜›, ๅฎžๆ—ถ็›‘ๆŽง, ๅŽๅฐ็›‘ๆŽง, ่ฎข้˜…session, agentๆดปๅŠจๆŽจ้€, ้‡ๅฏ็›‘ๆŽง, ๅœๆญข็›‘ๆŽง, ็›‘ๆŽง็Šถๆ€. NOT for one-shot session inspection (use built-in sessions_list / sessions_history for that)."

Session Monitor

Persistent background process that polls all JSONL transcript files in an agent's session directory, parses new entries, and pushes formatted HTML updates to a Telegram chat. Messages within the same time window are merged via editMessageText to avoid spam.

When to Use

  • User wants continuous, push-based monitoring of agent activity
  • User wants a live dashboard in a Telegram chat showing what the agent does
  • NOT for one-shot queries โ€” use sessions_list / sessions_history instead
  • Quick Start

    # 1. Configure
    cp scripts/.env.example scripts/.env
    

    Edit scripts/.env with bot token, chat ID, session dir, user/group mappings

    2. Dry-run (verify parsing works)

    node scripts/test.js

    3. Start (exec session safe โ€” won't die when agent session ends)

    node scripts/index.js > scripts/monitor.log 2>&1 &

    โš ๏ธ Agent exec sessions: Processes started via nohup & inside an agent's exec tool may be killed when the exec session is cleaned up. Add a watchdog to your HEARTBEAT.md to auto-restart:

    PID=$(cat scripts/.pid 2>/dev/null)
    if [ -z "$PID" ] || ! ps -p "$PID" > /dev/null 2>&1; then
      cd scripts && node index.js > monitor.log 2>&1 &
    fi
    

    Configuration (.env)

    | Variable | Required | Description | |----------|----------|-------------| | BOT_TOKEN | โœ… | Telegram bot token for sending updates | | CHAT_ID | โœ… | Target Telegram chat ID (group or DM) | | AGENTS | โŒ | Multi-agent: Name\|/path/to/sessions,Name2\|/path2 | | AGENT_NAME | โŒ | Single-agent display name (fallback when AGENTS unset) | | SESSIONS_DIR | โŒ | Single-agent session dir (default: ~/.openclaw/agents/main/sessions) | | DIRECT_USERS | โŒ | Direct chat mappings: userId:Name,userId2:Name2 | | GROUPS | โŒ | Group chat mappings: groupId:Name,groupId2:Name2 |

    Display format: direct chats show as โœˆ AgentNameโ†”UserName, groups as โœˆ GroupName.

    Architecture

    scripts/
    โ”œโ”€โ”€ index.js      โ€” Main loop: poll JSONL, accumulate, send/edit Telegram messages
    โ”œโ”€โ”€ parser.js     โ€” Parse JSONL entries into {sender, text} display objects
    โ”œโ”€โ”€ formatter.js  โ€” Merge same-sender messages, sort sessions, build HTML
    โ”œโ”€โ”€ sender.js     โ€” Telegram API: sendMessage / editMessageText with queue
    โ”œโ”€โ”€ sessions.js   โ€” Session key lookup, tag formatting, subagent name resolution
    โ”œโ”€โ”€ config.js     โ€” Load .env configuration
    โ”œโ”€โ”€ test.js       โ€” Dry-run: parse recent entries and print to stdout
    โ”œโ”€โ”€ .env.example  โ€” Configuration template
    โ””โ”€โ”€ .env          โ€” Local config (gitignored)
    

    Tuning

    In scripts/index.js:

  • POLL = 3000 โ€” Poll interval in ms (default 3s)
  • MERGE_WINDOW = 1 โ€” Merge edits within N minutes into one Telegram message
  • NEW_MSG_THRESHOLD = 3000 โ€” Start a new message when current exceeds this many chars
  • Message Format

    See references/REFERENCE.md for detailed format specification including:

  • Sender icons (๐Ÿค– assistant, ๐Ÿ‘ค user, โšก system, โ†ฉ๏ธ tool result)
  • Tool call formatting and truncation rules
  • Session tag formatting and sort order
  • Telegram delivery and rate limiting
  • Management

    PID file at scripts/.pid is written on startup, cleaned on exit. Always use the full path to avoid cross-monitor conflicts on shared machines:

    # Check if running
    SKILL_DIR=/path/to/session-monitor
    cat "$SKILL_DIR/scripts/.pid" && ps -p $(cat "$SKILL_DIR/scripts/.pid") -o pid,command

    Stop

    kill $(cat "$SKILL_DIR/scripts/.pid")

    View logs

    tail -f "$SKILL_DIR/scripts/monitor.log"

    โš ๏ธ Multiple monitors may coexist on the same machine (each with its own .env, .pid, and log). Always reference the correct skill directory.

    Restart / Stop / Status

    Resolve SKILL_DIR to this skill's directory (parent of scripts/).

    # Status โ€” is monitor running?
    SKILL_DIR=/absolute/path/to/session-monitor
    PID=$(cat "$SKILL_DIR/scripts/.pid" 2>/dev/null)
    if [ -n "$PID" ] && ps -p "$PID" > /dev/null 2>&1; then
      echo "โœ… Monitor running (PID $PID)"
    else
      echo "โŒ Monitor not running"
    fi

    Stop

    kill $(cat "$SKILL_DIR/scripts/.pid")

    Start

    cd "$SKILL_DIR/scripts" && node index.js > monitor.log 2>&1 &

    Restart (stop + start)

    kill $(cat "$SKILL_DIR/scripts/.pid") 2>/dev/null; sleep 1 cd "$SKILL_DIR/scripts" && node index.js > monitor.log 2>&1 &

    Notes

  • Zero dependencies โ€” pure Node.js standard library
  • Startup sends a sample banner message to verify connectivity
  • Messages > 4000 chars are truncated and force a new message next poll
  • Rate limit: 3s gap between Telegram API calls
  • โšก When to Use

    TriggerAction
    - User wants a **live dashboard** in a Telegram chat showing what the agent does
    - NOT for one-shot queries โ€” use `sessions_list` / `sessions_history` instead

    ๐Ÿ’ก Examples

    # 1. Configure
    cp scripts/.env.example scripts/.env
    

    Edit scripts/.env with bot token, chat ID, session dir, user/group mappings

    2. Dry-run (verify parsing works)

    node scripts/test.js

    3. Start (exec session safe โ€” won't die when agent session ends)

    node scripts/index.js > scripts/monitor.log 2>&1 &

    โš ๏ธ Agent exec sessions: Processes started via nohup & inside an agent's exec tool may be killed when the exec session is cleaned up. Add a watchdog to your HEARTBEAT.md to auto-restart:

    PID=$(cat scripts/.pid 2>/dev/null)
    if [ -z "$PID" ] || ! ps -p "$PID" > /dev/null 2>&1; then
      cd scripts && node index.js > monitor.log 2>&1 &
    fi
    

    ๐Ÿ“‹ Tips & Best Practices

  • Zero dependencies โ€” pure Node.js standard library
  • Startup sends a sample banner message to verify connectivity
  • Messages > 4000 chars are truncated and force a new message next poll
  • Rate limit: 3s gap between Telegram API calls