@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,460 @@
1
+ "use strict";
2
+ /**
3
+ * Email Listener
4
+ * Monitors IMAP inbox for replies and extracts 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 Imap = (0, optional_require_1.optionalRequire)('node-imap', 'IMAP email listening');
11
+ const mailparserModule = (0, optional_require_1.optionalRequire)('mailparser', 'email parsing');
12
+ const simpleParser = mailparserModule ? mailparserModule.simpleParser : null;
13
+ const events_1 = __importDefault(require("events"));
14
+ const logger_1 = __importDefault(require("../core/logger"));
15
+ const fs_1 = __importDefault(require("fs"));
16
+ const path_1 = __importDefault(require("path"));
17
+ class EmailListener extends events_1.default {
18
+ logger;
19
+ config;
20
+ imap;
21
+ isConnected;
22
+ isListening;
23
+ sessionsDir;
24
+ sentMessagesPath;
25
+ checkInterval;
26
+ lastCheckTime;
27
+ constructor(config) {
28
+ super();
29
+ this.logger = new logger_1.default('EmailListener');
30
+ this.config = config;
31
+ this.imap = null;
32
+ this.isConnected = false;
33
+ this.isListening = false;
34
+ this.sessionsDir = path_1.default.join(__dirname, '../data/sessions');
35
+ this.sentMessagesPath = config.sentMessagesPath || path_1.default.join(__dirname, '../data/sent-messages.json');
36
+ this.checkInterval = (config.template?.checkInterval || 30) * 1000; // Convert to milliseconds
37
+ this.lastCheckTime = new Date();
38
+ this._ensureDirectories();
39
+ }
40
+ _ensureDirectories() {
41
+ if (!fs_1.default.existsSync(this.sessionsDir)) {
42
+ fs_1.default.mkdirSync(this.sessionsDir, { recursive: true });
43
+ }
44
+ }
45
+ async start() {
46
+ if (!Imap) {
47
+ throw new Error('node-imap is required for email listening. Install with: npm install node-imap');
48
+ }
49
+ if (!simpleParser) {
50
+ throw new Error('mailparser is required for email listening. Install with: npm install mailparser');
51
+ }
52
+ if (this.isListening) {
53
+ this.logger.warn('Email listener already running');
54
+ return;
55
+ }
56
+ try {
57
+ await this._connect();
58
+ this._startListening();
59
+ this.isListening = true;
60
+ this.logger.info('Email listener started successfully');
61
+ }
62
+ catch (error) {
63
+ this.logger.error('Failed to start email listener:', error.message);
64
+ throw error;
65
+ }
66
+ }
67
+ async stop() {
68
+ if (!this.isListening) {
69
+ return;
70
+ }
71
+ this.isListening = false;
72
+ if (this.imap) {
73
+ this.imap.end();
74
+ this.imap = null;
75
+ }
76
+ this.isConnected = false;
77
+ this.logger.info('Email listener stopped');
78
+ }
79
+ async _connect() {
80
+ return new Promise((resolve, reject) => {
81
+ this.imap = new Imap({
82
+ user: this.config.imap.auth.user,
83
+ password: this.config.imap.auth.pass,
84
+ host: this.config.imap.host,
85
+ port: this.config.imap.port,
86
+ tls: this.config.imap.secure,
87
+ connTimeout: 10000,
88
+ authTimeout: 5000,
89
+ keepalive: true
90
+ });
91
+ this.imap.once('ready', () => {
92
+ this.isConnected = true;
93
+ this.logger.debug('IMAP connection established');
94
+ resolve();
95
+ });
96
+ this.imap.once('error', (error) => {
97
+ this.logger.error('IMAP connection error:', error.message);
98
+ reject(error);
99
+ });
100
+ this.imap.once('end', () => {
101
+ this.isConnected = false;
102
+ this.logger.debug('IMAP connection ended');
103
+ });
104
+ this.imap.connect();
105
+ });
106
+ }
107
+ _startListening() {
108
+ // Periodically check for new emails
109
+ this._checkNewMails();
110
+ setInterval(() => {
111
+ if (this.isListening && this.isConnected) {
112
+ this._checkNewMails();
113
+ }
114
+ }, this.checkInterval);
115
+ }
116
+ async _checkNewMails() {
117
+ try {
118
+ await this._openInbox();
119
+ await this._searchAndProcessMails();
120
+ }
121
+ catch (error) {
122
+ this.logger.error('Error checking emails:', error.message);
123
+ // If connection is lost, try to reconnect
124
+ if (!this.isConnected) {
125
+ this.logger.info('Attempting to reconnect...');
126
+ try {
127
+ await this._connect();
128
+ }
129
+ catch (reconnectError) {
130
+ this.logger.error('Reconnection failed:', reconnectError.message);
131
+ }
132
+ }
133
+ }
134
+ }
135
+ async _openInbox() {
136
+ return new Promise((resolve, reject) => {
137
+ this.imap.openBox('INBOX', false, (error, box) => {
138
+ if (error) {
139
+ reject(error);
140
+ }
141
+ else {
142
+ resolve(box);
143
+ }
144
+ });
145
+ });
146
+ }
147
+ async _searchAndProcessMails() {
148
+ return new Promise((resolve, reject) => {
149
+ // Search for recent unread emails
150
+ const searchCriteria = [
151
+ 'UNSEEN',
152
+ ['SINCE', this.lastCheckTime]
153
+ ];
154
+ this.imap.search(searchCriteria, (searchError, results) => {
155
+ if (searchError) {
156
+ reject(searchError);
157
+ return;
158
+ }
159
+ if (results.length === 0) {
160
+ resolve();
161
+ return;
162
+ }
163
+ this.logger.debug(`Found ${results.length} new emails`);
164
+ const fetch = this.imap.fetch(results, {
165
+ bodies: '',
166
+ markSeen: true
167
+ });
168
+ fetch.on('message', (msg, seqno) => {
169
+ this._processMessage(msg, seqno);
170
+ });
171
+ fetch.once('error', (fetchError) => {
172
+ this.logger.error('Fetch error:', fetchError.message);
173
+ reject(fetchError);
174
+ });
175
+ fetch.once('end', () => {
176
+ this.lastCheckTime = new Date();
177
+ resolve();
178
+ });
179
+ });
180
+ });
181
+ }
182
+ _processMessage(msg, seqno) {
183
+ let buffer = '';
184
+ msg.on('body', (stream, info) => {
185
+ stream.on('data', (chunk) => {
186
+ buffer += chunk.toString('utf8');
187
+ });
188
+ stream.once('end', async () => {
189
+ try {
190
+ const parsed = await simpleParser(buffer);
191
+ await this._handleParsedEmail(parsed, seqno);
192
+ }
193
+ catch (parseError) {
194
+ this.logger.error('Email parsing error:', parseError.message);
195
+ }
196
+ });
197
+ });
198
+ msg.once('attributes', (attrs) => {
199
+ this.logger.debug(`Processing email ${seqno}:`, {
200
+ date: attrs.date,
201
+ flags: attrs.flags
202
+ });
203
+ });
204
+ msg.once('end', () => {
205
+ this.logger.debug(`Finished processing email ${seqno}`);
206
+ });
207
+ }
208
+ async _handleParsedEmail(email, seqno) {
209
+ try {
210
+ // First check if this is a system-sent email
211
+ const messageId = email.headers.get('message-id');
212
+ if (await this._isSystemSentEmail(messageId)) {
213
+ this.logger.debug(`Skipping system-sent email: ${messageId}`);
214
+ await this._removeFromSentMessages(messageId);
215
+ return;
216
+ }
217
+ // Check if it's a reply email
218
+ if (!this._isReplyEmail(email)) {
219
+ this.logger.debug(`Email ${seqno} is not a TaskPing reply`);
220
+ return;
221
+ }
222
+ // Extract session ID
223
+ const sessionId = this._extractSessionId(email);
224
+ if (!sessionId) {
225
+ this.logger.warn(`No session ID found in email ${seqno}`);
226
+ return;
227
+ }
228
+ // Validate session
229
+ const session = await this._validateSession(sessionId);
230
+ if (!session) {
231
+ this.logger.warn(`Invalid session ID in email ${seqno}: ${sessionId}`);
232
+ return;
233
+ }
234
+ // Extract command
235
+ const command = this._extractCommand(email);
236
+ if (!command) {
237
+ this.logger.warn(`No command found in email ${seqno}`);
238
+ return;
239
+ }
240
+ // Security check
241
+ if (!this._isCommandSafe(command)) {
242
+ this.logger.warn(`Unsafe command in email ${seqno}: ${command}`);
243
+ return;
244
+ }
245
+ // Emit command event
246
+ this.emit('command', {
247
+ sessionId,
248
+ command: command.trim(),
249
+ email: {
250
+ from: email.from?.text,
251
+ subject: email.subject,
252
+ date: email.date
253
+ },
254
+ session
255
+ });
256
+ this.logger.info(`Command extracted from email ${seqno}:`, {
257
+ sessionId,
258
+ command: command.substring(0, 100) + (command.length > 100 ? '...' : ''),
259
+ from: email.from?.text
260
+ });
261
+ }
262
+ catch (error) {
263
+ this.logger.error(`Error handling email ${seqno}:`, error.message);
264
+ }
265
+ }
266
+ _isReplyEmail(email) {
267
+ // Check if subject contains CCGram identifier
268
+ const subject = email.subject || '';
269
+ if (!subject.includes('[CCGram')) {
270
+ return false;
271
+ }
272
+ // Check if it's a reply (Re: or RE:)
273
+ const isReply = /^(Re:|RE:|Reply:)/i.test(subject);
274
+ if (isReply) {
275
+ return true;
276
+ }
277
+ // Check if session ID exists in email headers
278
+ const sessionId = this._extractSessionId(email);
279
+ return !!sessionId;
280
+ }
281
+ _extractSessionId(email) {
282
+ // Extract from email headers
283
+ const headers = email.headers;
284
+ if (headers && headers.get('x-ccgram-session-id')) {
285
+ return headers.get('x-ccgram-session-id');
286
+ }
287
+ // Extract token from subject line
288
+ const subject = email.subject || '';
289
+ const tokenMatch = subject.match(/\[CCGram #([A-Z0-9]{6,8})\]/);
290
+ if (tokenMatch) {
291
+ const token = tokenMatch[1];
292
+ // Look up session by token
293
+ return this._getSessionIdByToken(token);
294
+ }
295
+ // Extract from email body (as backup method)
296
+ const text = email.text || '';
297
+ const sessionMatch = text.match(/Session ID:\s*([a-f0-9-]{36})/i);
298
+ if (sessionMatch) {
299
+ return sessionMatch[1];
300
+ }
301
+ // Extract from quoted email
302
+ const html = email.html || '';
303
+ const htmlSessionMatch = html.match(/Session ID:\s*<code>([a-f0-9-]{36})<\/code>/i);
304
+ if (htmlSessionMatch) {
305
+ return htmlSessionMatch[1];
306
+ }
307
+ return null;
308
+ }
309
+ _getSessionIdByToken(token) {
310
+ // Check session files for matching token
311
+ try {
312
+ const sessionFiles = fs_1.default.readdirSync(this.sessionsDir);
313
+ for (const file of sessionFiles) {
314
+ if (file.endsWith('.json')) {
315
+ const sessionPath = path_1.default.join(this.sessionsDir, file);
316
+ const sessionData = JSON.parse(fs_1.default.readFileSync(sessionPath, 'utf8'));
317
+ if (sessionData.token === token) {
318
+ return sessionData.id;
319
+ }
320
+ }
321
+ }
322
+ }
323
+ catch (error) {
324
+ this.logger.error('Error looking up session by token:', error.message);
325
+ }
326
+ return null;
327
+ }
328
+ async _validateSession(sessionId) {
329
+ const sessionFile = path_1.default.join(this.sessionsDir, `${sessionId}.json`);
330
+ if (!fs_1.default.existsSync(sessionFile)) {
331
+ return null;
332
+ }
333
+ try {
334
+ const sessionData = JSON.parse(fs_1.default.readFileSync(sessionFile, 'utf8'));
335
+ // Check if session has expired
336
+ const now = new Date();
337
+ const expires = new Date(sessionData.expires);
338
+ if (now > expires) {
339
+ this.logger.debug(`Session ${sessionId} has expired`);
340
+ // Delete expired session
341
+ fs_1.default.unlinkSync(sessionFile);
342
+ return null;
343
+ }
344
+ // Check command count limit
345
+ if (sessionData.commandCount >= sessionData.maxCommands) {
346
+ this.logger.debug(`Session ${sessionId} has reached command limit`);
347
+ return null;
348
+ }
349
+ return sessionData;
350
+ }
351
+ catch (error) {
352
+ this.logger.error(`Error reading session ${sessionId}:`, error.message);
353
+ return null;
354
+ }
355
+ }
356
+ _extractCommand(email) {
357
+ let text = email.text || '';
358
+ // Remove email signature and quoted content
359
+ text = this._cleanEmailContent(text);
360
+ // Remove empty lines and excess whitespace
361
+ text = text.replace(/\n\s*\n/g, '\n').trim();
362
+ return text;
363
+ }
364
+ _cleanEmailContent(text) {
365
+ // Remove common email quote markers
366
+ const lines = text.split('\n');
367
+ const cleanLines = [];
368
+ for (const line of lines) {
369
+ // Check if reached original email start
370
+ if (line.includes('-----Original Message-----') ||
371
+ line.includes('--- Original Message ---') ||
372
+ line.includes('at') && line.includes('wrote:') ||
373
+ line.includes('On') && line.includes('wrote:') ||
374
+ line.match(/^>\s*/) || // Quote marker
375
+ line.includes('Session ID:')) {
376
+ break;
377
+ }
378
+ // Skip common email signatures
379
+ if (line.includes('--') ||
380
+ line.includes('Sent from') ||
381
+ line.includes('Sent from my')) {
382
+ break;
383
+ }
384
+ cleanLines.push(line);
385
+ }
386
+ return cleanLines.join('\n').trim();
387
+ }
388
+ _isCommandSafe(command) {
389
+ // Basic security check
390
+ if (command.length > 1000) {
391
+ return false;
392
+ }
393
+ // Dangerous command blacklist
394
+ const dangerousPatterns = [
395
+ /rm\s+-rf/i,
396
+ /sudo\s+/i,
397
+ /chmod\s+777/i,
398
+ />\s*\/dev\/null/i,
399
+ /curl.*\|\s*sh/i,
400
+ /wget.*\|\s*sh/i,
401
+ /eval\s*\(/i,
402
+ /exec\s*\(/i
403
+ ];
404
+ for (const pattern of dangerousPatterns) {
405
+ if (pattern.test(command)) {
406
+ return false;
407
+ }
408
+ }
409
+ return true;
410
+ }
411
+ async updateSessionCommandCount(sessionId) {
412
+ const sessionFile = path_1.default.join(this.sessionsDir, `${sessionId}.json`);
413
+ if (fs_1.default.existsSync(sessionFile)) {
414
+ try {
415
+ const sessionData = JSON.parse(fs_1.default.readFileSync(sessionFile, 'utf8'));
416
+ sessionData.commandCount = (sessionData.commandCount || 0) + 1;
417
+ sessionData.lastCommand = new Date().toISOString();
418
+ fs_1.default.writeFileSync(sessionFile, JSON.stringify(sessionData, null, 2));
419
+ this.logger.debug(`Updated command count for session ${sessionId}: ${sessionData.commandCount}`);
420
+ }
421
+ catch (error) {
422
+ this.logger.error(`Error updating session ${sessionId}:`, error.message);
423
+ }
424
+ }
425
+ }
426
+ async _isSystemSentEmail(messageId) {
427
+ if (!messageId || !fs_1.default.existsSync(this.sentMessagesPath)) {
428
+ return false;
429
+ }
430
+ try {
431
+ const sentMessages = JSON.parse(fs_1.default.readFileSync(this.sentMessagesPath, 'utf8'));
432
+ return sentMessages.messages.some(msg => msg.messageId === messageId);
433
+ }
434
+ catch (error) {
435
+ this.logger.error('Error reading sent messages:', error.message);
436
+ return false;
437
+ }
438
+ }
439
+ async _removeFromSentMessages(messageId) {
440
+ if (!fs_1.default.existsSync(this.sentMessagesPath)) {
441
+ return;
442
+ }
443
+ try {
444
+ const sentMessages = JSON.parse(fs_1.default.readFileSync(this.sentMessagesPath, 'utf8'));
445
+ sentMessages.messages = sentMessages.messages.filter(msg => msg.messageId !== messageId);
446
+ // Also clean up old messages (older than 24 hours)
447
+ const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
448
+ sentMessages.messages = sentMessages.messages.filter(msg => {
449
+ return new Date(msg.sentAt) > oneDayAgo;
450
+ });
451
+ fs_1.default.writeFileSync(this.sentMessagesPath, JSON.stringify(sentMessages, null, 2));
452
+ this.logger.debug(`Removed message ${messageId} from sent tracking`);
453
+ }
454
+ catch (error) {
455
+ this.logger.error('Error removing from sent messages:', error.message);
456
+ }
457
+ }
458
+ }
459
+ module.exports = EmailListener;
460
+ //# sourceMappingURL=email-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-listener.js","sourceRoot":"","sources":["../../../src/relay/email-listener.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * relay-pty.ts - Fixed version
4
+ * Uses node-imap instead of ImapFlow to resolve Feishu email compatibility issues
5
+ */
6
+ interface ParsedEmail {
7
+ uid?: number;
8
+ messageId?: string;
9
+ subject?: string;
10
+ text?: string;
11
+ date?: Date;
12
+ from?: {
13
+ text?: string;
14
+ };
15
+ }
16
+ declare function extractTokenFromSubject(subject?: string): string | null;
17
+ declare function cleanEmailText(text?: string): string;
18
+ declare function handleMailMessage(parsed: ParsedEmail): Promise<void>;
19
+ declare function startImap(): void;
20
+ export { startImap, handleMailMessage, extractTokenFromSubject, cleanEmailText };
21
+ //# sourceMappingURL=relay-pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-pty.d.ts","sourceRoot":"","sources":["../../../src/relay/relay-pty.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAyBH,UAAU,WAAW;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAyHD,iBAAS,uBAAuB,CAAC,OAAO,GAAE,MAAW,GAAG,MAAM,GAAG,IAAI,CAYpE;AAGD,iBAAS,cAAc,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM,CA4EjD;AA8MD,iBAAe,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GnE;AAGD,iBAAS,SAAS,IAAI,IAAI,CAqFzB;AAwKD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,cAAc,EAAE,CAAC"}