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,7 @@
1
+ /**
2
+ * Logger Configuration
3
+ */
4
+ import winston from 'winston';
5
+ export declare const logger: winston.Logger;
6
+ export default logger;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAS9B,eAAO,MAAM,MAAM,gBAejB,CAAC;AAWH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Logger Configuration
3
+ */
4
+ import winston from 'winston';
5
+ const { combine, timestamp, printf, colorize } = winston.format;
6
+ const logFormat = printf(({ level, message, timestamp, ...meta }) => {
7
+ const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
8
+ return `${timestamp} [${level}]: ${message}${metaStr}`;
9
+ });
10
+ export const logger = winston.createLogger({
11
+ level: process.env.LOG_LEVEL || 'info',
12
+ format: combine(timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), logFormat),
13
+ transports: [
14
+ new winston.transports.Console({
15
+ format: combine(colorize(), timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), logFormat)
16
+ })
17
+ ]
18
+ });
19
+ // Add file transport in production
20
+ if (process.env.NODE_ENV === 'production') {
21
+ logger.add(new winston.transports.File({
22
+ filename: '/tmp/claude-telegram-mirror.log',
23
+ maxsize: 5242880, // 5MB
24
+ maxFiles: 3
25
+ }));
26
+ }
27
+ export default logger;
28
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;AAEhE,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,OAAO,GAAG,SAAS,KAAK,KAAK,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IACzC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,MAAM,EAAE,OAAO,CACb,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC5C,SAAS,CACV;IACD,UAAU,EAAE;QACV,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,OAAO,CACb,QAAQ,EAAE,EACV,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC5C,SAAS,CACV;SACF,CAAC;KACH;CACF,CAAC,CAAC;AAEH,mCAAmC;AACnC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QACrC,QAAQ,EAAE,iCAAiC;QAC3C,OAAO,EAAE,OAAO,EAAE,MAAM;QACxB,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC,CAAC;AACN,CAAC;AAED,eAAe,MAAM,CAAC"}
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "claude-telegram-mirror",
3
+ "version": "0.1.0",
4
+ "description": "Bidirectional Telegram integration for Claude Code CLI - monitor and control your Claude Code sessions from Telegram",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "claude-telegram-mirror": "./dist/cli.js",
9
+ "ctm": "./dist/cli.js",
10
+ "telegram-hook": "./scripts/telegram-hook.sh"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "start": "node dist/cli.js start",
16
+ "daemon": "node dist/cli.js start --foreground",
17
+ "status": "node dist/cli.js status",
18
+ "install-hooks": "node dist/cli.js install-hooks",
19
+ "uninstall-hooks": "node dist/cli.js uninstall-hooks",
20
+ "test": "vitest",
21
+ "test:coverage": "vitest --coverage",
22
+ "lint": "eslint src/",
23
+ "typecheck": "tsc --noEmit",
24
+ "postinstall": "node postinstall.cjs",
25
+ "prepublishOnly": "npm run build && npm run test"
26
+ },
27
+ "files": [
28
+ "dist/",
29
+ "scripts/",
30
+ "postinstall.cjs",
31
+ "README.md"
32
+ ],
33
+ "keywords": [
34
+ "claude",
35
+ "telegram",
36
+ "cli",
37
+ "mirror",
38
+ "bot",
39
+ "claude-code",
40
+ "anthropic",
41
+ "ai",
42
+ "automation",
43
+ "remote-control",
44
+ "mobile"
45
+ ],
46
+ "author": "Robert E. Lee <robert@agidreams.us>",
47
+ "license": "MIT",
48
+ "homepage": "https://github.com/robertelee78/claude-telegram-mirror",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/robertelee78/claude-telegram-mirror.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/robertelee78/claude-telegram-mirror/issues"
55
+ },
56
+ "funding": {
57
+ "type": "github",
58
+ "url": "https://github.com/sponsors/robertelee78"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public",
62
+ "provenance": true
63
+ },
64
+ "dependencies": {
65
+ "grammy": "^1.21.0",
66
+ "better-sqlite3": "^11.0.0",
67
+ "commander": "^12.0.0",
68
+ "winston": "^3.11.0",
69
+ "chalk": "^4.1.2",
70
+ "inquirer": "^8.2.5"
71
+ },
72
+ "devDependencies": {
73
+ "@types/better-sqlite3": "^7.6.8",
74
+ "@types/node": "^20.10.0",
75
+ "typescript": "^5.3.0",
76
+ "vitest": "^1.0.0",
77
+ "eslint": "^8.55.0",
78
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
79
+ "@typescript-eslint/parser": "^6.0.0"
80
+ },
81
+ "engines": {
82
+ "node": ">=18.0.0"
83
+ },
84
+ "os": [
85
+ "linux",
86
+ "darwin"
87
+ ]
88
+ }
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Post-install script for claude-telegram-mirror
4
+ * Shows helpful guidance after npm install
5
+ */
6
+
7
+ const os = require('os');
8
+ const path = require('path');
9
+ const fs = require('fs');
10
+
11
+ // Try to load chalk, fall back to plain text if not available
12
+ let chalk;
13
+ try {
14
+ chalk = require('chalk');
15
+ } catch (e) {
16
+ // Chalk not available, use plain text functions
17
+ const identity = (s) => s;
18
+ chalk = {
19
+ cyan: identity,
20
+ green: identity,
21
+ yellow: identity,
22
+ red: identity,
23
+ blue: identity,
24
+ gray: identity,
25
+ white: { bold: identity },
26
+ };
27
+ }
28
+
29
+ // Don't show guidance during CI or if TELEGRAM_BOT_TOKEN is already set
30
+ if (process.env.CI || process.env.TELEGRAM_BOT_TOKEN) {
31
+ process.exit(0);
32
+ }
33
+
34
+ console.log('');
35
+ console.log(chalk.cyan('╔════════════════════════════════════════════════════════════╗'));
36
+ console.log(chalk.cyan('║') + chalk.white.bold(' Claude Telegram Mirror - Installation Complete! ') + chalk.cyan('║'));
37
+ console.log(chalk.cyan('╚════════════════════════════════════════════════════════════╝'));
38
+ console.log('');
39
+
40
+ console.log(chalk.yellow('📱 Quick Setup:'));
41
+ console.log('');
42
+ console.log(' ' + chalk.white.bold('1. Run the interactive setup:'));
43
+ console.log(' ' + chalk.green('ctm setup'));
44
+ console.log('');
45
+ console.log(' ' + chalk.white.bold('2. Or configure manually:'));
46
+ console.log(' ' + chalk.gray('export TELEGRAM_BOT_TOKEN="your-bot-token"'));
47
+ console.log(' ' + chalk.gray('export TELEGRAM_CHAT_ID="your-chat-id"'));
48
+ console.log(' ' + chalk.gray('export TELEGRAM_MIRROR=true'));
49
+ console.log('');
50
+
51
+ console.log(chalk.yellow('🔧 Commands:'));
52
+ console.log('');
53
+ console.log(' ' + chalk.green('ctm setup') + ' Interactive configuration wizard');
54
+ console.log(' ' + chalk.green('ctm doctor') + ' Diagnose configuration issues');
55
+ console.log(' ' + chalk.green('ctm start') + ' Start the mirror daemon');
56
+ console.log(' ' + chalk.green('ctm status') + ' Show current status');
57
+ console.log(' ' + chalk.green('ctm install-hooks') + ' Install Claude Code hooks');
58
+ console.log(' ' + chalk.green('ctm service install') + ' Install as system service');
59
+ console.log('');
60
+
61
+ console.log(chalk.yellow('📚 Documentation:'));
62
+ console.log(' ' + chalk.blue('https://github.com/robertelee78/claude-mobile'));
63
+ console.log('');
64
+
65
+ // Check for existing config
66
+ const configDir = path.join(os.homedir(), '.config', 'claude-telegram-mirror');
67
+ const configFile = path.join(configDir, 'config.json');
68
+
69
+ if (fs.existsSync(configFile)) {
70
+ console.log(chalk.green('✓ Existing configuration found at:'));
71
+ console.log(' ' + chalk.gray(configFile));
72
+ console.log('');
73
+ }
74
+
75
+ console.log(chalk.gray('Run "ctm doctor" to verify your setup.'));
76
+ console.log('');
@@ -0,0 +1,122 @@
1
+ #!/bin/bash
2
+ #
3
+ # Claude Code Wrapper with Telegram Mirror
4
+ # Wraps existing claude command to enable Telegram mirroring
5
+ #
6
+ # Usage:
7
+ # claude-wrapper <original-claude-args>
8
+ #
9
+ # Or create aliases:
10
+ # alias dsp='TELEGRAM_MIRROR=true claude-wrapper --dangerously-skip-permissions'
11
+ # alias dsp-c='TELEGRAM_MIRROR=true claude-wrapper --dangerously-skip-permissions -c'
12
+ #
13
+
14
+ set -e
15
+
16
+ # Get the directory of this script
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ PACKAGE_DIR="$(dirname "$SCRIPT_DIR")"
19
+
20
+ # Check if Telegram mirror is enabled
21
+ TELEGRAM_ENABLED="${TELEGRAM_MIRROR:-false}"
22
+
23
+ # Bridge daemon socket path
24
+ SOCKET_PATH="${TELEGRAM_BRIDGE_SOCKET:-/tmp/claude-telegram-bridge.sock}"
25
+
26
+ # Start bridge daemon if needed
27
+ start_bridge() {
28
+ if [[ ! -S "$SOCKET_PATH" ]]; then
29
+ echo "🔌 Starting Telegram bridge daemon..."
30
+
31
+ # Start in background
32
+ if command -v node &> /dev/null && [[ -f "$PACKAGE_DIR/dist/cli.js" ]]; then
33
+ node "$PACKAGE_DIR/dist/cli.js" start &
34
+ BRIDGE_PID=$!
35
+
36
+ # Wait for socket to be created (max 5 seconds)
37
+ for i in {1..50}; do
38
+ if [[ -S "$SOCKET_PATH" ]]; then
39
+ echo "✅ Bridge daemon started"
40
+ break
41
+ fi
42
+ sleep 0.1
43
+ done
44
+
45
+ if [[ ! -S "$SOCKET_PATH" ]]; then
46
+ echo "⚠️ Bridge daemon failed to start, continuing without Telegram mirror"
47
+ TELEGRAM_ENABLED="false"
48
+ fi
49
+ else
50
+ echo "⚠️ claude-telegram-mirror not installed properly"
51
+ TELEGRAM_ENABLED="false"
52
+ fi
53
+ fi
54
+ }
55
+
56
+ # Notify session start
57
+ notify_start() {
58
+ if [[ -S "$SOCKET_PATH" ]]; then
59
+ local session_id="cli-$(date +%s)-$$"
60
+ local project_dir="$(pwd)"
61
+
62
+ echo "{\"type\":\"session_start\",\"sessionId\":\"$session_id\",\"timestamp\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\"content\":\"Session started\",\"metadata\":{\"projectDir\":\"$project_dir\"}}" | \
63
+ nc -U -q0 "$SOCKET_PATH" 2>/dev/null || true
64
+
65
+ export TELEGRAM_SESSION_ID="$session_id"
66
+ fi
67
+ }
68
+
69
+ # Notify session end
70
+ notify_end() {
71
+ if [[ -S "$SOCKET_PATH" && -n "$TELEGRAM_SESSION_ID" ]]; then
72
+ echo "{\"type\":\"session_end\",\"sessionId\":\"$TELEGRAM_SESSION_ID\",\"timestamp\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\"content\":\"Session ended\"}" | \
73
+ nc -U -q0 "$SOCKET_PATH" 2>/dev/null || true
74
+ fi
75
+ }
76
+
77
+ # Cleanup on exit
78
+ cleanup() {
79
+ notify_end
80
+
81
+ # Kill bridge daemon if we started it
82
+ if [[ -n "$BRIDGE_PID" ]]; then
83
+ kill "$BRIDGE_PID" 2>/dev/null || true
84
+ fi
85
+ }
86
+
87
+ # Main execution
88
+ main() {
89
+ # Find the real claude command
90
+ CLAUDE_CMD=$(which claude 2>/dev/null || echo "")
91
+
92
+ if [[ -z "$CLAUDE_CMD" ]]; then
93
+ echo "❌ Claude CLI not found"
94
+ exit 1
95
+ fi
96
+
97
+ # Check if this is being called as a wrapper (avoid recursion)
98
+ if [[ "$CLAUDE_WRAPPER_ACTIVE" == "true" ]]; then
99
+ exec "$CLAUDE_CMD" "$@"
100
+ fi
101
+
102
+ export CLAUDE_WRAPPER_ACTIVE="true"
103
+
104
+ if [[ "$TELEGRAM_ENABLED" == "true" || "$TELEGRAM_ENABLED" == "1" ]]; then
105
+ # Start bridge if needed
106
+ start_bridge
107
+
108
+ # Setup cleanup trap
109
+ trap cleanup EXIT
110
+
111
+ # Notify session start
112
+ notify_start
113
+
114
+ echo "📱 Telegram mirror active"
115
+ echo ""
116
+ fi
117
+
118
+ # Execute claude with all arguments
119
+ exec "$CLAUDE_CMD" "$@"
120
+ }
121
+
122
+ main "$@"