claude-telegram-mirror 0.1.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 (99) hide show
  1. package/README.md +331 -0
  2. package/dist/bot/commands.d.ts +41 -0
  3. package/dist/bot/commands.d.ts.map +1 -0
  4. package/dist/bot/commands.js +231 -0
  5. package/dist/bot/commands.js.map +1 -0
  6. package/dist/bot/formatting.d.ts +62 -0
  7. package/dist/bot/formatting.d.ts.map +1 -0
  8. package/dist/bot/formatting.js +295 -0
  9. package/dist/bot/formatting.js.map +1 -0
  10. package/dist/bot/telegram.d.ts +93 -0
  11. package/dist/bot/telegram.d.ts.map +1 -0
  12. package/dist/bot/telegram.js +378 -0
  13. package/dist/bot/telegram.js.map +1 -0
  14. package/dist/bot/types.d.ts +28 -0
  15. package/dist/bot/types.d.ts.map +1 -0
  16. package/dist/bot/types.js +5 -0
  17. package/dist/bot/types.js.map +1 -0
  18. package/dist/bridge/daemon.d.ts +93 -0
  19. package/dist/bridge/daemon.d.ts.map +1 -0
  20. package/dist/bridge/daemon.js +626 -0
  21. package/dist/bridge/daemon.js.map +1 -0
  22. package/dist/bridge/index.d.ts +10 -0
  23. package/dist/bridge/index.d.ts.map +1 -0
  24. package/dist/bridge/index.js +9 -0
  25. package/dist/bridge/index.js.map +1 -0
  26. package/dist/bridge/injector.d.ts +97 -0
  27. package/dist/bridge/injector.d.ts.map +1 -0
  28. package/dist/bridge/injector.js +289 -0
  29. package/dist/bridge/injector.js.map +1 -0
  30. package/dist/bridge/session.d.ts +108 -0
  31. package/dist/bridge/session.d.ts.map +1 -0
  32. package/dist/bridge/session.js +381 -0
  33. package/dist/bridge/session.js.map +1 -0
  34. package/dist/bridge/socket.d.ts +97 -0
  35. package/dist/bridge/socket.d.ts.map +1 -0
  36. package/dist/bridge/socket.js +436 -0
  37. package/dist/bridge/socket.js.map +1 -0
  38. package/dist/bridge/types.d.ts +38 -0
  39. package/dist/bridge/types.d.ts.map +1 -0
  40. package/dist/bridge/types.js +5 -0
  41. package/dist/bridge/types.js.map +1 -0
  42. package/dist/cli.d.ts +7 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +332 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/hooks/handler.d.ts +94 -0
  47. package/dist/hooks/handler.d.ts.map +1 -0
  48. package/dist/hooks/handler.js +431 -0
  49. package/dist/hooks/handler.js.map +1 -0
  50. package/dist/hooks/index.d.ts +8 -0
  51. package/dist/hooks/index.d.ts.map +1 -0
  52. package/dist/hooks/index.js +7 -0
  53. package/dist/hooks/index.js.map +1 -0
  54. package/dist/hooks/installer.d.ts +46 -0
  55. package/dist/hooks/installer.d.ts.map +1 -0
  56. package/dist/hooks/installer.js +317 -0
  57. package/dist/hooks/installer.js.map +1 -0
  58. package/dist/hooks/types.d.ts +88 -0
  59. package/dist/hooks/types.d.ts.map +1 -0
  60. package/dist/hooks/types.js +6 -0
  61. package/dist/hooks/types.js.map +1 -0
  62. package/dist/index.d.ts +19 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +20 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/service/doctor.d.ts +10 -0
  67. package/dist/service/doctor.d.ts.map +1 -0
  68. package/dist/service/doctor.js +424 -0
  69. package/dist/service/doctor.js.map +1 -0
  70. package/dist/service/manager.d.ts +48 -0
  71. package/dist/service/manager.d.ts.map +1 -0
  72. package/dist/service/manager.js +584 -0
  73. package/dist/service/manager.js.map +1 -0
  74. package/dist/service/setup.d.ts +10 -0
  75. package/dist/service/setup.d.ts.map +1 -0
  76. package/dist/service/setup.js +266 -0
  77. package/dist/service/setup.js.map +1 -0
  78. package/dist/utils/chunker.d.ts +24 -0
  79. package/dist/utils/chunker.d.ts.map +1 -0
  80. package/dist/utils/chunker.js +123 -0
  81. package/dist/utils/chunker.js.map +1 -0
  82. package/dist/utils/config.d.ts +48 -0
  83. package/dist/utils/config.d.ts.map +1 -0
  84. package/dist/utils/config.js +154 -0
  85. package/dist/utils/config.js.map +1 -0
  86. package/dist/utils/logger.d.ts +7 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +28 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/package.json +88 -0
  91. package/postinstall.cjs +76 -0
  92. package/scripts/claude-wrapper.sh +122 -0
  93. package/scripts/doctor.sh +433 -0
  94. package/scripts/get-chat-id.sh +64 -0
  95. package/scripts/global-hooks.sh +39 -0
  96. package/scripts/install.sh +831 -0
  97. package/scripts/start-daemon.sh +49 -0
  98. package/scripts/telegram-hook.sh +449 -0
  99. package/scripts/uninstall.sh +261 -0
@@ -0,0 +1,436 @@
1
+ /**
2
+ * Unix Domain Socket Server/Client
3
+ * IPC layer for Claude Code ↔ Telegram bridge
4
+ */
5
+ import { createServer, connect } from 'net';
6
+ import { unlinkSync, existsSync, writeFileSync, readFileSync, mkdirSync, chmodSync } from 'fs';
7
+ import { EventEmitter } from 'events';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ import logger from '../utils/logger.js';
11
+ // Use secure user-specific directory instead of world-writable /tmp
12
+ const SOCKET_DIR = join(homedir(), '.config', 'claude-telegram-mirror');
13
+ const DEFAULT_SOCKET_PATH = join(SOCKET_DIR, 'bridge.sock');
14
+ const DEFAULT_PID_PATH = join(SOCKET_DIR, 'bridge.pid');
15
+ /**
16
+ * Check if a socket is stale (file exists but no daemon listening)
17
+ * Returns: 'stale' | 'active' | 'none'
18
+ */
19
+ async function checkSocketStatus(socketPath) {
20
+ if (!existsSync(socketPath)) {
21
+ return 'none';
22
+ }
23
+ return new Promise((resolve) => {
24
+ const testSocket = connect(socketPath);
25
+ const timeout = setTimeout(() => {
26
+ testSocket.destroy();
27
+ resolve('stale'); // Timeout = no response = stale
28
+ }, 1000);
29
+ testSocket.on('connect', () => {
30
+ clearTimeout(timeout);
31
+ testSocket.destroy();
32
+ resolve('active'); // Connection succeeded = daemon alive
33
+ });
34
+ testSocket.on('error', (err) => {
35
+ clearTimeout(timeout);
36
+ testSocket.destroy();
37
+ if (err.code === 'ECONNREFUSED') {
38
+ resolve('stale'); // Connection refused = daemon dead
39
+ }
40
+ else {
41
+ resolve('stale'); // Other error = assume stale
42
+ }
43
+ });
44
+ });
45
+ }
46
+ /**
47
+ * Check if a PID is still running
48
+ */
49
+ function isPidRunning(pid) {
50
+ try {
51
+ process.kill(pid, 0); // Signal 0 = check if process exists
52
+ return true;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * Acquire PID lock, returns true if lock acquired
60
+ */
61
+ function acquirePidLock(pidPath) {
62
+ if (existsSync(pidPath)) {
63
+ try {
64
+ const existingPid = parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);
65
+ if (!isNaN(existingPid) && isPidRunning(existingPid)) {
66
+ logger.warn('Another daemon instance is running', { pid: existingPid });
67
+ return false;
68
+ }
69
+ // Stale PID file - process not running
70
+ logger.info('Removing stale PID file', { stalePid: existingPid });
71
+ }
72
+ catch {
73
+ // Can't read PID file - remove it
74
+ }
75
+ }
76
+ // Write our PID
77
+ writeFileSync(pidPath, process.pid.toString());
78
+ logger.debug('PID lock acquired', { pid: process.pid });
79
+ return true;
80
+ }
81
+ /**
82
+ * Release PID lock
83
+ */
84
+ function releasePidLock(pidPath) {
85
+ if (existsSync(pidPath)) {
86
+ try {
87
+ const storedPid = parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);
88
+ if (storedPid === process.pid) {
89
+ unlinkSync(pidPath);
90
+ logger.debug('PID lock released');
91
+ }
92
+ }
93
+ catch {
94
+ // Ignore errors during cleanup
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * Unix Socket Server
100
+ * Accepts connections from hook scripts and routes messages
101
+ */
102
+ export class SocketServer extends EventEmitter {
103
+ server = null;
104
+ clients = new Map();
105
+ socketPath;
106
+ pidPath;
107
+ buffer = new Map();
108
+ constructor(socketPath = DEFAULT_SOCKET_PATH, pidPath = DEFAULT_PID_PATH) {
109
+ super();
110
+ this.socketPath = socketPath;
111
+ this.pidPath = pidPath;
112
+ }
113
+ /**
114
+ * Start listening for connections
115
+ * Includes stale socket detection and PID file locking
116
+ */
117
+ async listen() {
118
+ // Step 0: Ensure socket directory exists with secure permissions (0o700)
119
+ const socketDir = join(this.socketPath, '..');
120
+ if (!existsSync(socketDir)) {
121
+ mkdirSync(socketDir, { recursive: true, mode: 0o700 });
122
+ logger.debug('Created socket directory', { path: socketDir, mode: '0700' });
123
+ }
124
+ else {
125
+ // Ensure existing directory has correct permissions
126
+ try {
127
+ chmodSync(socketDir, 0o700);
128
+ }
129
+ catch (error) {
130
+ logger.warn('Could not set socket directory permissions', { error });
131
+ }
132
+ }
133
+ // Step 1: Acquire PID lock (prevents multiple daemon instances)
134
+ if (!acquirePidLock(this.pidPath)) {
135
+ throw new Error('Another daemon instance is already running. Kill it first or check the PID file.');
136
+ }
137
+ // Register cleanup on process exit
138
+ const cleanup = () => {
139
+ releasePidLock(this.pidPath);
140
+ };
141
+ process.on('exit', cleanup);
142
+ process.on('SIGINT', cleanup);
143
+ process.on('SIGTERM', cleanup);
144
+ // Step 2: Check for stale socket
145
+ const socketStatus = await checkSocketStatus(this.socketPath);
146
+ if (socketStatus === 'active') {
147
+ releasePidLock(this.pidPath);
148
+ throw new Error(`Socket ${this.socketPath} is already in use by another process`);
149
+ }
150
+ if (socketStatus === 'stale') {
151
+ try {
152
+ unlinkSync(this.socketPath);
153
+ logger.info('Removed stale socket file', { path: this.socketPath });
154
+ }
155
+ catch (error) {
156
+ logger.error('Failed to remove stale socket', { error });
157
+ }
158
+ }
159
+ // Step 3: Start the server
160
+ return new Promise((resolve, reject) => {
161
+ this.server = createServer((socket) => {
162
+ this.handleConnection(socket);
163
+ });
164
+ this.server.on('error', (error) => {
165
+ logger.error('Socket server error', { error });
166
+ releasePidLock(this.pidPath);
167
+ this.emit('error', error);
168
+ reject(error);
169
+ });
170
+ this.server.listen(this.socketPath, () => {
171
+ // Set socket file permissions to owner-only (0o600)
172
+ try {
173
+ chmodSync(this.socketPath, 0o600);
174
+ logger.debug('Set socket permissions', { path: this.socketPath, mode: '0600' });
175
+ }
176
+ catch (error) {
177
+ logger.warn('Could not set socket file permissions', { error });
178
+ }
179
+ logger.info(`Socket server listening on ${this.socketPath}`, { pid: process.pid });
180
+ resolve();
181
+ });
182
+ });
183
+ }
184
+ /**
185
+ * Handle new client connection
186
+ */
187
+ handleConnection(socket) {
188
+ const clientId = `client-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
189
+ this.clients.set(clientId, socket);
190
+ this.buffer.set(clientId, '');
191
+ logger.debug('Client connected', { clientId });
192
+ this.emit('connect', clientId);
193
+ socket.on('data', (data) => {
194
+ this.handleData(clientId, data);
195
+ });
196
+ socket.on('close', () => {
197
+ this.clients.delete(clientId);
198
+ this.buffer.delete(clientId);
199
+ logger.debug('Client disconnected', { clientId });
200
+ this.emit('disconnect', clientId);
201
+ });
202
+ socket.on('error', (error) => {
203
+ logger.error('Client socket error', { clientId, error });
204
+ this.clients.delete(clientId);
205
+ this.buffer.delete(clientId);
206
+ });
207
+ }
208
+ /**
209
+ * Handle incoming data (NDJSON protocol)
210
+ */
211
+ handleData(clientId, data) {
212
+ let buffer = this.buffer.get(clientId) || '';
213
+ buffer += data.toString();
214
+ // Process complete lines (NDJSON)
215
+ const lines = buffer.split('\n');
216
+ this.buffer.set(clientId, lines.pop() || '');
217
+ for (const line of lines) {
218
+ if (!line.trim())
219
+ continue;
220
+ try {
221
+ const message = JSON.parse(line);
222
+ this.emit('message', message, clientId);
223
+ }
224
+ catch (error) {
225
+ logger.error('Failed to parse message', { line, error });
226
+ }
227
+ }
228
+ }
229
+ /**
230
+ * Send message to specific client
231
+ */
232
+ send(clientId, message) {
233
+ const socket = this.clients.get(clientId);
234
+ if (!socket || socket.destroyed) {
235
+ logger.warn('Client not found or disconnected', { clientId });
236
+ return false;
237
+ }
238
+ try {
239
+ socket.write(JSON.stringify(message) + '\n');
240
+ return true;
241
+ }
242
+ catch (error) {
243
+ logger.error('Failed to send message', { clientId, error });
244
+ return false;
245
+ }
246
+ }
247
+ /**
248
+ * Broadcast message to all clients
249
+ */
250
+ broadcast(message) {
251
+ const data = JSON.stringify(message) + '\n';
252
+ for (const [clientId, socket] of this.clients) {
253
+ if (!socket.destroyed) {
254
+ try {
255
+ socket.write(data);
256
+ }
257
+ catch (error) {
258
+ logger.error('Failed to broadcast to client', { clientId, error });
259
+ }
260
+ }
261
+ }
262
+ }
263
+ /**
264
+ * Get connected client count
265
+ */
266
+ getClientCount() {
267
+ return this.clients.size;
268
+ }
269
+ /**
270
+ * Close the server and release all locks
271
+ */
272
+ close() {
273
+ return new Promise((resolve) => {
274
+ // Close all client connections
275
+ for (const socket of this.clients.values()) {
276
+ socket.destroy();
277
+ }
278
+ this.clients.clear();
279
+ // Close server
280
+ if (this.server) {
281
+ this.server.close(() => {
282
+ // Clean up socket file
283
+ if (existsSync(this.socketPath)) {
284
+ try {
285
+ unlinkSync(this.socketPath);
286
+ }
287
+ catch (error) {
288
+ logger.error('Failed to clean up socket file', { error });
289
+ }
290
+ }
291
+ // Release PID lock
292
+ releasePidLock(this.pidPath);
293
+ logger.info('Socket server closed');
294
+ resolve();
295
+ });
296
+ }
297
+ else {
298
+ // Still release PID lock even if server wasn't created
299
+ releasePidLock(this.pidPath);
300
+ resolve();
301
+ }
302
+ });
303
+ }
304
+ }
305
+ /**
306
+ * Unix Socket Client
307
+ * Used by hook scripts to send messages to bridge
308
+ */
309
+ export class SocketClient extends EventEmitter {
310
+ socket = null;
311
+ socketPath;
312
+ buffer = '';
313
+ reconnectTimer = null;
314
+ connected = false;
315
+ constructor(socketPath = DEFAULT_SOCKET_PATH) {
316
+ super();
317
+ this.socketPath = socketPath;
318
+ }
319
+ /**
320
+ * Connect to the server
321
+ */
322
+ connect() {
323
+ return new Promise((resolve, reject) => {
324
+ this.socket = connect(this.socketPath);
325
+ this.socket.on('connect', () => {
326
+ this.connected = true;
327
+ logger.debug('Connected to bridge');
328
+ this.emit('connect');
329
+ resolve();
330
+ });
331
+ this.socket.on('data', (data) => {
332
+ this.handleData(data);
333
+ });
334
+ this.socket.on('close', () => {
335
+ this.connected = false;
336
+ logger.debug('Disconnected from bridge');
337
+ this.emit('disconnect');
338
+ });
339
+ this.socket.on('error', (error) => {
340
+ this.connected = false;
341
+ if (error.code === 'ENOENT') {
342
+ logger.warn('Bridge not running (socket not found)');
343
+ }
344
+ else if (error.code === 'ECONNREFUSED') {
345
+ logger.warn('Bridge refused connection');
346
+ }
347
+ else {
348
+ logger.error('Socket error', { error });
349
+ }
350
+ this.emit('error', error);
351
+ reject(error);
352
+ });
353
+ });
354
+ }
355
+ /**
356
+ * Handle incoming data
357
+ */
358
+ handleData(data) {
359
+ this.buffer += data.toString();
360
+ const lines = this.buffer.split('\n');
361
+ this.buffer = lines.pop() || '';
362
+ for (const line of lines) {
363
+ if (!line.trim())
364
+ continue;
365
+ try {
366
+ const message = JSON.parse(line);
367
+ this.emit('message', message);
368
+ }
369
+ catch (error) {
370
+ logger.error('Failed to parse server message', { error });
371
+ }
372
+ }
373
+ }
374
+ /**
375
+ * Send message to server
376
+ */
377
+ send(message) {
378
+ if (!this.socket || this.socket.destroyed || !this.connected) {
379
+ logger.warn('Not connected to bridge');
380
+ return false;
381
+ }
382
+ try {
383
+ this.socket.write(JSON.stringify(message) + '\n');
384
+ return true;
385
+ }
386
+ catch (error) {
387
+ logger.error('Failed to send message', { error });
388
+ return false;
389
+ }
390
+ }
391
+ /**
392
+ * Send message and wait for response
393
+ */
394
+ sendAndWait(message, timeout = 30000) {
395
+ return new Promise((resolve, reject) => {
396
+ const timer = setTimeout(() => {
397
+ reject(new Error('Response timeout'));
398
+ }, timeout);
399
+ const handler = (response) => {
400
+ if (response.sessionId === message.sessionId) {
401
+ clearTimeout(timer);
402
+ this.off('message', handler);
403
+ resolve(response);
404
+ }
405
+ };
406
+ this.on('message', handler);
407
+ if (!this.send(message)) {
408
+ clearTimeout(timer);
409
+ this.off('message', handler);
410
+ reject(new Error('Failed to send message'));
411
+ }
412
+ });
413
+ }
414
+ /**
415
+ * Check if connected
416
+ */
417
+ isConnected() {
418
+ return this.connected;
419
+ }
420
+ /**
421
+ * Disconnect from server
422
+ */
423
+ disconnect() {
424
+ if (this.reconnectTimer) {
425
+ clearTimeout(this.reconnectTimer);
426
+ this.reconnectTimer = null;
427
+ }
428
+ if (this.socket) {
429
+ this.socket.destroy();
430
+ this.socket = null;
431
+ }
432
+ this.connected = false;
433
+ }
434
+ }
435
+ export { SOCKET_DIR, DEFAULT_SOCKET_PATH, DEFAULT_PID_PATH, checkSocketStatus, isPidRunning };
436
+ //# sourceMappingURL=socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/bridge/socket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Bridge Types
3
+ */
4
+ export type MessageType = 'agent_response' | 'tool_start' | 'tool_result' | 'approval_request' | 'user_input' | 'approval_response' | 'command' | 'error' | 'session_start' | 'session_end' | 'turn_complete' | 'pre_compact';
5
+ export interface BridgeMessage {
6
+ type: MessageType;
7
+ sessionId: string;
8
+ timestamp: string;
9
+ content: string;
10
+ metadata?: Record<string, unknown>;
11
+ }
12
+ export interface Session {
13
+ id: string;
14
+ chatId: number;
15
+ threadId?: number;
16
+ hostname?: string;
17
+ projectDir?: string;
18
+ tmuxTarget?: string;
19
+ tmuxSocket?: string;
20
+ startedAt: Date;
21
+ lastActivity: Date;
22
+ status: 'active' | 'ended' | 'aborted';
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ export interface PendingApproval {
26
+ id: string;
27
+ sessionId: string;
28
+ prompt: string;
29
+ createdAt: Date;
30
+ expiresAt: Date;
31
+ status: 'pending' | 'approved' | 'rejected' | 'expired';
32
+ }
33
+ export interface SocketClientInfo {
34
+ id: string;
35
+ connectedAt: Date;
36
+ sessionId?: string;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bridge/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,WAAW,GACnB,gBAAgB,GAChB,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,mBAAmB,GACnB,SAAS,GACT,OAAO,GACP,eAAe,GACf,aAAa,GACb,eAAe,GACf,aAAa,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,IAAI,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Bridge Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bridge/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Telegram Mirror CLI
4
+ * Main command-line interface
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG"}