@kcisoul/remotecode 0.9.1

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.
Files changed (86) hide show
  1. package/README.md +358 -0
  2. package/dist/__tests__/config.test.d.ts +2 -0
  3. package/dist/__tests__/config.test.d.ts.map +1 -0
  4. package/dist/__tests__/config.test.js +84 -0
  5. package/dist/__tests__/config.test.js.map +1 -0
  6. package/dist/__tests__/format.test.d.ts +2 -0
  7. package/dist/__tests__/format.test.d.ts.map +1 -0
  8. package/dist/__tests__/format.test.js +62 -0
  9. package/dist/__tests__/format.test.js.map +1 -0
  10. package/dist/__tests__/sessions.test.d.ts +2 -0
  11. package/dist/__tests__/sessions.test.d.ts.map +1 -0
  12. package/dist/__tests__/sessions.test.js +51 -0
  13. package/dist/__tests__/sessions.test.js.map +1 -0
  14. package/dist/banner.d.ts +4 -0
  15. package/dist/banner.d.ts.map +1 -0
  16. package/dist/banner.js +154 -0
  17. package/dist/banner.js.map +1 -0
  18. package/dist/callbacks.d.ts +10 -0
  19. package/dist/callbacks.d.ts.map +1 -0
  20. package/dist/callbacks.js +184 -0
  21. package/dist/callbacks.js.map +1 -0
  22. package/dist/claude.d.ts +9 -0
  23. package/dist/claude.d.ts.map +1 -0
  24. package/dist/claude.js +117 -0
  25. package/dist/claude.js.map +1 -0
  26. package/dist/cli.d.ts +14 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +296 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/commands.d.ts +3 -0
  31. package/dist/commands.d.ts.map +1 -0
  32. package/dist/commands.js +107 -0
  33. package/dist/commands.js.map +1 -0
  34. package/dist/config.d.ts +24 -0
  35. package/dist/config.d.ts.map +1 -0
  36. package/dist/config.js +153 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/context.d.ts +12 -0
  39. package/dist/context.d.ts.map +1 -0
  40. package/dist/context.js +22 -0
  41. package/dist/context.js.map +1 -0
  42. package/dist/daemon.d.ts +11 -0
  43. package/dist/daemon.d.ts.map +1 -0
  44. package/dist/daemon.js +316 -0
  45. package/dist/daemon.js.map +1 -0
  46. package/dist/format.d.ts +8 -0
  47. package/dist/format.d.ts.map +1 -0
  48. package/dist/format.js +57 -0
  49. package/dist/format.js.map +1 -0
  50. package/dist/handler.d.ts +4 -0
  51. package/dist/handler.d.ts.map +1 -0
  52. package/dist/handler.js +292 -0
  53. package/dist/handler.js.map +1 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +142 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/logger.d.ts +10 -0
  59. package/dist/logger.d.ts.map +1 -0
  60. package/dist/logger.js +42 -0
  61. package/dist/logger.js.map +1 -0
  62. package/dist/session-ui.d.ts +17 -0
  63. package/dist/session-ui.d.ts.map +1 -0
  64. package/dist/session-ui.js +237 -0
  65. package/dist/session-ui.js.map +1 -0
  66. package/dist/sessions.d.ts +33 -0
  67. package/dist/sessions.d.ts.map +1 -0
  68. package/dist/sessions.js +341 -0
  69. package/dist/sessions.js.map +1 -0
  70. package/dist/setup.d.ts +3 -0
  71. package/dist/setup.d.ts.map +1 -0
  72. package/dist/setup.js +144 -0
  73. package/dist/setup.js.map +1 -0
  74. package/dist/stt.d.ts +11 -0
  75. package/dist/stt.d.ts.map +1 -0
  76. package/dist/stt.js +192 -0
  77. package/dist/stt.js.map +1 -0
  78. package/dist/telegram.d.ts +85 -0
  79. package/dist/telegram.d.ts.map +1 -0
  80. package/dist/telegram.js +97 -0
  81. package/dist/telegram.js.map +1 -0
  82. package/dist/watcher.d.ts +6 -0
  83. package/dist/watcher.d.ts.map +1 -0
  84. package/dist/watcher.js +230 -0
  85. package/dist/watcher.js.map +1 -0
  86. package/package.json +45 -0
package/dist/setup.js ADDED
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runSetupIfNeeded = runSetupIfNeeded;
37
+ exports.runConfigEditor = runConfigEditor;
38
+ const fs = __importStar(require("fs"));
39
+ const prompts_1 = require("@inquirer/prompts");
40
+ const config_1 = require("./config");
41
+ const banner_1 = require("./banner");
42
+ const logger_1 = require("./logger");
43
+ const telegram_1 = require("./telegram");
44
+ const stt_1 = require("./stt");
45
+ async function promptAndValidateToken(defaultToken) {
46
+ while (true) {
47
+ const token = await (0, prompts_1.input)({
48
+ message: "TELEGRAM_BOT_TOKEN",
49
+ default: defaultToken || undefined,
50
+ required: true,
51
+ validate: (v) => (v.trim() ? true : "Bot token is required."),
52
+ });
53
+ const trimmed = token.trim();
54
+ try {
55
+ const bot = await (0, telegram_1.getMe)({ botToken: trimmed });
56
+ console.log(`\u2713 Bot: @${bot.username} (${bot.first_name})`);
57
+ return trimmed;
58
+ }
59
+ catch (err) {
60
+ console.log(`\u2717 Invalid token: ${(0, logger_1.errorMessage)(err)}`);
61
+ defaultToken = undefined;
62
+ }
63
+ }
64
+ }
65
+ async function promptSttSetup() {
66
+ if (!(0, stt_1.isSttReady)()) {
67
+ console.log();
68
+ const setupStt = await (0, prompts_1.confirm)({ message: "Setup STT (speech-to-text)?", default: true });
69
+ if (setupStt) {
70
+ await (0, stt_1.cmdSetupStt)();
71
+ }
72
+ }
73
+ }
74
+ async function runSetupIfNeeded() {
75
+ (0, config_1.ensureConfigDir)();
76
+ const configPath = (0, config_1.globalConfigPath)();
77
+ if (fs.existsSync(configPath))
78
+ return;
79
+ (0, banner_1.printBanner)(["No config found. Let's get started."]);
80
+ (0, banner_1.stopBannerResize)();
81
+ const botToken = await promptAndValidateToken();
82
+ const allowedUsers = await (0, prompts_1.input)({
83
+ message: "REMOTECODE_ALLOWED_USERS (comma-separated user IDs or @usernames)",
84
+ required: true,
85
+ validate: (v) => (v.trim() ? true : "At least one user ID or @username is required."),
86
+ });
87
+ console.log("");
88
+ console.log(" YOLO mode:");
89
+ console.log(" Y = All actions run without permission prompts");
90
+ console.log(" N = Actions requiring approval will be pending (currently not supported)");
91
+ console.log("");
92
+ const yolo = await (0, prompts_1.confirm)({
93
+ message: "REMOTECODE_YOLO (recommended: Y)",
94
+ default: true,
95
+ });
96
+ const lines = [
97
+ `TELEGRAM_BOT_TOKEN=${botToken}`,
98
+ `REMOTECODE_ALLOWED_USERS=${allowedUsers.trim()}`,
99
+ `REMOTECODE_YOLO=${yolo ? "true" : "false"}`,
100
+ ];
101
+ (0, config_1.writeEnvLines)(configPath, lines);
102
+ console.log(`\nConfig saved to ${configPath}`);
103
+ await promptSttSetup();
104
+ }
105
+ async function runConfigEditor() {
106
+ (0, config_1.ensureConfigDir)();
107
+ const configPath = (0, config_1.globalConfigPath)();
108
+ const current = (0, config_1.readKvFile)(configPath);
109
+ (0, banner_1.printBanner)(["Config: " + configPath]);
110
+ (0, banner_1.stopBannerResize)();
111
+ const botToken = await promptAndValidateToken(current.TELEGRAM_BOT_TOKEN);
112
+ const allowedUsers = await (0, prompts_1.input)({
113
+ message: "REMOTECODE_ALLOWED_USERS",
114
+ default: current.REMOTECODE_ALLOWED_USERS || "",
115
+ required: true,
116
+ validate: (v) => (v.trim() ? true : "At least one user ID or @username is required."),
117
+ });
118
+ console.log("");
119
+ console.log(" YOLO mode:");
120
+ console.log(" Y = All actions run without permission prompts");
121
+ console.log(" N = Actions requiring approval will be pending (currently not supported)");
122
+ console.log("");
123
+ const currentYolo = (0, logger_1.parseTruthyEnv)(current.REMOTECODE_YOLO);
124
+ const yolo = await (0, prompts_1.confirm)({
125
+ message: "REMOTECODE_YOLO (recommended: Y)",
126
+ default: currentYolo,
127
+ });
128
+ const lines = [
129
+ `TELEGRAM_BOT_TOKEN=${botToken}`,
130
+ `REMOTECODE_ALLOWED_USERS=${allowedUsers.trim()}`,
131
+ `REMOTECODE_YOLO=${yolo ? "true" : "false"}`,
132
+ ];
133
+ // Detect changes
134
+ const oldLines = fs.existsSync(configPath)
135
+ ? fs.readFileSync(configPath, "utf-8").trimEnd()
136
+ : "";
137
+ const newContent = lines.join("\n").trimEnd();
138
+ const changed = oldLines !== newContent;
139
+ (0, config_1.writeEnvLines)(configPath, lines);
140
+ console.log(`\nConfig saved to ${configPath}`);
141
+ await promptSttSetup();
142
+ return changed;
143
+ }
144
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/dist/stt.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export interface SttStatus {
2
+ whisperCli: string | null;
3
+ ffmpeg: string | null;
4
+ model: string | null;
5
+ }
6
+ export declare function checkSttStatus(): SttStatus;
7
+ export declare function isSttReady(): boolean;
8
+ export declare function getSttSummary(): string;
9
+ export declare function getSttDetailLines(): string[];
10
+ export declare function cmdSetupStt(): Promise<void>;
11
+ //# sourceMappingURL=stt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../src/stt.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,cAAc,IAAI,SAAS,CAe1C;AAED,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAQtC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAS5C;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkGjD"}
package/dist/stt.js ADDED
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.checkSttStatus = checkSttStatus;
40
+ exports.isSttReady = isSttReady;
41
+ exports.getSttSummary = getSttSummary;
42
+ exports.getSttDetailLines = getSttDetailLines;
43
+ exports.cmdSetupStt = cmdSetupStt;
44
+ const fs = __importStar(require("fs"));
45
+ const child_process_1 = require("child_process");
46
+ const prompts_1 = require("@inquirer/prompts");
47
+ const axios_1 = __importDefault(require("axios"));
48
+ const config_1 = require("./config");
49
+ const banner_1 = require("./banner");
50
+ const logger_1 = require("./logger");
51
+ const MODEL_URL = "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin";
52
+ function checkSttStatus() {
53
+ const which = (cmd) => {
54
+ try {
55
+ return (0, child_process_1.execSync)(`which ${cmd}`, { stdio: "pipe" }).toString().trim() || null;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ };
61
+ const modelPath = (0, config_1.whisperModelPath)();
62
+ return {
63
+ whisperCli: which("whisper-cli"),
64
+ ffmpeg: which("ffmpeg"),
65
+ model: fs.existsSync(modelPath) ? modelPath : null,
66
+ };
67
+ }
68
+ function isSttReady() {
69
+ const s = checkSttStatus();
70
+ return !!(s.whisperCli && s.ffmpeg && s.model);
71
+ }
72
+ function getSttSummary() {
73
+ const s = checkSttStatus();
74
+ if (s.whisperCli && s.ffmpeg && s.model)
75
+ return "enabled";
76
+ const missing = [];
77
+ if (!s.whisperCli)
78
+ missing.push("whisper-cli");
79
+ if (!s.ffmpeg)
80
+ missing.push("ffmpeg");
81
+ if (!s.model)
82
+ missing.push("model");
83
+ return `not configured (missing: ${missing.join(", ")})`;
84
+ }
85
+ function getSttDetailLines() {
86
+ const s = checkSttStatus();
87
+ if (!(s.whisperCli && s.ffmpeg && s.model))
88
+ return [];
89
+ return [
90
+ "--- STT",
91
+ "whisper: " + s.whisperCli,
92
+ "ffmpeg: " + s.ffmpeg,
93
+ "model: " + s.model,
94
+ ];
95
+ }
96
+ async function cmdSetupStt() {
97
+ const status = checkSttStatus();
98
+ if (status.whisperCli && status.ffmpeg && status.model) {
99
+ (0, banner_1.printBanner)([
100
+ "STT is already enabled.",
101
+ "",
102
+ " whisper: " + status.whisperCli,
103
+ " ffmpeg: " + status.ffmpeg,
104
+ " model: " + status.model,
105
+ ]);
106
+ return;
107
+ }
108
+ (0, banner_1.printBanner)(["Setup STT (Speech-to-Text)"]);
109
+ (0, banner_1.stopBannerResize)();
110
+ const missing = [];
111
+ if (!status.whisperCli)
112
+ missing.push("whisper-cli (brew install whisper-cpp)");
113
+ if (!status.ffmpeg)
114
+ missing.push("ffmpeg (brew install ffmpeg)");
115
+ if (!status.model)
116
+ missing.push("ggml-small.bin (download from HuggingFace)");
117
+ console.log("Missing components:");
118
+ for (const m of missing)
119
+ console.log(` - ${m}`);
120
+ console.log();
121
+ const confirm = await (0, prompts_1.input)({
122
+ message: "Install missing components? (Y/n)",
123
+ default: "Y",
124
+ });
125
+ if (confirm.trim().toLowerCase() === "n") {
126
+ console.log("Aborted.");
127
+ return;
128
+ }
129
+ // Install whisper-cli
130
+ if (!status.whisperCli) {
131
+ console.log("\nInstalling whisper-cpp...");
132
+ try {
133
+ (0, child_process_1.execSync)("brew install whisper-cpp", { stdio: "inherit" });
134
+ console.log("whisper-cli installed.");
135
+ }
136
+ catch {
137
+ console.error("Failed to install whisper-cpp. Install it manually: brew install whisper-cpp");
138
+ return;
139
+ }
140
+ }
141
+ // Install ffmpeg
142
+ if (!status.ffmpeg) {
143
+ console.log("\nInstalling ffmpeg...");
144
+ try {
145
+ (0, child_process_1.execSync)("brew install ffmpeg", { stdio: "inherit" });
146
+ console.log("ffmpeg installed.");
147
+ }
148
+ catch {
149
+ console.error("Failed to install ffmpeg. Install it manually: brew install ffmpeg");
150
+ return;
151
+ }
152
+ }
153
+ // Download model
154
+ if (!status.model) {
155
+ const modelDir = (0, config_1.whisperModelDir)();
156
+ fs.mkdirSync(modelDir, { recursive: true });
157
+ const modelPath = (0, config_1.whisperModelPath)();
158
+ const tmpPath = modelPath + ".tmp";
159
+ console.log("\nDownloading ggml-small.bin...");
160
+ try {
161
+ const response = await axios_1.default.get(MODEL_URL, { responseType: "stream" });
162
+ const contentLength = parseInt(response.headers["content-length"] || "0", 10);
163
+ const writer = fs.createWriteStream(tmpPath);
164
+ let downloaded = 0;
165
+ response.data.on("data", (chunk) => {
166
+ downloaded += chunk.length;
167
+ if (contentLength > 0) {
168
+ const pct = Math.floor((downloaded / contentLength) * 100);
169
+ process.stdout.write(`\r ${pct}% (${(downloaded / 1024 / 1024).toFixed(1)} MB)`);
170
+ }
171
+ });
172
+ response.data.pipe(writer);
173
+ await new Promise((resolve, reject) => {
174
+ writer.on("finish", resolve);
175
+ writer.on("error", reject);
176
+ });
177
+ console.log();
178
+ fs.renameSync(tmpPath, modelPath);
179
+ console.log(`Model saved to ${modelPath}`);
180
+ }
181
+ catch (err) {
182
+ try {
183
+ fs.unlinkSync(tmpPath);
184
+ }
185
+ catch { /* ignore */ }
186
+ console.error(`Failed to download model: ${(0, logger_1.errorMessage)(err)}`);
187
+ return;
188
+ }
189
+ }
190
+ console.log("\nSTT enabled. Send a voice message to your bot!");
191
+ }
192
+ //# sourceMappingURL=stt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stt.js","sourceRoot":"","sources":["../src/stt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ export interface TelegramConfig {
2
+ botToken: string;
3
+ }
4
+ export interface SendMessageOptions {
5
+ replyToMessageId?: number;
6
+ replyMarkup?: Record<string, unknown>;
7
+ parseMode?: string;
8
+ }
9
+ export interface Update {
10
+ update_id: number;
11
+ message?: Message;
12
+ callback_query?: CallbackQuery;
13
+ }
14
+ export interface Message {
15
+ message_id: number;
16
+ from?: User;
17
+ chat: Chat;
18
+ text?: string;
19
+ caption?: string;
20
+ voice?: {
21
+ file_id: string;
22
+ duration?: number;
23
+ mime_type?: string;
24
+ };
25
+ audio?: {
26
+ file_id: string;
27
+ duration?: number;
28
+ mime_type?: string;
29
+ file_name?: string;
30
+ };
31
+ photo?: PhotoSize[];
32
+ document?: Document;
33
+ }
34
+ export interface User {
35
+ id: number;
36
+ username?: string;
37
+ first_name?: string;
38
+ last_name?: string;
39
+ }
40
+ export interface Chat {
41
+ id: number;
42
+ }
43
+ export interface PhotoSize {
44
+ file_id: string;
45
+ file_size?: number;
46
+ width?: number;
47
+ height?: number;
48
+ }
49
+ export interface Document {
50
+ file_id: string;
51
+ mime_type?: string;
52
+ file_name?: string;
53
+ }
54
+ export interface CallbackQuery {
55
+ id: string;
56
+ from: User;
57
+ message?: Message;
58
+ data?: string;
59
+ }
60
+ export interface BotInfo {
61
+ id: number;
62
+ is_bot: boolean;
63
+ first_name: string;
64
+ username: string;
65
+ }
66
+ export declare function getMe(config: TelegramConfig): Promise<BotInfo>;
67
+ export declare function getUpdates(config: TelegramConfig, offset: number, timeout?: number): Promise<Update[]>;
68
+ export declare function sendMessage(config: TelegramConfig, chatId: number, text: string, options?: SendMessageOptions): Promise<number>;
69
+ export declare function deleteMessage(config: TelegramConfig, chatId: number, messageId: number): Promise<void>;
70
+ export declare function answerCallbackQuery(config: TelegramConfig, callbackQueryId: string, text?: string): Promise<void>;
71
+ export declare function downloadFile(config: TelegramConfig, fileId: string): Promise<{
72
+ data: Buffer;
73
+ filePath: string;
74
+ }>;
75
+ export declare function setMyCommands(config: TelegramConfig, commands: Array<{
76
+ command: string;
77
+ description: string;
78
+ }>): Promise<void>;
79
+ export declare function editMessageText(config: TelegramConfig, chatId: number, messageId: number, text: string, options?: {
80
+ replyMarkup?: Record<string, unknown>;
81
+ parseMode?: string;
82
+ }): Promise<void>;
83
+ export declare function sendChatAction(config: TelegramConfig, chatId: number, action?: string): Promise<void>;
84
+ export declare function deleteWebhook(config: TelegramConfig): Promise<void>;
85
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getMe = getMe;
7
+ exports.getUpdates = getUpdates;
8
+ exports.sendMessage = sendMessage;
9
+ exports.deleteMessage = deleteMessage;
10
+ exports.answerCallbackQuery = answerCallbackQuery;
11
+ exports.downloadFile = downloadFile;
12
+ exports.setMyCommands = setMyCommands;
13
+ exports.editMessageText = editMessageText;
14
+ exports.sendChatAction = sendChatAction;
15
+ exports.deleteWebhook = deleteWebhook;
16
+ const axios_1 = __importDefault(require("axios"));
17
+ const logger_1 = require("./logger");
18
+ // ---------- internal helpers ----------
19
+ function callApi(token, method, body, timeoutMs = 30000) {
20
+ return axios_1.default
21
+ .post(`https://api.telegram.org/bot${token}/${method}`, body, { timeout: timeoutMs })
22
+ .then((resp) => {
23
+ if (!resp.data.ok)
24
+ throw new Error(`Telegram API error: ${JSON.stringify(resp.data)}`);
25
+ return resp.data.result;
26
+ });
27
+ }
28
+ // ---------- public API ----------
29
+ function getMe(config) {
30
+ return callApi(config.botToken, "getMe", {}, 10000);
31
+ }
32
+ function getUpdates(config, offset, timeout = 30) {
33
+ return callApi(config.botToken, "getUpdates", {
34
+ offset, timeout, allowed_updates: ["message", "callback_query"],
35
+ }, (timeout + 5) * 1000);
36
+ }
37
+ const TELEGRAM_MSG_LIMIT = 4096;
38
+ async function sendMessage(config, chatId, text, options) {
39
+ logger_1.logger.debug("telegram", `OUT message chat_id=${chatId} text=${text}`);
40
+ if (text.length > TELEGRAM_MSG_LIMIT) {
41
+ text = text.slice(0, TELEGRAM_MSG_LIMIT - 15) + "\n...[truncated]";
42
+ }
43
+ const payload = { chat_id: chatId, text };
44
+ if (options?.replyToMessageId)
45
+ payload.reply_to_message_id = options.replyToMessageId;
46
+ if (options?.replyMarkup)
47
+ payload.reply_markup = options.replyMarkup;
48
+ if (options?.parseMode)
49
+ payload.parse_mode = options.parseMode;
50
+ try {
51
+ const result = await callApi(config.botToken, "sendMessage", payload);
52
+ return result.message_id;
53
+ }
54
+ catch (err) {
55
+ // Retry without parse_mode if HTML parsing failed (400)
56
+ if (options?.parseMode && axios_1.default.isAxiosError(err) && err.response?.status === 400) {
57
+ logger_1.logger.warn("telegram", `HTML parse failed, retrying as plain text`);
58
+ delete payload.parse_mode;
59
+ const result = await callApi(config.botToken, "sendMessage", payload);
60
+ return result.message_id;
61
+ }
62
+ throw err;
63
+ }
64
+ }
65
+ function deleteMessage(config, chatId, messageId) {
66
+ return callApi(config.botToken, "deleteMessage", { chat_id: chatId, message_id: messageId }).then(() => { });
67
+ }
68
+ function answerCallbackQuery(config, callbackQueryId, text) {
69
+ const payload = { callback_query_id: callbackQueryId };
70
+ if (text)
71
+ payload.text = text;
72
+ return callApi(config.botToken, "answerCallbackQuery", payload).then(() => { });
73
+ }
74
+ async function downloadFile(config, fileId) {
75
+ const fileInfo = await callApi(config.botToken, "getFile", { file_id: fileId }, 60000);
76
+ const url = `https://api.telegram.org/file/bot${config.botToken}/${fileInfo.file_path}`;
77
+ const resp = await axios_1.default.get(url, { responseType: "arraybuffer", timeout: 60000 });
78
+ return { data: Buffer.from(resp.data), filePath: fileInfo.file_path };
79
+ }
80
+ function setMyCommands(config, commands) {
81
+ return callApi(config.botToken, "setMyCommands", { commands }).then(() => { });
82
+ }
83
+ function editMessageText(config, chatId, messageId, text, options) {
84
+ const payload = { chat_id: chatId, message_id: messageId, text };
85
+ if (options?.replyMarkup)
86
+ payload.reply_markup = options.replyMarkup;
87
+ if (options?.parseMode)
88
+ payload.parse_mode = options.parseMode;
89
+ return callApi(config.botToken, "editMessageText", payload).then(() => { });
90
+ }
91
+ function sendChatAction(config, chatId, action = "typing") {
92
+ return callApi(config.botToken, "sendChatAction", { chat_id: chatId, action }).then(() => { });
93
+ }
94
+ function deleteWebhook(config) {
95
+ return callApi(config.botToken, "deleteWebhook", {}).then(() => { });
96
+ }
97
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { TelegramConfig } from "./telegram";
2
+ export declare function isAutoSyncEnabled(sessionsFile: string): boolean;
3
+ export declare function setAutoSync(sessionsFile: string, enabled: boolean): void;
4
+ export declare function startWatcher(telegram: TelegramConfig, sessionsFile: string): void;
5
+ export declare function stopWatcher(): void;
6
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAOzD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAG/D;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAKxE;AA0ID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAkCjF;AAED,wBAAgB,WAAW,IAAI,IAAI,CAclC"}