@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,42 @@
1
+ /**
2
+ * Trace Capture Utility
3
+ * Tracks user input timestamps for smart execution trace capture
4
+ */
5
+ interface InputEntry {
6
+ timestamp: number;
7
+ date: string;
8
+ }
9
+ interface SessionTimestamps {
10
+ inputs: InputEntry[];
11
+ }
12
+ interface TimestampsMap {
13
+ [sessionName: string]: SessionTimestamps;
14
+ }
15
+ declare class TraceCapture {
16
+ dataDir: string;
17
+ timestampFile: string;
18
+ constructor();
19
+ _ensureDataDir(): void;
20
+ /**
21
+ * Load timestamp data
22
+ */
23
+ _loadTimestamps(): TimestampsMap;
24
+ /**
25
+ * Save timestamp data
26
+ */
27
+ _saveTimestamps(data: TimestampsMap): void;
28
+ /**
29
+ * Record user input timestamp for a session
30
+ */
31
+ recordUserInput(sessionName: string, timestamp?: number): void;
32
+ /**
33
+ * Get the most recent user input timestamp for a session
34
+ */
35
+ getLastUserInputTime(sessionName: string): number | null;
36
+ /**
37
+ * Clean up old session data (older than 7 days)
38
+ */
39
+ cleanup(): void;
40
+ }
41
+ export = TraceCapture;
42
+ //# sourceMappingURL=trace-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-capture.d.ts","sourceRoot":"","sources":["../../../src/utils/trace-capture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,UAAU,UAAU;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACvB,MAAM,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,UAAU,aAAa;IACnB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAAC;CAC5C;AAED,cAAM,YAAY;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;;IAQtB,cAAc,IAAI,IAAI;IAMtB;;OAEG;IACH,eAAe,IAAI,aAAa;IAYhC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAQ1C;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAAmB,GAAG,IAAI;IAsB1E;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWxD;;OAEG;IACH,OAAO,IAAI,IAAI;CAmBlB;AAED,SAAS,YAAY,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * Trace Capture Utility
4
+ * Tracks user input timestamps for smart execution trace capture
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const paths_1 = require("./paths");
12
+ class TraceCapture {
13
+ dataDir;
14
+ timestampFile;
15
+ constructor() {
16
+ this.dataDir = path_1.default.join(paths_1.PROJECT_ROOT, 'src/data');
17
+ this.timestampFile = path_1.default.join(this.dataDir, 'user-input-timestamps.json');
18
+ this._ensureDataDir();
19
+ }
20
+ _ensureDataDir() {
21
+ if (!fs_1.default.existsSync(this.dataDir)) {
22
+ fs_1.default.mkdirSync(this.dataDir, { recursive: true });
23
+ }
24
+ }
25
+ /**
26
+ * Load timestamp data
27
+ */
28
+ _loadTimestamps() {
29
+ try {
30
+ if (fs_1.default.existsSync(this.timestampFile)) {
31
+ const data = fs_1.default.readFileSync(this.timestampFile, 'utf8');
32
+ return JSON.parse(data);
33
+ }
34
+ }
35
+ catch (error) {
36
+ console.error('Failed to load timestamps:', error.message);
37
+ }
38
+ return {};
39
+ }
40
+ /**
41
+ * Save timestamp data
42
+ */
43
+ _saveTimestamps(data) {
44
+ try {
45
+ fs_1.default.writeFileSync(this.timestampFile, JSON.stringify(data, null, 2));
46
+ }
47
+ catch (error) {
48
+ console.error('Failed to save timestamps:', error.message);
49
+ }
50
+ }
51
+ /**
52
+ * Record user input timestamp for a session
53
+ */
54
+ recordUserInput(sessionName, timestamp = Date.now()) {
55
+ const timestamps = this._loadTimestamps();
56
+ if (!timestamps[sessionName]) {
57
+ timestamps[sessionName] = {
58
+ inputs: []
59
+ };
60
+ }
61
+ timestamps[sessionName].inputs.push({
62
+ timestamp: timestamp,
63
+ date: new Date(timestamp).toISOString()
64
+ });
65
+ // Keep only last 10 inputs per session to avoid growing too large
66
+ if (timestamps[sessionName].inputs.length > 10) {
67
+ timestamps[sessionName].inputs = timestamps[sessionName].inputs.slice(-10);
68
+ }
69
+ this._saveTimestamps(timestamps);
70
+ }
71
+ /**
72
+ * Get the most recent user input timestamp for a session
73
+ */
74
+ getLastUserInputTime(sessionName) {
75
+ const timestamps = this._loadTimestamps();
76
+ if (timestamps[sessionName] && timestamps[sessionName].inputs.length > 0) {
77
+ const lastInput = timestamps[sessionName].inputs[timestamps[sessionName].inputs.length - 1];
78
+ return lastInput.timestamp;
79
+ }
80
+ return null;
81
+ }
82
+ /**
83
+ * Clean up old session data (older than 7 days)
84
+ */
85
+ cleanup() {
86
+ const timestamps = this._loadTimestamps();
87
+ const now = Date.now();
88
+ const sevenDaysAgo = now - (7 * 24 * 60 * 60 * 1000);
89
+ for (const sessionName in timestamps) {
90
+ const session = timestamps[sessionName];
91
+ // Remove old inputs
92
+ session.inputs = session.inputs.filter(input => input.timestamp > sevenDaysAgo);
93
+ // Remove session if no inputs remain
94
+ if (session.inputs.length === 0) {
95
+ delete timestamps[sessionName];
96
+ }
97
+ }
98
+ this._saveTimestamps(timestamps);
99
+ }
100
+ }
101
+ module.exports = TraceCapture;
102
+ //# sourceMappingURL=trace-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-capture.js","sourceRoot":"","sources":["../../../src/utils/trace-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Multi-Platform Webhook Server
4
+ * Starts all enabled webhook servers (Telegram, LINE) in parallel
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-all-webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-all-webhooks.d.ts","sourceRoot":"","sources":["../start-all-webhooks.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Multi-Platform Webhook Server
5
+ * Starts all enabled webhook servers (Telegram, LINE) in parallel
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const child_process_1 = require("child_process");
12
+ const path_1 = __importDefault(require("path"));
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const dotenv_1 = __importDefault(require("dotenv"));
15
+ const paths_1 = require("./src/utils/paths");
16
+ // Load environment variables
17
+ const envPath = path_1.default.join(paths_1.PROJECT_ROOT, '.env');
18
+ if (fs_1.default.existsSync(envPath)) {
19
+ dotenv_1.default.config({ path: envPath });
20
+ }
21
+ console.log('\u{1F680} Starting Claude Code Remote Multi-Platform Webhook Server...\n');
22
+ const processes = [];
23
+ // Start Telegram webhook if enabled
24
+ if (process.env.TELEGRAM_ENABLED === 'true' && process.env.TELEGRAM_BOT_TOKEN) {
25
+ console.log('\u{1F4F1} Starting Telegram webhook server...');
26
+ const telegramProcess = (0, child_process_1.spawn)('node', [path_1.default.join(__dirname, 'start-telegram-webhook.js')], {
27
+ stdio: ['inherit', 'inherit', 'inherit'],
28
+ env: process.env
29
+ });
30
+ telegramProcess.on('exit', (code) => {
31
+ console.log(`\u{1F4F1} Telegram webhook server exited with code ${code}`);
32
+ });
33
+ processes.push({ name: 'Telegram', process: telegramProcess });
34
+ }
35
+ // Start LINE webhook if enabled
36
+ if (process.env.LINE_ENABLED === 'true' && process.env.LINE_CHANNEL_ACCESS_TOKEN) {
37
+ console.log('\u{1F4F1} Starting LINE webhook server...');
38
+ const lineProcess = (0, child_process_1.spawn)('node', [path_1.default.join(__dirname, 'start-line-webhook.js')], {
39
+ stdio: ['inherit', 'inherit', 'inherit'],
40
+ env: process.env
41
+ });
42
+ lineProcess.on('exit', (code) => {
43
+ console.log(`\u{1F4F1} LINE webhook server exited with code ${code}`);
44
+ });
45
+ processes.push({ name: 'LINE', process: lineProcess });
46
+ }
47
+ // Start Email daemon if enabled
48
+ if (process.env.EMAIL_ENABLED === 'true' && process.env.SMTP_USER) {
49
+ console.log('\u{1F4E7} Starting email daemon...');
50
+ const emailProcess = (0, child_process_1.spawn)('node', [path_1.default.join(__dirname, 'claude-remote.js'), 'daemon', 'start'], {
51
+ stdio: ['inherit', 'inherit', 'inherit'],
52
+ env: process.env
53
+ });
54
+ emailProcess.on('exit', (code) => {
55
+ console.log(`\u{1F4E7} Email daemon exited with code ${code}`);
56
+ });
57
+ processes.push({ name: 'Email', process: emailProcess });
58
+ }
59
+ if (processes.length === 0) {
60
+ console.log('\u274C No platforms enabled. Please configure at least one platform in .env file:');
61
+ console.log(' - Set TELEGRAM_ENABLED=true and configure TELEGRAM_BOT_TOKEN');
62
+ console.log(' - Set LINE_ENABLED=true and configure LINE_CHANNEL_ACCESS_TOKEN');
63
+ console.log(' - Set EMAIL_ENABLED=true and configure SMTP_USER');
64
+ console.log('\n Tip: run `npm run setup` for an interactive configuration wizard.');
65
+ process.exit(1);
66
+ }
67
+ console.log(`\n\u2705 Started ${processes.length} webhook server(s):`);
68
+ processes.forEach(p => {
69
+ console.log(` - ${p.name}`);
70
+ });
71
+ console.log('\n\u{1F4CB} Platform Command Formats:');
72
+ if (process.env.TELEGRAM_ENABLED === 'true') {
73
+ console.log(' Telegram: /cmd TOKEN123 <command>');
74
+ }
75
+ if (process.env.LINE_ENABLED === 'true') {
76
+ console.log(' LINE: Token TOKEN123 <command>');
77
+ }
78
+ if (process.env.EMAIL_ENABLED === 'true') {
79
+ console.log(' Email: Reply to notification emails');
80
+ }
81
+ console.log('\n\u{1F527} To stop all services, press Ctrl+C\n');
82
+ // Handle graceful shutdown
83
+ function shutdown() {
84
+ console.log('\n\u{1F6D1} Shutting down all webhook servers...');
85
+ processes.forEach(p => {
86
+ console.log(` Stopping ${p.name}...`);
87
+ p.process.kill('SIGTERM');
88
+ });
89
+ setTimeout(() => {
90
+ console.log('\u2705 All services stopped');
91
+ process.exit(0);
92
+ }, 2000);
93
+ }
94
+ process.on('SIGINT', shutdown);
95
+ process.on('SIGTERM', shutdown);
96
+ // Keep the main process alive
97
+ process.stdin.resume();
98
+ //# sourceMappingURL=start-all-webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-all-webhooks.js","sourceRoot":"","sources":["../start-all-webhooks.ts"],"names":[],"mappings":";;AAEA;;;GAGG;;;;;AAEH,iDAAoD;AACpD,gDAAwB;AACxB,4CAAoB;AACpB,oDAA4B;AAC5B,6CAAiD;AAEjD,6BAA6B;AAC7B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,MAAM,CAAC,CAAC;AAChD,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;AAOxF,MAAM,SAAS,GAAmB,EAAE,CAAC;AAErC,oCAAoC;AACpC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC,EAAE;QACvF,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;KACnB,CAAC,CAAC;IAEH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,gCAAgC;AAChC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,EAAE;QAC/E,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;KACnB,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,gCAAgC;AAChC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;QAC9F,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;KACnB,CAAC,CAAC;IAEH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,MAAM,qBAAqB,CAAC,CAAC;AACvE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;IAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AACrD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AACD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AACrD,CAAC;AACD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;AAEhE,2BAA2B;AAC3B,SAAS,QAAQ;IACb,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAEhE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAClB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,EAAE,IAAI,CAAC,CAAC;AACb,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,8BAA8B;AAC9B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * LINE Webhook Server
4
+ * Starts the LINE webhook server for receiving messages
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-line-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-line-webhook.d.ts","sourceRoot":"","sources":["../start-line-webhook.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * LINE Webhook Server
5
+ * Starts the LINE webhook server for receiving messages
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const dotenv_1 = __importDefault(require("dotenv"));
14
+ const paths_1 = require("./src/utils/paths");
15
+ const logger_1 = __importDefault(require("./src/core/logger"));
16
+ const LINEWebhookHandler = require('./src/channels/line/webhook');
17
+ // Load environment variables
18
+ const envPath = path_1.default.join(paths_1.PROJECT_ROOT, '.env');
19
+ if (fs_1.default.existsSync(envPath)) {
20
+ dotenv_1.default.config({ path: envPath });
21
+ }
22
+ const logger = new logger_1.default('LINE-Webhook-Server');
23
+ // Load configuration
24
+ const config = {
25
+ channelAccessToken: process.env.LINE_CHANNEL_ACCESS_TOKEN,
26
+ channelSecret: process.env.LINE_CHANNEL_SECRET,
27
+ userId: process.env.LINE_USER_ID,
28
+ groupId: process.env.LINE_GROUP_ID,
29
+ whitelist: process.env.LINE_WHITELIST ? process.env.LINE_WHITELIST.split(',').map(id => id.trim()) : [],
30
+ port: process.env.LINE_WEBHOOK_PORT || 3000
31
+ };
32
+ // Validate configuration
33
+ if (!config.channelAccessToken || !config.channelSecret) {
34
+ logger.error('LINE_CHANNEL_ACCESS_TOKEN and LINE_CHANNEL_SECRET must be set in .env file');
35
+ process.exit(1);
36
+ }
37
+ if (!config.userId && !config.groupId) {
38
+ logger.error('Either LINE_USER_ID or LINE_GROUP_ID must be set in .env file');
39
+ process.exit(1);
40
+ }
41
+ // Create and start webhook handler
42
+ const webhookHandler = new LINEWebhookHandler(config);
43
+ logger.info('Starting LINE webhook server...');
44
+ logger.info(`Configuration:`);
45
+ logger.info(`- Port: ${config.port}`);
46
+ logger.info(`- User ID: ${config.userId || 'Not set'}`);
47
+ logger.info(`- Group ID: ${config.groupId || 'Not set'}`);
48
+ logger.info(`- Whitelist: ${config.whitelist.length > 0 ? config.whitelist.join(', ') : 'None (using configured IDs)'}`);
49
+ webhookHandler.start(config.port);
50
+ // Handle graceful shutdown
51
+ process.on('SIGINT', () => {
52
+ logger.info('Shutting down LINE webhook server...');
53
+ process.exit(0);
54
+ });
55
+ process.on('SIGTERM', () => {
56
+ logger.info('Shutting down LINE webhook server...');
57
+ process.exit(0);
58
+ });
59
+ //# sourceMappingURL=start-line-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-line-webhook.js","sourceRoot":"","sources":["../start-line-webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CCGram PTY Relay Startup Script
4
+ * Start node-pty based email command relay service
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-relay-pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-relay-pty.d.ts","sourceRoot":"","sources":["../start-relay-pty.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * CCGram PTY Relay Startup Script
5
+ * Start node-pty based email command relay service
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const child_process_1 = require("child_process");
12
+ const path_1 = __importDefault(require("path"));
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const paths_1 = require("./src/utils/paths");
15
+ // Check environment configuration
16
+ function checkConfig() {
17
+ const envPath = path_1.default.join(paths_1.PROJECT_ROOT, '.env');
18
+ if (!fs_1.default.existsSync(envPath)) {
19
+ console.error('\u274C Error: .env configuration file not found');
20
+ console.log('\nPlease first copy .env.example to .env and configure your email information:');
21
+ console.log(' cp .env.example .env');
22
+ console.log(' Then edit .env file to fill in your email configuration\n');
23
+ process.exit(1);
24
+ }
25
+ // Load environment variables
26
+ require('dotenv').config({ path: envPath });
27
+ // Check required configuration
28
+ const required = ['IMAP_HOST', 'IMAP_USER', 'IMAP_PASS'];
29
+ const missing = required.filter(key => !process.env[key]);
30
+ if (missing.length > 0) {
31
+ console.error('\u274C Error: Missing required environment variables:');
32
+ missing.forEach(key => console.log(` - ${key}`));
33
+ console.log('\nPlease edit .env file and fill in all required configurations\n');
34
+ process.exit(1);
35
+ }
36
+ console.log('\u2705 Configuration check passed');
37
+ console.log(`\u{1F4E7} IMAP server: ${process.env.IMAP_HOST}`);
38
+ console.log(`\u{1F464} Email account: ${process.env.IMAP_USER}`);
39
+ console.log(`\u{1F512} Whitelist senders: ${process.env.ALLOWED_SENDERS || '(Not set, will accept all emails)'}`);
40
+ console.log(`\u{1F4BE} Session storage path: ${process.env.SESSION_MAP_PATH || '(Using default path)'}`);
41
+ console.log('');
42
+ }
43
+ // Create example session
44
+ function createExampleSession() {
45
+ const sessionMapPath = process.env.SESSION_MAP_PATH || path_1.default.join(paths_1.PROJECT_ROOT, 'src/data/session-map.json');
46
+ const sessionDir = path_1.default.dirname(sessionMapPath);
47
+ // Ensure directory exists
48
+ if (!fs_1.default.existsSync(sessionDir)) {
49
+ fs_1.default.mkdirSync(sessionDir, { recursive: true });
50
+ }
51
+ // If session file doesn't exist, create an example
52
+ if (!fs_1.default.existsSync(sessionMapPath)) {
53
+ const exampleToken = 'TEST123';
54
+ const exampleSession = {
55
+ [exampleToken]: {
56
+ type: 'pty',
57
+ createdAt: Math.floor(Date.now() / 1000),
58
+ expiresAt: Math.floor((Date.now() + 24 * 60 * 60 * 1000) / 1000),
59
+ cwd: process.cwd(),
60
+ description: 'Test session - Include [CCGram #TEST123] in email subject when sending'
61
+ }
62
+ };
63
+ fs_1.default.writeFileSync(sessionMapPath, JSON.stringify(exampleSession, null, 2));
64
+ console.log(`\u{1F4DD} Created example session file: ${sessionMapPath}`);
65
+ console.log(`\u{1F511} Test Token: ${exampleToken}`);
66
+ console.log(' When sending test email, include in subject: [CCGram #TEST123]');
67
+ console.log('');
68
+ }
69
+ }
70
+ // PID file path
71
+ const PID_FILE = path_1.default.join(paths_1.PROJECT_ROOT, 'relay-pty.pid');
72
+ // Check if an instance is already running
73
+ function checkSingleInstance() {
74
+ if (fs_1.default.existsSync(PID_FILE)) {
75
+ try {
76
+ const oldPid = parseInt(fs_1.default.readFileSync(PID_FILE, 'utf8'));
77
+ // Check if process is actually running
78
+ process.kill(oldPid, 0);
79
+ // If no error thrown, process is still running
80
+ console.error('\u274C Error: relay-pty service is already running (PID: ' + oldPid + ')');
81
+ console.log('\nIf you\'re sure the service is not running, you can delete the PID file:');
82
+ console.log(' rm ' + PID_FILE);
83
+ console.log('\nOr stop existing service:');
84
+ console.log(' kill ' + oldPid);
85
+ process.exit(1);
86
+ }
87
+ catch {
88
+ // Process doesn't exist, delete old PID file
89
+ fs_1.default.unlinkSync(PID_FILE);
90
+ }
91
+ }
92
+ // Write current process PID
93
+ fs_1.default.writeFileSync(PID_FILE, process.pid.toString());
94
+ }
95
+ // Clean up PID file
96
+ function cleanupPidFile() {
97
+ if (fs_1.default.existsSync(PID_FILE)) {
98
+ fs_1.default.unlinkSync(PID_FILE);
99
+ }
100
+ }
101
+ // Start service
102
+ function startService() {
103
+ // Check single instance
104
+ checkSingleInstance();
105
+ console.log('\u{1F680} Starting CCGram PTY Relay service...\n');
106
+ const relayPath = path_1.default.join(__dirname, 'src/relay/relay-pty.js');
107
+ // Use node to run directly, so we can see complete log output
108
+ const relay = (0, child_process_1.spawn)('node', [relayPath], {
109
+ stdio: 'inherit',
110
+ env: {
111
+ ...process.env,
112
+ INJECTION_MODE: 'pty'
113
+ }
114
+ });
115
+ // Handle exit
116
+ process.on('SIGINT', () => {
117
+ console.log('\n\u23F9\uFE0F Stopping service...');
118
+ relay.kill('SIGINT');
119
+ cleanupPidFile();
120
+ process.exit(0);
121
+ });
122
+ process.on('exit', cleanupPidFile);
123
+ process.on('SIGTERM', cleanupPidFile);
124
+ relay.on('error', (error) => {
125
+ console.error('\u274C Startup failed:', error.message);
126
+ cleanupPidFile();
127
+ process.exit(1);
128
+ });
129
+ relay.on('exit', (code, signal) => {
130
+ cleanupPidFile();
131
+ if (signal) {
132
+ console.log(`\nService stopped (signal: ${signal})`);
133
+ }
134
+ else if (code !== 0) {
135
+ console.error(`\nService exited abnormally (code: ${code})`);
136
+ process.exit(code ?? 1);
137
+ }
138
+ });
139
+ }
140
+ // Show usage instructions
141
+ function showInstructions() {
142
+ console.log('\u{1F4D6} Usage instructions:');
143
+ console.log('1. When executing tasks in Claude Code, reminder emails containing Token will be sent');
144
+ console.log('2. Reply to that email with the commands to execute');
145
+ console.log('3. Supported command formats:');
146
+ console.log(' - Enter command text directly');
147
+ console.log(' - Use CMD: prefix, like "CMD: continue"');
148
+ console.log(' - Use code block wrapping, like:');
149
+ console.log(' ```');
150
+ console.log(' your command');
151
+ console.log(' ```');
152
+ console.log('4. System will automatically extract commands and inject them into corresponding Claude Code session');
153
+ console.log('\n\u2328\uFE0F Press Ctrl+C to stop service\n');
154
+ console.log('\u2501'.repeat(60) + '\n');
155
+ }
156
+ // Main function
157
+ function main() {
158
+ console.log('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557');
159
+ console.log('\u2551 CCGram PTY Relay Service \u2551');
160
+ console.log('\u2551 Email Command Relay Service - node-pty based PTY mode \u2551');
161
+ console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n');
162
+ // Check configuration
163
+ checkConfig();
164
+ // Create example session
165
+ createExampleSession();
166
+ // Show usage instructions
167
+ showInstructions();
168
+ // Start service
169
+ startService();
170
+ }
171
+ // Run
172
+ main();
173
+ //# sourceMappingURL=start-relay-pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-relay-pty.js","sourceRoot":"","sources":["../start-relay-pty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Telegram Webhook Server
4
+ * Starts the Telegram webhook server for receiving messages
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-telegram-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-telegram-webhook.d.ts","sourceRoot":"","sources":["../start-telegram-webhook.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Telegram Webhook Server
5
+ * Starts the Telegram webhook server for receiving messages
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const dotenv_1 = __importDefault(require("dotenv"));
14
+ const paths_1 = require("./src/utils/paths");
15
+ const logger_1 = __importDefault(require("./src/core/logger"));
16
+ const TelegramWebhookHandler = require('./src/channels/telegram/webhook');
17
+ // Load environment variables
18
+ const envPath = path_1.default.join(paths_1.PROJECT_ROOT, '.env');
19
+ if (fs_1.default.existsSync(envPath)) {
20
+ dotenv_1.default.config({ path: envPath });
21
+ }
22
+ const logger = new logger_1.default('Telegram-Webhook-Server');
23
+ // Load configuration
24
+ const config = {
25
+ botToken: process.env.TELEGRAM_BOT_TOKEN,
26
+ chatId: process.env.TELEGRAM_CHAT_ID,
27
+ groupId: process.env.TELEGRAM_GROUP_ID,
28
+ whitelist: process.env.TELEGRAM_WHITELIST ? process.env.TELEGRAM_WHITELIST.split(',').map(id => id.trim()) : [],
29
+ port: process.env.TELEGRAM_WEBHOOK_PORT || 3001,
30
+ webhookUrl: process.env.TELEGRAM_WEBHOOK_URL
31
+ };
32
+ // Validate configuration
33
+ if (!config.botToken) {
34
+ logger.error('TELEGRAM_BOT_TOKEN must be set in .env file');
35
+ process.exit(1);
36
+ }
37
+ if (!config.chatId && !config.groupId) {
38
+ logger.error('Either TELEGRAM_CHAT_ID or TELEGRAM_GROUP_ID must be set in .env file');
39
+ process.exit(1);
40
+ }
41
+ // Create and start webhook handler
42
+ const webhookHandler = new TelegramWebhookHandler(config);
43
+ async function start() {
44
+ logger.info('Starting Telegram webhook server...');
45
+ logger.info(`Configuration:`);
46
+ logger.info(`- Port: ${config.port}`);
47
+ logger.info(`- Chat ID: ${config.chatId || 'Not set'}`);
48
+ logger.info(`- Group ID: ${config.groupId || 'Not set'}`);
49
+ logger.info(`- Whitelist: ${config.whitelist.length > 0 ? config.whitelist.join(', ') : 'None (using configured IDs)'}`);
50
+ // Set webhook if URL is provided
51
+ if (config.webhookUrl) {
52
+ try {
53
+ const webhookEndpoint = `${config.webhookUrl}/webhook/telegram`;
54
+ logger.info(`Setting webhook to: ${webhookEndpoint}`);
55
+ await webhookHandler.setWebhook(webhookEndpoint);
56
+ }
57
+ catch (error) {
58
+ logger.error('Failed to set webhook:', error.message);
59
+ logger.info('You can manually set the webhook using:');
60
+ logger.info(`curl -X POST https://api.telegram.org/bot${config.botToken}/setWebhook -d "url=${config.webhookUrl}/webhook/telegram"`);
61
+ }
62
+ }
63
+ else {
64
+ logger.warn('TELEGRAM_WEBHOOK_URL not set. Please set the webhook manually.');
65
+ logger.info('To set webhook manually, use:');
66
+ logger.info(`curl -X POST https://api.telegram.org/bot${config.botToken}/setWebhook -d "url=https://your-domain.com/webhook/telegram"`);
67
+ }
68
+ webhookHandler.start(config.port);
69
+ }
70
+ start();
71
+ // Handle graceful shutdown
72
+ process.on('SIGINT', () => {
73
+ logger.info('Shutting down Telegram webhook server...');
74
+ process.exit(0);
75
+ });
76
+ process.on('SIGTERM', () => {
77
+ logger.info('Shutting down Telegram webhook server...');
78
+ process.exit(0);
79
+ });
80
+ //# sourceMappingURL=start-telegram-webhook.js.map