# TextMe Clawdbot Channel Plugin External channel plugin for integrating TextMe messaging with Clawdbot. ## Features - **Multi-account support** - Manage multiple TextMe phone numbers - **Persistent authentication** - Tokens stored securely, auto-refresh before expiry - **Inbound messages** - Real-time WebSocket connection, auto-reconnect - **Outbound messages** - HTTP webhook interface for Clawdbot - **Standard channel plugin interface** - Probe, send, health endpoints ## Installation ```bash cd textme-closebot-channel npm install npm run build ``` ## Configuration ### Option 1: Environment Variables (Simple) For a single account setup: ```bash export TEXTME_EMAIL="your-email@example.com" export TEXTME_PASSWORD="your-password" export TEXTME_PHONE_NUMBERS="+1234567890,+0987654321" export CLAWDBOT_GATEWAY_URL="http://localhost:3000" export CLAWDBOT_GATEWAY_TOKEN="your-gateway-token" # optional export TEXTME_WEBHOOK_PORT="3100" export TEXTME_DEBUG="true" # optional ``` ### Option 2: Configuration File (Multi-account) Create `textme-channel.json` in your working directory: ```json { "accounts": [ { "id": "primary", "name": "Primary Account", "credentials": { "email": "primary@example.com", "password": "password123" }, "phoneNumbers": ["+1234567890"], "enabled": true, "isDefault": true }, { "id": "secondary", "name": "Secondary Account", "credentials": { "email": "secondary@example.com", "password": "password456" }, "phoneNumbers": ["+0987654321"], "enabled": true } ], "clawdbotGatewayUrl": "http://localhost:3000", "clawdbotGatewayToken": "your-token", "webhookPort": 3100, "webhookPath": "/textme", "debug": false, "tokenStoragePath": ".textme-tokens.json", "autoReconnect": true, "maxReconnectAttempts": 10, "reconnectDelay": 5000 } ``` ## Usage ### Running Standalone ```bash # Start the plugin npm start # Or with tsx for development npm run dev ``` ### Programmatic Usage ```typescript import { createTextMeChannelPlugin } from 'textme-closebot-channel'; const plugin = createTextMeChannelPlugin({ configPath: './my-config.json', debug: true, // Optional: custom message handler (bypasses gateway forwarding) onMessage: async (message, account) => { console.log('Received:', message); }, }); // Start the plugin await plugin.start(); // Get status const status = plugin.getStatus(); console.log('Running:', status.running); console.log('Accounts:', status.accounts); // Send a message programmatically const result = await plugin.send({ target: '123456', // conversation ID message: 'Hello from Clawdbot!', accountId: 'primary', // optional: specific account }); // Stop the plugin await plugin.stop(); ``` ## Webhook Endpoints The plugin exposes these HTTP endpoints: ### GET /textme/probe Channel plugin probe endpoint. Returns plugin capabilities and account status. ```bash curl http://localhost:3100/textme/probe ``` Response: ```json { "channel": "textme", "version": "1.0.0", "capabilities": ["send", "receive", "attachments", "multi-account"], "accounts": [ { "id": "primary", "name": "Primary Account", "phoneNumbers": ["+1234567890"], "enabled": true } ], "status": "ready" } ``` ### POST /textme/send Send a message via TextMe. ```bash curl -X POST http://localhost:3100/textme/send \ -H "Content-Type: application/json" \ -d '{ "target": "123456", "message": "Hello!", "accountId": "primary" }' ``` Request body: ```json { "target": "123456", // Conversation ID or phone number "message": "Hello!", // Message content "accountId": "primary", // Optional: specific account ID "fromNumber": "+1234567890", // Optional: specific from number "attachments": ["123"], // Optional: attachment IDs "replyTo": "789" // Optional: reply to message ID } ``` Response: ```json { "success": true, "messageId": "456789" } ``` ### GET /textme/health Health check endpoint. ```bash curl http://localhost:3100/textme/health ``` Response: ```json { "status": "healthy", "accounts": 2, "timestamp": "2024-01-01T00:00:00.000Z" } ``` ## Inbound Message Format Messages forwarded to Clawdbot gateway: ```json { "channel": "textme", "channelId": "textme:primary:123456", "messageId": "msg-123", "authorId": "user-456", "authorName": "John Doe", "content": "Hello!", "timestamp": "2024-01-01T00:00:00.000Z", "attachments": [ { "url": "https://...", "type": "image" } ], "metadata": { "conversationId": "123456", "accountId": "primary", "accountName": "Primary Account", "phoneNumbers": ["+1234567890"] } } ``` ## Token Storage Tokens are stored in `.textme-tokens.json` (configurable via `tokenStoragePath`). This file is created with restrictive permissions (0600) and contains: ```json { "accounts": { "primary": { "accessToken": "...", "refreshToken": "...", "expiresAt": 1704067200000, "userId": 12345 } }, "lastUpdated": "2024-01-01T00:00:00.000Z" } ``` **Important:** Keep this file secure and don't commit it to version control. ## Architecture ``` ┌─────────────────────────────────────────────────────────────┐ │ TextMe Channel Plugin │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Config │ │ Auth │ │ Token │ │ │ │ Manager │◄───│ Manager │◄───│ Storage │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Plugin Core │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Inbound │ │ Outbound │ │ │ │ Handler │ │ Handler │ │ │ │ (WebSocket) │ │ (HTTP) │ │ │ └─────────────┘ └─────────────┘ │ │ │ │ │ └─────────│────────────────────────────────────│───────────────┘ │ │ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ TextMe │ │ TextMe │ │ Realtime │ │ REST API │ │ WebSocket │ │ │ └─────────────┘ └─────────────┘ ``` ## Development ```bash # Install dependencies npm install # Build npm run build # Watch mode npm run watch # Run with tsx (no build needed) npm run dev # Type check npm run typecheck ``` ## Troubleshooting ### Authentication Errors 1. Check credentials in config/environment 2. Delete `.textme-tokens.json` to force re-authentication 3. Enable debug mode to see detailed logs ### Connection Issues 1. Check network connectivity 2. Verify TextMe service status 3. Check if tokens are expired (delete token file) 4. Enable debug mode and check WebSocket errors ### Messages Not Forwarding 1. Verify `clawdbotGatewayUrl` is correct 2. Check if gateway token is valid 3. Check Clawdbot gateway logs for errors 4. Test with custom `onMessage` handler ## License MIT ## Disclaimer This plugin uses the unofficial `textme-unofficial-api` package. Use at your own risk. See the API package disclaimer for details.