@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
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.activeCalls = void 0;
4
+ exports.isUserAllowed = isUserAllowed;
5
+ exports.withSessionLock = withSessionLock;
6
+ function isUserAllowed(userId, username, allowedIds, allowedNames) {
7
+ if (userId !== undefined && allowedIds?.has(userId))
8
+ return true;
9
+ if (username && allowedNames?.has(username.toLowerCase()))
10
+ return true;
11
+ return false;
12
+ }
13
+ // ---------- session locks ----------
14
+ const sessionLocks = new Map();
15
+ exports.activeCalls = new Set();
16
+ function withSessionLock(lockId, fn) {
17
+ const prev = sessionLocks.get(lockId) || Promise.resolve();
18
+ const next = prev.then(() => { exports.activeCalls.add(lockId); return fn(); }, () => { exports.activeCalls.add(lockId); return fn(); }).finally(() => { exports.activeCalls.delete(lockId); });
19
+ sessionLocks.set(lockId, next.then(() => { }, () => { }));
20
+ return next;
21
+ }
22
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;;AAUA,sCASC;AAMD,0CAQC;AAvBD,SAAgB,aAAa,CAC3B,MAAe,EACf,QAAiB,EACjB,UAAwB,EACxB,YAA0B;IAE1B,IAAI,MAAM,KAAK,SAAS,IAAI,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,QAAQ,IAAI,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sCAAsC;AACtC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;AACzC,QAAA,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;AAE7C,SAAgB,eAAe,CAAI,MAAc,EAAE,EAAoB;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CACpB,GAAG,EAAE,GAAG,mBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAC/C,GAAG,EAAE,GAAG,mBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAChD,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,mBAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function readPid(): number | null;
2
+ export declare function isRunning(pid: number): boolean;
3
+ export declare function isDaemonRunning(): {
4
+ running: boolean;
5
+ pid: number | null;
6
+ };
7
+ /** Kill any orphaned --daemon processes (PID file missing but process alive) */
8
+ export declare function killOrphanDaemons(): void;
9
+ export declare function daemonMain(): Promise<void>;
10
+ export declare function spawnDaemon(): Promise<void>;
11
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAqBA,wBAAgB,OAAO,IAAI,MAAM,GAAG,IAAI,CAQvC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9C;AAED,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAO1E;AAeD,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,IAAI,CAexC;AAmID,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDhD;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BjD"}
package/dist/daemon.js ADDED
@@ -0,0 +1,316 @@
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.readPid = readPid;
37
+ exports.isRunning = isRunning;
38
+ exports.isDaemonRunning = isDaemonRunning;
39
+ exports.killOrphanDaemons = killOrphanDaemons;
40
+ exports.daemonMain = daemonMain;
41
+ exports.spawnDaemon = spawnDaemon;
42
+ const fs = __importStar(require("fs"));
43
+ const child_process_1 = require("child_process");
44
+ const config_1 = require("./config");
45
+ const logger_1 = require("./logger");
46
+ const telegram_1 = require("./telegram");
47
+ const handler_1 = require("./handler");
48
+ const callbacks_1 = require("./callbacks");
49
+ const watcher_1 = require("./watcher");
50
+ // ---------- PID management ----------
51
+ function readPid() {
52
+ try {
53
+ const content = fs.readFileSync((0, config_1.pidFilePath)(), "utf-8").trim();
54
+ const pid = parseInt(content, 10);
55
+ return isNaN(pid) ? null : pid;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function isRunning(pid) {
62
+ try {
63
+ process.kill(pid, 0);
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ function isDaemonRunning() {
71
+ const pid = readPid();
72
+ if (pid === null)
73
+ return { running: false, pid: null };
74
+ if (isRunning(pid))
75
+ return { running: true, pid };
76
+ // Stale PID file -- clean up
77
+ try {
78
+ fs.unlinkSync((0, config_1.pidFilePath)());
79
+ }
80
+ catch { /* ignore */ }
81
+ return { running: false, pid: null };
82
+ }
83
+ function writePid() {
84
+ fs.writeFileSync((0, config_1.pidFilePath)(), String(process.pid), "utf-8");
85
+ }
86
+ function removePid() {
87
+ try {
88
+ const content = fs.readFileSync((0, config_1.pidFilePath)(), "utf-8").trim();
89
+ if (content === String(process.pid)) {
90
+ fs.unlinkSync((0, config_1.pidFilePath)());
91
+ }
92
+ }
93
+ catch { /* ignore */ }
94
+ }
95
+ /** Kill any orphaned --daemon processes (PID file missing but process alive) */
96
+ function killOrphanDaemons() {
97
+ try {
98
+ const out = (0, child_process_1.execSync)("ps -eo pid,args", { stdio: "pipe" }).toString();
99
+ const myPid = process.pid;
100
+ for (const line of out.split("\n")) {
101
+ if (!line.includes("--daemon"))
102
+ continue;
103
+ if (!line.includes("remotecode") && !line.includes("index.js") && !line.includes("index.ts"))
104
+ continue;
105
+ const pid = parseInt(line.trim(), 10);
106
+ if (isNaN(pid) || pid === myPid)
107
+ continue;
108
+ try {
109
+ process.kill(pid, "SIGTERM");
110
+ console.log(` Killed orphan daemon (pid ${pid})`);
111
+ }
112
+ catch { /* already dead */ }
113
+ }
114
+ }
115
+ catch { /* ps failed -- ignore */ }
116
+ }
117
+ // ---------- Log management ----------
118
+ const LOG_MAX_BYTES = 5 * 1024 * 1024; // 5MB
119
+ function setupLogging() {
120
+ const logPath = (0, config_1.logFilePath)();
121
+ let logStream = fs.createWriteStream(logPath, { flags: "a" });
122
+ let byteCount = 0;
123
+ try {
124
+ byteCount = fs.statSync(logPath).size;
125
+ }
126
+ catch { /* file may not exist yet */ }
127
+ function rotateIfNeeded(bytes) {
128
+ byteCount += bytes;
129
+ if (byteCount >= LOG_MAX_BYTES) {
130
+ logStream.end();
131
+ try {
132
+ fs.renameSync(logPath, logPath + ".old");
133
+ }
134
+ catch { /* ignore */ }
135
+ logStream = fs.createWriteStream(logPath, { flags: "a" });
136
+ byteCount = 0;
137
+ patchWrite();
138
+ }
139
+ }
140
+ function patchWrite() {
141
+ process.stdout.write = (chunk, ...args) => {
142
+ const buf = Buffer.from(typeof chunk === "string" ? chunk : chunk.toString());
143
+ logStream.write(buf);
144
+ rotateIfNeeded(buf.length);
145
+ return true;
146
+ };
147
+ process.stderr.write = (chunk, ...args) => {
148
+ const buf = Buffer.from(typeof chunk === "string" ? chunk : chunk.toString());
149
+ logStream.write(buf);
150
+ rotateIfNeeded(buf.length);
151
+ return true;
152
+ };
153
+ }
154
+ patchWrite();
155
+ }
156
+ // ---------- Bot commands ----------
157
+ async function registerCommands(config) {
158
+ const commands = [
159
+ { command: "start", description: "Welcome message and quick actions" },
160
+ { command: "help", description: "Show help and commands" },
161
+ { command: "sessions", description: "List local Claude Code sessions" },
162
+ { command: "projects", description: "Browse sessions by project" },
163
+ { command: "new", description: "New Claude session" },
164
+ { command: "history", description: "Show last 10 turns of current session" },
165
+ { command: "sync", description: "Toggle auto-sync notifications" },
166
+ ];
167
+ await (0, telegram_1.setMyCommands)(config, commands);
168
+ }
169
+ function saveChatId(sessionsFile, chatId) {
170
+ let lines = (0, config_1.readEnvLines)(sessionsFile);
171
+ lines = lines.filter((l) => !l.trim().startsWith("REMOTECODE_CHAT_ID="));
172
+ lines.push(`REMOTECODE_CHAT_ID=${chatId}`);
173
+ (0, config_1.writeEnvLines)(sessionsFile, lines);
174
+ }
175
+ async function processUpdate(update, ctx) {
176
+ try {
177
+ const chatId = update.message?.chat.id || update.callback_query?.message?.chat.id;
178
+ if (chatId)
179
+ saveChatId(ctx.sessionsFile, chatId);
180
+ const from = update.message?.from || update.callback_query?.from;
181
+ const msg = update.message;
182
+ const content = msg?.text
183
+ ? `text="${msg.text}"`
184
+ : msg?.voice ? `voice ${msg.voice.duration || 0}s`
185
+ : msg?.audio ? `audio "${msg.audio.file_name || "unknown"}"`
186
+ : msg?.photo ? `photo${msg.caption ? ` "${msg.caption}"` : ""}`
187
+ : msg?.document ? `document "${msg.document.file_name || "unknown"}"`
188
+ : update.callback_query ? `callback "${update.callback_query.data || ""}"`
189
+ : "unknown";
190
+ logger_1.logger.info("poll", `Update ${update.update_id} from=${from?.username || from?.id || "unknown"} ${content}`);
191
+ if (update.callback_query) {
192
+ await (0, callbacks_1.handleCallbackQuery)(update.callback_query, ctx);
193
+ }
194
+ else if (update.message) {
195
+ await (0, handler_1.handleMessage)(update.message, ctx);
196
+ }
197
+ }
198
+ catch (err) {
199
+ const errMsg = (0, logger_1.errorMessage)(err);
200
+ logger_1.logger.error("poll", `Error processing update ${update.update_id}: ${errMsg}`);
201
+ const chatId = update.message?.chat.id || update.callback_query?.message?.chat.id;
202
+ if (chatId) {
203
+ try {
204
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, `Error: ${errMsg}`);
205
+ }
206
+ catch { /* ignore send failure */ }
207
+ }
208
+ }
209
+ }
210
+ async function pollLoop(telegramConfig, ctx) {
211
+ let offset = 0;
212
+ logger_1.logger.info("poll", "Polling for updates...");
213
+ while (true) {
214
+ try {
215
+ const updates = await (0, telegram_1.getUpdates)(telegramConfig, offset, 30);
216
+ for (const update of updates) {
217
+ offset = update.update_id + 1;
218
+ processUpdate(update, ctx).catch((err) => {
219
+ logger_1.logger.error("poll", `Unhandled error: ${(0, logger_1.errorMessage)(err)}`);
220
+ });
221
+ }
222
+ }
223
+ catch (err) {
224
+ const message = (0, logger_1.errorMessage)(err);
225
+ if (message.includes("409")) {
226
+ logger_1.logger.warn("poll", "Conflict: another bot instance is running or webhook is set. Clearing webhook...");
227
+ try {
228
+ await (0, telegram_1.deleteWebhook)(telegramConfig);
229
+ logger_1.logger.info("poll", "Webhook cleared. Retrying...");
230
+ }
231
+ catch {
232
+ // ignore
233
+ }
234
+ }
235
+ else {
236
+ logger_1.logger.error("poll", `Polling error: ${message}`);
237
+ }
238
+ await new Promise((resolve) => setTimeout(resolve, 3000));
239
+ }
240
+ }
241
+ }
242
+ // ---------- Daemon main ----------
243
+ async function daemonMain() {
244
+ (0, config_1.ensureConfigDir)();
245
+ setupLogging();
246
+ writePid();
247
+ const cfgPath = (0, config_1.loadConfig)();
248
+ if (cfgPath)
249
+ logger_1.logger.info("config", `Loaded: ${cfgPath}`);
250
+ const config = (0, config_1.getConfig)();
251
+ const telegramConfig = { botToken: config.botToken };
252
+ logger_1.logger.info("daemon", "RemoteCode daemon starting...");
253
+ if (config.verbose)
254
+ logger_1.logger.info("daemon", "Verbose logging enabled");
255
+ try {
256
+ await (0, telegram_1.deleteWebhook)(telegramConfig);
257
+ logger_1.logger.debug("daemon", "Webhook cleared for long polling");
258
+ }
259
+ catch (err) {
260
+ logger_1.logger.warn("daemon", `Failed to clear webhook: ${(0, logger_1.errorMessage)(err)}`);
261
+ }
262
+ try {
263
+ await registerCommands(telegramConfig);
264
+ logger_1.logger.debug("daemon", "Bot commands registered");
265
+ }
266
+ catch (err) {
267
+ logger_1.logger.warn("daemon", `Failed to register bot commands: ${(0, logger_1.errorMessage)(err)}`);
268
+ }
269
+ const sessionsFile = (0, config_1.sessionsFilePath)();
270
+ const ctx = {
271
+ telegram: telegramConfig,
272
+ sessionsFile,
273
+ allowedIds: config.allowedUsers.ids,
274
+ allowedNames: config.allowedUsers.usernames,
275
+ yolo: config.yolo,
276
+ };
277
+ logger_1.logger.info("daemon", "RemoteCode daemon ready.");
278
+ (0, watcher_1.startWatcher)(telegramConfig, sessionsFile);
279
+ const shutdown = () => {
280
+ (0, watcher_1.stopWatcher)();
281
+ removePid();
282
+ logger_1.logger.info("daemon", "Daemon shutting down...");
283
+ process.exit(0);
284
+ };
285
+ process.on("SIGINT", shutdown);
286
+ process.on("SIGTERM", shutdown);
287
+ await pollLoop(telegramConfig, ctx);
288
+ }
289
+ // ---------- Daemon spawn ----------
290
+ async function spawnDaemon() {
291
+ const logPath = (0, config_1.logFilePath)();
292
+ const logFd = fs.openSync(logPath, "a");
293
+ const child = (0, child_process_1.spawn)(process.execPath, [...process.execArgv, process.argv[1], "--daemon"], {
294
+ detached: true,
295
+ stdio: ["ignore", logFd, logFd],
296
+ env: { ...process.env },
297
+ });
298
+ child.unref();
299
+ fs.closeSync(logFd);
300
+ const childPid = child.pid;
301
+ if (!childPid) {
302
+ console.error("Failed to spawn daemon.");
303
+ process.exit(1);
304
+ }
305
+ // Wait a moment and verify the daemon is still running
306
+ await new Promise((resolve) => setTimeout(resolve, 1000));
307
+ if (isRunning(childPid)) {
308
+ console.log(` Daemon running in background (pid ${childPid})\n`);
309
+ }
310
+ else {
311
+ console.error(" Daemon exited immediately. Check logs:");
312
+ console.error(` ${logPath}\n`);
313
+ process.exit(1);
314
+ }
315
+ }
316
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,0BAQC;AAED,8BAOC;AAED,0CAOC;AAgBD,8CAeC;AAmID,gCAiDC;AAGD,kCA2BC;AAhSD,uCAAyB;AACzB,iDAAgD;AAChD,qCAGkB;AAClB,qCAAgD;AAChD,yCAOoB;AACpB,uCAA0C;AAC1C,2CAAkD;AAElD,uCAAsD;AAEtD,uCAAuC;AACvC,SAAgB,OAAO;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAA,oBAAW,GAAE,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACvD,IAAI,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAClD,6BAA6B;IAC7B,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,IAAA,oBAAW,GAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,QAAQ;IACf,EAAE,CAAC,aAAa,CAAC,IAAA,oBAAW,GAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAA,oBAAW,GAAE,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,UAAU,CAAC,IAAA,oBAAW,GAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAChF,SAAgB,iBAAiB;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,wBAAQ,EAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,SAAS;YACzC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,SAAS;YACvG,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK;gBAAE,SAAS;YAC1C,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,GAAG,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;AACvC,CAAC;AAED,uCAAuC;AACvC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AAE7C,SAAS,YAAY;IACnB,MAAM,OAAO,GAAG,IAAA,oBAAW,GAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC;QACH,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAExC,SAAS,cAAc,CAAC,KAAa;QACnC,SAAS,IAAI,KAAK,CAAC;QACnB,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;YAC/B,SAAS,CAAC,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACxB,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1D,SAAS,GAAG,CAAC,CAAC;YACd,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,SAAS,UAAU;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAA0B,EAAE,GAAG,IAAe,EAAW,EAAE;YACjF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9E,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAA0B,EAAE,GAAG,IAAe,EAAW,EAAE;YACjF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9E,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;IACJ,CAAC;IAED,UAAU,EAAE,CAAC;AACf,CAAC;AAED,qCAAqC;AACrC,KAAK,UAAU,gBAAgB,CAAC,MAAsB;IACpD,MAAM,QAAQ,GAAG;QACf,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,mCAAmC,EAAE;QACtE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAE;QAC1D,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iCAAiC,EAAE;QACvE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,4BAA4B,EAAE;QAClE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACrD,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,uCAAuC,EAAE;QAC5E,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,gCAAgC,EAAE;KACnE,CAAC;IACF,MAAM,IAAA,wBAAa,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,YAAoB,EAAE,MAAc;IACtD,IAAI,KAAK,GAAG,IAAA,qBAAY,EAAC,YAAY,CAAC,CAAC;IACvC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC;IAC3C,IAAA,sBAAa,EAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,GAAmB;IAC9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QAClF,IAAI,MAAM;YAAE,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI;YACvB,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG;YACtB,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,GAAG;gBAClD,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,GAAG;oBAC5D,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC/D,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS,GAAG;4BACrE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,GAAG;gCAC1E,CAAC,CAAC,SAAS,CAAC;QACd,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,MAAM,CAAC,SAAS,SAAS,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,EAAE,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QAC7G,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,IAAA,+BAAmB,EAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAA,uBAAa,EAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,GAAG,CAAC,CAAC;QACjC,eAAM,CAAC,KAAK,CAAC,MAAM,EAAE,2BAA2B,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QAClF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,IAAA,sBAAW,EAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,cAA8B,EAAE,GAAmB;IACzE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAE9C,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAU,EAAC,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;gBAC9B,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACvC,eAAM,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,IAAA,qBAAY,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChE,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,IAAA,qBAAY,EAAC,GAAG,CAAC,CAAC;YAClC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE,kFAAkF,CAAC,CAAC;gBACxG,IAAI,CAAC;oBACH,MAAM,IAAA,wBAAa,EAAC,cAAc,CAAC,CAAC;oBACpC,eAAM,CAAC,IAAI,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;gBACtD,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,KAAK,CAAC,MAAM,EAAE,kBAAkB,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAED,oCAAoC;AAC7B,KAAK,UAAU,UAAU;IAC9B,IAAA,wBAAe,GAAE,CAAC;IAClB,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC;IAEX,MAAM,OAAO,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC7B,IAAI,OAAO;QAAE,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,MAAM,cAAc,GAAmB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAErE,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,OAAO;QAAE,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,IAAA,wBAAa,EAAC,cAAc,CAAC,CAAC;QACpC,eAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,4BAA4B,IAAA,qBAAY,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACvC,eAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,oCAAoC,IAAA,qBAAY,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,YAAY,GAAG,IAAA,yBAAgB,GAAE,CAAC;IACxC,MAAM,GAAG,GAAmB;QAC1B,QAAQ,EAAE,cAAc;QACxB,YAAY;QACZ,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG;QACnC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,SAAS;QAC3C,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;IAEF,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;IAClD,IAAA,sBAAY,EAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAA,qBAAW,GAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,qCAAqC;AAC9B,KAAK,UAAU,WAAW;IAC/B,MAAM,OAAO,GAAG,IAAA,oBAAW,GAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE;QACxF,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;QAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;KACxB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;IAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uDAAuD;IACvD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,uCAAuC,QAAQ,KAAK,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function escapeHtml(text: string): string;
2
+ export declare function mdToTelegramHtml(md: string): string;
3
+ export declare function tryMdToHtml(text: string): {
4
+ text: string;
5
+ parseMode?: string;
6
+ };
7
+ export declare function truncateMessage(text: string, limit?: number): string;
8
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAyCnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAO9E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,MAAM,CAG1E"}
package/dist/format.js ADDED
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeHtml = escapeHtml;
4
+ exports.mdToTelegramHtml = mdToTelegramHtml;
5
+ exports.tryMdToHtml = tryMdToHtml;
6
+ exports.truncateMessage = truncateMessage;
7
+ function escapeHtml(text) {
8
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
9
+ }
10
+ function mdToTelegramHtml(md) {
11
+ let text = md;
12
+ // Extract code blocks first to protect them
13
+ const codeBlocks = [];
14
+ text = text.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, _lang, code) => {
15
+ const idx = codeBlocks.length;
16
+ codeBlocks.push(`<pre>${escapeHtml(code.trimEnd())}</pre>`);
17
+ return `\x00CODEBLOCK${idx}\x00`;
18
+ });
19
+ // Extract inline code
20
+ const inlineCodes = [];
21
+ text = text.replace(/`([^`]+)`/g, (_match, code) => {
22
+ const idx = inlineCodes.length;
23
+ inlineCodes.push(`<code>${escapeHtml(code)}</code>`);
24
+ return `\x00INLINE${idx}\x00`;
25
+ });
26
+ // Escape remaining HTML
27
+ text = escapeHtml(text);
28
+ // Bold **text** or __text__
29
+ text = text.replace(/\*\*(.+?)\*\*/g, "<b>$1</b>");
30
+ text = text.replace(/__(.+?)__/g, "<b>$1</b>");
31
+ // Italic *text* or _text_
32
+ text = text.replace(/\*(.+?)\*/g, "<i>$1</i>");
33
+ text = text.replace(/(?<!\w)_(.+?)_(?!\w)/g, "<i>$1</i>");
34
+ // Headings -> bold
35
+ text = text.replace(/^#{1,6}\s+(.+)$/gm, "<b>$1</b>");
36
+ // Strikethrough ~~text~~
37
+ text = text.replace(/~~(.+?)~~/g, "<s>$1</s>");
38
+ // Restore code blocks and inline codes
39
+ text = text.replace(/\x00CODEBLOCK(\d+)\x00/g, (_match, idx) => codeBlocks[Number(idx)]);
40
+ text = text.replace(/\x00INLINE(\d+)\x00/g, (_match, idx) => inlineCodes[Number(idx)]);
41
+ return text;
42
+ }
43
+ function tryMdToHtml(text) {
44
+ try {
45
+ const html = mdToTelegramHtml(text);
46
+ return { text: html, parseMode: "HTML" };
47
+ }
48
+ catch {
49
+ return { text };
50
+ }
51
+ }
52
+ function truncateMessage(text, limit = 3500) {
53
+ if (text.length <= limit)
54
+ return text;
55
+ return text.slice(0, limit) + "\n...[truncated]";
56
+ }
57
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Message } from "./telegram";
2
+ import { HandlerContext } from "./context";
3
+ export declare function handleMessage(msg: Message, ctx: HandlerContext): Promise<void>;
4
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,OAAO,EAIR,MAAM,YAAY,CAAC;AAWpB,OAAO,EAAE,cAAc,EAAkC,MAAM,WAAW,CAAC;AAuF3E,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpF"}