Draft Router

Prompts

Routes Telegram draft messages with inline buttons to archive, add to memory, create tasks, or run as prompts.

Install

openclaw skills install draft-router

Draft Router Skill

Route incoming drafts via Telegram inline buttons. Forwards messages get three action options.

Installation

# Make executable
chmod +x /home/node/.openclaw/workspace/skills/draft-router/draft-router.js

Usage

Auto-detects drafts by header pattern: DRAFTS | YYYY-MM-DD HH:MM ---

// From an OpenClaw agent
const router = require('./skills/draft-router/draft-router.js');

// Check if message is a draft
if (router.isDraftMessage(messageText)) {
  const result = router.handleDraft(messageText, 'drafts-app');
  
  // Send via Telegram with buttons
  message.send({
    to: chatId,
    message: result.text,
    buttons: result.buttons
  });
}

Button Actions

ButtonAction
🧠 KnowledgeAppends to MEMORY.md with timestamp and source
📦 ArchiveSaves to memory/drafts-archive/archived/
✅ TasksAdds to SESSION-STATE.md as an active task
▶️ Run as PromptPrepares for execution; asks qualifying questions one at a time

File Structure

workspace/
├── skills/draft-router/
│   ├── SKILL.md
│   └── draft-router.js
└── memory/
    └── drafts-archive/
        ├── archived/       # Archived drafts
        ├── prompts/        # Drafts marked for prompt execution
        └── processed/      # Knowledge additions

Callback Handling

Callbacks use format: draft:{id}:{action}

// Parse callback
callback_data.split(':') // ['draft', 'id', 'action']

// Execute
const result = router.handleCallback(draftId, action);

Integration with AGENTS.md

Add to your agent's routing logic:

// When message is forwarded or has draft content
if (isForwarded || message.text.includes('#draft')) {
  const router = require('../skills/draft-router/draft-router.js');
  const result = router.handleDraft(message.text, message.from);
  
  return {
    message: result.text,
    buttons: result.buttons
  };
}