Telegram Plugin
Telegram bot service for TokenRing agents with multi-bot support, group/DM conversations, and escalation provider integration.
Overview
The @tokenring-ai/telegram package provides a comprehensive Telegram bot service that integrates with TokenRing agents, enabling natural language conversations through Telegram. Each Telegram user or group gets their own dedicated agent instance that maintains conversation history and context. The service handles message routing, event processing, and automatic agent management.
As a core integration package, it provides:
- Multi-Bot Support: Manage multiple Telegram bots simultaneously with named configurations
- Group-Based Configuration: Configure bots with specific groups for different agent types
- Direct Messaging (DM) Support: Optional DM support with per-user agent instances
- Per-User/Group Agents: Each Telegram user or group gets a dedicated agent with persistent chat history
- Event-Driven Communication: Handles agent events and sends responses back to Telegram
- Escalation Provider: Implements
EscalationProviderinterface for agent-to-human escalation workflows - Message Buffering: Efficient message buffering with automatic edit/update for long responses
- File Attachments: Supports photos and documents with configurable size limits
- Command Mapping: Configurable command mapping for custom bot commands
- Markdown Support: Messages are sent with Markdown formatting (with fallback to plain text)
Key capabilities include:
- Multi-bot support with named configurations
- Group-based agent instances with persistent conversation history
- Direct messaging with reply-based response handling
- File attachment support (photos and documents)
- Integration with the escalation system for human-in-the-loop workflows
- Message buffering and intelligent edit/update patterns
- Configurable command mapping for custom bot commands
- Markdown support with fallback to plain text
Key Features
- Multi-Bot Architecture: Support for multiple independently configured bots
- Authorization Control: User whitelists for both groups and DMs
- Reply-Based Communication: Support for Telegram reply feature in escalation workflows
- Intelligent Message Buffering: 250ms throttled batching with message editing
- Automatic Agent Lifecycle: Creates, manages, and cleans up agents per chat
- Graceful Shutdown: Proper cleanup of all resources on service termination
- Error Handling: Robust error handling with Markdown parse error fallbacks
- File Processing: Photo and document extraction with size validation
Core Components
TelegramBotService
The main service class that manages multiple Telegram bot instances.
Location: TelegramService.ts
Implements: TokenRingService
Key Methods:
constructor(app: TokenRingApp, options: ParsedTelegramServiceConfig): Initializes the service with app instance and configurationrun(signal: AbortSignal): Promise<void>: Starts all configured bots and handles lifecyclegetAvailableBots(): string[]: Returns array of configured bot namesgetBot(botName: string): TelegramBot: Returns the specified bot instance
Properties:
name: string: Service identifier ("TelegramService")description: string: Service description
Constructor
constructor(app: TokenRingApp, options: ParsedTelegramServiceConfig)
- app: TokenRingApp instance
- options: Validated configuration object with bots configuration
TelegramBot
The bot implementation that handles Telegram API interactions and message processing.
Location: TelegramBot.ts
Note: Not exported from main entry point. Access via telegramService.getBot().
Key Methods:
constructor(app: TokenRingApp, telegramService: TelegramBotService, botName: string, botConfig: ParsedTelegramBotConfig): Initializes bot with configurationstart(): Promise<void>: Starts the bot and begins pollingstop(): Promise<void>: Gracefully stops the bot and cleans up resourcescreateCommunicationChannelWithGroup(groupName: string): CommunicationChannel: Creates a communication channel for escalationcreateCommunicationChannelWithUser(userId: string): CommunicationChannel: Creates a communication channel for a specific usergetBotUsername(): string | undefined: Returns the bot's username
Internal Components:
- Message Handling: Processes incoming messages with authorization checks
- Agent Management: Creates and manages agents per chat ID
- Event Processing: Subscribes to agent events and forwards to Telegram
- Response Buffering: Implements throttled batch processing for efficient messaging
- File Extraction: Handles photo and document attachments
Constructor
constructor(app: TokenRingApp, telegramService: TelegramService, botName: string, botConfig: ParsedTelegramBotConfig)
- app: TokenRingApp instance
- telegramService: The parent TelegramService instance
- botName: Name of this bot configuration
- botConfig: Validated bot configuration
TelegramEscalationProvider
Implements the EscalationProvider interface for escalation workflows.
Location: TelegramEscalationProvider.ts
Key Methods:
constructor(config: ParsedTelegramEscalationProviderConfig): Initializes with bot and group configurationcreateCommunicationChannelWithUser(groupName: string, agent: Agent): Promise<CommunicationChannel>: Creates a communication channel for escalation
Constructor
constructor(config: ParsedTelegramEscalationProviderConfig)
- config: Configuration with
bot(bot name) andgroup(group name)
Services
TelegramService
The TelegramService manages multiple Telegram bots and provides the core functionality for bot operations.
Type: TokenRingService
Purpose: Manages multiple Telegram bot instances and their lifecycle
Registration: Automatically registered when plugin is installed with telegram configuration
Integration:
- Integrates with
TokenRingAppfor service management - Uses
AgentManagerfor agent lifecycle - Integrates with
EscalationServicewhen escalation plugin is configured
Configuration Schema
export const TelegramServiceConfigSchema = z.object({
bots: z.record(z.string(), TelegramBotConfigSchema)
});
Example Service Usage
import TokenRingApp from '@tokenring-ai/app';
import { TelegramService } from '@tokenring-ai/telegram';
import { TelegramServiceConfigSchema } from '@tokenring-ai/telegram/schema';
const app = new TokenRingApp();
const config = {
bots: {
"primaryBot": {
name: "Primary Bot",
botToken: process.env.TELEGRAM_BOT_TOKEN!,
groups: {
"developers": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "developerAgent"
}
}
}
}
};
const validatedConfig = TelegramServiceConfigSchema.parse(config);
const telegramService = new TelegramService(app, validatedConfig);
app.addServices(telegramService);
Provider Documentation
EscalationProvider Implementation
The TelegramEscalationProvider implements the EscalationProvider interface from @tokenring-ai/escalation.
Configuration Schema
export const TelegramEscalationProviderConfigSchema = z.object({
type: z.literal('telegram'),
bot: z.string(),
group: z.string(),
});
Registration Example
import TokenRingApp from '@tokenring-ai/app';
import telegramPlugin from '@tokenring-ai/telegram';
import escalationPlugin from '@tokenring-ai/escalation';
const app = new TokenRingApp({
telegram: {
bots: {
"primaryBot": {
name: "Primary Bot",
botToken: process.env.TELEGRAM_BOT_TOKEN!,
groups: {
"admins": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "teamLeader"
}
}
}
}
},
escalation: {
providers: {
"telegramAdmins": {
type: "telegram",
bot: "primaryBot",
group: "admins"
}
},
groups: {
"admins": ["123456789@telegram"]
}
}
});
app.install(escalationPlugin);
app.install(telegramPlugin);
RPC Endpoints
This package does not define any RPC endpoints. It uses the Telegram Bot API directly via the node-telegram-bot-api library.
Chat Commands
The package supports configurable command mapping via the commandMapping configuration option. Default mapping:
{
"/reset": "/chat reset"
}
Supported Commands:
/reset- Resets the agent conversation (maps to/chat reset)/stop- Special command that aborts the current agent operation
Custom Commands: Add custom command mappings in configuration:
commandMapping: {
"/reset": "/chat reset",
"/help": "/chat help",
"/status": "/chat status"
}
Commands not in the mapping that start with / will result in an error. Commands that don't start with / are sent as regular chat messages.
Configuration
Configuration Schemas
The package uses Zod schemas for configuration validation:
import { TelegramBotConfigSchema, TelegramServiceConfigSchema, TelegramEscalationProviderConfigSchema } from '@tokenring-ai/telegram/schema';
TelegramBotConfigSchema
Configuration for individual bot instances:
export const TelegramBotConfigSchema = z.object({
name: z.string(),
botToken: z.string().min(1, "Bot token is required"),
joinMessage: z.string().optional(),
maxPhotoPixels: z.number().default(1_000_000),
maxFileSize: z.number().default(20_971_520), // 20MB default
maxDocumentSize: z.number().default(10_485_760), // 10MB default
groups: z.record(z.string(), z.object({
groupId: z.number().max(0, "Group ID must be a negative number"),
allowedUsers: z.array(z.number()).default([]),
agentType: z.string(),
})),
dmAgentType: z.string(),
dmAllowedUsers: z.array(z.number()).default([]),
commandMapping: z.record(z.string(), z.string()).default({
"/reset": "/chat reset",
})
});
Properties:
name(string): Unique name for this bot configurationbotToken(string): Telegram bot token from @BotFatherjoinMessage(string, optional): Message sent to all groups on bot startupmaxPhotoPixels(number): Maximum pixel count for photos (width × height), default 1,000,000maxFileSize(number): Maximum file size in bytes, default 20MB (20,971,520)maxDocumentSize(number): Maximum document size in bytes, default 10MB (10,485,760)groups(object): Map of group configurationsgroupId(number): Telegram group/chat ID (must be negative)allowedUsers(number[]): Array of allowed user IDs (empty = all users)agentType(string): Agent type for this group
dmAgentType(string): Agent type for direct messages (DMs disabled if not provided)dmAllowedUsers(number[]): Array of allowed DM user IDs (empty = all users)commandMapping(Record<string, string>): Map of bot commands to agent commands
TelegramServiceConfigSchema
Configuration for the service with multiple bots:
export const TelegramServiceConfigSchema = z.object({
bots: z.record(z.string(), TelegramBotConfigSchema)
});
TelegramEscalationProviderConfigSchema
Configuration for escalation provider:
export const TelegramEscalationProviderConfigSchema = z.object({
type: z.literal('telegram'),
bot: z.string(),
group: z.string(),
});
Plugin Configuration Schema
The plugin uses nested configuration with both telegram and escalation options.
export const packageConfigSchema = z.object({
telegram: TelegramServiceConfigSchema.optional(),
escalation: EscalationServiceConfigSchema.optional()
});
Example Configuration
{
bots: {
"primaryBot": {
name: "Primary Bot",
botToken: "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
joinMessage: "Bot is online! Type /help for available commands.",
maxPhotoPixels: 1000000,
maxFileSize: 20971520,
maxDocumentSize: 10485760,
commandMapping: {
"/reset": "/chat reset",
"/help": "/chat help"
},
groups: {
"developers": {
groupId: -1001234567890,
allowedUsers: [123456789, 987654321],
agentType: "developerAgent"
},
"managers": {
groupId: -1009876543210,
allowedUsers: [],
agentType: "managerAgent"
}
},
dmAgentType: "personalAgent",
dmAllowedUsers: [123456789]
},
"secondaryBot": {
name: "Secondary Bot",
botToken: "987654:XYZ-ABC5678jkl-Mno987Qrs456def22",
groups: {
"support": {
groupId: -1005555555555,
allowedUsers: [],
agentType: "supportAgent"
}
}
}
}
}
Integration
Plugin Installation
The recommended way to use the Telegram service is through the TokenRing plugin system:
import TokenRingApp from '@tokenring-ai/app';
import telegramPlugin from '@tokenring-ai/telegram';
const app = new TokenRingApp({
telegram: {
bots: {
"primaryBot": {
name: "Primary Bot",
botToken: process.env.TELEGRAM_BOT_TOKEN!,
groups: {
"developers": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "teamLeader"
}
}
}
}
}
});
app.install(telegramPlugin);
await app.start();
Escalation Integration
To use the Telegram escalation provider, configure both the Telegram and escalation plugins:
import TokenRingApp from '@tokenring-ai/app';
import telegramPlugin from '@tokenring-ai/telegram';
import escalationPlugin from '@tokenring-ai/escalation';
const app = new TokenRingApp({
telegram: {
bots: {
"primaryBot": {
name: "Primary Bot",
botToken: process.env.TELEGRAM_BOT_TOKEN!,
groups: {
"admins": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "teamLeader"
}
}
}
}
},
escalation: {
providers: {
"telegramAdmins": {
type: "telegram",
bot: "primaryBot",
group: "admins"
}
},
groups: {
"admins": ["123456789@telegram"]
}
}
});
app.install(telegramPlugin);
app.install(escalationPlugin);
await app.start();
Manual Service Registration
For advanced usage, services can be registered manually:
import TokenRingApp from '@tokenring-ai/app';
import TelegramService from '@tokenring-ai/telegram/TelegramService';
import { TelegramServiceConfigSchema } from '@tokenring-ai/telegram/schema';
const app = new TokenRingApp();
const config = TelegramServiceConfigSchema.parse({
bots: {
"primaryBot": {
name: "Primary Bot",
botToken: process.env.TELEGRAM_BOT_TOKEN!,
groups: {
"developers": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "teamLeader"
}
}
}
}
});
app.addServices(new TelegramService(app, config));
await app.start();
Agent Integration
The Telegram service integrates with agents by creating dedicated agent instances for each group or DM user:
- Agent Creation: Creates agents using
agentTypefrom group configuration ordmAgentTypefor DMs - Event Processing: Subscribes to agent events for response handling
- State Management: Maintains persistent state across conversations
- Resource Management: Proper cleanup of agent resources
Usage Examples
Basic Bot Setup
import TokenRingApp from '@tokenring-ai/app';
import telegramPlugin from '@tokenring-ai/telegram';
const app = new TokenRingApp({
telegram: {
bots: {
"myBot": {
name: "My Bot",
botToken: "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
groups: {
"main": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "developerAgent"
}
}
}
}
}
});
app.install(telegramPlugin);
await app.start();
Direct Messaging Setup
const app = new TokenRingApp({
telegram: {
bots: {
"myBot": {
name: "My Bot",
botToken: "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
groups: {
"main": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "developerAgent"
}
},
dmAgentType: "personalAgent",
dmAllowedUsers: [123456789, 987654321]
}
}
}
});
Communication Channel Example
import { TelegramBotService } from '@tokenring-ai/telegram';
import { EscalationService } from '@tokenring-ai/escalation';
// Get the Telegram service from an agent
const telegramService = agent.requireServiceByType(TelegramBotService);
// Get the bot instance
const bot = telegramService.getBot("primaryBot");
// Create a communication channel with a specific group
const channel = bot.createCommunicationChannelWithGroup("developers");
// Send a message
await channel.send('Please approve this deployment');
// Listen for a response
for await (const message of channel.receive()) {
console.log('User responded:', message);
break; // Process response and break out of loop
}
// Clean up
await channel[Symbol.asyncDispose]();
Escalation Example
import { EscalationService } from '@tokenring-ai/escalation';
const escalationService = agent.requireServiceByType(EscalationService);
// Create a communication channel and send message
const channel = await escalationService.initiateContactWithUserOrGroup(
'admins', // Group name
'Approve production deployment?',
agent
);
// Listen for response
for await (const message of channel.receive()) {
if (message.toLowerCase().includes('yes')) {
console.log('Deployment approved');
}
await channel[Symbol.asyncDispose]();
break;
}
Direct Messaging with Escalation
// In agent code
const escalationService = agent.requireServiceByType(EscalationService);
// Create a communication channel and send message
const channel = await escalationService.initiateContactWithUserOrGroup(
'admins', // Group name
'Approve production deployment?',
agent
);
// Listen for response
for await (const message of channel.receive()) {
if (message.toLowerCase().includes('yes')) {
// Proceed with deployment
console.log('Deployment approved');
}
await channel[Symbol.asyncDispose]();
break;
}
Manual Bot Management
import TokenRingApp from '@tokenring-ai/app';
import { TelegramService } from '@tokenring-ai/telegram';
const app = new TokenRingApp();
const telegramService = new TelegramService(app, {
bots: {
"primaryBot": {
name: "Primary Bot",
botToken: process.env.TELEGRAM_BOT_TOKEN!,
groups: {
"developers": {
groupId: -1001234567890,
allowedUsers: [],
agentType: "developerAgent"
}
}
}
}
});
app.addServices(telegramService);
await telegramService.run(signal);
Best Practices
Security
- Never commit bot tokens: Use environment variables for bot tokens
- Use user authorization: Configure
allowedUsersanddmAllowedUsersto restrict access - Validate group IDs: Ensure group IDs are negative numbers as required by Telegram
- Handle errors gracefully: Implement proper error handling for all Telegram API calls
Performance
- Configure appropriate limits: Set
maxPhotoPixelsandmaxDocumentSizebased on your needs - Use message buffering: The built-in buffering (250ms) optimizes API calls
- Clean up resources: Always dispose of communication channels after use
- Monitor agent lifecycle: The service automatically manages agent lifecycle per chat
Message Handling
- Use Markdown carefully: Messages support Markdown with automatic fallback to plain text
- Handle long responses: The service automatically chunks messages over 4090 characters
- Test reply functionality: Verify reply-based communication works as expected
- Monitor rate limits: The service includes built-in rate limiting to avoid Telegram API limits
Bot Token Security
- Never commit bot tokens to version control
- Use environment variables for bot tokens
- Rotate tokens regularly for production bots
Group Configuration
- Use descriptive group names for clarity
- Limit
allowedUsersfor security-critical applications - Test group configurations before production deployment
Direct Messaging
- Configure
dmAgentTypeonly if you want to enable DMs - Use
dmAllowedUsersto restrict DM access to specific users - Monitor DM usage to prevent abuse
Error Handling
- Implement proper error logging for debugging
- Monitor bot health through service events
- Handle rate limiting by respecting Telegram API limits
File Attachments
- Set appropriate
maxPhotoPixelsfor your use case - Configure
maxDocumentSizebased on your storage constraints - Note that audio, voice, video, and GIF attachments are not currently supported
Command Mapping
- Use clear and consistent command names
- Map common commands to improve user experience
- Document available commands in your
joinMessage
Message Processing Flow
Regular Messages (Group)
- Mention Check: Verifies message contains bot username mention (
@botname) - Authorization Check: Verifies user is authorized for the group (if user whitelist is configured)
- Agent Management: Gets or creates dedicated agent for the group
- State Wait: Waits for agent to be idle before processing new input
- Input Handling: Sends message to agent for processing
- Event Processing: Subscribes to agent events:
output.chat: Sends chat responses to Telegram (with buffering)output.info: Sends system messages with level formattingoutput.warning: Sends system messages with level formattingoutput.error: Sends system messages with level formattinginput.handled: Cleans up event subscription and handles timeouts
- Response Accumulation: Accumulates chat content with intelligent buffering
- Timeout Handling: Implements configurable timeout with user feedback
Direct Messages (DM)
- Authorization Check: Verifies user is authorized for DM (if user whitelist is configured)
- Agent Management: Gets or creates dedicated agent for the user
- State Wait: Waits for agent to be idle before processing new input
- Input Handling: Sends message to agent for processing
- Event Processing: Same as group messages
- Response Delivery: Sends accumulated responses to the user
Reply Handling (Escalation)
- Message Sent: Bot sends message to user via
CommunicationChannel.send() - Handler Registered: Message ID is tracked for reply detection
- User Replies: User uses Telegram reply feature to respond
- Reply Processed: Registered listeners are invoked with response text
- Confirmation Sent: User receives confirmation (reply handler cleanup)
- Cleanup: Handler removed from registry
File Attachments
The service supports the following file types:
Photos
- Extracts the highest quality photo that fits within
maxPhotoPixels - Downloads and converts to base64
- Sent as image attachment to agent
Documents
- Downloads and converts to base64
- Respects
maxDocumentSizelimit (default 10MB) - Skips image documents (processed as photos)
- Preserves original filename and MIME type
Unsupported Attachments
The following attachment types are currently not supported:
- Audio
- Voice messages
- Video
- Video notes (video messages)
- Animations/GIFs
Utility Functions
parseCommand
Location: parseCommand.ts
Parses incoming messages and maps commands to agent commands.
type ParsedCommand =
| { type: 'mapped'; message: string }
| { type: 'stop' }
| { type: 'unknown'; command: string }
| { type: 'chat'; message: string };
export function parseCommand(
text: string | undefined,
commandMapping: Record<string, string>,
from?: { first_name?: string; username?: string }
): ParsedCommand
Parameters:
text: The message text to parsecommandMapping: Map of bot commands to agent commandsfrom: Optional sender information for chat message formatting
Returns: ParsedCommand object with type and message
fetchTelegramFile
Location: fetchTelegramFile.ts
Downloads a file from Telegram and returns it as a Buffer.
export async function fetchTelegramFile(
bot: TelegramBotAPI,
botToken: string,
fileId: string
): Promise<Buffer>
Parameters:
bot: TelegramBotAPI instancebotToken: Bot token for API authenticationfileId: Telegram file ID to download
Returns: Buffer containing the file data
splitIntoChunks
Location: splitIntoChunks.ts
Splits text into chunks suitable for Telegram messages (max 4090 characters).
export function splitIntoChunks(text: string | null): string[]
Parameters:
text: Text to split into chunks
Returns: Array of message chunks
Features:
- Splits on headers (
\n#) and paragraph breaks (\n\n) - Force-splits oversized sections at line breaks
- Falls back to character-based splitting if needed
- Returns "working..." message for null input
ThrottledBatchProcessor
Location: throttledBatchProcessor.ts
Batch processor with throttling for efficient message sending.
export class ThrottledBatchProcessor<T> {
constructor(
processItems: (items: T[]) => Promise<void>,
intervalMs: number = 250
)
add(item: T): void
flush(): Promise<void>
dispose(): void
get hasPending(): boolean
}
Parameters:
processItems: Function to process batch of itemsintervalMs: Minimum interval between batches (default 250ms)
Methods:
add(item): Add item to pending batchflush(): Process all pending items immediatelydispose(): Clear pending items and cancel timerhasPending: Check if there are pending items
Error Handling
Bot-Level Errors
- Polling Errors: Logged to console with error details
- Message Processing: Wrapped in try-catch to prevent crashes
- Bot Startup: Validates configuration before initialization
User-Level Errors
- Authorization: Sends "Sorry, you are not authorized to use this bot." for unauthorized users
- Timeout: Sends
Agent timed out after {time} seconds.when agents exceed max runtime - No Response: Sends "No response received from agent." when no output is generated
- Group Not Found: Throws error when referencing non-existent group configuration
- DM Not Enabled: Sends "DMs are not enabled for this bot." when dmAgentType is not configured
Service-Level Errors
- Configuration: Validates bot token presence on construction
- Shutdown: Graceful cleanup with error handling for bot stop operations
- Resource Management: Proper cleanup of all user agents on service termination
- Bot Not Found: Throws error when referencing non-existent bot configuration
Testing and Development
Running Tests
The package includes comprehensive unit and integration tests:
# Run all tests
bun test
# Run tests in watch mode
bun test --watch
# Run tests with coverage
bun test --coverage
Test Configuration
The package uses Vitest with the following configuration (vitest.config.ts):
import {defineConfig} from "vitest/config";
export default defineConfig({
test: {
include: ["**/*.test.ts"],
environment: "node",
globals: true,
isolate: true,
},
});
Development Setup
- Install dependencies:
bun install - Run type check:
bun run build - Run tests:
bun test
Package Structure
pkg/telegram/
├── index.ts # Main exports
├── plugin.ts # Plugin definition for TokenRing integration
├── TelegramService.ts # Core service implementation
├── TelegramBot.ts # Bot implementation with message handling
├── TelegramEscalationProvider.ts # Escalation provider implementation
├── schema.ts # Configuration schemas
├── parseCommand.ts # Command parsing utility
├── fetchTelegramFile.ts # File download utility
├── splitIntoChunks.ts # Message chunking utility
├── throttledBatchProcessor.ts # Batch processing utility
├── vitest.config.ts # Vitest configuration
└── README.md # Package README
Dependencies
Production Dependencies
@tokenring-ai/app(0.2.0) - Application framework@tokenring-ai/chat(0.2.0) - Chat service integration@tokenring-ai/agent(0.2.0) - Agent management@tokenring-ai/utility(0.2.0) - Utility functions@tokenring-ai/escalation(0.2.0) - Escalation provider interfacenode-telegram-bot-api(^0.67.0) - Telegram API bindingaxios(^1.13.6) - HTTP client for file downloadsmarked(^17.0.4) - Markdown parsingzod(^4.3.6) - Schema validation
Development Dependencies
@types/node-telegram-bot-api(^0.64.14) - TypeScript definitionsvitest(^4.1.0) - Testing frameworktypescript(^5.9.3) - TypeScript compiler
Related Components
- @tokenring-ai/agent: Core agent system used by Telegram bots
- @tokenring-ai/escalation: Escalation service integrated with Telegram provider
- @tokenring-ai/app: Base application framework
- @tokenring-ai/chat: Chat service for agent interactions
License
MIT License - see LICENSE file for details.