9.2 KiB
PR Preparation: GramJS Phase 1 - Telegram User Account Adapter
Status: ✅ Ready for PR submission
Branch: fix/cron-systemevents-autonomous-execution
Commit: 84c1ab4d5
Target: openclaw/openclaw main branch
Summary
Implements Telegram user account support via GramJS/MTProto, allowing openclaw agents to access personal Telegram accounts (DMs, groups, channels) without requiring a bot.
Closes: #937 (Phase 1)
What's Included
✅ Complete Implementation
- 18 files added/modified
- 3,825 lines of new code
- 2 test files with comprehensive coverage
- 14KB documentation with setup guide, examples, troubleshooting
Core Features
- ✅ Interactive auth flow (phone → SMS → 2FA)
- ✅ Session persistence via encrypted StringSession
- ✅ DM message send/receive
- ✅ Group message send/receive
- ✅ Reply context preservation
- ✅ Multi-account configuration
- ✅ Security policies (pairing, allowlist, dmPolicy, groupPolicy)
- ✅ Command detection (
/start,/help, etc.)
Test Coverage
- ✅ Auth flow tests (mocked readline and client)
- ✅ Message conversion tests (DM, group, reply)
- ✅ Phone validation tests
- ✅ Session verification tests
- ✅ Edge case handling (empty messages, special chars, long text)
Documentation
- ✅ Complete setup guide (
docs/channels/telegram-gramjs.md) - ✅ Getting API credentials walkthrough
- ✅ Configuration examples (single/multi-account)
- ✅ Security best practices
- ✅ Troubleshooting guide
- ✅ Migration from Bot API guide
Files Changed
Core Implementation (src/telegram-gramjs/)
auth.ts - Interactive auth flow (142 lines)
auth.test.ts - Auth tests with mocks (245 lines)
client.ts - GramJS client wrapper (244 lines)
config.ts - Config adapter (218 lines)
gateway.ts - Gateway adapter (240 lines)
handlers.ts - Message handlers (206 lines)
handlers.test.ts - Handler tests (367 lines)
setup.ts - CLI setup wizard (199 lines)
types.ts - Type definitions (47 lines)
index.ts - Module exports (33 lines)
Configuration
src/config/types.telegram-gramjs.ts - Config schema (237 lines)
Plugin Extension
extensions/telegram-gramjs/index.ts - Plugin registration (20 lines)
extensions/telegram-gramjs/src/channel.ts - Channel plugin (275 lines)
extensions/telegram-gramjs/openclaw.plugin.json - Manifest (8 lines)
extensions/telegram-gramjs/package.json - Dependencies (9 lines)
Documentation
docs/channels/telegram-gramjs.md - Complete setup guide (14KB, 535 lines)
GRAMJS-PHASE1-SUMMARY.md - Implementation summary (1.8KB)
Registry
src/channels/registry.ts - Added telegram-gramjs to CHAT_CHANNEL_ORDER
Breaking Changes
None. This is a new feature that runs alongside existing channels.
- Existing
telegram(Bot API) adapter unchanged - Can run both
telegramandtelegram-gramjssimultaneously - No config migration required
- Opt-in feature (disabled by default)
Testing Checklist
Unit Tests ✅
- Auth flow with phone/SMS/2FA (mocked)
- Phone number validation
- Session verification
- Message conversion (DM, group, reply)
- Session key routing
- Command extraction
- Edge cases (empty messages, special chars, long text)
Integration Tests ⏳
- End-to-end auth flow (requires real Telegram account)
- Message send/receive (requires real Telegram account)
- Multi-account setup (requires multiple accounts)
- Gateway daemon integration (needs openclaw built)
Note: Integration tests require real Telegram credentials and are best done by maintainers.
Dependencies
New Dependencies
telegram@^2.24.15- GramJS library (MTProto client)
Peer Dependencies (already in openclaw)
- Node.js 18+
- TypeScript 5+
- vitest (for tests)
Documentation Quality
Setup Guide (docs/channels/telegram-gramjs.md)
- 📋 Quick setup (4 steps)
- 📊 Feature comparison (GramJS vs Bot API)
- ⚙️ Configuration examples (single/multi-account)
- 🔐 Security best practices
- 🛠️ Troubleshooting (8 common issues)
- 📖 API reference (all config options)
- 💡 Real-world examples (personal/team/family setups)
Code Documentation
- All public functions have JSDoc comments
- Type definitions for all interfaces
- Inline comments for complex logic
- Error messages are clear and actionable
Known Limitations (Phase 1)
Not Yet Implemented
- ⏳ Media support (photos, videos, files) - Phase 2
- ⏳ Voice messages - Phase 2
- ⏳ Stickers and GIFs - Phase 2
- ⏳ Reactions - Phase 2
- ⏳ Message editing/deletion - Phase 2
- ⏳ Channel messages - Phase 3
- ⏳ Secret chats - Phase 3
- ⏳ Mention detection in groups (placeholder exists)
Workarounds
- Groups:
requireMention: trueis in config but not enforced (all messages processed) - Media: Skipped for now (text-only)
- Channels: Explicitly filtered out
Migration Path
For New Users
- Go to https://my.telegram.org/apps
- Get
api_idandapi_hash - Run
openclaw setup telegram-gramjs - Follow prompts (phone → SMS → 2FA)
- Done!
For Existing Bot API Users
Can run both simultaneously:
{
channels: {
telegram: { // Existing Bot API
enabled: true,
botToken: "..."
},
telegramGramjs: { // New user account
enabled: true,
apiId: 123456,
apiHash: "..."
}
}
}
No conflicts - separate accounts, separate sessions.
Security Considerations
✅ Implemented
- Session string encryption (via gateway encryption key)
- DM pairing (default policy)
- Allowlist support
- Group policy enforcement
- Security checks before queueing messages
⚠️ User Responsibilities
- Keep session strings private (like passwords)
- Use strong 2FA on Telegram account
- Regularly review active sessions
- Use
allowFromin sensitive contexts - Don't share API credentials publicly
📝 Documented
- Security best practices section in docs
- Session management guide
- Credential handling instructions
- Compromise recovery steps
Rate Limits
Telegram Limits (Documented)
- ~20 messages/minute per chat
- ~40-50 messages/minute globally
- Flood wait errors trigger cooldown
GramJS Handling
- Auto-retry on
FLOOD_WAITerrors - Exponential backoff
- Configurable
floodSleepThreshold
Documentation
- Rate limit table in docs
- Best practices section
- Comparison with Bot API limits
PR Checklist
- Code follows openclaw patterns (studied existing telegram/whatsapp adapters)
- TypeScript types complete and strict
- JSDoc comments on public APIs
- Unit tests with good coverage
- Documentation comprehensive
- No breaking changes
- Git commit message follows convention
- Files organized logically
- Error handling robust
- Logging via subsystem logger
- Config validation in place
- Integration tests (requires real credentials - maintainer task)
- Performance testing (requires production scale - maintainer task)
Commit Message
feat(telegram-gramjs): Phase 1 - User account adapter with tests and docs
Implements Telegram user account support via GramJS/MTProto (#937).
[Full commit message in git log]
Next Steps (After Merge)
Phase 2 (Media Support)
- Image/video upload and download
- Voice messages
- Stickers and GIFs
- File attachments
- Reactions
Phase 3 (Advanced Features)
- Channel messages
- Secret chats
- Poll creation
- Inline queries
- Custom entity parsing (mentions, hashtags, URLs)
Future Improvements
- Webhook support (like Bot API)
- Better mention detection
- Flood limit auto-throttling
- Session file encryption options
- Multi-device session sync
Maintainer Notes
Review Focus Areas
- Security: Session string handling, encryption, allowlists
- Architecture: Plugin structure, gateway integration, session routing
- Config Schema: Backward compatibility, validation
- Error Handling: User-facing messages, retry logic
- Documentation: Clarity, completeness, examples
Testing Recommendations
- Test auth flow with real Telegram account
- Test DM send/receive
- Test group message handling
- Test multi-account setup
- Test session persistence across restarts
- Test flood limit handling
- Test error recovery
Integration Points
- Gateway daemon (message polling)
- Config system (multi-account)
- Session storage (encryption)
- Logging (subsystem logger)
- Registry (channel discovery)
Questions for Reviewers
- Session encryption: Should we add option for separate encryption passphrase (vs using gateway key)?
- Mention detection: Implement now or defer to Phase 2?
- Channel messages: Support in Phase 1 or keep for Phase 3?
- Integration tests: Add to CI or keep manual-only (requires Telegram credentials)?
Contact
Implementer: Spotter (subagent of Clawd)
Human: Jakub (@oogway_defi)
Issue: https://github.com/openclaw/openclaw/issues/937
Repo: https://github.com/openclaw/openclaw
Ready for PR submission! 🚀