@jsayubi/ccgram 1.0.0 ā 1.0.2
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/package.json +1 -2
- package/dist/src/automation/claude-automation.d.ts +0 -45
- package/dist/src/automation/claude-automation.d.ts.map +0 -1
- package/dist/src/automation/claude-automation.js +0 -367
- package/dist/src/automation/claude-automation.js.map +0 -1
- package/dist/src/automation/simple-automation.d.ts +0 -56
- package/dist/src/automation/simple-automation.d.ts.map +0 -1
- package/dist/src/automation/simple-automation.js +0 -283
- package/dist/src/automation/simple-automation.js.map +0 -1
- package/dist/src/daemon/taskping-daemon.d.ts +0 -38
- package/dist/src/daemon/taskping-daemon.d.ts.map +0 -1
- package/dist/src/daemon/taskping-daemon.js +0 -306
- package/dist/src/daemon/taskping-daemon.js.map +0 -1
- package/dist/src/relay/command-relay.d.ts +0 -94
- package/dist/src/relay/command-relay.d.ts.map +0 -1
- package/dist/src/relay/command-relay.js +0 -463
- package/dist/src/relay/command-relay.js.map +0 -1
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Simple Automation Solution
|
|
4
|
-
* Use simpler methods to handle email reply commands
|
|
5
|
-
*/
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
|
-
const child_process_1 = require("child_process");
|
|
10
|
-
const fs_1 = __importDefault(require("fs"));
|
|
11
|
-
const path_1 = __importDefault(require("path"));
|
|
12
|
-
const logger_1 = __importDefault(require("../core/logger"));
|
|
13
|
-
class SimpleAutomation {
|
|
14
|
-
logger;
|
|
15
|
-
commandFile;
|
|
16
|
-
notificationSent;
|
|
17
|
-
constructor() {
|
|
18
|
-
this.logger = new logger_1.default('SimpleAutomation');
|
|
19
|
-
this.commandFile = path_1.default.join(__dirname, '../data/current_command.txt');
|
|
20
|
-
this.notificationSent = false;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Send command - using multiple simple methods
|
|
24
|
-
*/
|
|
25
|
-
async sendCommand(command, sessionId = '') {
|
|
26
|
-
try {
|
|
27
|
-
// Method 1: Save to file, user can manually copy
|
|
28
|
-
await this._saveCommandToFile(command, sessionId);
|
|
29
|
-
// Method 2: Copy to clipboard
|
|
30
|
-
const clipboardSuccess = await this._copyToClipboard(command);
|
|
31
|
-
// Method 3: Send rich notification (including command content)
|
|
32
|
-
const notificationSuccess = await this._sendRichNotification(command, sessionId);
|
|
33
|
-
// Method 4: Try simple automation (no complex permissions needed)
|
|
34
|
-
const autoSuccess = await this._trySimpleAutomation(command);
|
|
35
|
-
if (clipboardSuccess || notificationSuccess || autoSuccess) {
|
|
36
|
-
this.logger.info('Command sent successfully via simple automation');
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
this.logger.warn('All simple automation methods failed');
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch (error) {
|
|
45
|
-
this.logger.error('Simple automation failed:', error.message);
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Save command to file
|
|
51
|
-
*/
|
|
52
|
-
async _saveCommandToFile(command, sessionId) {
|
|
53
|
-
try {
|
|
54
|
-
const timestamp = new Date().toLocaleString('zh-CN');
|
|
55
|
-
const content = `# TaskPing Email Reply Command
|
|
56
|
-
# Time: ${timestamp}
|
|
57
|
-
# Session ID: ${sessionId}
|
|
58
|
-
#
|
|
59
|
-
# Please copy the command below to Claude Code for execution:
|
|
60
|
-
|
|
61
|
-
${command}
|
|
62
|
-
|
|
63
|
-
# ===============================
|
|
64
|
-
# This file can be deleted after execution
|
|
65
|
-
`;
|
|
66
|
-
fs_1.default.writeFileSync(this.commandFile, content, 'utf8');
|
|
67
|
-
this.logger.info(`Command saved to file: ${this.commandFile}`);
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
this.logger.error('Failed to save command to file:', error.message);
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Copy to clipboard
|
|
77
|
-
*/
|
|
78
|
-
async _copyToClipboard(command) {
|
|
79
|
-
try {
|
|
80
|
-
if (process.platform === 'darwin') {
|
|
81
|
-
const pbcopy = (0, child_process_1.spawn)('pbcopy');
|
|
82
|
-
pbcopy.stdin.write(command);
|
|
83
|
-
pbcopy.stdin.end();
|
|
84
|
-
return new Promise((resolve) => {
|
|
85
|
-
pbcopy.on('close', (code) => {
|
|
86
|
-
if (code === 0) {
|
|
87
|
-
this.logger.info('Command copied to clipboard');
|
|
88
|
-
resolve(true);
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
resolve(false);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
pbcopy.on('error', () => resolve(false));
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
this.logger.error('Failed to copy to clipboard:', error.message);
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Send rich notification
|
|
106
|
-
*/
|
|
107
|
-
async _sendRichNotification(command, sessionId) {
|
|
108
|
-
try {
|
|
109
|
-
if (process.platform === 'darwin') {
|
|
110
|
-
const shortCommand = command.length > 50 ? command.substring(0, 50) + '...' : command;
|
|
111
|
-
// Create detailed notification
|
|
112
|
-
const script = `
|
|
113
|
-
set commandText to "${command.replace(/"/g, '\\"').replace(/\n/g, '\\n')}"
|
|
114
|
-
|
|
115
|
-
display notification "Command copied to clipboard, please paste to Claude Code" with title "TaskPing - New Email Command" subtitle "${shortCommand.replace(/"/g, '\\"')}" sound name "default"
|
|
116
|
-
|
|
117
|
-
-- Also show dialog (optional, user can cancel)
|
|
118
|
-
try
|
|
119
|
-
set userChoice to display dialog "Received new email command:" & return & return & commandText buttons {"Open Command File", "Cancel", "Pasted"} default button "Pasted" with title "TaskPing Email Relay" giving up after 10
|
|
120
|
-
|
|
121
|
-
if button returned of userChoice is "Open Command File" then
|
|
122
|
-
do shell script "open -t '${this.commandFile}'"
|
|
123
|
-
end if
|
|
124
|
-
end try
|
|
125
|
-
`;
|
|
126
|
-
const osascript = (0, child_process_1.spawn)('osascript', ['-e', script]);
|
|
127
|
-
return new Promise((resolve) => {
|
|
128
|
-
osascript.on('close', (code) => {
|
|
129
|
-
if (code === 0) {
|
|
130
|
-
this.logger.info('Rich notification sent successfully');
|
|
131
|
-
resolve(true);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
this.logger.warn('Rich notification failed, trying simple notification');
|
|
135
|
-
this._sendSimpleNotification(command);
|
|
136
|
-
resolve(true); // Consider successful even if failed, because there are backup options
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
osascript.on('error', () => {
|
|
140
|
-
this._sendSimpleNotification(command);
|
|
141
|
-
resolve(true);
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return false;
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
this.logger.error('Failed to send rich notification:', error.message);
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Send simple notification
|
|
154
|
-
*/
|
|
155
|
-
async _sendSimpleNotification(command) {
|
|
156
|
-
try {
|
|
157
|
-
const shortCommand = command.length > 50 ? command.substring(0, 50) + '...' : command;
|
|
158
|
-
const script = `display notification "Command: ${shortCommand.replace(/"/g, '\\"')}" with title "TaskPing - Email Command" sound name "default"`;
|
|
159
|
-
const osascript = (0, child_process_1.spawn)('osascript', ['-e', script]);
|
|
160
|
-
osascript.on('close', () => {
|
|
161
|
-
this.logger.info('Simple notification sent');
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
this.logger.warn('Simple notification also failed:', error.message);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Try simple automation (no complex permissions needed)
|
|
170
|
-
*/
|
|
171
|
-
async _trySimpleAutomation(command) {
|
|
172
|
-
try {
|
|
173
|
-
if (process.platform === 'darwin') {
|
|
174
|
-
// Only try basic operations, don't force permissions
|
|
175
|
-
const script = `
|
|
176
|
-
try
|
|
177
|
-
tell application "System Events"
|
|
178
|
-
-- Try to get frontmost application
|
|
179
|
-
set frontApp to name of first application process whose frontmost is true
|
|
180
|
-
|
|
181
|
-
-- If it's terminal or code editor, try to paste
|
|
182
|
-
if frontApp contains "Terminal" or frontApp contains "iTerm" or frontApp contains "Code" or frontApp contains "Claude" then
|
|
183
|
-
keystroke "v" using command down
|
|
184
|
-
delay 0.2
|
|
185
|
-
keystroke return
|
|
186
|
-
return "success"
|
|
187
|
-
else
|
|
188
|
-
return "not_target_app"
|
|
189
|
-
end if
|
|
190
|
-
end tell
|
|
191
|
-
on error
|
|
192
|
-
return "no_permission"
|
|
193
|
-
end try
|
|
194
|
-
`;
|
|
195
|
-
const osascript = (0, child_process_1.spawn)('osascript', ['-e', script]);
|
|
196
|
-
let output = '';
|
|
197
|
-
osascript.stdout.on('data', (data) => {
|
|
198
|
-
output += data.toString().trim();
|
|
199
|
-
});
|
|
200
|
-
return new Promise((resolve) => {
|
|
201
|
-
osascript.on('close', (code) => {
|
|
202
|
-
if (code === 0 && output === 'success') {
|
|
203
|
-
this.logger.info('Simple automation succeeded');
|
|
204
|
-
resolve(true);
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
this.logger.debug(`Simple automation result: ${output}`);
|
|
208
|
-
resolve(false);
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
osascript.on('error', () => resolve(false));
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
return false;
|
|
215
|
-
}
|
|
216
|
-
catch (error) {
|
|
217
|
-
this.logger.error('Simple automation error:', error.message);
|
|
218
|
-
return false;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Open command file
|
|
223
|
-
*/
|
|
224
|
-
async openCommandFile() {
|
|
225
|
-
try {
|
|
226
|
-
if (fs_1.default.existsSync(this.commandFile)) {
|
|
227
|
-
if (process.platform === 'darwin') {
|
|
228
|
-
(0, child_process_1.spawn)('open', ['-t', this.commandFile]);
|
|
229
|
-
this.logger.info('Command file opened');
|
|
230
|
-
return true;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
catch (error) {
|
|
236
|
-
this.logger.error('Failed to open command file:', error.message);
|
|
237
|
-
return false;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Clean up command files
|
|
242
|
-
*/
|
|
243
|
-
cleanupCommandFile() {
|
|
244
|
-
try {
|
|
245
|
-
if (fs_1.default.existsSync(this.commandFile)) {
|
|
246
|
-
fs_1.default.unlinkSync(this.commandFile);
|
|
247
|
-
this.logger.info('Command file cleaned up');
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
catch (error) {
|
|
251
|
-
this.logger.error('Failed to cleanup command file:', error.message);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Get status
|
|
256
|
-
*/
|
|
257
|
-
getStatus() {
|
|
258
|
-
return {
|
|
259
|
-
supported: process.platform === 'darwin',
|
|
260
|
-
commandFile: this.commandFile,
|
|
261
|
-
commandFileExists: fs_1.default.existsSync(this.commandFile),
|
|
262
|
-
lastCommand: this._getLastCommand()
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
_getLastCommand() {
|
|
266
|
-
try {
|
|
267
|
-
if (fs_1.default.existsSync(this.commandFile)) {
|
|
268
|
-
const content = fs_1.default.readFileSync(this.commandFile, 'utf8');
|
|
269
|
-
const lines = content.split('\n');
|
|
270
|
-
const commandLines = lines.filter((line) => !line.startsWith('#') &&
|
|
271
|
-
!line.startsWith('=') &&
|
|
272
|
-
line.trim().length > 0);
|
|
273
|
-
return commandLines.join('\n').trim();
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
catch (error) {
|
|
277
|
-
this.logger.error('Failed to get last command:', error.message);
|
|
278
|
-
}
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
module.exports = SimpleAutomation;
|
|
283
|
-
//# sourceMappingURL=simple-automation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-automation.js","sourceRoot":"","sources":["../../../src/automation/simple-automation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* CCGram Daemon Service
|
|
4
|
-
* Background daemon process for monitoring emails and processing remote commands
|
|
5
|
-
*/
|
|
6
|
-
import Logger from '../core/logger';
|
|
7
|
-
import ConfigManager from '../core/config';
|
|
8
|
-
interface DaemonStatus {
|
|
9
|
-
running: boolean;
|
|
10
|
-
pid: number | null;
|
|
11
|
-
pidFile: string;
|
|
12
|
-
logFile: string;
|
|
13
|
-
uptime: string | null;
|
|
14
|
-
}
|
|
15
|
-
declare class ClaudeCodeRemoteDaemon {
|
|
16
|
-
logger: Logger;
|
|
17
|
-
config: ConfigManager;
|
|
18
|
-
pidFile: string;
|
|
19
|
-
logFile: string;
|
|
20
|
-
relayService: any;
|
|
21
|
-
isRunning: boolean;
|
|
22
|
-
constructor();
|
|
23
|
-
start(detached?: boolean): Promise<void>;
|
|
24
|
-
startDetached(): Promise<void>;
|
|
25
|
-
startForeground(): Promise<void>;
|
|
26
|
-
setupEventHandlers(): void;
|
|
27
|
-
keepAlive(): void;
|
|
28
|
-
stop(): Promise<void>;
|
|
29
|
-
restart(): Promise<void>;
|
|
30
|
-
getStatus(): DaemonStatus;
|
|
31
|
-
showStatus(): void;
|
|
32
|
-
isAlreadyRunning(): boolean;
|
|
33
|
-
getPid(): number | null;
|
|
34
|
-
waitForStop(pid: number, timeout?: number): Promise<void>;
|
|
35
|
-
getUptime(pid: number): string;
|
|
36
|
-
}
|
|
37
|
-
export = ClaudeCodeRemoteDaemon;
|
|
38
|
-
//# sourceMappingURL=taskping-daemon.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"taskping-daemon.d.ts","sourceRoot":"","sources":["../../../src/daemon/taskping-daemon.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAKH,OAAO,MAAM,MAAM,gBAAgB,CAAC;AACpC,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,UAAU,YAAY;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,cAAM,sBAAsB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,GAAG,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;;IAiBb,KAAK,CAAC,QAAQ,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B9B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BtC,kBAAkB,IAAI,IAAI;IAwD1B,SAAS,IAAI,IAAI;IAWX,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,SAAS,IAAI,YAAY;IAazB,UAAU,IAAI,IAAI;IA6BlB,gBAAgB,IAAI,OAAO;IAiB3B,MAAM,IAAI,MAAM,GAAG,IAAI;IAOjB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAejC;AAoCD,SAAS,sBAAsB,CAAC"}
|
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* CCGram Daemon Service
|
|
5
|
-
* Background daemon process for monitoring emails and processing remote commands
|
|
6
|
-
*/
|
|
7
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
-
};
|
|
10
|
-
const fs_1 = __importDefault(require("fs"));
|
|
11
|
-
const path_1 = __importDefault(require("path"));
|
|
12
|
-
const child_process_1 = require("child_process");
|
|
13
|
-
const logger_1 = __importDefault(require("../core/logger"));
|
|
14
|
-
const config_1 = __importDefault(require("../core/config"));
|
|
15
|
-
class ClaudeCodeRemoteDaemon {
|
|
16
|
-
logger;
|
|
17
|
-
config;
|
|
18
|
-
pidFile;
|
|
19
|
-
logFile;
|
|
20
|
-
relayService;
|
|
21
|
-
isRunning;
|
|
22
|
-
constructor() {
|
|
23
|
-
this.logger = new logger_1.default('Daemon');
|
|
24
|
-
this.config = new config_1.default();
|
|
25
|
-
this.pidFile = path_1.default.join(__dirname, '../data/ccgram-daemon.pid');
|
|
26
|
-
this.logFile = path_1.default.join(__dirname, '../data/daemon.log');
|
|
27
|
-
this.relayService = null;
|
|
28
|
-
this.isRunning = false;
|
|
29
|
-
// Ensure data directory exists
|
|
30
|
-
const dataDir = path_1.default.dirname(this.pidFile);
|
|
31
|
-
if (!fs_1.default.existsSync(dataDir)) {
|
|
32
|
-
fs_1.default.mkdirSync(dataDir, { recursive: true });
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
async start(detached = true) {
|
|
36
|
-
try {
|
|
37
|
-
// Check if already running
|
|
38
|
-
if (this.isAlreadyRunning()) {
|
|
39
|
-
console.log('ā CCGram daemon is already running');
|
|
40
|
-
console.log('š” Use "claude-remote daemon stop" to stop existing service');
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
if (detached) {
|
|
44
|
-
// Start in daemon mode
|
|
45
|
-
await this.startDetached();
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
// Run directly in current process
|
|
49
|
-
await this.startForeground();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
this.logger.error('Failed to start daemon:', error);
|
|
54
|
-
throw error;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async startDetached() {
|
|
58
|
-
console.log('š Starting CCGram daemon...');
|
|
59
|
-
// Create child process
|
|
60
|
-
const child = (0, child_process_1.spawn)(process.execPath, [__filename, '--foreground'], {
|
|
61
|
-
detached: true,
|
|
62
|
-
stdio: ['ignore', 'pipe', 'pipe']
|
|
63
|
-
});
|
|
64
|
-
// Redirect logs
|
|
65
|
-
const logStream = fs_1.default.createWriteStream(this.logFile, { flags: 'a' });
|
|
66
|
-
child.stdout.pipe(logStream);
|
|
67
|
-
child.stderr.pipe(logStream);
|
|
68
|
-
// Save PID
|
|
69
|
-
fs_1.default.writeFileSync(this.pidFile, child.pid.toString());
|
|
70
|
-
// Detach child process
|
|
71
|
-
child.unref();
|
|
72
|
-
console.log(`ā
CCGram daemon started (PID: ${child.pid})`);
|
|
73
|
-
console.log(`š Log file: ${this.logFile}`);
|
|
74
|
-
console.log('š” Use "claude-remote daemon status" to view status');
|
|
75
|
-
console.log('š” Use "claude-remote daemon stop" to stop service');
|
|
76
|
-
}
|
|
77
|
-
async startForeground() {
|
|
78
|
-
console.log('š CCGram daemon starting...');
|
|
79
|
-
this.isRunning = true;
|
|
80
|
-
process.title = 'ccgram-daemon';
|
|
81
|
-
// Load configuration
|
|
82
|
-
this.config.load();
|
|
83
|
-
// Initialize email relay service
|
|
84
|
-
const emailConfig = this.config.getChannel('email');
|
|
85
|
-
if (!emailConfig || !emailConfig.enabled) {
|
|
86
|
-
this.logger.warn('Email channel not configured or disabled');
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const CommandRelayService = require('../relay/command-relay');
|
|
90
|
-
this.relayService = new CommandRelayService(emailConfig.config);
|
|
91
|
-
// Setup event handlers
|
|
92
|
-
this.setupEventHandlers();
|
|
93
|
-
// Start service
|
|
94
|
-
await this.relayService.start();
|
|
95
|
-
this.logger.info('Email relay service started');
|
|
96
|
-
// Keep process running
|
|
97
|
-
this.keepAlive();
|
|
98
|
-
}
|
|
99
|
-
setupEventHandlers() {
|
|
100
|
-
// Graceful shutdown
|
|
101
|
-
const gracefulShutdown = async (signal) => {
|
|
102
|
-
this.logger.info(`Received ${signal}, shutting down gracefully...`);
|
|
103
|
-
this.isRunning = false;
|
|
104
|
-
if (this.relayService) {
|
|
105
|
-
await this.relayService.stop();
|
|
106
|
-
}
|
|
107
|
-
// Delete PID file
|
|
108
|
-
if (fs_1.default.existsSync(this.pidFile)) {
|
|
109
|
-
fs_1.default.unlinkSync(this.pidFile);
|
|
110
|
-
}
|
|
111
|
-
process.exit(0);
|
|
112
|
-
};
|
|
113
|
-
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
114
|
-
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
115
|
-
process.on('SIGHUP', () => {
|
|
116
|
-
this.logger.info('Received SIGHUP, reloading configuration...');
|
|
117
|
-
this.config.load();
|
|
118
|
-
});
|
|
119
|
-
// Relay service events
|
|
120
|
-
if (this.relayService) {
|
|
121
|
-
this.relayService.on('started', () => {
|
|
122
|
-
this.logger.info('Command relay service started');
|
|
123
|
-
});
|
|
124
|
-
this.relayService.on('commandQueued', (command) => {
|
|
125
|
-
this.logger.info(`Command queued: ${command.id}`);
|
|
126
|
-
});
|
|
127
|
-
this.relayService.on('commandExecuted', (command) => {
|
|
128
|
-
this.logger.info(`Command executed: ${command.id}`);
|
|
129
|
-
});
|
|
130
|
-
this.relayService.on('commandFailed', (command, error) => {
|
|
131
|
-
this.logger.error(`Command failed: ${command.id} - ${error.message}`);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
// Uncaught exception handling
|
|
135
|
-
process.on('uncaughtException', (error) => {
|
|
136
|
-
this.logger.error('Uncaught exception:', error);
|
|
137
|
-
process.exit(1);
|
|
138
|
-
});
|
|
139
|
-
process.on('unhandledRejection', (reason, promise) => {
|
|
140
|
-
this.logger.error('Unhandled rejection at:', promise, 'reason:', reason);
|
|
141
|
-
process.exit(1);
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
keepAlive() {
|
|
145
|
-
// Keep process running
|
|
146
|
-
const heartbeat = setInterval(() => {
|
|
147
|
-
if (!this.isRunning) {
|
|
148
|
-
clearInterval(heartbeat);
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
this.logger.debug('Heartbeat');
|
|
152
|
-
}, 60000); // Output heartbeat log every minute
|
|
153
|
-
}
|
|
154
|
-
async stop() {
|
|
155
|
-
if (!this.isAlreadyRunning()) {
|
|
156
|
-
console.log('ā CCGram daemon is not running');
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
try {
|
|
160
|
-
const pid = this.getPid();
|
|
161
|
-
console.log(`š Stopping CCGram daemon (PID: ${pid})...`);
|
|
162
|
-
// Send SIGTERM signal
|
|
163
|
-
process.kill(pid, 'SIGTERM');
|
|
164
|
-
// Wait for process to end
|
|
165
|
-
await this.waitForStop(pid);
|
|
166
|
-
console.log('ā
CCGram daemon stopped');
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
console.error('ā Failed to stop daemon:', error.message);
|
|
170
|
-
// Force delete PID file
|
|
171
|
-
if (fs_1.default.existsSync(this.pidFile)) {
|
|
172
|
-
fs_1.default.unlinkSync(this.pidFile);
|
|
173
|
-
console.log('š§¹ PID file cleaned up');
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
async restart() {
|
|
178
|
-
console.log('š Restarting CCGram daemon...');
|
|
179
|
-
await this.stop();
|
|
180
|
-
await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2 seconds
|
|
181
|
-
await this.start();
|
|
182
|
-
}
|
|
183
|
-
getStatus() {
|
|
184
|
-
const isRunning = this.isAlreadyRunning();
|
|
185
|
-
const pid = isRunning ? this.getPid() : null;
|
|
186
|
-
return {
|
|
187
|
-
running: isRunning,
|
|
188
|
-
pid: pid,
|
|
189
|
-
pidFile: this.pidFile,
|
|
190
|
-
logFile: this.logFile,
|
|
191
|
-
uptime: isRunning ? this.getUptime(pid) : null
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
showStatus() {
|
|
195
|
-
const status = this.getStatus();
|
|
196
|
-
console.log('š CCGram daemon status\n');
|
|
197
|
-
if (status.running) {
|
|
198
|
-
console.log('ā
Status: Running');
|
|
199
|
-
console.log(`š PID: ${status.pid}`);
|
|
200
|
-
console.log(`ā±ļø Uptime: ${status.uptime || 'Unknown'}`);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
console.log('ā Status: Not running');
|
|
204
|
-
}
|
|
205
|
-
console.log(`š Log file: ${status.logFile}`);
|
|
206
|
-
console.log(`š PID file: ${status.pidFile}`);
|
|
207
|
-
// Show recent logs
|
|
208
|
-
if (fs_1.default.existsSync(status.logFile)) {
|
|
209
|
-
console.log('\nš Recent logs:');
|
|
210
|
-
try {
|
|
211
|
-
const logs = fs_1.default.readFileSync(status.logFile, 'utf8');
|
|
212
|
-
const lines = logs.split('\n').filter((line) => line.trim()).slice(-5);
|
|
213
|
-
lines.forEach((line) => console.log(` ${line}`));
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
console.log(' Unable to read log file');
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
isAlreadyRunning() {
|
|
221
|
-
if (!fs_1.default.existsSync(this.pidFile)) {
|
|
222
|
-
return false;
|
|
223
|
-
}
|
|
224
|
-
try {
|
|
225
|
-
const pid = parseInt(fs_1.default.readFileSync(this.pidFile, 'utf8'));
|
|
226
|
-
// Check if process is still running
|
|
227
|
-
process.kill(pid, 0);
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
// Process doesn't exist, delete outdated PID file
|
|
232
|
-
fs_1.default.unlinkSync(this.pidFile);
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
getPid() {
|
|
237
|
-
if (!fs_1.default.existsSync(this.pidFile)) {
|
|
238
|
-
return null;
|
|
239
|
-
}
|
|
240
|
-
return parseInt(fs_1.default.readFileSync(this.pidFile, 'utf8'));
|
|
241
|
-
}
|
|
242
|
-
async waitForStop(pid, timeout = 10000) {
|
|
243
|
-
const startTime = Date.now();
|
|
244
|
-
while (Date.now() - startTime < timeout) {
|
|
245
|
-
try {
|
|
246
|
-
process.kill(pid, 0);
|
|
247
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
248
|
-
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
// Process has stopped
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
// Timeout, force termination
|
|
255
|
-
throw new Error('Process stop timeout, may need manual termination');
|
|
256
|
-
}
|
|
257
|
-
getUptime(pid) {
|
|
258
|
-
try {
|
|
259
|
-
// Get process start time on macOS and Linux
|
|
260
|
-
const result = (0, child_process_1.execSync)(`ps -o lstart= -p ${pid}`, { encoding: 'utf8' });
|
|
261
|
-
const startTime = new Date(result.trim());
|
|
262
|
-
const uptime = Date.now() - startTime.getTime();
|
|
263
|
-
const hours = Math.floor(uptime / (1000 * 60 * 60));
|
|
264
|
-
const minutes = Math.floor((uptime % (1000 * 60 * 60)) / (1000 * 60));
|
|
265
|
-
return `${hours}h ${minutes}m`;
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
return 'Unknown';
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
// Command line interface
|
|
273
|
-
if (require.main === module) {
|
|
274
|
-
const daemon = new ClaudeCodeRemoteDaemon();
|
|
275
|
-
const command = process.argv[2];
|
|
276
|
-
(async () => {
|
|
277
|
-
try {
|
|
278
|
-
switch (command) {
|
|
279
|
-
case 'start':
|
|
280
|
-
await daemon.start(true);
|
|
281
|
-
break;
|
|
282
|
-
case '--foreground':
|
|
283
|
-
await daemon.start(false);
|
|
284
|
-
break;
|
|
285
|
-
case 'stop':
|
|
286
|
-
await daemon.stop();
|
|
287
|
-
break;
|
|
288
|
-
case 'restart':
|
|
289
|
-
await daemon.restart();
|
|
290
|
-
break;
|
|
291
|
-
case 'status':
|
|
292
|
-
daemon.showStatus();
|
|
293
|
-
break;
|
|
294
|
-
default:
|
|
295
|
-
console.log('Usage: ccgram-daemon <start|stop|restart|status>');
|
|
296
|
-
process.exit(1);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
catch (error) {
|
|
300
|
-
console.error('Error:', error.message);
|
|
301
|
-
process.exit(1);
|
|
302
|
-
}
|
|
303
|
-
})();
|
|
304
|
-
}
|
|
305
|
-
module.exports = ClaudeCodeRemoteDaemon;
|
|
306
|
-
//# sourceMappingURL=taskping-daemon.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"taskping-daemon.js","sourceRoot":"","sources":["../../../src/daemon/taskping-daemon.ts"],"names":[],"mappings":"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"}
|