@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/cli.js ADDED
@@ -0,0 +1,296 @@
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.cmdStart = cmdStart;
37
+ exports.cmdStop = cmdStop;
38
+ exports.cmdRestart = cmdRestart;
39
+ exports.cmdStatus = cmdStatus;
40
+ exports.cmdLogs = cmdLogs;
41
+ exports.cmdConfig = cmdConfig;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const config_1 = require("./config");
45
+ const banner_1 = require("./banner");
46
+ const session_ui_1 = require("./session-ui");
47
+ const sessions_1 = require("./sessions");
48
+ const setup_1 = require("./setup");
49
+ const stt_1 = require("./stt");
50
+ const daemon_1 = require("./daemon");
51
+ // ---------- Subcommands ----------
52
+ async function cmdStart() {
53
+ const { running, pid } = (0, daemon_1.isDaemonRunning)();
54
+ if (running) {
55
+ (0, banner_1.printBanner)(["Already running (pid " + pid + ").", "Use 'remotecode restart' to restart."]);
56
+ process.exit(1);
57
+ }
58
+ // runSetupIfNeeded prints its own banner on first run
59
+ const needsSetup = !fs.existsSync(path.join((0, config_1.globalConfigDir)(), "config"));
60
+ await (0, setup_1.runSetupIfNeeded)();
61
+ (0, banner_1.stopBannerResize)();
62
+ const configPath = (0, config_1.loadConfig)();
63
+ (0, config_1.getConfig)();
64
+ if (!needsSetup && configPath)
65
+ (0, banner_1.printBanner)(["Config: " + configPath]);
66
+ (0, daemon_1.killOrphanDaemons)();
67
+ await (0, daemon_1.spawnDaemon)();
68
+ cmdStatus();
69
+ cmdLogs({ follow: true, lines: 10, level: null, tag: null });
70
+ }
71
+ async function cmdStop() {
72
+ const { running, pid } = (0, daemon_1.isDaemonRunning)();
73
+ if (!running || pid === null) {
74
+ // PID file missing -- try to kill orphans
75
+ (0, daemon_1.killOrphanDaemons)();
76
+ return;
77
+ }
78
+ process.kill(pid, "SIGTERM");
79
+ // Wait for process to exit
80
+ for (let i = 0; i < 30; i++) {
81
+ await new Promise((resolve) => setTimeout(resolve, 100));
82
+ if (!(await isStillRunning(pid))) {
83
+ console.log(`RemoteCode stopped (pid ${pid}).`);
84
+ (0, daemon_1.killOrphanDaemons)(); // clean up any other orphans
85
+ return;
86
+ }
87
+ }
88
+ console.error(`Process ${pid} did not exit in time. Sending SIGKILL...`);
89
+ try {
90
+ process.kill(pid, "SIGKILL");
91
+ }
92
+ catch { /* ignore */ }
93
+ (0, daemon_1.killOrphanDaemons)();
94
+ console.log("RemoteCode killed.");
95
+ }
96
+ function isStillRunning(pid) {
97
+ try {
98
+ process.kill(pid, 0);
99
+ return true;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ async function cmdRestart() {
106
+ const { running } = (0, daemon_1.isDaemonRunning)();
107
+ if (running) {
108
+ await cmdStop();
109
+ }
110
+ await cmdStart();
111
+ }
112
+ function formatUptime(ms) {
113
+ const seconds = Math.floor(ms / 1000);
114
+ const days = Math.floor(seconds / 86400);
115
+ const hours = Math.floor((seconds % 86400) / 3600);
116
+ const minutes = Math.floor((seconds % 3600) / 60);
117
+ const parts = [];
118
+ if (days > 0)
119
+ parts.push(`${days}d`);
120
+ if (hours > 0)
121
+ parts.push(`${hours}h`);
122
+ parts.push(`${minutes}m`);
123
+ return parts.join(" ");
124
+ }
125
+ function cmdStatus() {
126
+ const { running, pid } = (0, daemon_1.isDaemonRunning)();
127
+ if (!running || pid === null) {
128
+ (0, banner_1.printBanner)([
129
+ "Status: not running",
130
+ "STT: " + (0, stt_1.getSttSummary)(),
131
+ ...(0, stt_1.getSttDetailLines)(),
132
+ "--- Commands",
133
+ "start Start the daemon",
134
+ "stop Stop the daemon",
135
+ "restart Restart the daemon",
136
+ "status Show status",
137
+ "logs Follow logs (default: -f)",
138
+ " -n N Show last N lines (static)",
139
+ " --level LEVEL Filter by DEBUG|INFO|WARN|ERROR",
140
+ " --tag TAG Filter by component tag",
141
+ "config Edit configuration",
142
+ "setup-stt Setup STT (speech-to-text)",
143
+ ]);
144
+ return;
145
+ }
146
+ let uptime = "unknown";
147
+ try {
148
+ const pidStat = fs.statSync((0, config_1.pidFilePath)());
149
+ uptime = formatUptime(Date.now() - pidStat.mtimeMs);
150
+ }
151
+ catch { /* ignore */ }
152
+ const sessionsFile = (0, config_1.sessionsFilePath)();
153
+ const activeId = (0, sessions_1.loadActiveSessionId)(sessionsFile);
154
+ const session = activeId ? (0, sessions_1.findSession)(activeId) : null;
155
+ const sessionLines = [];
156
+ if (session) {
157
+ const label = session.projectName + (session.slug ? ` (${session.slug})` : "");
158
+ sessionLines.push("Session: " + label);
159
+ sessionLines.push("CWD: " + session.project);
160
+ const lastMsg = session.lastMessage || session.firstMessage;
161
+ if (lastMsg) {
162
+ const preview = lastMsg.length > 50 ? lastMsg.slice(0, 47) + "..." : lastMsg;
163
+ sessionLines.push("Last: " + preview + " (" + (0, session_ui_1.formatTimeAgo)(session.lastModified) + ")");
164
+ }
165
+ }
166
+ else if (activeId) {
167
+ sessionLines.push("Session: new (awaiting first message)");
168
+ const cwd = (0, sessions_1.loadSessionCwd)(sessionsFile);
169
+ if (cwd)
170
+ sessionLines.push("CWD: " + cwd);
171
+ }
172
+ else {
173
+ sessionLines.push("Session: none");
174
+ }
175
+ (0, banner_1.printBanner)([
176
+ "Status: running (pid " + pid + ")",
177
+ "Uptime: " + uptime,
178
+ "Log: " + (0, config_1.logFilePath)(),
179
+ "STT: " + (0, stt_1.getSttSummary)(),
180
+ ...(0, stt_1.getSttDetailLines)(),
181
+ "--- Session",
182
+ ...sessionLines,
183
+ "--- Commands",
184
+ "start Start the daemon",
185
+ "stop Stop the daemon",
186
+ "restart Restart the daemon",
187
+ "status Show status",
188
+ "logs Follow logs (default: -f)",
189
+ " -n N Show last N lines (static)",
190
+ " --level LEVEL Filter by DEBUG|INFO|WARN|ERROR",
191
+ " --tag TAG Filter by component tag",
192
+ "config Edit configuration",
193
+ "setup-stt Setup STT (speech-to-text)",
194
+ ]);
195
+ }
196
+ // ---------- Log viewer ----------
197
+ const LOG_LINE_RE = /^(\S+)\s+\[(DEBUG|INFO|WARN|ERROR)\](\[\w+\])\s+(.*)$/;
198
+ function colorizeLine(line) {
199
+ if (!process.stdout.isTTY)
200
+ return line;
201
+ const m = line.match(LOG_LINE_RE);
202
+ if (!m)
203
+ return line;
204
+ const [, ts, level, tag, msg] = m;
205
+ const dim = "\x1b[2m";
206
+ const r = "\x1b[0m";
207
+ const levelColors = {
208
+ DEBUG: "\x1b[2m", // dim
209
+ INFO: "\x1b[36m", // cyan
210
+ WARN: "\x1b[33m", // yellow
211
+ ERROR: "\x1b[31m", // red
212
+ };
213
+ const lc = levelColors[level] || "";
214
+ return `${dim}${ts}${r} ${lc}[${level}]${r}${dim}${tag}${r} ${msg}`;
215
+ }
216
+ function matchesFilter(line, opts) {
217
+ if (!opts.level && !opts.tag)
218
+ return true;
219
+ const m = line.match(LOG_LINE_RE);
220
+ if (!m)
221
+ return !opts.level && !opts.tag; // non-structured lines: show only if no filters
222
+ if (opts.level && m[2].toUpperCase() !== opts.level)
223
+ return false;
224
+ if (opts.tag && m[3] !== `[${opts.tag}]`)
225
+ return false;
226
+ return true;
227
+ }
228
+ function cmdLogs(opts) {
229
+ const logPath = (0, config_1.logFilePath)();
230
+ if (!fs.existsSync(logPath)) {
231
+ console.log("No log file found.");
232
+ return;
233
+ }
234
+ if (!opts.follow) {
235
+ // Static: read last N matching lines
236
+ const allLines = fs.readFileSync(logPath, "utf-8").split("\n").filter(Boolean);
237
+ const filtered = allLines.filter((l) => matchesFilter(l, opts));
238
+ const tail = filtered.slice(-opts.lines);
239
+ for (const line of tail)
240
+ console.log(colorizeLine(line));
241
+ return;
242
+ }
243
+ // Follow mode: dump last N matching lines, then tail
244
+ const allLines = fs.readFileSync(logPath, "utf-8").split("\n").filter(Boolean);
245
+ const filtered = allLines.filter((l) => matchesFilter(l, opts));
246
+ const initial = filtered.slice(-opts.lines);
247
+ for (const line of initial)
248
+ console.log(colorizeLine(line));
249
+ // Watch for new data
250
+ let offset = fs.statSync(logPath).size;
251
+ let lineBuf = "";
252
+ const watcher = fs.watch(logPath, () => {
253
+ let size;
254
+ try {
255
+ size = fs.statSync(logPath).size;
256
+ }
257
+ catch {
258
+ return;
259
+ }
260
+ if (size <= offset) {
261
+ offset = size;
262
+ return;
263
+ } // file was truncated/rotated
264
+ const buf = Buffer.alloc(size - offset);
265
+ const fd = fs.openSync(logPath, "r");
266
+ try {
267
+ fs.readSync(fd, buf, 0, buf.length, offset);
268
+ }
269
+ finally {
270
+ fs.closeSync(fd);
271
+ }
272
+ offset = size;
273
+ const raw = lineBuf + buf.toString("utf-8");
274
+ const lines = raw.split("\n");
275
+ lineBuf = lines.pop() || "";
276
+ for (const line of lines) {
277
+ if (line && matchesFilter(line, opts))
278
+ console.log(colorizeLine(line));
279
+ }
280
+ });
281
+ process.on("SIGINT", () => { watcher.close(); process.exit(0); });
282
+ process.on("SIGTERM", () => { watcher.close(); process.exit(0); });
283
+ }
284
+ async function cmdConfig() {
285
+ await (0, setup_1.runConfigEditor)();
286
+ const { running } = (0, daemon_1.isDaemonRunning)();
287
+ if (running) {
288
+ await cmdStop();
289
+ }
290
+ (0, config_1.loadConfig)();
291
+ (0, config_1.getConfig)();
292
+ await (0, daemon_1.spawnDaemon)();
293
+ cmdStatus();
294
+ cmdLogs({ follow: true, lines: 10, level: null, tag: null });
295
+ }
296
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { HandlerContext } from "./context";
2
+ export declare function handleCommand(text: string, chatId: number, messageId: number, ctx: HandlerContext): Promise<boolean>;
3
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAsGlB"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleCommand = handleCommand;
4
+ const telegram_1 = require("./telegram");
5
+ const logger_1 = require("./logger");
6
+ const watcher_1 = require("./watcher");
7
+ const sessions_1 = require("./sessions");
8
+ const session_ui_1 = require("./session-ui");
9
+ const callbacks_1 = require("./callbacks");
10
+ async function handleCommand(text, chatId, messageId, ctx) {
11
+ if (!text.startsWith("/"))
12
+ return false;
13
+ const [rawCommand] = text.split(/\s+/);
14
+ const command = rawCommand.split("@")[0].toLowerCase();
15
+ if (command === "/start" || command === "/help") {
16
+ logger_1.logger.debug("command", `chat_id=${chatId} command=${command}`);
17
+ const welcome = [
18
+ "<b>RemoteCode</b> - Claude Code via Telegram",
19
+ "",
20
+ "Send any message to chat with Claude.",
21
+ "You can also send images and voice messages.",
22
+ "",
23
+ "<b>Commands:</b>",
24
+ "/sessions - Browse and switch sessions",
25
+ "/projects - Browse sessions by project",
26
+ "/new - Start a new session",
27
+ "/history - Show conversation history",
28
+ "/sync - Toggle auto-sync notifications",
29
+ ].join("\n");
30
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, welcome, {
31
+ replyToMessageId: messageId,
32
+ parseMode: "HTML",
33
+ replyMarkup: {
34
+ inline_keyboard: [
35
+ [
36
+ { text: "Sessions", callback_data: "sess:list" },
37
+ { text: "Projects", callback_data: "proj:list" },
38
+ { text: "+ New", callback_data: "sess:new" },
39
+ ],
40
+ ],
41
+ },
42
+ });
43
+ return true;
44
+ }
45
+ if (command === "/projects") {
46
+ logger_1.logger.debug("command", `chat_id=${chatId} command=/projects`);
47
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, "Projects:", {
48
+ replyToMessageId: messageId,
49
+ replyMarkup: (0, callbacks_1.buildProjectListMarkup)(),
50
+ });
51
+ return true;
52
+ }
53
+ if (command === "/history") {
54
+ logger_1.logger.debug("command", `chat_id=${chatId} command=/history`);
55
+ const activeId = (0, sessions_1.loadActiveSessionId)(ctx.sessionsFile);
56
+ if (!activeId) {
57
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, "No active session.", { replyToMessageId: messageId });
58
+ return true;
59
+ }
60
+ const session = (0, sessions_1.findSession)(activeId);
61
+ const label = session ? (0, session_ui_1.formatSessionLabel)(session) : activeId.slice(0, 8);
62
+ const pages = (0, session_ui_1.readLastTurns)(activeId, 10);
63
+ if (pages.length === 0) {
64
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, `${label}: No conversation history yet. Send a message to start chatting.`, { replyToMessageId: messageId });
65
+ return true;
66
+ }
67
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, `${label}\n\n${pages[0]}`, { replyToMessageId: messageId, parseMode: "HTML" });
68
+ for (let i = 1; i < pages.length; i++) {
69
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, pages[i], { parseMode: "HTML" });
70
+ }
71
+ return true;
72
+ }
73
+ if (command === "/sessions") {
74
+ logger_1.logger.debug("command", `chat_id=${chatId} command=/sessions`);
75
+ const sessions = (0, sessions_1.discoverSessions)(5);
76
+ const activeId = (0, sessions_1.loadActiveSessionId)(ctx.sessionsFile);
77
+ const display = (0, session_ui_1.buildSessionDisplay)(sessions, activeId);
78
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, display.text, {
79
+ replyToMessageId: messageId,
80
+ parseMode: "HTML",
81
+ replyMarkup: { inline_keyboard: display.buttons },
82
+ });
83
+ return true;
84
+ }
85
+ if (command === "/sync") {
86
+ logger_1.logger.debug("command", `chat_id=${chatId} command=/sync`);
87
+ const current = (0, watcher_1.isAutoSyncEnabled)(ctx.sessionsFile);
88
+ (0, watcher_1.setAutoSync)(ctx.sessionsFile, !current);
89
+ const status = !current ? "on" : "off";
90
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, `Auto-sync: ${status}`, {
91
+ replyToMessageId: messageId,
92
+ replyMarkup: (0, session_ui_1.sessionsReplyKeyboard)(ctx.sessionsFile),
93
+ });
94
+ return true;
95
+ }
96
+ if (command === "/new") {
97
+ logger_1.logger.debug("command", `chat_id=${chatId} command=/new`);
98
+ (0, sessions_1.createNewSession)(ctx.sessionsFile);
99
+ await (0, telegram_1.sendMessage)(ctx.telegram, chatId, "New session started.", {
100
+ replyToMessageId: messageId,
101
+ replyMarkup: (0, session_ui_1.sessionsReplyKeyboard)(ctx.sessionsFile),
102
+ });
103
+ return true;
104
+ }
105
+ return false;
106
+ }
107
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface Config {
2
+ botToken: string;
3
+ allowedUsers: {
4
+ ids: Set<number>;
5
+ usernames: Set<string>;
6
+ };
7
+ yolo: boolean;
8
+ verbose: boolean;
9
+ }
10
+ export declare function globalConfigDir(): string;
11
+ export declare function ensureConfigDir(): void;
12
+ export declare function globalConfigPath(): string;
13
+ export declare function pidFilePath(): string;
14
+ export declare function logFilePath(): string;
15
+ export declare function sessionsFilePath(): string;
16
+ export declare function whisperModelDir(): string;
17
+ export declare function whisperModelPath(): string;
18
+ export declare function defaultCwd(): string;
19
+ export declare function readKvFile(filePath: string): Record<string, string>;
20
+ export declare function readEnvLines(filePath: string): string[];
21
+ export declare function writeEnvLines(filePath: string, lines: string[]): void;
22
+ export declare function loadConfig(): string | null;
23
+ export declare function getConfig(): Config;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAInC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAanE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAGvD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAGrE;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAW1C;AAiBD,wBAAgB,SAAS,IAAI,MAAM,CAalC"}
package/dist/config.js ADDED
@@ -0,0 +1,153 @@
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.globalConfigDir = globalConfigDir;
37
+ exports.ensureConfigDir = ensureConfigDir;
38
+ exports.globalConfigPath = globalConfigPath;
39
+ exports.pidFilePath = pidFilePath;
40
+ exports.logFilePath = logFilePath;
41
+ exports.sessionsFilePath = sessionsFilePath;
42
+ exports.whisperModelDir = whisperModelDir;
43
+ exports.whisperModelPath = whisperModelPath;
44
+ exports.defaultCwd = defaultCwd;
45
+ exports.readKvFile = readKvFile;
46
+ exports.readEnvLines = readEnvLines;
47
+ exports.writeEnvLines = writeEnvLines;
48
+ exports.loadConfig = loadConfig;
49
+ exports.getConfig = getConfig;
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const os = __importStar(require("os"));
53
+ const logger_1 = require("./logger");
54
+ function globalConfigDir() {
55
+ return path.join(os.homedir(), ".remotecode");
56
+ }
57
+ function ensureConfigDir() {
58
+ const dir = globalConfigDir();
59
+ if (!fs.existsSync(dir)) {
60
+ fs.mkdirSync(dir, { recursive: true });
61
+ }
62
+ }
63
+ function globalConfigPath() {
64
+ return path.join(globalConfigDir(), "config");
65
+ }
66
+ function pidFilePath() {
67
+ return path.join(globalConfigDir(), "remotecode.pid");
68
+ }
69
+ function logFilePath() {
70
+ return path.join(globalConfigDir(), "remotecode.log");
71
+ }
72
+ function sessionsFilePath() {
73
+ return path.join(globalConfigDir(), "local");
74
+ }
75
+ function whisperModelDir() {
76
+ return path.join(globalConfigDir(), "whisper");
77
+ }
78
+ function whisperModelPath() {
79
+ return path.join(whisperModelDir(), "ggml-small.bin");
80
+ }
81
+ function defaultCwd() {
82
+ const dir = path.join(globalConfigDir(), "RemoteCodeSessions");
83
+ if (!fs.existsSync(dir))
84
+ fs.mkdirSync(dir, { recursive: true });
85
+ return dir;
86
+ }
87
+ function readKvFile(filePath) {
88
+ if (!fs.existsSync(filePath))
89
+ return {};
90
+ const data = {};
91
+ const content = fs.readFileSync(filePath, "utf-8");
92
+ for (const line of content.split("\n")) {
93
+ const stripped = line.trim();
94
+ if (!stripped || stripped.startsWith("#") || !stripped.includes("="))
95
+ continue;
96
+ const idx = stripped.indexOf("=");
97
+ const key = stripped.slice(0, idx).trim();
98
+ const value = stripped.slice(idx + 1).trim();
99
+ data[key] = value;
100
+ }
101
+ return data;
102
+ }
103
+ function readEnvLines(filePath) {
104
+ if (!fs.existsSync(filePath))
105
+ return [];
106
+ return fs.readFileSync(filePath, "utf-8").split("\n");
107
+ }
108
+ function writeEnvLines(filePath, lines) {
109
+ const content = lines.join("\n").trimEnd() + "\n";
110
+ fs.writeFileSync(filePath, content, "utf-8");
111
+ }
112
+ function loadConfig() {
113
+ const gp = globalConfigPath();
114
+ const config = readKvFile(gp);
115
+ for (const [key, value] of Object.entries(config)) {
116
+ if (process.env[key] === undefined) {
117
+ process.env[key] = value;
118
+ }
119
+ }
120
+ if (fs.existsSync(gp))
121
+ return gp;
122
+ return null;
123
+ }
124
+ function parseAllowedUsers(raw) {
125
+ const ids = new Set();
126
+ const usernames = new Set();
127
+ if (!raw.trim())
128
+ return { ids, usernames };
129
+ const parts = raw.replace(/,/g, " ").split(/\s+/).filter(Boolean);
130
+ for (const part of parts) {
131
+ if (/^\d+$/.test(part)) {
132
+ ids.add(parseInt(part, 10));
133
+ }
134
+ else {
135
+ usernames.add(part.replace(/^@/, "").toLowerCase());
136
+ }
137
+ }
138
+ return { ids, usernames };
139
+ }
140
+ function getConfig() {
141
+ const botToken = process.env.TELEGRAM_BOT_TOKEN;
142
+ if (!botToken) {
143
+ throw new Error("Missing required env var: TELEGRAM_BOT_TOKEN");
144
+ }
145
+ const allowedUsers = parseAllowedUsers(process.env.REMOTECODE_ALLOWED_USERS || "");
146
+ if (allowedUsers.ids.size === 0 && allowedUsers.usernames.size === 0) {
147
+ throw new Error("REMOTECODE_ALLOWED_USERS is empty or invalid. Set at least one user ID or username.");
148
+ }
149
+ const yolo = (0, logger_1.parseTruthyEnv)(process.env.REMOTECODE_YOLO);
150
+ const verbose = (0, logger_1.parseTruthyEnv)(process.env.REMOTECODE_VERBOSE);
151
+ return { botToken, allowedUsers, yolo, verbose };
152
+ }
153
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,0CAEC;AAED,0CAKC;AAED,4CAEC;AAED,kCAEC;AAED,kCAEC;AAED,4CAEC;AAED,0CAEC;AAED,4CAEC;AAED,gCAIC;AAED,gCAaC;AAED,oCAGC;AAED,sCAGC;AAED,gCAWC;AAiBD,8BAaC;AAvHD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,qCAA0C;AAS1C,SAAgB,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,UAAU,CAAC,QAAgB;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/E,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB,EAAE,KAAe;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAC5B,CAAC;AAED,SAAgB,SAAS;IACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IACnF,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IACD,MAAM,IAAI,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAE/D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { TelegramConfig } from "./telegram";
2
+ export interface HandlerContext {
3
+ telegram: TelegramConfig;
4
+ sessionsFile: string;
5
+ allowedIds: Set<number>;
6
+ allowedNames: Set<string>;
7
+ yolo: boolean;
8
+ }
9
+ export declare function isUserAllowed(userId?: number, username?: string, allowedIds?: Set<number>, allowedNames?: Set<string>): boolean;
10
+ export declare const activeCalls: Set<string>;
11
+ export declare function withSessionLock<T>(lockId: string, fn: () => Promise<T>): Promise<T>;
12
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,aAAa,CAC3B,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,OAAO,CAIT;AAID,eAAO,MAAM,WAAW,aAAoB,CAAC;AAE7C,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQnF"}