@jsayubi/ccgram 1.0.0

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 (247) hide show
  1. package/.env.example +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +338 -0
  4. package/ccgram.service +24 -0
  5. package/config/channels.json +58 -0
  6. package/config/default.json +27 -0
  7. package/config/defaults/config.json +16 -0
  8. package/config/defaults/i18n.json +32 -0
  9. package/config/email-template.json +31 -0
  10. package/config/test-with-subagent.json +16 -0
  11. package/config/user.json +27 -0
  12. package/dist/claude-hook-notify.d.ts +7 -0
  13. package/dist/claude-hook-notify.d.ts.map +1 -0
  14. package/dist/claude-hook-notify.js +154 -0
  15. package/dist/claude-hook-notify.js.map +1 -0
  16. package/dist/claude-remote.d.ts +50 -0
  17. package/dist/claude-remote.d.ts.map +1 -0
  18. package/dist/claude-remote.js +927 -0
  19. package/dist/claude-remote.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +110 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/enhanced-hook-notify.d.ts +16 -0
  25. package/dist/enhanced-hook-notify.d.ts.map +1 -0
  26. package/dist/enhanced-hook-notify.js +288 -0
  27. package/dist/enhanced-hook-notify.js.map +1 -0
  28. package/dist/permission-hook.d.ts +15 -0
  29. package/dist/permission-hook.d.ts.map +1 -0
  30. package/dist/permission-hook.js +357 -0
  31. package/dist/permission-hook.js.map +1 -0
  32. package/dist/prompt-bridge.d.ts +50 -0
  33. package/dist/prompt-bridge.d.ts.map +1 -0
  34. package/dist/prompt-bridge.js +173 -0
  35. package/dist/prompt-bridge.js.map +1 -0
  36. package/dist/question-notify.d.ts +16 -0
  37. package/dist/question-notify.d.ts.map +1 -0
  38. package/dist/question-notify.js +272 -0
  39. package/dist/question-notify.js.map +1 -0
  40. package/dist/setup.d.ts +10 -0
  41. package/dist/setup.d.ts.map +1 -0
  42. package/dist/setup.js +649 -0
  43. package/dist/setup.js.map +1 -0
  44. package/dist/smart-monitor.d.ts +7 -0
  45. package/dist/smart-monitor.d.ts.map +1 -0
  46. package/dist/smart-monitor.js +256 -0
  47. package/dist/smart-monitor.js.map +1 -0
  48. package/dist/src/automation/claude-automation.d.ts +45 -0
  49. package/dist/src/automation/claude-automation.d.ts.map +1 -0
  50. package/dist/src/automation/claude-automation.js +367 -0
  51. package/dist/src/automation/claude-automation.js.map +1 -0
  52. package/dist/src/automation/clipboard-automation.d.ts +35 -0
  53. package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
  54. package/dist/src/automation/clipboard-automation.js +242 -0
  55. package/dist/src/automation/clipboard-automation.js.map +1 -0
  56. package/dist/src/automation/simple-automation.d.ts +56 -0
  57. package/dist/src/automation/simple-automation.d.ts.map +1 -0
  58. package/dist/src/automation/simple-automation.js +283 -0
  59. package/dist/src/automation/simple-automation.js.map +1 -0
  60. package/dist/src/channels/base/channel.d.ts +60 -0
  61. package/dist/src/channels/base/channel.d.ts.map +1 -0
  62. package/dist/src/channels/base/channel.js +96 -0
  63. package/dist/src/channels/base/channel.js.map +1 -0
  64. package/dist/src/channels/email/smtp.d.ts +74 -0
  65. package/dist/src/channels/email/smtp.d.ts.map +1 -0
  66. package/dist/src/channels/email/smtp.js +605 -0
  67. package/dist/src/channels/email/smtp.js.map +1 -0
  68. package/dist/src/channels/line/line.d.ts +36 -0
  69. package/dist/src/channels/line/line.d.ts.map +1 -0
  70. package/dist/src/channels/line/line.js +180 -0
  71. package/dist/src/channels/line/line.js.map +1 -0
  72. package/dist/src/channels/line/webhook.d.ts +55 -0
  73. package/dist/src/channels/line/webhook.d.ts.map +1 -0
  74. package/dist/src/channels/line/webhook.js +191 -0
  75. package/dist/src/channels/line/webhook.js.map +1 -0
  76. package/dist/src/channels/local/desktop.d.ts +30 -0
  77. package/dist/src/channels/local/desktop.d.ts.map +1 -0
  78. package/dist/src/channels/local/desktop.js +161 -0
  79. package/dist/src/channels/local/desktop.js.map +1 -0
  80. package/dist/src/channels/telegram/telegram.d.ts +43 -0
  81. package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
  82. package/dist/src/channels/telegram/telegram.js +223 -0
  83. package/dist/src/channels/telegram/telegram.js.map +1 -0
  84. package/dist/src/channels/telegram/webhook.d.ts +75 -0
  85. package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
  86. package/dist/src/channels/telegram/webhook.js +278 -0
  87. package/dist/src/channels/telegram/webhook.js.map +1 -0
  88. package/dist/src/config-manager.d.ts +16 -0
  89. package/dist/src/config-manager.d.ts.map +1 -0
  90. package/dist/src/config-manager.js +152 -0
  91. package/dist/src/config-manager.js.map +1 -0
  92. package/dist/src/core/config.d.ts +28 -0
  93. package/dist/src/core/config.d.ts.map +1 -0
  94. package/dist/src/core/config.js +248 -0
  95. package/dist/src/core/config.js.map +1 -0
  96. package/dist/src/core/logger.d.ts +19 -0
  97. package/dist/src/core/logger.d.ts.map +1 -0
  98. package/dist/src/core/logger.js +47 -0
  99. package/dist/src/core/logger.js.map +1 -0
  100. package/dist/src/core/notifier.d.ts +45 -0
  101. package/dist/src/core/notifier.d.ts.map +1 -0
  102. package/dist/src/core/notifier.js +189 -0
  103. package/dist/src/core/notifier.js.map +1 -0
  104. package/dist/src/daemon/taskping-daemon.d.ts +38 -0
  105. package/dist/src/daemon/taskping-daemon.d.ts.map +1 -0
  106. package/dist/src/daemon/taskping-daemon.js +306 -0
  107. package/dist/src/daemon/taskping-daemon.js.map +1 -0
  108. package/dist/src/relay/claude-command-bridge.d.ts +57 -0
  109. package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
  110. package/dist/src/relay/claude-command-bridge.js +188 -0
  111. package/dist/src/relay/claude-command-bridge.js.map +1 -0
  112. package/dist/src/relay/command-relay.d.ts +94 -0
  113. package/dist/src/relay/command-relay.d.ts.map +1 -0
  114. package/dist/src/relay/command-relay.js +463 -0
  115. package/dist/src/relay/command-relay.js.map +1 -0
  116. package/dist/src/relay/email-listener.d.ts +65 -0
  117. package/dist/src/relay/email-listener.d.ts.map +1 -0
  118. package/dist/src/relay/email-listener.js +460 -0
  119. package/dist/src/relay/email-listener.js.map +1 -0
  120. package/dist/src/relay/relay-pty.d.ts +21 -0
  121. package/dist/src/relay/relay-pty.d.ts.map +1 -0
  122. package/dist/src/relay/relay-pty.js +696 -0
  123. package/dist/src/relay/relay-pty.js.map +1 -0
  124. package/dist/src/relay/smart-injector.d.ts +30 -0
  125. package/dist/src/relay/smart-injector.d.ts.map +1 -0
  126. package/dist/src/relay/smart-injector.js +233 -0
  127. package/dist/src/relay/smart-injector.js.map +1 -0
  128. package/dist/src/relay/tmux-injector.d.ts +46 -0
  129. package/dist/src/relay/tmux-injector.d.ts.map +1 -0
  130. package/dist/src/relay/tmux-injector.js +413 -0
  131. package/dist/src/relay/tmux-injector.js.map +1 -0
  132. package/dist/src/tools/config-manager.d.ts +33 -0
  133. package/dist/src/tools/config-manager.d.ts.map +1 -0
  134. package/dist/src/tools/config-manager.js +448 -0
  135. package/dist/src/tools/config-manager.js.map +1 -0
  136. package/dist/src/tools/installer.d.ts +38 -0
  137. package/dist/src/tools/installer.d.ts.map +1 -0
  138. package/dist/src/tools/installer.js +222 -0
  139. package/dist/src/tools/installer.js.map +1 -0
  140. package/dist/src/types/callbacks.d.ts +29 -0
  141. package/dist/src/types/callbacks.d.ts.map +1 -0
  142. package/dist/src/types/callbacks.js +7 -0
  143. package/dist/src/types/callbacks.js.map +1 -0
  144. package/dist/src/types/config.d.ts +56 -0
  145. package/dist/src/types/config.d.ts.map +1 -0
  146. package/dist/src/types/config.js +6 -0
  147. package/dist/src/types/config.js.map +1 -0
  148. package/dist/src/types/hooks.d.ts +47 -0
  149. package/dist/src/types/hooks.d.ts.map +1 -0
  150. package/dist/src/types/hooks.js +6 -0
  151. package/dist/src/types/hooks.js.map +1 -0
  152. package/dist/src/types/index.d.ts +7 -0
  153. package/dist/src/types/index.d.ts.map +1 -0
  154. package/dist/src/types/index.js +23 -0
  155. package/dist/src/types/index.js.map +1 -0
  156. package/dist/src/types/ipc.d.ts +43 -0
  157. package/dist/src/types/ipc.d.ts.map +1 -0
  158. package/dist/src/types/ipc.js +7 -0
  159. package/dist/src/types/ipc.js.map +1 -0
  160. package/dist/src/types/session.d.ts +70 -0
  161. package/dist/src/types/session.d.ts.map +1 -0
  162. package/dist/src/types/session.js +9 -0
  163. package/dist/src/types/session.js.map +1 -0
  164. package/dist/src/types/telegram.d.ts +58 -0
  165. package/dist/src/types/telegram.d.ts.map +1 -0
  166. package/dist/src/types/telegram.js +6 -0
  167. package/dist/src/types/telegram.js.map +1 -0
  168. package/dist/src/utils/active-check.d.ts +19 -0
  169. package/dist/src/utils/active-check.d.ts.map +1 -0
  170. package/dist/src/utils/active-check.js +41 -0
  171. package/dist/src/utils/active-check.js.map +1 -0
  172. package/dist/src/utils/callback-parser.d.ts +21 -0
  173. package/dist/src/utils/callback-parser.d.ts.map +1 -0
  174. package/dist/src/utils/callback-parser.js +58 -0
  175. package/dist/src/utils/callback-parser.js.map +1 -0
  176. package/dist/src/utils/controller-injector.d.ts +21 -0
  177. package/dist/src/utils/controller-injector.d.ts.map +1 -0
  178. package/dist/src/utils/controller-injector.js +108 -0
  179. package/dist/src/utils/controller-injector.js.map +1 -0
  180. package/dist/src/utils/conversation-tracker.d.ts +32 -0
  181. package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
  182. package/dist/src/utils/conversation-tracker.js +119 -0
  183. package/dist/src/utils/conversation-tracker.js.map +1 -0
  184. package/dist/src/utils/http-request.d.ts +25 -0
  185. package/dist/src/utils/http-request.d.ts.map +1 -0
  186. package/dist/src/utils/http-request.js +66 -0
  187. package/dist/src/utils/http-request.js.map +1 -0
  188. package/dist/src/utils/optional-require.d.ts +13 -0
  189. package/dist/src/utils/optional-require.d.ts.map +1 -0
  190. package/dist/src/utils/optional-require.js +37 -0
  191. package/dist/src/utils/optional-require.js.map +1 -0
  192. package/dist/src/utils/paths.d.ts +11 -0
  193. package/dist/src/utils/paths.d.ts.map +1 -0
  194. package/dist/src/utils/paths.js +28 -0
  195. package/dist/src/utils/paths.js.map +1 -0
  196. package/dist/src/utils/pty-session-manager.d.ts +42 -0
  197. package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
  198. package/dist/src/utils/pty-session-manager.js +182 -0
  199. package/dist/src/utils/pty-session-manager.js.map +1 -0
  200. package/dist/src/utils/subagent-tracker.d.ts +64 -0
  201. package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
  202. package/dist/src/utils/subagent-tracker.js +191 -0
  203. package/dist/src/utils/subagent-tracker.js.map +1 -0
  204. package/dist/src/utils/tmux-monitor.d.ts +102 -0
  205. package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
  206. package/dist/src/utils/tmux-monitor.js +642 -0
  207. package/dist/src/utils/tmux-monitor.js.map +1 -0
  208. package/dist/src/utils/trace-capture.d.ts +42 -0
  209. package/dist/src/utils/trace-capture.d.ts.map +1 -0
  210. package/dist/src/utils/trace-capture.js +102 -0
  211. package/dist/src/utils/trace-capture.js.map +1 -0
  212. package/dist/start-all-webhooks.d.ts +7 -0
  213. package/dist/start-all-webhooks.d.ts.map +1 -0
  214. package/dist/start-all-webhooks.js +98 -0
  215. package/dist/start-all-webhooks.js.map +1 -0
  216. package/dist/start-line-webhook.d.ts +7 -0
  217. package/dist/start-line-webhook.d.ts.map +1 -0
  218. package/dist/start-line-webhook.js +59 -0
  219. package/dist/start-line-webhook.js.map +1 -0
  220. package/dist/start-relay-pty.d.ts +7 -0
  221. package/dist/start-relay-pty.d.ts.map +1 -0
  222. package/dist/start-relay-pty.js +173 -0
  223. package/dist/start-relay-pty.js.map +1 -0
  224. package/dist/start-telegram-webhook.d.ts +7 -0
  225. package/dist/start-telegram-webhook.d.ts.map +1 -0
  226. package/dist/start-telegram-webhook.js +80 -0
  227. package/dist/start-telegram-webhook.js.map +1 -0
  228. package/dist/user-prompt-hook.d.ts +13 -0
  229. package/dist/user-prompt-hook.d.ts.map +1 -0
  230. package/dist/user-prompt-hook.js +45 -0
  231. package/dist/user-prompt-hook.js.map +1 -0
  232. package/dist/workspace-router.d.ts +78 -0
  233. package/dist/workspace-router.d.ts.map +1 -0
  234. package/dist/workspace-router.js +408 -0
  235. package/dist/workspace-router.js.map +1 -0
  236. package/dist/workspace-telegram-bot.d.ts +3 -0
  237. package/dist/workspace-telegram-bot.d.ts.map +1 -0
  238. package/dist/workspace-telegram-bot.js +1172 -0
  239. package/dist/workspace-telegram-bot.js.map +1 -0
  240. package/package.json +80 -0
  241. package/src/types/callbacks.ts +39 -0
  242. package/src/types/config.ts +63 -0
  243. package/src/types/hooks.ts +50 -0
  244. package/src/types/index.ts +6 -0
  245. package/src/types/ipc.ts +55 -0
  246. package/src/types/session.ts +72 -0
  247. package/src/types/telegram.ts +66 -0
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ /**
3
+ * Telegram Webhook Handler
4
+ * Handles incoming Telegram messages and commands
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ const optional_require_1 = require("../../utils/optional-require");
10
+ const express = (0, optional_require_1.optionalRequire)('express', 'Telegram webhook server');
11
+ const http_request_1 = __importDefault(require("../../utils/http-request"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const logger_1 = __importDefault(require("../../core/logger"));
15
+ const controller_injector_1 = __importDefault(require("../../utils/controller-injector"));
16
+ class TelegramWebhookHandler {
17
+ config;
18
+ logger;
19
+ sessionsDir;
20
+ injector;
21
+ app;
22
+ apiBaseUrl;
23
+ botUsername;
24
+ constructor(config = {}) {
25
+ if (!express) {
26
+ throw new Error('express is required for the Telegram webhook server. Install with: npm install express');
27
+ }
28
+ this.config = config;
29
+ this.logger = new logger_1.default('TelegramWebhook');
30
+ this.sessionsDir = path_1.default.join(__dirname, '../../data/sessions');
31
+ this.injector = new controller_injector_1.default();
32
+ this.app = express();
33
+ this.apiBaseUrl = 'https://api.telegram.org';
34
+ this.botUsername = null; // Cache for bot username
35
+ this._setupMiddleware();
36
+ this._setupRoutes();
37
+ }
38
+ _setupMiddleware() {
39
+ // Parse JSON for all requests
40
+ this.app.use(express.json());
41
+ }
42
+ _setupRoutes() {
43
+ // Telegram webhook endpoint
44
+ this.app.post('/webhook/telegram', this._handleWebhook.bind(this));
45
+ // Health check endpoint
46
+ this.app.get('/health', (req, res) => {
47
+ res.json({ status: 'ok', service: 'telegram-webhook' });
48
+ });
49
+ }
50
+ /**
51
+ * Generate network options for HTTP requests
52
+ */
53
+ _getNetworkOptions() {
54
+ const options = {};
55
+ if (this.config.forceIPv4) {
56
+ options.family = 4;
57
+ }
58
+ return options;
59
+ }
60
+ async _handleWebhook(req, res) {
61
+ try {
62
+ const update = req.body;
63
+ // Handle different update types
64
+ if (update.message) {
65
+ await this._handleMessage(update.message);
66
+ }
67
+ else if (update.callback_query) {
68
+ await this._handleCallbackQuery(update.callback_query);
69
+ }
70
+ res.status(200).send('OK');
71
+ }
72
+ catch (error) {
73
+ this.logger.error('Webhook handling error:', error.message);
74
+ res.status(500).send('Internal Server Error');
75
+ }
76
+ }
77
+ async _handleMessage(message) {
78
+ const chatId = message.chat.id;
79
+ const userId = message.from.id;
80
+ const messageText = message.text?.trim();
81
+ if (!messageText)
82
+ return;
83
+ // Check if user is authorized
84
+ if (!this._isAuthorized(userId, chatId)) {
85
+ this.logger.warn(`Unauthorized user/chat: ${userId}/${chatId}`);
86
+ await this._sendMessage(chatId, 'You are not authorized to use this bot.');
87
+ return;
88
+ }
89
+ // Handle /start command
90
+ if (messageText === '/start') {
91
+ await this._sendWelcomeMessage(chatId);
92
+ return;
93
+ }
94
+ // Handle /help command
95
+ if (messageText === '/help') {
96
+ await this._sendHelpMessage(chatId);
97
+ return;
98
+ }
99
+ // Parse command
100
+ const commandMatch = messageText.match(/^\/cmd\s+([A-Z0-9]{8})\s+(.+)$/i);
101
+ if (!commandMatch) {
102
+ // Check if it's a direct command without /cmd prefix
103
+ const directMatch = messageText.match(/^([A-Z0-9]{8})\s+(.+)$/);
104
+ if (directMatch) {
105
+ await this._processCommand(chatId, directMatch[1], directMatch[2]);
106
+ }
107
+ else {
108
+ await this._sendMessage(chatId, 'Invalid format. Use:\n`/cmd <TOKEN> <command>`\n\nExample:\n`/cmd ABC12345 analyze this code`', { parse_mode: 'Markdown' });
109
+ }
110
+ return;
111
+ }
112
+ const token = commandMatch[1].toUpperCase();
113
+ const command = commandMatch[2];
114
+ await this._processCommand(chatId, token, command);
115
+ }
116
+ async _processCommand(chatId, token, command) {
117
+ // Find session by token
118
+ const session = await this._findSessionByToken(token);
119
+ if (!session) {
120
+ await this._sendMessage(chatId, 'Invalid or expired token. Please wait for a new task notification.', { parse_mode: 'Markdown' });
121
+ return;
122
+ }
123
+ // Check if session is expired
124
+ if (session.expiresAt < Math.floor(Date.now() / 1000)) {
125
+ await this._sendMessage(chatId, 'Token has expired. Please wait for a new task notification.', { parse_mode: 'Markdown' });
126
+ await this._removeSession(session.id);
127
+ return;
128
+ }
129
+ try {
130
+ // Inject command into tmux session
131
+ const tmuxSession = session.tmuxSession || 'default';
132
+ await this.injector.injectCommand(command, tmuxSession);
133
+ // Send confirmation
134
+ await this._sendMessage(chatId, `*Command sent successfully*\n\n*Command:* ${command}\n*Session:* ${tmuxSession}\n\nClaude is now processing your request...`, { parse_mode: 'Markdown' });
135
+ // Log command execution
136
+ this.logger.info(`Command injected - User: ${chatId}, Token: ${token}, Command: ${command}`);
137
+ }
138
+ catch (error) {
139
+ this.logger.error('Command injection failed:', error.message);
140
+ await this._sendMessage(chatId, `*Command execution failed:* ${error.message}`, { parse_mode: 'Markdown' });
141
+ }
142
+ }
143
+ async _handleCallbackQuery(callbackQuery) {
144
+ const chatId = callbackQuery.message.chat.id;
145
+ const data = callbackQuery.data;
146
+ // Answer callback query to remove loading state
147
+ await this._answerCallbackQuery(callbackQuery.id);
148
+ if (data.startsWith('personal:')) {
149
+ const token = data.split(':')[1];
150
+ // Send personal chat command format
151
+ await this._sendMessage(chatId, `*Personal Chat Command Format:*\n\n\`/cmd ${token} <your command>\`\n\n*Example:*\n\`/cmd ${token} please analyze this code\`\n\n*Copy and paste the format above, then add your command!*`, { parse_mode: 'Markdown' });
152
+ }
153
+ else if (data.startsWith('group:')) {
154
+ const token = data.split(':')[1];
155
+ // Send group chat command format with @bot_name
156
+ const botUsername = await this._getBotUsername();
157
+ await this._sendMessage(chatId, `*Group Chat Command Format:*\n\n\`@${botUsername} /cmd ${token} <your command>\`\n\n*Example:*\n\`@${botUsername} /cmd ${token} please analyze this code\`\n\n*Copy and paste the format above, then add your command!*`, { parse_mode: 'Markdown' });
158
+ }
159
+ else if (data.startsWith('session:')) {
160
+ const token = data.split(':')[1];
161
+ // For backward compatibility - send help message for old callback buttons
162
+ await this._sendMessage(chatId, `*How to send a command:*\n\nType:\n\`/cmd ${token} <your command>\`\n\nExample:\n\`/cmd ${token} please analyze this code\`\n\n*Tip:* New notifications have a button that auto-fills the command for you!`, { parse_mode: 'Markdown' });
163
+ }
164
+ }
165
+ async _sendWelcomeMessage(chatId) {
166
+ const message = `*Welcome to Claude Code Remote Bot!*\n\n` +
167
+ `I'll notify you when Claude completes tasks or needs input.\n\n` +
168
+ `When you receive a notification with a token, you can send commands back using:\n` +
169
+ `\`/cmd <TOKEN> <your command>\`\n\n` +
170
+ `Type /help for more information.`;
171
+ await this._sendMessage(chatId, message, { parse_mode: 'Markdown' });
172
+ }
173
+ async _sendHelpMessage(chatId) {
174
+ const message = `*Claude Code Remote Bot Help*\n\n` +
175
+ `*Commands:*\n` +
176
+ `\`/start\` - Welcome message\n` +
177
+ `\`/help\` - Show this help\n` +
178
+ `\`/cmd <TOKEN> <command>\` - Send command to Claude\n\n` +
179
+ `*Example:*\n` +
180
+ `\`/cmd ABC12345 analyze the performance of this function\`\n\n` +
181
+ `*Tips:*\n` +
182
+ `Tokens are case-insensitive\n` +
183
+ `Tokens expire after 24 hours\n` +
184
+ `You can also just type \`TOKEN command\` without /cmd`;
185
+ await this._sendMessage(chatId, message, { parse_mode: 'Markdown' });
186
+ }
187
+ _isAuthorized(userId, chatId) {
188
+ // Check whitelist
189
+ const whitelist = this.config.whitelist || [];
190
+ if (whitelist.includes(String(chatId)) || whitelist.includes(String(userId))) {
191
+ return true;
192
+ }
193
+ // If no whitelist configured, allow configured chat/user
194
+ if (whitelist.length === 0) {
195
+ const configuredChatId = this.config.chatId || this.config.groupId;
196
+ if (configuredChatId && String(chatId) === String(configuredChatId)) {
197
+ return true;
198
+ }
199
+ }
200
+ return false;
201
+ }
202
+ async _getBotUsername() {
203
+ if (this.botUsername) {
204
+ return this.botUsername;
205
+ }
206
+ try {
207
+ const response = await http_request_1.default.get(`${this.apiBaseUrl}/bot${this.config.botToken}/getMe`, this._getNetworkOptions());
208
+ if (response.data.ok && response.data.result.username) {
209
+ this.botUsername = response.data.result.username;
210
+ return this.botUsername;
211
+ }
212
+ }
213
+ catch (error) {
214
+ this.logger.error('Failed to get bot username:', error.message);
215
+ }
216
+ // Fallback to configured username or default
217
+ return this.config.botUsername || 'claude_remote_bot';
218
+ }
219
+ async _findSessionByToken(token) {
220
+ const files = fs_1.default.readdirSync(this.sessionsDir);
221
+ for (const file of files) {
222
+ if (!file.endsWith('.json'))
223
+ continue;
224
+ const sessionPath = path_1.default.join(this.sessionsDir, file);
225
+ try {
226
+ const session = JSON.parse(fs_1.default.readFileSync(sessionPath, 'utf8'));
227
+ if (session.token === token) {
228
+ return session;
229
+ }
230
+ }
231
+ catch (error) {
232
+ this.logger.error(`Failed to read session file ${file}:`, error.message);
233
+ }
234
+ }
235
+ return null;
236
+ }
237
+ async _removeSession(sessionId) {
238
+ const sessionFile = path_1.default.join(this.sessionsDir, `${sessionId}.json`);
239
+ if (fs_1.default.existsSync(sessionFile)) {
240
+ fs_1.default.unlinkSync(sessionFile);
241
+ this.logger.debug(`Session removed: ${sessionId}`);
242
+ }
243
+ }
244
+ async _sendMessage(chatId, text, options = {}) {
245
+ try {
246
+ await http_request_1.default.post(`${this.apiBaseUrl}/bot${this.config.botToken}/sendMessage`, { chat_id: chatId, text, ...options }, this._getNetworkOptions());
247
+ }
248
+ catch (error) {
249
+ this.logger.error('Failed to send message:', error.message);
250
+ }
251
+ }
252
+ async _answerCallbackQuery(callbackQueryId, text = '') {
253
+ try {
254
+ await http_request_1.default.post(`${this.apiBaseUrl}/bot${this.config.botToken}/answerCallbackQuery`, { callback_query_id: callbackQueryId, text }, this._getNetworkOptions());
255
+ }
256
+ catch (error) {
257
+ this.logger.error('Failed to answer callback query:', error.message);
258
+ }
259
+ }
260
+ async setWebhook(webhookUrl) {
261
+ try {
262
+ const response = await http_request_1.default.post(`${this.apiBaseUrl}/bot${this.config.botToken}/setWebhook`, { url: webhookUrl, allowed_updates: ['message', 'callback_query'] }, this._getNetworkOptions());
263
+ this.logger.info('Webhook set successfully:', response.data);
264
+ return response.data;
265
+ }
266
+ catch (error) {
267
+ this.logger.error('Failed to set webhook:', error.message);
268
+ throw error;
269
+ }
270
+ }
271
+ start(port = 3000) {
272
+ this.app.listen(port, () => {
273
+ this.logger.info(`Telegram webhook server started on port ${port}`);
274
+ });
275
+ }
276
+ }
277
+ module.exports = TelegramWebhookHandler;
278
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../../src/channels/telegram/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import readline from 'readline';
2
+ declare class ConfigManager {
3
+ configPath: string;
4
+ rl: readline.Interface;
5
+ constructor();
6
+ loadConfig(): Promise<Record<string, any>>;
7
+ saveConfig(config: Record<string, any>): Promise<void>;
8
+ question(prompt: string): Promise<string>;
9
+ configureEmail(): Promise<void>;
10
+ showCurrentConfig(): Promise<void>;
11
+ toggleChannel(channelName: string): Promise<void>;
12
+ interactiveMenu(): Promise<void>;
13
+ close(): void;
14
+ }
15
+ export = ConfigManager;
16
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config-manager.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAKhC,cAAM,aAAa;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC;;IAUjB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAU1C,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA0D/B,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBlC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCtC,KAAK,IAAI,IAAI;CAGhB;AAQD,SAAS,aAAa,CAAC"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const fs_1 = __importDefault(require("fs"));
6
+ const path_1 = __importDefault(require("path"));
7
+ const readline_1 = __importDefault(require("readline"));
8
+ const logger_1 = __importDefault(require("./core/logger"));
9
+ const logger = new logger_1.default('ConfigManager');
10
+ class ConfigManager {
11
+ configPath;
12
+ rl;
13
+ constructor() {
14
+ this.configPath = path_1.default.join(__dirname, '../config/channels.json');
15
+ this.rl = readline_1.default.createInterface({
16
+ input: process.stdin,
17
+ output: process.stdout
18
+ });
19
+ }
20
+ async loadConfig() {
21
+ try {
22
+ const data = fs_1.default.readFileSync(this.configPath, 'utf8');
23
+ return JSON.parse(data);
24
+ }
25
+ catch (error) {
26
+ logger.error('Failed to load config:', error);
27
+ throw error;
28
+ }
29
+ }
30
+ async saveConfig(config) {
31
+ try {
32
+ fs_1.default.writeFileSync(this.configPath, JSON.stringify(config, null, 2));
33
+ logger.info('Configuration saved successfully');
34
+ }
35
+ catch (error) {
36
+ logger.error('Failed to save config:', error);
37
+ throw error;
38
+ }
39
+ }
40
+ async question(prompt) {
41
+ return new Promise((resolve) => {
42
+ this.rl.question(prompt, resolve);
43
+ });
44
+ }
45
+ async configureEmail() {
46
+ console.log('\nšŸ“§ Email Configuration Setup\n');
47
+ const config = await this.loadConfig();
48
+ console.log('Please enter your email configuration:');
49
+ console.log('(Press Enter to keep current value)\n');
50
+ // SMTP Configuration
51
+ console.log('--- SMTP Settings (for sending emails) ---');
52
+ const smtpHost = await this.question(`SMTP Host [${config.email.config.smtp.host || 'smtp.gmail.com'}]: `);
53
+ config.email.config.smtp.host = smtpHost || config.email.config.smtp.host || 'smtp.gmail.com';
54
+ const smtpPort = await this.question(`SMTP Port [${config.email.config.smtp.port || 587}]: `);
55
+ config.email.config.smtp.port = parseInt(smtpPort) || config.email.config.smtp.port || 587;
56
+ const smtpUser = await this.question(`Email Address [${config.email.config.smtp.auth.user || ''}]: `);
57
+ config.email.config.smtp.auth.user = smtpUser || config.email.config.smtp.auth.user;
58
+ const smtpPass = await this.question(`App Password [${config.email.config.smtp.auth.pass ? '***' : ''}]: `);
59
+ if (smtpPass) {
60
+ config.email.config.smtp.auth.pass = smtpPass;
61
+ }
62
+ // IMAP Configuration
63
+ console.log('\n--- IMAP Settings (for receiving emails) ---');
64
+ const imapHost = await this.question(`IMAP Host [${config.email.config.imap.host || 'imap.gmail.com'}]: `);
65
+ config.email.config.imap.host = imapHost || config.email.config.imap.host || 'imap.gmail.com';
66
+ const imapPort = await this.question(`IMAP Port [${config.email.config.imap.port || 993}]: `);
67
+ config.email.config.imap.port = parseInt(imapPort) || config.email.config.imap.port || 993;
68
+ // Use same credentials as SMTP by default
69
+ config.email.config.imap.auth.user = config.email.config.smtp.auth.user;
70
+ config.email.config.imap.auth.pass = config.email.config.smtp.auth.pass;
71
+ // Email addresses
72
+ console.log('\n--- Email Addresses ---');
73
+ const fromEmail = await this.question(`From Address [${config.email.config.from || `CCGram <${config.email.config.smtp.auth.user}>`}]: `);
74
+ config.email.config.from = fromEmail || config.email.config.from || `CCGram <${config.email.config.smtp.auth.user}>`;
75
+ const toEmail = await this.question(`To Address [${config.email.config.to || config.email.config.smtp.auth.user}]: `);
76
+ config.email.config.to = toEmail || config.email.config.to || config.email.config.smtp.auth.user;
77
+ // Enable email
78
+ const enable = await this.question('\nEnable email notifications? (y/n) [y]: ');
79
+ config.email.enabled = enable.toLowerCase() !== 'n';
80
+ await this.saveConfig(config);
81
+ console.log('\nāœ… Email configuration completed!');
82
+ if (config.email.enabled) {
83
+ console.log('\nšŸ“Œ Important: Make sure to use an App Password (not your regular password)');
84
+ console.log(' Gmail: https://support.google.com/accounts/answer/185833');
85
+ console.log(' Outlook: https://support.microsoft.com/en-us/account-billing/using-app-passwords-with-apps-that-don-t-support-two-step-verification-5896ed9b-4263-e681-128a-a6f2979a7944');
86
+ }
87
+ }
88
+ async showCurrentConfig() {
89
+ const config = await this.loadConfig();
90
+ console.log('\nšŸ“‹ Current Configuration:\n');
91
+ for (const [channel, settings] of Object.entries(config)) {
92
+ const channelSettings = settings;
93
+ console.log(`${channel}:`);
94
+ console.log(` Enabled: ${channelSettings.enabled ? 'āœ…' : 'āŒ'}`);
95
+ if (channel === 'email' && channelSettings.config.smtp.auth.user) {
96
+ console.log(` Email: ${channelSettings.config.smtp.auth.user}`);
97
+ console.log(` SMTP: ${channelSettings.config.smtp.host}:${channelSettings.config.smtp.port}`);
98
+ console.log(` IMAP: ${channelSettings.config.imap.host}:${channelSettings.config.imap.port}`);
99
+ }
100
+ console.log();
101
+ }
102
+ }
103
+ async toggleChannel(channelName) {
104
+ const config = await this.loadConfig();
105
+ if (!config[channelName]) {
106
+ console.log(`āŒ Channel "${channelName}" not found`);
107
+ return;
108
+ }
109
+ config[channelName].enabled = !config[channelName].enabled;
110
+ await this.saveConfig(config);
111
+ console.log(`${channelName}: ${config[channelName].enabled ? 'āœ… Enabled' : 'āŒ Disabled'}`);
112
+ }
113
+ async interactiveMenu() {
114
+ console.log('\nšŸ› ļø CCGram Configuration Manager\n');
115
+ while (true) {
116
+ console.log('\nChoose an option:');
117
+ console.log('1. Configure Email');
118
+ console.log('2. Show Current Configuration');
119
+ console.log('3. Toggle Channel (enable/disable)');
120
+ console.log('4. Exit');
121
+ const choice = await this.question('\nYour choice (1-4): ');
122
+ switch (choice) {
123
+ case '1':
124
+ await this.configureEmail();
125
+ break;
126
+ case '2':
127
+ await this.showCurrentConfig();
128
+ break;
129
+ case '3':
130
+ const channel = await this.question('Channel name (desktop/email/discord/telegram/whatsapp/feishu): ');
131
+ await this.toggleChannel(channel);
132
+ break;
133
+ case '4':
134
+ console.log('\nšŸ‘‹ Goodbye!');
135
+ this.rl.close();
136
+ return;
137
+ default:
138
+ console.log('Invalid choice. Please try again.');
139
+ }
140
+ }
141
+ }
142
+ close() {
143
+ this.rl.close();
144
+ }
145
+ }
146
+ // Run as standalone script
147
+ if (require.main === module) {
148
+ const manager = new ConfigManager();
149
+ manager.interactiveMenu().catch(console.error);
150
+ }
151
+ module.exports = ConfigManager;
152
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * CCGram Configuration Manager
3
+ * Handles loading, merging, and saving configurations
4
+ */
5
+ import Logger from './logger';
6
+ import type { AppConfig, ChannelConfig, ChannelsConfig } from '../types';
7
+ declare class ConfigManager {
8
+ logger: Logger;
9
+ configDir: string;
10
+ userConfigPath: string;
11
+ defaultConfigPath: string;
12
+ channelsConfigPath: string;
13
+ _config: Record<string, unknown> | null;
14
+ _channels: ChannelsConfig | null;
15
+ constructor(configDir?: string | null);
16
+ getDefaultConfig(): AppConfig;
17
+ getDefaultChannelsConfig(): ChannelsConfig;
18
+ load(): Record<string, unknown>;
19
+ save(): boolean;
20
+ get(key: string, defaultValue?: unknown): unknown;
21
+ set(key: string, value: unknown): this;
22
+ getChannel(channelName: string): ChannelConfig | undefined;
23
+ setChannel(channelName: string, config: ChannelConfig): this;
24
+ getProjectName(): string;
25
+ _deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown>;
26
+ }
27
+ export = ConfigManager;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEzE,cAAM,aAAa;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;gBAErB,SAAS,GAAE,MAAM,GAAG,IAAW;IAW3C,gBAAgB,IAAI,SAAS;IA8B7B,wBAAwB,IAAI,cAAc;IA0D1C,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA0C/B,IAAI,IAAI,OAAO;IAuBf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO;IAmBjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAoBtC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAO1D,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAQ5D,cAAc,IAAI,MAAM;IAgBxB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAgBxG;AAED,SAAS,aAAa,CAAC"}