@ebowwa/channel-telegram 1.15.5 → 1.15.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Telegram Command Adapter
3
+ *
4
+ * Bridges @ebowwa/channel-command definitions to Telegram bot handlers.
5
+ */
6
+ import type TelegramBot from 'node-telegram-bot-api';
7
+ import type { CommandDefinition as ChannelCommandDefinition } from '@ebowwa/channel-command';
8
+ import type { ConversationMemory } from './conversation-memory';
9
+ import type { Tool } from './types';
10
+ /**
11
+ * Convert channel-command definition to Telegram handler
12
+ */
13
+ export declare function createTelegramHandler(def: ChannelCommandDefinition, memory: ConversationMemory, tools: Tool[]): (bot: TelegramBot) => void;
14
+ /**
15
+ * Register multiple channel-command definitions with Telegram bot
16
+ */
17
+ export declare function registerChannelCommands(bot: TelegramBot, commands: ChannelCommandDefinition[], memory: ConversationMemory, tools: Tool[]): void;
18
+ //# sourceMappingURL=command-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-adapter.d.ts","sourceRoot":"","sources":["../src/command-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EACV,iBAAiB,IAAI,wBAAwB,EAG9C,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,IAAI,EAAE,GACZ,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAiD5B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,wBAAwB,EAAE,EACpC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,IAAI,EAAE,GACZ,IAAI,CAKN"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Telegram Command Adapter
3
+ *
4
+ * Bridges @ebowwa/channel-command definitions to Telegram bot handlers.
5
+ */
6
+ /**
7
+ * Convert channel-command definition to Telegram handler
8
+ */
9
+ export function createTelegramHandler(def, memory, tools) {
10
+ return (bot) => {
11
+ // Find telegram aliases
12
+ const telegramAliases = def.aliases.filter(a => a.channel === 'telegram');
13
+ for (const alias of telegramAliases) {
14
+ // Create regex pattern for the alias
15
+ const pattern = new RegExp(`^${escapeRegex(alias.alias)}(?:\\s+(.*))?$`);
16
+ bot.onText(pattern, async (msg, match) => {
17
+ const chatId = msg.chat.id;
18
+ const inputText = match?.[1] || '';
19
+ // Build context
20
+ const ctx = {
21
+ channel: 'telegram',
22
+ channelId: String(chatId),
23
+ input: alias.alias + (inputText ? ' ' + inputText : ''),
24
+ args: parseArgs(inputText),
25
+ message: msg,
26
+ sessionId: String(msg.from?.id),
27
+ timestamp: new Date(),
28
+ correlationId: crypto.randomUUID(),
29
+ memory,
30
+ tools: tools,
31
+ config: {},
32
+ reply: async (message, options) => {
33
+ const parseMode = options;
34
+ await bot.sendMessage(chatId, message, {
35
+ parse_mode: parseMode?.parse_mode,
36
+ });
37
+ },
38
+ };
39
+ try {
40
+ const result = await def.handler(ctx.args, ctx);
41
+ if (result.message && ctx.reply) {
42
+ await ctx.reply(result.message, { parse_mode: result.format === 'markdown' ? 'Markdown' : undefined });
43
+ }
44
+ else if (result.error && ctx.reply) {
45
+ await ctx.reply(`Error: ${result.error}`);
46
+ }
47
+ }
48
+ catch (error) {
49
+ console.error(`Command ${alias.alias} failed:`, error);
50
+ await bot.sendMessage(chatId, `Command failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
51
+ }
52
+ });
53
+ }
54
+ };
55
+ }
56
+ /**
57
+ * Register multiple channel-command definitions with Telegram bot
58
+ */
59
+ export function registerChannelCommands(bot, commands, memory, tools) {
60
+ for (const cmd of commands) {
61
+ const handler = createTelegramHandler(cmd, memory, tools);
62
+ handler(bot);
63
+ }
64
+ }
65
+ /**
66
+ * Parse simple space-separated args
67
+ */
68
+ function parseArgs(input) {
69
+ const params = {};
70
+ if (!input.trim())
71
+ return params;
72
+ const parts = input.split(/\s+/);
73
+ for (let i = 0; i < parts.length; i++) {
74
+ const part = parts[i];
75
+ if (part.includes('=')) {
76
+ const [key, value] = part.split('=');
77
+ params[key] = value;
78
+ }
79
+ else {
80
+ // Positional
81
+ params._positional = params._positional || [];
82
+ params._positional.push(part);
83
+ }
84
+ }
85
+ // If only positional, join as message
86
+ if (params._positional && Object.keys(params).length === 1) {
87
+ params.message = params._positional.join(' ');
88
+ delete params._positional;
89
+ }
90
+ return params;
91
+ }
92
+ /**
93
+ * Escape special regex characters
94
+ */
95
+ function escapeRegex(str) {
96
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
97
+ }
98
+ //# sourceMappingURL=command-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-adapter.js","sourceRoot":"","sources":["../src/command-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,16 @@
1
1
  /**
2
2
  * Command index - Single source of truth for commands
3
3
  *
4
- * Each command exports a CommandDefinition with:
5
- * - command: name (without /)
6
- * - description: for Telegram menu
7
- * - register: function to set up handler
4
+ * Uses @ebowwa/channel-command for channel-agnostic definitions
5
+ * and adapts them for Telegram.
8
6
  */
9
7
  import type TelegramBot from 'node-telegram-bot-api';
10
- import { registerResourcesCommand } from './resources';
11
- import { registerStartCommand } from './start';
12
- import { registerStatusCommand } from './status';
13
- import { registerHelpCommand } from './help';
8
+ import type { CommandRegistrar } from './types';
9
+ import type { ConversationMemory } from '../conversation-memory';
10
+ import type { Tool } from '../types';
14
11
  import { registerGitCommand } from './git';
15
12
  import { registerDopplerCommand } from './doppler';
16
13
  import { registerLogsCommand } from './logs';
17
- import { registerClearCommand } from './clear';
18
- import { registerToolsCommand } from './tools';
19
14
  import { registerCancelCommand, isCancelled, clearCancel } from './cancel';
20
15
  import { registerPauseCommand, isPaused, waitWhilePaused, clearPause } from './pause';
21
16
  import { registerResumeCommand } from './resume';
@@ -23,12 +18,15 @@ import { registerQuietCommand } from './quiet';
23
18
  import { isQuiet, clearQuiet } from '@ebowwa/channel-core';
24
19
  import { registerVerboseCommand } from './verbose';
25
20
  import { register as registerRestartCommand } from './restart';
21
+ import { registerResourcesCommand } from './resources';
22
+ import { registerPromptCommand } from './prompt';
23
+ declare const registerSettingsCommand: CommandRegistrar;
26
24
  export type { CommandDefinition, CommandRegistrar, CommandContext } from './types';
27
- export { registerStartCommand, registerStatusCommand, registerHelpCommand, registerGitCommand, registerDopplerCommand, registerLogsCommand, registerClearCommand, registerToolsCommand, registerResourcesCommand, registerCancelCommand, registerPauseCommand, registerResumeCommand, registerQuietCommand, registerVerboseCommand, registerRestartCommand, isCancelled, clearCancel, isPaused, waitWhilePaused, clearPause, isQuiet, clearQuiet, };
25
+ export { registerGitCommand, registerDopplerCommand, registerLogsCommand, registerResourcesCommand, registerCancelCommand, registerPauseCommand, registerResumeCommand, registerQuietCommand, registerVerboseCommand, registerRestartCommand, registerPromptCommand, registerSettingsCommand, isCancelled, clearCancel, isPaused, waitWhilePaused, clearPause, isQuiet, clearQuiet, };
28
26
  /**
29
27
  * Register all command handlers with the bot
30
28
  */
31
- export declare function registerAllCommands(bot: TelegramBot, memory: import('../conversation-memory').ConversationMemory, tools: import('../index').Tool[]): void;
29
+ export declare function registerAllCommands(bot: TelegramBot, memory: ConversationMemory, tools: Tool[]): void;
32
30
  /**
33
31
  * Get menu entries for Telegram's command suggestions
34
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAoB,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAG/D,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGnF,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,UAAU,EACV,OAAO,EACP,UAAU,GACX,CAAC;AAwBF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,OAAO,wBAAwB,EAAE,kBAAkB,EAC3D,KAAK,EAAE,OAAO,UAAU,EAAE,IAAI,EAAE,GAC/B,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAEhF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAC;AAMrD,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAoB,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,QAAA,MAAM,uBAAuB,EAAE,gBAA2E,CAAC;AAG3G,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGnF,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,UAAU,EACV,OAAO,EACP,UAAU,GACX,CAAC;AAmBF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,IAAI,EAAE,GACZ,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBhF"}
@@ -1,22 +1,15 @@
1
1
  /**
2
2
  * Command index - Single source of truth for commands
3
3
  *
4
- * Each command exports a CommandDefinition with:
5
- * - command: name (without /)
6
- * - description: for Telegram menu
7
- * - register: function to set up handler
4
+ * Uses @ebowwa/channel-command for channel-agnostic definitions
5
+ * and adapts them for Telegram.
8
6
  */
9
- // Import command definitions
10
- import { resourcesCommand, registerResourcesCommand } from './resources';
11
- // Legacy imports (to be migrated)
12
- import { registerStartCommand } from './start';
13
- import { registerStatusCommand } from './status';
14
- import { registerHelpCommand } from './help';
7
+ import { BUILTIN_COMMANDS, } from '@ebowwa/channel-command';
8
+ import { registerChannelCommands } from '../command-adapter';
9
+ // Legacy imports (Telegram-specific, not yet migrated)
15
10
  import { registerGitCommand } from './git';
16
11
  import { registerDopplerCommand } from './doppler';
17
12
  import { registerLogsCommand } from './logs';
18
- import { registerClearCommand } from './clear';
19
- import { registerToolsCommand } from './tools';
20
13
  import { registerCancelCommand, isCancelled, clearCancel } from './cancel';
21
14
  import { registerPauseCommand, isPaused, waitWhilePaused, clearPause } from './pause';
22
15
  import { registerResumeCommand } from './resume';
@@ -24,32 +17,35 @@ import { registerQuietCommand } from './quiet';
24
17
  import { isQuiet, clearQuiet } from '@ebowwa/channel-core';
25
18
  import { registerVerboseCommand } from './verbose';
26
19
  import { register as registerRestartCommand } from './restart';
20
+ import { resourcesCommand, registerResourcesCommand } from './resources';
21
+ import { registerPromptCommand } from './prompt';
22
+ import { register as registerSettingsCmd } from './settings';
23
+ const registerSettingsCommand = (bot, _memory, tools) => registerSettingsCmd(bot, tools);
27
24
  // Export legacy functions for backwards compatibility
28
- export { registerStartCommand, registerStatusCommand, registerHelpCommand, registerGitCommand, registerDopplerCommand, registerLogsCommand, registerClearCommand, registerToolsCommand, registerResourcesCommand, registerCancelCommand, registerPauseCommand, registerResumeCommand, registerQuietCommand, registerVerboseCommand, registerRestartCommand, isCancelled, clearCancel, isPaused, waitWhilePaused, clearPause, isQuiet, clearQuiet, };
25
+ export { registerGitCommand, registerDopplerCommand, registerLogsCommand, registerResourcesCommand, registerCancelCommand, registerPauseCommand, registerResumeCommand, registerQuietCommand, registerVerboseCommand, registerRestartCommand, registerPromptCommand, registerSettingsCommand, isCancelled, clearCancel, isPaused, waitWhilePaused, clearPause, isQuiet, clearQuiet, };
29
26
  // Command definitions with descriptions (for menu)
30
27
  const COMMAND_DEFS = [
31
- // Migrated to CommandDefinition pattern
32
- resourcesCommand,
33
- // TODO: Migrate these to CommandDefinition pattern
34
- { command: 'start', description: 'Start the bot', register: registerStartCommand },
35
- { command: 'help', description: 'Show available commands', register: registerHelpCommand },
36
- { command: 'status', description: 'Check bot status', register: registerStatusCommand },
28
+ // Telegram-specific commands (not yet migrated)
37
29
  { command: 'git', description: 'Check git status', register: registerGitCommand },
38
30
  { command: 'doppler', description: 'Check Doppler secrets', register: registerDopplerCommand },
39
31
  { command: 'logs', description: 'View recent logs', register: registerLogsCommand },
40
- { command: 'clear', description: 'Clear conversation history', register: registerClearCommand },
41
- { command: 'tools', description: 'List available tools', register: registerToolsCommand },
42
32
  { command: 'cancel', description: 'Stop current task', register: registerCancelCommand },
43
33
  { command: 'pause', description: 'Pause execution', register: registerPauseCommand },
44
34
  { command: 'resume', description: 'Resume execution', register: registerResumeCommand },
45
35
  { command: 'quiet', description: 'Hide tool logging', register: registerQuietCommand },
46
36
  { command: 'verbose', description: 'Show tool logging', register: registerVerboseCommand },
47
37
  { command: 'restart', description: 'Restart the bot service', register: registerRestartCommand },
38
+ resourcesCommand,
39
+ { command: 'prompt', description: 'Manage system prompt', register: registerPromptCommand },
40
+ { command: 'settings', description: 'Show bot configuration', register: registerSettingsCommand },
48
41
  ];
49
42
  /**
50
43
  * Register all command handlers with the bot
51
44
  */
52
45
  export function registerAllCommands(bot, memory, tools) {
46
+ // Register channel-agnostic commands from @ebowwa/channel-command
47
+ registerChannelCommands(bot, BUILTIN_COMMANDS, memory, tools);
48
+ // Register Telegram-specific commands
53
49
  for (const def of COMMAND_DEFS) {
54
50
  def.register(bot, memory, tools);
55
51
  }
@@ -58,6 +54,20 @@ export function registerAllCommands(bot, memory, tools) {
58
54
  * Get menu entries for Telegram's command suggestions
59
55
  */
60
56
  export function getCommandMenu() {
61
- return COMMAND_DEFS.map(({ command, description }) => ({ command, description }));
57
+ // Combine channel-command definitions with local ones
58
+ const channelMenu = BUILTIN_COMMANDS
59
+ .filter(cmd => cmd.channels.includes('telegram'))
60
+ .map(cmd => {
61
+ const telegramAlias = cmd.aliases.find(a => a.channel === 'telegram');
62
+ const command = telegramAlias?.alias.replace(/^\//, '') || cmd.id.name;
63
+ return { command, description: cmd.description };
64
+ });
65
+ const localMenu = COMMAND_DEFS.map(({ command, description }) => ({ command, description }));
66
+ // Merge and dedupe
67
+ const menuMap = new Map();
68
+ for (const item of [...channelMenu, ...localMenu]) {
69
+ menuMap.set(item.command, item);
70
+ }
71
+ return Array.from(menuMap.values());
62
72
  }
63
73
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { isQuiet } from "../index.js";
2
- import { unlinkSync, existsSync } from "node:fs";
2
+ import { unlinkSync, existsSync, readFileSync, writeFileSync } from "node:fs";
3
3
  const PROMPT_FILE = "/root/seed/custom-prompt.md";
4
4
  const DEFAULT_PROMPT = `You are {{nodeName}} — a 24/7 AI assistant.
5
5
 
@@ -80,8 +80,12 @@ export function registerPromptCommand(bot, memory, tools) {
80
80
  async function viewPrompt(bot, chatId) {
81
81
  let promptContent = "";
82
82
  try {
83
- const file = Bun.file(PROMPT_FILE);
84
- promptContent = await file.text();
83
+ if (existsSync(PROMPT_FILE)) {
84
+ promptContent = readFileSync(PROMPT_FILE, "utf-8");
85
+ }
86
+ else {
87
+ promptContent = DEFAULT_PROMPT;
88
+ }
85
89
  }
86
90
  catch {
87
91
  // Fallback to default
@@ -96,20 +100,25 @@ async function viewPrompt(bot, chatId) {
96
100
  });
97
101
  }
98
102
  async function setCustomPrompt(newPrompt, bot, chatId) {
99
- await Bun.write(PROMPT_FILE, newPrompt);
103
+ writeFileSync(PROMPT_FILE, newPrompt, "utf-8");
100
104
  await bot.sendMessage(chatId, `Custom prompt saved (${newPrompt.length} chars).\nUse /prompt reset to restore default.`, { parse_mode: "Markdown" });
101
105
  }
102
106
  async function appendToPrompt(appendText, bot, chatId) {
103
107
  let currentPrompt = "";
104
108
  try {
105
- currentPrompt = await Bun.file(PROMPT_FILE).text();
109
+ if (existsSync(PROMPT_FILE)) {
110
+ currentPrompt = readFileSync(PROMPT_FILE, "utf-8");
111
+ }
112
+ else {
113
+ currentPrompt = DEFAULT_PROMPT;
114
+ }
106
115
  }
107
116
  catch {
108
117
  // No custom prompt, just default
109
118
  currentPrompt = DEFAULT_PROMPT;
110
119
  }
111
120
  const updatedPrompt = currentPrompt + "\n\n" + appendText;
112
- await Bun.write(PROMPT_FILE, updatedPrompt);
121
+ writeFileSync(PROMPT_FILE, updatedPrompt, "utf-8");
113
122
  await bot.sendMessage(chatId, `Prompt updated. Appended: ${appendText.length} chars.`, {
114
123
  parse_mode: "Markdown",
115
124
  });
@@ -117,14 +126,19 @@ async function appendToPrompt(appendText, bot, chatId) {
117
126
  async function prependToPrompt(prependText, bot, chatId) {
118
127
  let currentPrompt = "";
119
128
  try {
120
- currentPrompt = await Bun.file(PROMPT_FILE).text();
129
+ if (existsSync(PROMPT_FILE)) {
130
+ currentPrompt = readFileSync(PROMPT_FILE, "utf-8");
131
+ }
132
+ else {
133
+ currentPrompt = DEFAULT_PROMPT;
134
+ }
121
135
  }
122
136
  catch {
123
137
  // No custom prompt, just default
124
138
  currentPrompt = DEFAULT_PROMPT;
125
139
  }
126
140
  const updatedPrompt = prependText + "\n\n" + currentPrompt;
127
- await Bun.write(PROMPT_FILE, updatedPrompt);
141
+ writeFileSync(PROMPT_FILE, updatedPrompt, "utf-8");
128
142
  await bot.sendMessage(chatId, `Prompt updated. Prepended: ${prependText.length} chars.`, {
129
143
  parse_mode: "Markdown",
130
144
  });
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
package/dist/plugin.d.ts CHANGED
@@ -19,12 +19,21 @@ export interface ResolvedTelegramAccount {
19
19
  allowedUsers?: number[];
20
20
  allowedChats?: number[];
21
21
  pollingInterval: number;
22
+ /** Enable native streaming using sendMessageDraft API (Bot API 9.5+) */
23
+ nativeStreaming?: boolean;
24
+ /** Streaming mode: 'partial' (default), 'block', or 'progress' */
25
+ streamingMode?: "partial" | "block" | "progress";
26
+ /** Debounce interval for streaming updates (ms), default: 100 */
27
+ streamingDebounceMs?: number;
22
28
  }
23
29
  export declare const telegramMeta: ChannelMeta;
24
30
  export declare const telegramConfigAdapter: ChannelConfigAdapter<ResolvedTelegramAccount>;
25
31
  export declare const telegramThreadingAdapter: ChannelThreadingAdapter;
26
32
  export declare function createTelegramPlugin(config?: {
27
33
  botToken?: string;
34
+ nativeStreaming?: boolean;
35
+ streamingMode?: "partial" | "block" | "progress";
36
+ streamingDebounceMs?: number;
28
37
  }, TelegramBotClass?: typeof TelegramBot): ChannelPlugin<ResolvedTelegramAccount>;
29
38
  export declare const telegramPlugin: ChannelPlugin<ResolvedTelegramAccount>;
30
39
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,oBAAoB,EAGpB,uBAAuB,EAExB,MAAM,+BAA+B,CAAC;AAMvC,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAC;AAMrD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAMD,eAAO,MAAM,YAAY,EAAE,WAM1B,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,uBAAuB,CAqB/E,CAAC;AAgGF,eAAO,MAAM,wBAAwB,EAAE,uBAGtC,CAAC;AAwFF,wBAAgB,oBAAoB,CAClC,MAAM,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,EAClC,gBAAgB,CAAC,EAAE,OAAO,WAAW,GACpC,aAAa,CAAC,uBAAuB,CAAC,CA2CxC;AAMD,eAAO,MAAM,cAAc,wCAAyB,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,oBAAoB,EAGpB,uBAAuB,EAExB,MAAM,+BAA+B,CAAC;AAMvC,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAC;AAMrD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kEAAkE;IAClE,aAAa,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD,eAAO,MAAM,YAAY,EAAE,WAM1B,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,uBAAuB,CAwB/E,CAAC;AAkPF,eAAO,MAAM,wBAAwB,EAAE,uBAGtC,CAAC;AAwFF,wBAAgB,oBAAoB,CAClC,MAAM,GAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACzB,EACN,gBAAgB,CAAC,EAAE,OAAO,WAAW,GACpC,aAAa,CAAC,uBAAuB,CAAC,CA2DxC;AAMD,eAAO,MAAM,cAAc,wCAAyB,CAAC"}
package/dist/plugin.js CHANGED
@@ -38,6 +38,9 @@ export const telegramConfigAdapter = {
38
38
  allowedUsers: config.allowedUsers,
39
39
  allowedChats: config.allowedChats,
40
40
  pollingInterval: config.pollingInterval || 1000,
41
+ nativeStreaming: config.nativeStreaming ?? false,
42
+ streamingMode: config.streamingMode ?? "partial",
43
+ streamingDebounceMs: config.streamingDebounceMs ?? 100,
41
44
  };
42
45
  },
43
46
  validateAccount: async (account) => {
@@ -50,83 +53,229 @@ export const telegramConfigAdapter = {
50
53
  // ============================================================
51
54
  // OUTBOUND ADAPTER
52
55
  // ============================================================
53
- const createOutboundAdapter = (getBot) => ({
54
- deliveryMode: "direct",
55
- textChunkLimit: 4096,
56
- chunker: (text, limit) => {
57
- // Simple chunking - could be smarter with markdown
58
- const chunks = [];
59
- for (let i = 0; i < text.length; i += limit) {
60
- chunks.push(text.slice(i, i + limit));
61
- }
62
- return { chunks, totalChunks: chunks.length };
63
- },
64
- sendText: async ({ to, text, accountId, account, replyToId, threadId }) => {
65
- const bot = getBot();
66
- if (!bot) {
67
- return { success: false, error: "Bot not initialized", timestamp: new Date() };
68
- }
69
- try {
70
- const chatId = parseInt(to, 10);
71
- const options = {
72
- parse_mode: "Markdown",
73
- };
74
- if (replyToId) {
75
- options.reply_to_message_id = parseInt(replyToId, 10);
56
+ const createOutboundAdapter = (getBot, getAccount) => {
57
+ // Active streams for streaming support
58
+ const activeStreams = new Map();
59
+ return {
60
+ deliveryMode: "direct",
61
+ textChunkLimit: 4096,
62
+ chunker: (text, limit) => {
63
+ // Simple chunking - could be smarter with markdown
64
+ const chunks = [];
65
+ for (let i = 0; i < text.length; i += limit) {
66
+ chunks.push(text.slice(i, i + limit));
76
67
  }
77
- if (threadId) {
78
- options.message_thread_id = parseInt(threadId, 10);
68
+ return { chunks, totalChunks: chunks.length };
69
+ },
70
+ sendText: async ({ to, text, accountId, account, replyToId, threadId }) => {
71
+ const bot = getBot();
72
+ if (!bot) {
73
+ return { success: false, error: "Bot not initialized", timestamp: new Date() };
79
74
  }
80
- const result = await bot.sendMessage(chatId, text, options);
81
- return {
82
- success: true,
83
- messageId: result.message_id.toString(),
84
- timestamp: new Date(),
85
- };
86
- }
87
- catch (error) {
88
- return {
89
- success: false,
90
- error: error.message,
91
- timestamp: new Date(),
92
- };
93
- }
94
- },
95
- sendMedia: async ({ to, text, mediaUrl, mediaType, accountId, account }) => {
96
- const bot = getBot();
97
- if (!bot) {
98
- return { success: false, error: "Bot not initialized", timestamp: new Date() };
99
- }
100
- try {
101
- const chatId = parseInt(to, 10);
102
- let result;
103
- if (mediaType === "image") {
104
- result = await bot.sendPhoto(chatId, mediaUrl, { caption: text });
75
+ try {
76
+ const chatId = parseInt(to, 10);
77
+ const options = {
78
+ parse_mode: "Markdown",
79
+ };
80
+ if (replyToId) {
81
+ options.reply_to_message_id = parseInt(replyToId, 10);
82
+ }
83
+ if (threadId) {
84
+ options.message_thread_id = parseInt(threadId, 10);
85
+ }
86
+ const result = await bot.sendMessage(chatId, text, options);
87
+ return {
88
+ success: true,
89
+ messageId: result.message_id.toString(),
90
+ timestamp: new Date(),
91
+ };
105
92
  }
106
- else if (mediaType === "video") {
107
- result = await bot.sendVideo(chatId, mediaUrl, { caption: text });
93
+ catch (error) {
94
+ return {
95
+ success: false,
96
+ error: error.message,
97
+ timestamp: new Date(),
98
+ };
108
99
  }
109
- else if (mediaType === "audio") {
110
- result = await bot.sendAudio(chatId, mediaUrl, { caption: text });
100
+ },
101
+ // Streaming support
102
+ startStream: async ({ to }) => {
103
+ const streamId = `${to}:${Date.now()}`;
104
+ activeStreams.set(streamId, { lastText: "", lastUpdate: 0 });
105
+ return streamId;
106
+ },
107
+ updateStream: async ({ streamId, text, options }) => {
108
+ const stream = activeStreams.get(streamId);
109
+ if (!stream)
110
+ return;
111
+ const bot = getBot();
112
+ const account = getAccount();
113
+ if (!bot || !account)
114
+ return;
115
+ const chatId = parseInt(streamId.split(":")[0], 10);
116
+ const now = Date.now();
117
+ const debounceMs = account.streamingDebounceMs ?? 100;
118
+ // Debounce updates
119
+ if (now - stream.lastUpdate < debounceMs && text === stream.lastText) {
120
+ return;
111
121
  }
112
- else {
113
- result = await bot.sendDocument(chatId, mediaUrl, { caption: text });
122
+ stream.lastText = text;
123
+ stream.lastUpdate = now;
124
+ try {
125
+ if (account.nativeStreaming) {
126
+ // Use sendMessageDraft for native streaming (Bot API 9.5+)
127
+ await bot.sendMessage(chatId, text, {
128
+ parse_mode: options?.parseMode,
129
+ // @ts-expect-error - sendMessageDraft is new in Bot API 9.5
130
+ draft: true,
131
+ });
132
+ }
133
+ else {
134
+ // Fallback: sendMessage + editMessageText
135
+ if (!stream.messageId) {
136
+ const result = await bot.sendMessage(chatId, text, {
137
+ parse_mode: options?.parseMode,
138
+ });
139
+ stream.messageId = result.message_id;
140
+ }
141
+ else {
142
+ await bot.editMessageText(text, {
143
+ chat_id: chatId,
144
+ message_id: stream.messageId,
145
+ parse_mode: options?.parseMode,
146
+ });
147
+ }
148
+ }
114
149
  }
115
- return {
116
- success: true,
117
- messageId: result.message_id.toString(),
118
- timestamp: new Date(),
119
- };
120
- }
121
- catch (error) {
122
- return {
123
- success: false,
124
- error: error.message,
125
- timestamp: new Date(),
126
- };
127
- }
128
- },
129
- });
150
+ catch (error) {
151
+ // Handle entity parse errors by retrying without formatting
152
+ if (error?.message?.includes("can't parse entities")) {
153
+ console.log("[TelegramPlugin] Entity parse error in updateStream, retrying without formatting");
154
+ try {
155
+ if (!stream.messageId) {
156
+ const result = await bot.sendMessage(chatId, text);
157
+ stream.messageId = result.message_id;
158
+ }
159
+ else {
160
+ await bot.editMessageText(text, {
161
+ chat_id: chatId,
162
+ message_id: stream.messageId,
163
+ });
164
+ }
165
+ }
166
+ catch (retryError) {
167
+ console.error(`[TelegramPlugin] updateStream fallback failed: ${retryError.message}`);
168
+ }
169
+ return;
170
+ }
171
+ console.error(`[TelegramOutbound] Stream update error: ${error.message}`);
172
+ }
173
+ },
174
+ finalizeStream: async ({ streamId, finalText, options }) => {
175
+ const stream = activeStreams.get(streamId);
176
+ if (!stream)
177
+ return undefined;
178
+ const bot = getBot();
179
+ const account = getAccount();
180
+ if (!bot || !account)
181
+ return undefined;
182
+ const chatId = parseInt(streamId.split(":")[0], 10);
183
+ let messageId = stream.messageId;
184
+ try {
185
+ if (account.nativeStreaming) {
186
+ // Final commit with sendMessageDraft
187
+ const result = await bot.sendMessage(chatId, finalText, {
188
+ parse_mode: options?.parseMode,
189
+ // @ts-expect-error - sendMessageDraft is new in Bot API 9.5
190
+ draft: false,
191
+ });
192
+ messageId = result.message_id;
193
+ }
194
+ else if (stream.messageId) {
195
+ // Final edit for fallback mode
196
+ await bot.editMessageText(finalText, {
197
+ chat_id: chatId,
198
+ message_id: stream.messageId,
199
+ parse_mode: options?.parseMode,
200
+ });
201
+ }
202
+ }
203
+ catch (error) {
204
+ // Handle entity parse errors by retrying without formatting
205
+ if (error?.message?.includes("can't parse entities")) {
206
+ console.log("[TelegramPlugin] Entity parse error in finalizeStream, retrying without formatting");
207
+ try {
208
+ if (account.nativeStreaming) {
209
+ const result = await bot.sendMessage(chatId, finalText);
210
+ messageId = result.message_id;
211
+ }
212
+ else if (stream.messageId) {
213
+ await bot.editMessageText(finalText, {
214
+ chat_id: chatId,
215
+ message_id: stream.messageId,
216
+ });
217
+ }
218
+ }
219
+ catch (retryError) {
220
+ console.error(`[TelegramPlugin] finalizeStream fallback failed: ${retryError.message}`);
221
+ }
222
+ }
223
+ else {
224
+ console.error(`[TelegramOutbound] Stream finalize error: ${error.message}`);
225
+ }
226
+ }
227
+ finally {
228
+ activeStreams.delete(streamId);
229
+ }
230
+ return messageId?.toString();
231
+ },
232
+ cancelStream: async ({ streamId }) => {
233
+ const stream = activeStreams.get(streamId);
234
+ if (stream?.messageId) {
235
+ const bot = getBot();
236
+ if (bot) {
237
+ const chatId = parseInt(streamId.split(":")[0], 10);
238
+ await bot.deleteMessage(chatId, stream.messageId).catch(() => { });
239
+ }
240
+ }
241
+ activeStreams.delete(streamId);
242
+ },
243
+ sendMedia: async ({ to, text, mediaUrl, mediaType, accountId, account }) => {
244
+ const bot = getBot();
245
+ if (!bot) {
246
+ return { success: false, error: "Bot not initialized", timestamp: new Date() };
247
+ }
248
+ try {
249
+ const chatId = parseInt(to, 10);
250
+ let result;
251
+ if (mediaType === "image") {
252
+ result = await bot.sendPhoto(chatId, mediaUrl, { caption: text });
253
+ }
254
+ else if (mediaType === "video") {
255
+ result = await bot.sendVideo(chatId, mediaUrl, { caption: text });
256
+ }
257
+ else if (mediaType === "audio") {
258
+ result = await bot.sendAudio(chatId, mediaUrl, { caption: text });
259
+ }
260
+ else {
261
+ result = await bot.sendDocument(chatId, mediaUrl, { caption: text });
262
+ }
263
+ return {
264
+ success: true,
265
+ messageId: result.message_id.toString(),
266
+ timestamp: new Date(),
267
+ };
268
+ }
269
+ catch (error) {
270
+ return {
271
+ success: false,
272
+ error: error.message,
273
+ timestamp: new Date(),
274
+ };
275
+ }
276
+ },
277
+ };
278
+ };
130
279
  // ============================================================
131
280
  // THREADING ADAPTER
132
281
  // ============================================================
@@ -208,12 +357,17 @@ const createGatewayAdapter = (createBot) => {
208
357
  // ============================================================
209
358
  export function createTelegramPlugin(config = {}, TelegramBotClass) {
210
359
  let bot = null;
360
+ let account = null;
211
361
  const createBot = (token) => {
212
362
  if (!TelegramBotClass) {
213
363
  throw new Error("TelegramBot class not provided");
214
364
  }
215
365
  return new TelegramBotClass(token, { polling: true });
216
366
  };
367
+ // Native streaming configuration
368
+ const nativeStreaming = config.nativeStreaming ?? false;
369
+ const streamingMode = config.streamingMode ?? "partial";
370
+ const streamingDebounceMs = config.streamingDebounceMs ?? 100;
217
371
  return {
218
372
  id: "telegram",
219
373
  meta: telegramMeta,
@@ -226,7 +380,7 @@ export function createTelegramPlugin(config = {}, TelegramBotClass) {
226
380
  threads: true,
227
381
  reactions: true,
228
382
  editing: true,
229
- streaming: false,
383
+ streaming: nativeStreaming,
230
384
  buttons: true,
231
385
  },
232
386
  nativeCommands: true,
@@ -240,9 +394,16 @@ export function createTelegramPlugin(config = {}, TelegramBotClass) {
240
394
  },
241
395
  },
242
396
  config: telegramConfigAdapter,
243
- outbound: createOutboundAdapter(() => bot),
397
+ outbound: createOutboundAdapter(() => bot, () => account),
244
398
  gateway: createGatewayAdapter((token) => {
245
399
  bot = createBot(token);
400
+ account = {
401
+ botToken: token,
402
+ pollingInterval: 1000,
403
+ nativeStreaming,
404
+ streamingMode,
405
+ streamingDebounceMs,
406
+ };
246
407
  return bot;
247
408
  }),
248
409
  threading: telegramThreadingAdapter,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ebowwa/channel-telegram",
3
- "version": "1.15.5",
3
+ "version": "1.15.7",
4
4
  "description": "Pure Telegram protocol adapter implementing ChannelConnector",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -40,14 +40,16 @@
40
40
  "url": "https://github.com/ebowwa/codespaces/issues"
41
41
  },
42
42
  "dependencies": {
43
+ "@ebowwa/channel-command": "^1.0.3",
43
44
  "@ebowwa/channel-core": "^1.15.0",
44
45
  "@ebowwa/channel-types": "^0.2.3",
45
46
  "node-telegram-bot-api": "^0.66.0"
46
47
  },
47
48
  "devDependencies": {
48
- "@types/bun": "latest",
49
+ "@types/bun": "^1.3.10",
49
50
  "@types/node": "^22.19.11",
50
51
  "@types/node-telegram-bot-api": "^0.64.13",
52
+ "bun-types": "^1.3.10",
51
53
  "typescript": "^5.9.3"
52
54
  },
53
55
  "ownership": {
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Telegram Command Adapter
3
+ *
4
+ * Bridges @ebowwa/channel-command definitions to Telegram bot handlers.
5
+ */
6
+
7
+ import type TelegramBot from 'node-telegram-bot-api';
8
+ import type {
9
+ CommandDefinition as ChannelCommandDefinition,
10
+ CommandContext,
11
+ CommandParams,
12
+ } from '@ebowwa/channel-command';
13
+ import type { ConversationMemory } from './conversation-memory';
14
+ import type { Tool } from './types';
15
+
16
+ /**
17
+ * Convert channel-command definition to Telegram handler
18
+ */
19
+ export function createTelegramHandler(
20
+ def: ChannelCommandDefinition,
21
+ memory: ConversationMemory,
22
+ tools: Tool[]
23
+ ): (bot: TelegramBot) => void {
24
+ return (bot: TelegramBot) => {
25
+ // Find telegram aliases
26
+ const telegramAliases = def.aliases.filter(a => a.channel === 'telegram');
27
+
28
+ for (const alias of telegramAliases) {
29
+ // Create regex pattern for the alias
30
+ const pattern = new RegExp(`^${escapeRegex(alias.alias)}(?:\\s+(.*))?$`);
31
+
32
+ bot.onText(pattern, async (msg, match) => {
33
+ const chatId = msg.chat.id;
34
+ const inputText = match?.[1] || '';
35
+
36
+ // Build context
37
+ const ctx: CommandContext = {
38
+ channel: 'telegram',
39
+ channelId: String(chatId),
40
+ input: alias.alias + (inputText ? ' ' + inputText : ''),
41
+ args: parseArgs(inputText),
42
+ message: msg as unknown as CommandContext['message'],
43
+ sessionId: String(msg.from?.id),
44
+ timestamp: new Date(),
45
+ correlationId: crypto.randomUUID(),
46
+ memory,
47
+ tools: tools as unknown[],
48
+ config: {},
49
+ reply: async (message: string, options?: unknown) => {
50
+ const parseMode = options as { parse_mode?: string } | undefined;
51
+ await bot.sendMessage(chatId, message, {
52
+ parse_mode: parseMode?.parse_mode as TelegramBot.ParseMode | undefined,
53
+ });
54
+ },
55
+ };
56
+
57
+ try {
58
+ const result = await def.handler(ctx.args, ctx);
59
+
60
+ if (result.message && ctx.reply) {
61
+ await ctx.reply(result.message, { parse_mode: result.format === 'markdown' ? 'Markdown' : undefined });
62
+ } else if (result.error && ctx.reply) {
63
+ await ctx.reply(`Error: ${result.error}`);
64
+ }
65
+ } catch (error) {
66
+ console.error(`Command ${alias.alias} failed:`, error);
67
+ await bot.sendMessage(chatId, `Command failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
68
+ }
69
+ });
70
+ }
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Register multiple channel-command definitions with Telegram bot
76
+ */
77
+ export function registerChannelCommands(
78
+ bot: TelegramBot,
79
+ commands: ChannelCommandDefinition[],
80
+ memory: ConversationMemory,
81
+ tools: Tool[]
82
+ ): void {
83
+ for (const cmd of commands) {
84
+ const handler = createTelegramHandler(cmd, memory, tools);
85
+ handler(bot);
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Parse simple space-separated args
91
+ */
92
+ function parseArgs(input: string): CommandParams {
93
+ const params: CommandParams = {};
94
+
95
+ if (!input.trim()) return params;
96
+
97
+ const parts = input.split(/\s+/);
98
+
99
+ for (let i = 0; i < parts.length; i++) {
100
+ const part = parts[i];
101
+
102
+ if (part.includes('=')) {
103
+ const [key, value] = part.split('=');
104
+ params[key] = value;
105
+ } else {
106
+ // Positional
107
+ params._positional = params._positional || [];
108
+ (params._positional as string[]).push(part);
109
+ }
110
+ }
111
+
112
+ // If only positional, join as message
113
+ if (params._positional && Object.keys(params).length === 1) {
114
+ params.message = (params._positional as string[]).join(' ');
115
+ delete params._positional;
116
+ }
117
+
118
+ return params;
119
+ }
120
+
121
+ /**
122
+ * Escape special regex characters
123
+ */
124
+ function escapeRegex(str: string): string {
125
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
126
+ }
@@ -1,27 +1,24 @@
1
1
  /**
2
2
  * Command index - Single source of truth for commands
3
3
  *
4
- * Each command exports a CommandDefinition with:
5
- * - command: name (without /)
6
- * - description: for Telegram menu
7
- * - register: function to set up handler
4
+ * Uses @ebowwa/channel-command for channel-agnostic definitions
5
+ * and adapts them for Telegram.
8
6
  */
9
7
 
10
8
  import type TelegramBot from 'node-telegram-bot-api';
9
+ import {
10
+ BUILTIN_COMMANDS,
11
+ registerBuiltinCommands as registerChannelBuiltinCommands,
12
+ } from '@ebowwa/channel-command';
13
+ import { registerChannelCommands } from '../command-adapter';
11
14
  import type { CommandDefinition, CommandRegistrar } from './types';
15
+ import type { ConversationMemory } from '../conversation-memory';
16
+ import type { Tool } from '../types';
12
17
 
13
- // Import command definitions
14
- import { resourcesCommand, registerResourcesCommand } from './resources';
15
-
16
- // Legacy imports (to be migrated)
17
- import { registerStartCommand } from './start';
18
- import { registerStatusCommand } from './status';
19
- import { registerHelpCommand } from './help';
18
+ // Legacy imports (Telegram-specific, not yet migrated)
20
19
  import { registerGitCommand } from './git';
21
20
  import { registerDopplerCommand } from './doppler';
22
21
  import { registerLogsCommand } from './logs';
23
- import { registerClearCommand } from './clear';
24
- import { registerToolsCommand } from './tools';
25
22
  import { registerCancelCommand, isCancelled, clearCancel } from './cancel';
26
23
  import { registerPauseCommand, isPaused, waitWhilePaused, clearPause } from './pause';
27
24
  import { registerResumeCommand } from './resume';
@@ -29,20 +26,19 @@ import { registerQuietCommand } from './quiet';
29
26
  import { isQuiet, clearQuiet } from '@ebowwa/channel-core';
30
27
  import { registerVerboseCommand } from './verbose';
31
28
  import { register as registerRestartCommand } from './restart';
29
+ import { resourcesCommand, registerResourcesCommand } from './resources';
30
+ import { registerPromptCommand } from './prompt';
31
+ import { register as registerSettingsCmd } from './settings';
32
+ const registerSettingsCommand: CommandRegistrar = (bot, _memory, tools) => registerSettingsCmd(bot, tools);
32
33
 
33
34
  // Export types
34
35
  export type { CommandDefinition, CommandRegistrar, CommandContext } from './types';
35
36
 
36
37
  // Export legacy functions for backwards compatibility
37
38
  export {
38
- registerStartCommand,
39
- registerStatusCommand,
40
- registerHelpCommand,
41
39
  registerGitCommand,
42
40
  registerDopplerCommand,
43
41
  registerLogsCommand,
44
- registerClearCommand,
45
- registerToolsCommand,
46
42
  registerResourcesCommand,
47
43
  registerCancelCommand,
48
44
  registerPauseCommand,
@@ -50,6 +46,8 @@ export {
50
46
  registerQuietCommand,
51
47
  registerVerboseCommand,
52
48
  registerRestartCommand,
49
+ registerPromptCommand,
50
+ registerSettingsCommand,
53
51
  isCancelled,
54
52
  clearCancel,
55
53
  isPaused,
@@ -61,24 +59,19 @@ export {
61
59
 
62
60
  // Command definitions with descriptions (for menu)
63
61
  const COMMAND_DEFS: CommandDefinition[] = [
64
- // Migrated to CommandDefinition pattern
65
- resourcesCommand,
66
-
67
- // TODO: Migrate these to CommandDefinition pattern
68
- { command: 'start', description: 'Start the bot', register: registerStartCommand },
69
- { command: 'help', description: 'Show available commands', register: registerHelpCommand },
70
- { command: 'status', description: 'Check bot status', register: registerStatusCommand },
62
+ // Telegram-specific commands (not yet migrated)
71
63
  { command: 'git', description: 'Check git status', register: registerGitCommand },
72
64
  { command: 'doppler', description: 'Check Doppler secrets', register: registerDopplerCommand },
73
65
  { command: 'logs', description: 'View recent logs', register: registerLogsCommand },
74
- { command: 'clear', description: 'Clear conversation history', register: registerClearCommand },
75
- { command: 'tools', description: 'List available tools', register: registerToolsCommand },
76
66
  { command: 'cancel', description: 'Stop current task', register: registerCancelCommand },
77
67
  { command: 'pause', description: 'Pause execution', register: registerPauseCommand },
78
68
  { command: 'resume', description: 'Resume execution', register: registerResumeCommand },
79
69
  { command: 'quiet', description: 'Hide tool logging', register: registerQuietCommand },
80
70
  { command: 'verbose', description: 'Show tool logging', register: registerVerboseCommand },
81
71
  { command: 'restart', description: 'Restart the bot service', register: registerRestartCommand },
72
+ resourcesCommand,
73
+ { command: 'prompt', description: 'Manage system prompt', register: registerPromptCommand },
74
+ { command: 'settings', description: 'Show bot configuration', register: registerSettingsCommand },
82
75
  ];
83
76
 
84
77
  /**
@@ -86,9 +79,13 @@ const COMMAND_DEFS: CommandDefinition[] = [
86
79
  */
87
80
  export function registerAllCommands(
88
81
  bot: TelegramBot,
89
- memory: import('../conversation-memory').ConversationMemory,
90
- tools: import('../index').Tool[]
82
+ memory: ConversationMemory,
83
+ tools: Tool[]
91
84
  ): void {
85
+ // Register channel-agnostic commands from @ebowwa/channel-command
86
+ registerChannelCommands(bot, BUILTIN_COMMANDS, memory, tools);
87
+
88
+ // Register Telegram-specific commands
92
89
  for (const def of COMMAND_DEFS) {
93
90
  def.register(bot, memory, tools);
94
91
  }
@@ -98,5 +95,22 @@ export function registerAllCommands(
98
95
  * Get menu entries for Telegram's command suggestions
99
96
  */
100
97
  export function getCommandMenu(): Array<{ command: string; description: string }> {
101
- return COMMAND_DEFS.map(({ command, description }) => ({ command, description }));
98
+ // Combine channel-command definitions with local ones
99
+ const channelMenu = BUILTIN_COMMANDS
100
+ .filter(cmd => cmd.channels.includes('telegram'))
101
+ .map(cmd => {
102
+ const telegramAlias = cmd.aliases.find(a => a.channel === 'telegram');
103
+ const command = telegramAlias?.alias.replace(/^\//, '') || cmd.id.name;
104
+ return { command, description: cmd.description };
105
+ });
106
+
107
+ const localMenu = COMMAND_DEFS.map(({ command, description }) => ({ command, description }));
108
+
109
+ // Merge and dedupe
110
+ const menuMap = new Map<string, { command: string; description: string }>();
111
+ for (const item of [...channelMenu, ...localMenu]) {
112
+ menuMap.set(item.command, item);
113
+ }
114
+
115
+ return Array.from(menuMap.values());
102
116
  }
@@ -12,7 +12,7 @@ import TelegramBot from "node-telegram-bot-api";
12
12
  import { ConversationMemory } from "../conversation-memory.js";
13
13
  import type { Tool } from "../types.js";
14
14
  import { isQuiet } from "../index.js";
15
- import { unlinkSync, existsSync } from "node:fs";
15
+ import { unlinkSync, existsSync, readFileSync, writeFileSync } from "node:fs";
16
16
 
17
17
  const PROMPT_FILE = "/root/seed/custom-prompt.md";
18
18
 
@@ -102,8 +102,11 @@ export function registerPromptCommand(
102
102
  async function viewPrompt(bot: TelegramBot, chatId: number): Promise<void> {
103
103
  let promptContent = "";
104
104
  try {
105
- const file = Bun.file(PROMPT_FILE);
106
- promptContent = await file.text();
105
+ if (existsSync(PROMPT_FILE)) {
106
+ promptContent = readFileSync(PROMPT_FILE, "utf-8");
107
+ } else {
108
+ promptContent = DEFAULT_PROMPT;
109
+ }
107
110
  } catch {
108
111
  // Fallback to default
109
112
  promptContent = DEFAULT_PROMPT;
@@ -120,7 +123,7 @@ async function viewPrompt(bot: TelegramBot, chatId: number): Promise<void> {
120
123
  }
121
124
 
122
125
  async function setCustomPrompt(newPrompt: string, bot: TelegramBot, chatId: number): Promise<void> {
123
- await Bun.write(PROMPT_FILE, newPrompt);
126
+ writeFileSync(PROMPT_FILE, newPrompt, "utf-8");
124
127
  await bot.sendMessage(
125
128
  chatId,
126
129
  `Custom prompt saved (${newPrompt.length} chars).\nUse /prompt reset to restore default.`,
@@ -131,13 +134,17 @@ async function setCustomPrompt(newPrompt: string, bot: TelegramBot, chatId: numb
131
134
  async function appendToPrompt(appendText: string, bot: TelegramBot, chatId: number): Promise<void> {
132
135
  let currentPrompt = "";
133
136
  try {
134
- currentPrompt = await Bun.file(PROMPT_FILE).text();
137
+ if (existsSync(PROMPT_FILE)) {
138
+ currentPrompt = readFileSync(PROMPT_FILE, "utf-8");
139
+ } else {
140
+ currentPrompt = DEFAULT_PROMPT;
141
+ }
135
142
  } catch {
136
143
  // No custom prompt, just default
137
144
  currentPrompt = DEFAULT_PROMPT;
138
145
  }
139
146
  const updatedPrompt = currentPrompt + "\n\n" + appendText;
140
- await Bun.write(PROMPT_FILE, updatedPrompt);
147
+ writeFileSync(PROMPT_FILE, updatedPrompt, "utf-8");
141
148
  await bot.sendMessage(
142
149
  chatId,
143
150
  `Prompt updated. Appended: ${appendText.length} chars.`, {
@@ -149,13 +156,17 @@ async function appendToPrompt(appendText: string, bot: TelegramBot, chatId: numb
149
156
  async function prependToPrompt(prependText: string, bot: TelegramBot, chatId: number): Promise<void> {
150
157
  let currentPrompt = "";
151
158
  try {
152
- currentPrompt = await Bun.file(PROMPT_FILE).text();
159
+ if (existsSync(PROMPT_FILE)) {
160
+ currentPrompt = readFileSync(PROMPT_FILE, "utf-8");
161
+ } else {
162
+ currentPrompt = DEFAULT_PROMPT;
163
+ }
153
164
  } catch {
154
165
  // No custom prompt, just default
155
166
  currentPrompt = DEFAULT_PROMPT;
156
167
  }
157
168
  const updatedPrompt = prependText + "\n\n" + currentPrompt;
158
- await Bun.write(PROMPT_FILE, updatedPrompt);
169
+ writeFileSync(PROMPT_FILE, updatedPrompt, "utf-8");
159
170
  await bot.sendMessage(
160
171
  chatId,
161
172
  `Prompt updated. Prepended: ${prependText.length} chars.`, {