@selucas12/cheesy 2.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 (292) hide show
  1. package/.env.example +22 -0
  2. package/CHANGELOG.md +268 -0
  3. package/LICENSE +21 -0
  4. package/README.md +394 -0
  5. package/ccgram.service +24 -0
  6. package/config/channels.json +58 -0
  7. package/config/default.json +27 -0
  8. package/config/defaults/config.json +16 -0
  9. package/config/defaults/i18n.json +32 -0
  10. package/config/email-template.json +31 -0
  11. package/config/test-with-subagent.json +16 -0
  12. package/config/user.json +27 -0
  13. package/dist/claude-hook-notify.d.ts +7 -0
  14. package/dist/claude-hook-notify.d.ts.map +1 -0
  15. package/dist/claude-hook-notify.js +154 -0
  16. package/dist/claude-hook-notify.js.map +1 -0
  17. package/dist/claude-remote.d.ts +50 -0
  18. package/dist/claude-remote.d.ts.map +1 -0
  19. package/dist/claude-remote.js +927 -0
  20. package/dist/claude-remote.js.map +1 -0
  21. package/dist/elicitation-notify.d.ts +20 -0
  22. package/dist/elicitation-notify.d.ts.map +1 -0
  23. package/dist/elicitation-notify.js +241 -0
  24. package/dist/elicitation-notify.js.map +1 -0
  25. package/dist/enhanced-hook-notify.d.ts +23 -0
  26. package/dist/enhanced-hook-notify.d.ts.map +1 -0
  27. package/dist/enhanced-hook-notify.js +402 -0
  28. package/dist/enhanced-hook-notify.js.map +1 -0
  29. package/dist/permission-denied-notify.d.ts +11 -0
  30. package/dist/permission-denied-notify.d.ts.map +1 -0
  31. package/dist/permission-denied-notify.js +193 -0
  32. package/dist/permission-denied-notify.js.map +1 -0
  33. package/dist/permission-hook.d.ts +15 -0
  34. package/dist/permission-hook.d.ts.map +1 -0
  35. package/dist/permission-hook.js +386 -0
  36. package/dist/permission-hook.js.map +1 -0
  37. package/dist/pre-compact-notify.d.ts +13 -0
  38. package/dist/pre-compact-notify.d.ts.map +1 -0
  39. package/dist/pre-compact-notify.js +197 -0
  40. package/dist/pre-compact-notify.js.map +1 -0
  41. package/dist/prompt-bridge.d.ts +50 -0
  42. package/dist/prompt-bridge.d.ts.map +1 -0
  43. package/dist/prompt-bridge.js +173 -0
  44. package/dist/prompt-bridge.js.map +1 -0
  45. package/dist/question-notify.d.ts +17 -0
  46. package/dist/question-notify.d.ts.map +1 -0
  47. package/dist/question-notify.js +356 -0
  48. package/dist/question-notify.js.map +1 -0
  49. package/dist/setup.d.ts +10 -0
  50. package/dist/setup.d.ts.map +1 -0
  51. package/dist/setup.js +649 -0
  52. package/dist/setup.js.map +1 -0
  53. package/dist/smart-monitor.d.ts +7 -0
  54. package/dist/smart-monitor.d.ts.map +1 -0
  55. package/dist/smart-monitor.js +256 -0
  56. package/dist/smart-monitor.js.map +1 -0
  57. package/dist/src/automation/clipboard-automation.d.ts +35 -0
  58. package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
  59. package/dist/src/automation/clipboard-automation.js +242 -0
  60. package/dist/src/automation/clipboard-automation.js.map +1 -0
  61. package/dist/src/channels/base/channel.d.ts +60 -0
  62. package/dist/src/channels/base/channel.d.ts.map +1 -0
  63. package/dist/src/channels/base/channel.js +96 -0
  64. package/dist/src/channels/base/channel.js.map +1 -0
  65. package/dist/src/channels/email/smtp.d.ts +74 -0
  66. package/dist/src/channels/email/smtp.d.ts.map +1 -0
  67. package/dist/src/channels/email/smtp.js +605 -0
  68. package/dist/src/channels/email/smtp.js.map +1 -0
  69. package/dist/src/channels/line/line.d.ts +36 -0
  70. package/dist/src/channels/line/line.d.ts.map +1 -0
  71. package/dist/src/channels/line/line.js +180 -0
  72. package/dist/src/channels/line/line.js.map +1 -0
  73. package/dist/src/channels/line/webhook.d.ts +55 -0
  74. package/dist/src/channels/line/webhook.d.ts.map +1 -0
  75. package/dist/src/channels/line/webhook.js +191 -0
  76. package/dist/src/channels/line/webhook.js.map +1 -0
  77. package/dist/src/channels/local/desktop.d.ts +30 -0
  78. package/dist/src/channels/local/desktop.d.ts.map +1 -0
  79. package/dist/src/channels/local/desktop.js +161 -0
  80. package/dist/src/channels/local/desktop.js.map +1 -0
  81. package/dist/src/channels/telegram/telegram.d.ts +43 -0
  82. package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
  83. package/dist/src/channels/telegram/telegram.js +223 -0
  84. package/dist/src/channels/telegram/telegram.js.map +1 -0
  85. package/dist/src/channels/telegram/webhook.d.ts +75 -0
  86. package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
  87. package/dist/src/channels/telegram/webhook.js +278 -0
  88. package/dist/src/channels/telegram/webhook.js.map +1 -0
  89. package/dist/src/cli.d.ts +9 -0
  90. package/dist/src/cli.d.ts.map +1 -0
  91. package/dist/src/cli.js +99 -0
  92. package/dist/src/cli.js.map +1 -0
  93. package/dist/src/commands/hooks.d.ts +10 -0
  94. package/dist/src/commands/hooks.d.ts.map +1 -0
  95. package/dist/src/commands/hooks.js +50 -0
  96. package/dist/src/commands/hooks.js.map +1 -0
  97. package/dist/src/commands/init.d.ts +20 -0
  98. package/dist/src/commands/init.d.ts.map +1 -0
  99. package/dist/src/commands/init.js +173 -0
  100. package/dist/src/commands/init.js.map +1 -0
  101. package/dist/src/commands/license.d.ts +15 -0
  102. package/dist/src/commands/license.d.ts.map +1 -0
  103. package/dist/src/commands/license.js +107 -0
  104. package/dist/src/commands/license.js.map +1 -0
  105. package/dist/src/commands/start.d.ts +17 -0
  106. package/dist/src/commands/start.d.ts.map +1 -0
  107. package/dist/src/commands/start.js +150 -0
  108. package/dist/src/commands/start.js.map +1 -0
  109. package/dist/src/commands/status.d.ts +8 -0
  110. package/dist/src/commands/status.d.ts.map +1 -0
  111. package/dist/src/commands/status.js +95 -0
  112. package/dist/src/commands/status.js.map +1 -0
  113. package/dist/src/commands/stop.d.ts +8 -0
  114. package/dist/src/commands/stop.d.ts.map +1 -0
  115. package/dist/src/commands/stop.js +64 -0
  116. package/dist/src/commands/stop.js.map +1 -0
  117. package/dist/src/config-manager.d.ts +16 -0
  118. package/dist/src/config-manager.d.ts.map +1 -0
  119. package/dist/src/config-manager.js +152 -0
  120. package/dist/src/config-manager.js.map +1 -0
  121. package/dist/src/core/config.d.ts +28 -0
  122. package/dist/src/core/config.d.ts.map +1 -0
  123. package/dist/src/core/config.js +248 -0
  124. package/dist/src/core/config.js.map +1 -0
  125. package/dist/src/core/logger.d.ts +19 -0
  126. package/dist/src/core/logger.d.ts.map +1 -0
  127. package/dist/src/core/logger.js +47 -0
  128. package/dist/src/core/logger.js.map +1 -0
  129. package/dist/src/core/notifier.d.ts +45 -0
  130. package/dist/src/core/notifier.d.ts.map +1 -0
  131. package/dist/src/core/notifier.js +189 -0
  132. package/dist/src/core/notifier.js.map +1 -0
  133. package/dist/src/lib/license-validator.d.ts +120 -0
  134. package/dist/src/lib/license-validator.d.ts.map +1 -0
  135. package/dist/src/lib/license-validator.js +294 -0
  136. package/dist/src/lib/license-validator.js.map +1 -0
  137. package/dist/src/lib/preflight.d.ts +28 -0
  138. package/dist/src/lib/preflight.d.ts.map +1 -0
  139. package/dist/src/lib/preflight.js +90 -0
  140. package/dist/src/lib/preflight.js.map +1 -0
  141. package/dist/src/relay/claude-command-bridge.d.ts +57 -0
  142. package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
  143. package/dist/src/relay/claude-command-bridge.js +188 -0
  144. package/dist/src/relay/claude-command-bridge.js.map +1 -0
  145. package/dist/src/relay/email-listener.d.ts +65 -0
  146. package/dist/src/relay/email-listener.d.ts.map +1 -0
  147. package/dist/src/relay/email-listener.js +460 -0
  148. package/dist/src/relay/email-listener.js.map +1 -0
  149. package/dist/src/relay/relay-pty.d.ts +21 -0
  150. package/dist/src/relay/relay-pty.d.ts.map +1 -0
  151. package/dist/src/relay/relay-pty.js +696 -0
  152. package/dist/src/relay/relay-pty.js.map +1 -0
  153. package/dist/src/relay/smart-injector.d.ts +30 -0
  154. package/dist/src/relay/smart-injector.d.ts.map +1 -0
  155. package/dist/src/relay/smart-injector.js +233 -0
  156. package/dist/src/relay/smart-injector.js.map +1 -0
  157. package/dist/src/relay/tmux-injector.d.ts +46 -0
  158. package/dist/src/relay/tmux-injector.d.ts.map +1 -0
  159. package/dist/src/relay/tmux-injector.js +413 -0
  160. package/dist/src/relay/tmux-injector.js.map +1 -0
  161. package/dist/src/tools/config-manager.d.ts +33 -0
  162. package/dist/src/tools/config-manager.d.ts.map +1 -0
  163. package/dist/src/tools/config-manager.js +448 -0
  164. package/dist/src/tools/config-manager.js.map +1 -0
  165. package/dist/src/tools/installer.d.ts +38 -0
  166. package/dist/src/tools/installer.d.ts.map +1 -0
  167. package/dist/src/tools/installer.js +222 -0
  168. package/dist/src/tools/installer.js.map +1 -0
  169. package/dist/src/types/callbacks.d.ts +53 -0
  170. package/dist/src/types/callbacks.d.ts.map +1 -0
  171. package/dist/src/types/callbacks.js +7 -0
  172. package/dist/src/types/callbacks.js.map +1 -0
  173. package/dist/src/types/config.d.ts +56 -0
  174. package/dist/src/types/config.d.ts.map +1 -0
  175. package/dist/src/types/config.js +6 -0
  176. package/dist/src/types/config.js.map +1 -0
  177. package/dist/src/types/hooks.d.ts +47 -0
  178. package/dist/src/types/hooks.d.ts.map +1 -0
  179. package/dist/src/types/hooks.js +6 -0
  180. package/dist/src/types/hooks.js.map +1 -0
  181. package/dist/src/types/index.d.ts +7 -0
  182. package/dist/src/types/index.d.ts.map +1 -0
  183. package/dist/src/types/index.js +23 -0
  184. package/dist/src/types/index.js.map +1 -0
  185. package/dist/src/types/ipc.d.ts +43 -0
  186. package/dist/src/types/ipc.d.ts.map +1 -0
  187. package/dist/src/types/ipc.js +7 -0
  188. package/dist/src/types/ipc.js.map +1 -0
  189. package/dist/src/types/session.d.ts +87 -0
  190. package/dist/src/types/session.d.ts.map +1 -0
  191. package/dist/src/types/session.js +9 -0
  192. package/dist/src/types/session.js.map +1 -0
  193. package/dist/src/types/telegram.d.ts +58 -0
  194. package/dist/src/types/telegram.d.ts.map +1 -0
  195. package/dist/src/types/telegram.js +6 -0
  196. package/dist/src/types/telegram.js.map +1 -0
  197. package/dist/src/utils/active-check.d.ts +20 -0
  198. package/dist/src/utils/active-check.d.ts.map +1 -0
  199. package/dist/src/utils/active-check.js +42 -0
  200. package/dist/src/utils/active-check.js.map +1 -0
  201. package/dist/src/utils/callback-parser.d.ts +23 -0
  202. package/dist/src/utils/callback-parser.d.ts.map +1 -0
  203. package/dist/src/utils/callback-parser.js +85 -0
  204. package/dist/src/utils/callback-parser.js.map +1 -0
  205. package/dist/src/utils/controller-injector.d.ts +21 -0
  206. package/dist/src/utils/controller-injector.d.ts.map +1 -0
  207. package/dist/src/utils/controller-injector.js +108 -0
  208. package/dist/src/utils/controller-injector.js.map +1 -0
  209. package/dist/src/utils/conversation-tracker.d.ts +32 -0
  210. package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
  211. package/dist/src/utils/conversation-tracker.js +119 -0
  212. package/dist/src/utils/conversation-tracker.js.map +1 -0
  213. package/dist/src/utils/deep-link.d.ts +22 -0
  214. package/dist/src/utils/deep-link.d.ts.map +1 -0
  215. package/dist/src/utils/deep-link.js +43 -0
  216. package/dist/src/utils/deep-link.js.map +1 -0
  217. package/dist/src/utils/ghostty-session-manager.d.ts +81 -0
  218. package/dist/src/utils/ghostty-session-manager.d.ts.map +1 -0
  219. package/dist/src/utils/ghostty-session-manager.js +370 -0
  220. package/dist/src/utils/ghostty-session-manager.js.map +1 -0
  221. package/dist/src/utils/hook-definitions.d.ts +25 -0
  222. package/dist/src/utils/hook-definitions.d.ts.map +1 -0
  223. package/dist/src/utils/hook-definitions.js +36 -0
  224. package/dist/src/utils/hook-definitions.js.map +1 -0
  225. package/dist/src/utils/http-request.d.ts +25 -0
  226. package/dist/src/utils/http-request.d.ts.map +1 -0
  227. package/dist/src/utils/http-request.js +66 -0
  228. package/dist/src/utils/http-request.js.map +1 -0
  229. package/dist/src/utils/optional-require.d.ts +13 -0
  230. package/dist/src/utils/optional-require.d.ts.map +1 -0
  231. package/dist/src/utils/optional-require.js +37 -0
  232. package/dist/src/utils/optional-require.js.map +1 -0
  233. package/dist/src/utils/paths.d.ts +13 -0
  234. package/dist/src/utils/paths.d.ts.map +1 -0
  235. package/dist/src/utils/paths.js +30 -0
  236. package/dist/src/utils/paths.js.map +1 -0
  237. package/dist/src/utils/pty-session-manager.d.ts +43 -0
  238. package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
  239. package/dist/src/utils/pty-session-manager.js +183 -0
  240. package/dist/src/utils/pty-session-manager.js.map +1 -0
  241. package/dist/src/utils/subagent-tracker.d.ts +64 -0
  242. package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
  243. package/dist/src/utils/subagent-tracker.js +191 -0
  244. package/dist/src/utils/subagent-tracker.js.map +1 -0
  245. package/dist/src/utils/tmux-monitor.d.ts +102 -0
  246. package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
  247. package/dist/src/utils/tmux-monitor.js +642 -0
  248. package/dist/src/utils/tmux-monitor.js.map +1 -0
  249. package/dist/src/utils/trace-capture.d.ts +42 -0
  250. package/dist/src/utils/trace-capture.d.ts.map +1 -0
  251. package/dist/src/utils/trace-capture.js +102 -0
  252. package/dist/src/utils/trace-capture.js.map +1 -0
  253. package/dist/src/utils/transcript-reader.d.ts +57 -0
  254. package/dist/src/utils/transcript-reader.d.ts.map +1 -0
  255. package/dist/src/utils/transcript-reader.js +229 -0
  256. package/dist/src/utils/transcript-reader.js.map +1 -0
  257. package/dist/start-all-webhooks.d.ts +7 -0
  258. package/dist/start-all-webhooks.d.ts.map +1 -0
  259. package/dist/start-all-webhooks.js +98 -0
  260. package/dist/start-all-webhooks.js.map +1 -0
  261. package/dist/start-line-webhook.d.ts +7 -0
  262. package/dist/start-line-webhook.d.ts.map +1 -0
  263. package/dist/start-line-webhook.js +59 -0
  264. package/dist/start-line-webhook.js.map +1 -0
  265. package/dist/start-relay-pty.d.ts +7 -0
  266. package/dist/start-relay-pty.d.ts.map +1 -0
  267. package/dist/start-relay-pty.js +173 -0
  268. package/dist/start-relay-pty.js.map +1 -0
  269. package/dist/start-telegram-webhook.d.ts +7 -0
  270. package/dist/start-telegram-webhook.d.ts.map +1 -0
  271. package/dist/start-telegram-webhook.js +80 -0
  272. package/dist/start-telegram-webhook.js.map +1 -0
  273. package/dist/user-prompt-hook.d.ts +13 -0
  274. package/dist/user-prompt-hook.d.ts.map +1 -0
  275. package/dist/user-prompt-hook.js +45 -0
  276. package/dist/user-prompt-hook.js.map +1 -0
  277. package/dist/workspace-router.d.ts +114 -0
  278. package/dist/workspace-router.d.ts.map +1 -0
  279. package/dist/workspace-router.js +572 -0
  280. package/dist/workspace-router.js.map +1 -0
  281. package/dist/workspace-telegram-bot.d.ts +3 -0
  282. package/dist/workspace-telegram-bot.d.ts.map +1 -0
  283. package/dist/workspace-telegram-bot.js +1847 -0
  284. package/dist/workspace-telegram-bot.js.map +1 -0
  285. package/package.json +85 -0
  286. package/src/types/callbacks.ts +73 -0
  287. package/src/types/config.ts +63 -0
  288. package/src/types/hooks.ts +50 -0
  289. package/src/types/index.ts +6 -0
  290. package/src/types/ipc.ts +55 -0
  291. package/src/types/session.ts +91 -0
  292. 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"}