@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.
@@ -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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"}