@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.
- package/.env.example +19 -0
- package/LICENSE +21 -0
- package/README.md +338 -0
- package/ccgram.service +24 -0
- package/config/channels.json +58 -0
- package/config/default.json +27 -0
- package/config/defaults/config.json +16 -0
- package/config/defaults/i18n.json +32 -0
- package/config/email-template.json +31 -0
- package/config/test-with-subagent.json +16 -0
- package/config/user.json +27 -0
- package/dist/claude-hook-notify.d.ts +7 -0
- package/dist/claude-hook-notify.d.ts.map +1 -0
- package/dist/claude-hook-notify.js +154 -0
- package/dist/claude-hook-notify.js.map +1 -0
- package/dist/claude-remote.d.ts +50 -0
- package/dist/claude-remote.d.ts.map +1 -0
- package/dist/claude-remote.js +927 -0
- package/dist/claude-remote.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +110 -0
- package/dist/cli.js.map +1 -0
- package/dist/enhanced-hook-notify.d.ts +16 -0
- package/dist/enhanced-hook-notify.d.ts.map +1 -0
- package/dist/enhanced-hook-notify.js +288 -0
- package/dist/enhanced-hook-notify.js.map +1 -0
- package/dist/permission-hook.d.ts +15 -0
- package/dist/permission-hook.d.ts.map +1 -0
- package/dist/permission-hook.js +357 -0
- package/dist/permission-hook.js.map +1 -0
- package/dist/prompt-bridge.d.ts +50 -0
- package/dist/prompt-bridge.d.ts.map +1 -0
- package/dist/prompt-bridge.js +173 -0
- package/dist/prompt-bridge.js.map +1 -0
- package/dist/question-notify.d.ts +16 -0
- package/dist/question-notify.d.ts.map +1 -0
- package/dist/question-notify.js +272 -0
- package/dist/question-notify.js.map +1 -0
- package/dist/setup.d.ts +10 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +649 -0
- package/dist/setup.js.map +1 -0
- package/dist/smart-monitor.d.ts +7 -0
- package/dist/smart-monitor.d.ts.map +1 -0
- package/dist/smart-monitor.js +256 -0
- package/dist/smart-monitor.js.map +1 -0
- package/dist/src/automation/claude-automation.d.ts +45 -0
- package/dist/src/automation/claude-automation.d.ts.map +1 -0
- package/dist/src/automation/claude-automation.js +367 -0
- package/dist/src/automation/claude-automation.js.map +1 -0
- package/dist/src/automation/clipboard-automation.d.ts +35 -0
- package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
- package/dist/src/automation/clipboard-automation.js +242 -0
- package/dist/src/automation/clipboard-automation.js.map +1 -0
- package/dist/src/automation/simple-automation.d.ts +56 -0
- package/dist/src/automation/simple-automation.d.ts.map +1 -0
- package/dist/src/automation/simple-automation.js +283 -0
- package/dist/src/automation/simple-automation.js.map +1 -0
- package/dist/src/channels/base/channel.d.ts +60 -0
- package/dist/src/channels/base/channel.d.ts.map +1 -0
- package/dist/src/channels/base/channel.js +96 -0
- package/dist/src/channels/base/channel.js.map +1 -0
- package/dist/src/channels/email/smtp.d.ts +74 -0
- package/dist/src/channels/email/smtp.d.ts.map +1 -0
- package/dist/src/channels/email/smtp.js +605 -0
- package/dist/src/channels/email/smtp.js.map +1 -0
- package/dist/src/channels/line/line.d.ts +36 -0
- package/dist/src/channels/line/line.d.ts.map +1 -0
- package/dist/src/channels/line/line.js +180 -0
- package/dist/src/channels/line/line.js.map +1 -0
- package/dist/src/channels/line/webhook.d.ts +55 -0
- package/dist/src/channels/line/webhook.d.ts.map +1 -0
- package/dist/src/channels/line/webhook.js +191 -0
- package/dist/src/channels/line/webhook.js.map +1 -0
- package/dist/src/channels/local/desktop.d.ts +30 -0
- package/dist/src/channels/local/desktop.d.ts.map +1 -0
- package/dist/src/channels/local/desktop.js +161 -0
- package/dist/src/channels/local/desktop.js.map +1 -0
- package/dist/src/channels/telegram/telegram.d.ts +43 -0
- package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
- package/dist/src/channels/telegram/telegram.js +223 -0
- package/dist/src/channels/telegram/telegram.js.map +1 -0
- package/dist/src/channels/telegram/webhook.d.ts +75 -0
- package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
- package/dist/src/channels/telegram/webhook.js +278 -0
- package/dist/src/channels/telegram/webhook.js.map +1 -0
- package/dist/src/config-manager.d.ts +16 -0
- package/dist/src/config-manager.d.ts.map +1 -0
- package/dist/src/config-manager.js +152 -0
- package/dist/src/config-manager.js.map +1 -0
- package/dist/src/core/config.d.ts +28 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +248 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/logger.d.ts +19 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +47 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/notifier.d.ts +45 -0
- package/dist/src/core/notifier.d.ts.map +1 -0
- package/dist/src/core/notifier.js +189 -0
- package/dist/src/core/notifier.js.map +1 -0
- package/dist/src/daemon/taskping-daemon.d.ts +38 -0
- package/dist/src/daemon/taskping-daemon.d.ts.map +1 -0
- package/dist/src/daemon/taskping-daemon.js +306 -0
- package/dist/src/daemon/taskping-daemon.js.map +1 -0
- package/dist/src/relay/claude-command-bridge.d.ts +57 -0
- package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
- package/dist/src/relay/claude-command-bridge.js +188 -0
- package/dist/src/relay/claude-command-bridge.js.map +1 -0
- package/dist/src/relay/command-relay.d.ts +94 -0
- package/dist/src/relay/command-relay.d.ts.map +1 -0
- package/dist/src/relay/command-relay.js +463 -0
- package/dist/src/relay/command-relay.js.map +1 -0
- package/dist/src/relay/email-listener.d.ts +65 -0
- package/dist/src/relay/email-listener.d.ts.map +1 -0
- package/dist/src/relay/email-listener.js +460 -0
- package/dist/src/relay/email-listener.js.map +1 -0
- package/dist/src/relay/relay-pty.d.ts +21 -0
- package/dist/src/relay/relay-pty.d.ts.map +1 -0
- package/dist/src/relay/relay-pty.js +696 -0
- package/dist/src/relay/relay-pty.js.map +1 -0
- package/dist/src/relay/smart-injector.d.ts +30 -0
- package/dist/src/relay/smart-injector.d.ts.map +1 -0
- package/dist/src/relay/smart-injector.js +233 -0
- package/dist/src/relay/smart-injector.js.map +1 -0
- package/dist/src/relay/tmux-injector.d.ts +46 -0
- package/dist/src/relay/tmux-injector.d.ts.map +1 -0
- package/dist/src/relay/tmux-injector.js +413 -0
- package/dist/src/relay/tmux-injector.js.map +1 -0
- package/dist/src/tools/config-manager.d.ts +33 -0
- package/dist/src/tools/config-manager.d.ts.map +1 -0
- package/dist/src/tools/config-manager.js +448 -0
- package/dist/src/tools/config-manager.js.map +1 -0
- package/dist/src/tools/installer.d.ts +38 -0
- package/dist/src/tools/installer.d.ts.map +1 -0
- package/dist/src/tools/installer.js +222 -0
- package/dist/src/tools/installer.js.map +1 -0
- package/dist/src/types/callbacks.d.ts +29 -0
- package/dist/src/types/callbacks.d.ts.map +1 -0
- package/dist/src/types/callbacks.js +7 -0
- package/dist/src/types/callbacks.js.map +1 -0
- package/dist/src/types/config.d.ts +56 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +6 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/hooks.d.ts +47 -0
- package/dist/src/types/hooks.d.ts.map +1 -0
- package/dist/src/types/hooks.js +6 -0
- package/dist/src/types/hooks.js.map +1 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +23 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/ipc.d.ts +43 -0
- package/dist/src/types/ipc.d.ts.map +1 -0
- package/dist/src/types/ipc.js +7 -0
- package/dist/src/types/ipc.js.map +1 -0
- package/dist/src/types/session.d.ts +70 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +9 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/telegram.d.ts +58 -0
- package/dist/src/types/telegram.d.ts.map +1 -0
- package/dist/src/types/telegram.js +6 -0
- package/dist/src/types/telegram.js.map +1 -0
- package/dist/src/utils/active-check.d.ts +19 -0
- package/dist/src/utils/active-check.d.ts.map +1 -0
- package/dist/src/utils/active-check.js +41 -0
- package/dist/src/utils/active-check.js.map +1 -0
- package/dist/src/utils/callback-parser.d.ts +21 -0
- package/dist/src/utils/callback-parser.d.ts.map +1 -0
- package/dist/src/utils/callback-parser.js +58 -0
- package/dist/src/utils/callback-parser.js.map +1 -0
- package/dist/src/utils/controller-injector.d.ts +21 -0
- package/dist/src/utils/controller-injector.d.ts.map +1 -0
- package/dist/src/utils/controller-injector.js +108 -0
- package/dist/src/utils/controller-injector.js.map +1 -0
- package/dist/src/utils/conversation-tracker.d.ts +32 -0
- package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
- package/dist/src/utils/conversation-tracker.js +119 -0
- package/dist/src/utils/conversation-tracker.js.map +1 -0
- package/dist/src/utils/http-request.d.ts +25 -0
- package/dist/src/utils/http-request.d.ts.map +1 -0
- package/dist/src/utils/http-request.js +66 -0
- package/dist/src/utils/http-request.js.map +1 -0
- package/dist/src/utils/optional-require.d.ts +13 -0
- package/dist/src/utils/optional-require.d.ts.map +1 -0
- package/dist/src/utils/optional-require.js +37 -0
- package/dist/src/utils/optional-require.js.map +1 -0
- package/dist/src/utils/paths.d.ts +11 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +28 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/pty-session-manager.d.ts +42 -0
- package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
- package/dist/src/utils/pty-session-manager.js +182 -0
- package/dist/src/utils/pty-session-manager.js.map +1 -0
- package/dist/src/utils/subagent-tracker.d.ts +64 -0
- package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
- package/dist/src/utils/subagent-tracker.js +191 -0
- package/dist/src/utils/subagent-tracker.js.map +1 -0
- package/dist/src/utils/tmux-monitor.d.ts +102 -0
- package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
- package/dist/src/utils/tmux-monitor.js +642 -0
- package/dist/src/utils/tmux-monitor.js.map +1 -0
- package/dist/src/utils/trace-capture.d.ts +42 -0
- package/dist/src/utils/trace-capture.d.ts.map +1 -0
- package/dist/src/utils/trace-capture.js +102 -0
- package/dist/src/utils/trace-capture.js.map +1 -0
- package/dist/start-all-webhooks.d.ts +7 -0
- package/dist/start-all-webhooks.d.ts.map +1 -0
- package/dist/start-all-webhooks.js +98 -0
- package/dist/start-all-webhooks.js.map +1 -0
- package/dist/start-line-webhook.d.ts +7 -0
- package/dist/start-line-webhook.d.ts.map +1 -0
- package/dist/start-line-webhook.js +59 -0
- package/dist/start-line-webhook.js.map +1 -0
- package/dist/start-relay-pty.d.ts +7 -0
- package/dist/start-relay-pty.d.ts.map +1 -0
- package/dist/start-relay-pty.js +173 -0
- package/dist/start-relay-pty.js.map +1 -0
- package/dist/start-telegram-webhook.d.ts +7 -0
- package/dist/start-telegram-webhook.d.ts.map +1 -0
- package/dist/start-telegram-webhook.js +80 -0
- package/dist/start-telegram-webhook.js.map +1 -0
- package/dist/user-prompt-hook.d.ts +13 -0
- package/dist/user-prompt-hook.d.ts.map +1 -0
- package/dist/user-prompt-hook.js +45 -0
- package/dist/user-prompt-hook.js.map +1 -0
- package/dist/workspace-router.d.ts +78 -0
- package/dist/workspace-router.d.ts.map +1 -0
- package/dist/workspace-router.js +408 -0
- package/dist/workspace-router.js.map +1 -0
- package/dist/workspace-telegram-bot.d.ts +3 -0
- package/dist/workspace-telegram-bot.d.ts.map +1 -0
- package/dist/workspace-telegram-bot.js +1172 -0
- package/dist/workspace-telegram-bot.js.map +1 -0
- package/package.json +80 -0
- package/src/types/callbacks.ts +39 -0
- package/src/types/config.ts +63 -0
- package/src/types/hooks.ts +50 -0
- package/src/types/index.ts +6 -0
- package/src/types/ipc.ts +55 -0
- package/src/types/session.ts +72 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|