@selucas12/cheesy 2.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.
Files changed (292) hide show
  1. package/.env.example +22 -0
  2. package/CHANGELOG.md +268 -0
  3. package/LICENSE +21 -0
  4. package/README.md +394 -0
  5. package/ccgram.service +24 -0
  6. package/config/channels.json +58 -0
  7. package/config/default.json +27 -0
  8. package/config/defaults/config.json +16 -0
  9. package/config/defaults/i18n.json +32 -0
  10. package/config/email-template.json +31 -0
  11. package/config/test-with-subagent.json +16 -0
  12. package/config/user.json +27 -0
  13. package/dist/claude-hook-notify.d.ts +7 -0
  14. package/dist/claude-hook-notify.d.ts.map +1 -0
  15. package/dist/claude-hook-notify.js +154 -0
  16. package/dist/claude-hook-notify.js.map +1 -0
  17. package/dist/claude-remote.d.ts +50 -0
  18. package/dist/claude-remote.d.ts.map +1 -0
  19. package/dist/claude-remote.js +927 -0
  20. package/dist/claude-remote.js.map +1 -0
  21. package/dist/elicitation-notify.d.ts +20 -0
  22. package/dist/elicitation-notify.d.ts.map +1 -0
  23. package/dist/elicitation-notify.js +241 -0
  24. package/dist/elicitation-notify.js.map +1 -0
  25. package/dist/enhanced-hook-notify.d.ts +23 -0
  26. package/dist/enhanced-hook-notify.d.ts.map +1 -0
  27. package/dist/enhanced-hook-notify.js +402 -0
  28. package/dist/enhanced-hook-notify.js.map +1 -0
  29. package/dist/permission-denied-notify.d.ts +11 -0
  30. package/dist/permission-denied-notify.d.ts.map +1 -0
  31. package/dist/permission-denied-notify.js +193 -0
  32. package/dist/permission-denied-notify.js.map +1 -0
  33. package/dist/permission-hook.d.ts +15 -0
  34. package/dist/permission-hook.d.ts.map +1 -0
  35. package/dist/permission-hook.js +386 -0
  36. package/dist/permission-hook.js.map +1 -0
  37. package/dist/pre-compact-notify.d.ts +13 -0
  38. package/dist/pre-compact-notify.d.ts.map +1 -0
  39. package/dist/pre-compact-notify.js +197 -0
  40. package/dist/pre-compact-notify.js.map +1 -0
  41. package/dist/prompt-bridge.d.ts +50 -0
  42. package/dist/prompt-bridge.d.ts.map +1 -0
  43. package/dist/prompt-bridge.js +173 -0
  44. package/dist/prompt-bridge.js.map +1 -0
  45. package/dist/question-notify.d.ts +17 -0
  46. package/dist/question-notify.d.ts.map +1 -0
  47. package/dist/question-notify.js +356 -0
  48. package/dist/question-notify.js.map +1 -0
  49. package/dist/setup.d.ts +10 -0
  50. package/dist/setup.d.ts.map +1 -0
  51. package/dist/setup.js +649 -0
  52. package/dist/setup.js.map +1 -0
  53. package/dist/smart-monitor.d.ts +7 -0
  54. package/dist/smart-monitor.d.ts.map +1 -0
  55. package/dist/smart-monitor.js +256 -0
  56. package/dist/smart-monitor.js.map +1 -0
  57. package/dist/src/automation/clipboard-automation.d.ts +35 -0
  58. package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
  59. package/dist/src/automation/clipboard-automation.js +242 -0
  60. package/dist/src/automation/clipboard-automation.js.map +1 -0
  61. package/dist/src/channels/base/channel.d.ts +60 -0
  62. package/dist/src/channels/base/channel.d.ts.map +1 -0
  63. package/dist/src/channels/base/channel.js +96 -0
  64. package/dist/src/channels/base/channel.js.map +1 -0
  65. package/dist/src/channels/email/smtp.d.ts +74 -0
  66. package/dist/src/channels/email/smtp.d.ts.map +1 -0
  67. package/dist/src/channels/email/smtp.js +605 -0
  68. package/dist/src/channels/email/smtp.js.map +1 -0
  69. package/dist/src/channels/line/line.d.ts +36 -0
  70. package/dist/src/channels/line/line.d.ts.map +1 -0
  71. package/dist/src/channels/line/line.js +180 -0
  72. package/dist/src/channels/line/line.js.map +1 -0
  73. package/dist/src/channels/line/webhook.d.ts +55 -0
  74. package/dist/src/channels/line/webhook.d.ts.map +1 -0
  75. package/dist/src/channels/line/webhook.js +191 -0
  76. package/dist/src/channels/line/webhook.js.map +1 -0
  77. package/dist/src/channels/local/desktop.d.ts +30 -0
  78. package/dist/src/channels/local/desktop.d.ts.map +1 -0
  79. package/dist/src/channels/local/desktop.js +161 -0
  80. package/dist/src/channels/local/desktop.js.map +1 -0
  81. package/dist/src/channels/telegram/telegram.d.ts +43 -0
  82. package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
  83. package/dist/src/channels/telegram/telegram.js +223 -0
  84. package/dist/src/channels/telegram/telegram.js.map +1 -0
  85. package/dist/src/channels/telegram/webhook.d.ts +75 -0
  86. package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
  87. package/dist/src/channels/telegram/webhook.js +278 -0
  88. package/dist/src/channels/telegram/webhook.js.map +1 -0
  89. package/dist/src/cli.d.ts +9 -0
  90. package/dist/src/cli.d.ts.map +1 -0
  91. package/dist/src/cli.js +99 -0
  92. package/dist/src/cli.js.map +1 -0
  93. package/dist/src/commands/hooks.d.ts +10 -0
  94. package/dist/src/commands/hooks.d.ts.map +1 -0
  95. package/dist/src/commands/hooks.js +50 -0
  96. package/dist/src/commands/hooks.js.map +1 -0
  97. package/dist/src/commands/init.d.ts +20 -0
  98. package/dist/src/commands/init.d.ts.map +1 -0
  99. package/dist/src/commands/init.js +173 -0
  100. package/dist/src/commands/init.js.map +1 -0
  101. package/dist/src/commands/license.d.ts +15 -0
  102. package/dist/src/commands/license.d.ts.map +1 -0
  103. package/dist/src/commands/license.js +107 -0
  104. package/dist/src/commands/license.js.map +1 -0
  105. package/dist/src/commands/start.d.ts +17 -0
  106. package/dist/src/commands/start.d.ts.map +1 -0
  107. package/dist/src/commands/start.js +150 -0
  108. package/dist/src/commands/start.js.map +1 -0
  109. package/dist/src/commands/status.d.ts +8 -0
  110. package/dist/src/commands/status.d.ts.map +1 -0
  111. package/dist/src/commands/status.js +95 -0
  112. package/dist/src/commands/status.js.map +1 -0
  113. package/dist/src/commands/stop.d.ts +8 -0
  114. package/dist/src/commands/stop.d.ts.map +1 -0
  115. package/dist/src/commands/stop.js +64 -0
  116. package/dist/src/commands/stop.js.map +1 -0
  117. package/dist/src/config-manager.d.ts +16 -0
  118. package/dist/src/config-manager.d.ts.map +1 -0
  119. package/dist/src/config-manager.js +152 -0
  120. package/dist/src/config-manager.js.map +1 -0
  121. package/dist/src/core/config.d.ts +28 -0
  122. package/dist/src/core/config.d.ts.map +1 -0
  123. package/dist/src/core/config.js +248 -0
  124. package/dist/src/core/config.js.map +1 -0
  125. package/dist/src/core/logger.d.ts +19 -0
  126. package/dist/src/core/logger.d.ts.map +1 -0
  127. package/dist/src/core/logger.js +47 -0
  128. package/dist/src/core/logger.js.map +1 -0
  129. package/dist/src/core/notifier.d.ts +45 -0
  130. package/dist/src/core/notifier.d.ts.map +1 -0
  131. package/dist/src/core/notifier.js +189 -0
  132. package/dist/src/core/notifier.js.map +1 -0
  133. package/dist/src/lib/license-validator.d.ts +120 -0
  134. package/dist/src/lib/license-validator.d.ts.map +1 -0
  135. package/dist/src/lib/license-validator.js +294 -0
  136. package/dist/src/lib/license-validator.js.map +1 -0
  137. package/dist/src/lib/preflight.d.ts +28 -0
  138. package/dist/src/lib/preflight.d.ts.map +1 -0
  139. package/dist/src/lib/preflight.js +90 -0
  140. package/dist/src/lib/preflight.js.map +1 -0
  141. package/dist/src/relay/claude-command-bridge.d.ts +57 -0
  142. package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
  143. package/dist/src/relay/claude-command-bridge.js +188 -0
  144. package/dist/src/relay/claude-command-bridge.js.map +1 -0
  145. package/dist/src/relay/email-listener.d.ts +65 -0
  146. package/dist/src/relay/email-listener.d.ts.map +1 -0
  147. package/dist/src/relay/email-listener.js +460 -0
  148. package/dist/src/relay/email-listener.js.map +1 -0
  149. package/dist/src/relay/relay-pty.d.ts +21 -0
  150. package/dist/src/relay/relay-pty.d.ts.map +1 -0
  151. package/dist/src/relay/relay-pty.js +696 -0
  152. package/dist/src/relay/relay-pty.js.map +1 -0
  153. package/dist/src/relay/smart-injector.d.ts +30 -0
  154. package/dist/src/relay/smart-injector.d.ts.map +1 -0
  155. package/dist/src/relay/smart-injector.js +233 -0
  156. package/dist/src/relay/smart-injector.js.map +1 -0
  157. package/dist/src/relay/tmux-injector.d.ts +46 -0
  158. package/dist/src/relay/tmux-injector.d.ts.map +1 -0
  159. package/dist/src/relay/tmux-injector.js +413 -0
  160. package/dist/src/relay/tmux-injector.js.map +1 -0
  161. package/dist/src/tools/config-manager.d.ts +33 -0
  162. package/dist/src/tools/config-manager.d.ts.map +1 -0
  163. package/dist/src/tools/config-manager.js +448 -0
  164. package/dist/src/tools/config-manager.js.map +1 -0
  165. package/dist/src/tools/installer.d.ts +38 -0
  166. package/dist/src/tools/installer.d.ts.map +1 -0
  167. package/dist/src/tools/installer.js +222 -0
  168. package/dist/src/tools/installer.js.map +1 -0
  169. package/dist/src/types/callbacks.d.ts +53 -0
  170. package/dist/src/types/callbacks.d.ts.map +1 -0
  171. package/dist/src/types/callbacks.js +7 -0
  172. package/dist/src/types/callbacks.js.map +1 -0
  173. package/dist/src/types/config.d.ts +56 -0
  174. package/dist/src/types/config.d.ts.map +1 -0
  175. package/dist/src/types/config.js +6 -0
  176. package/dist/src/types/config.js.map +1 -0
  177. package/dist/src/types/hooks.d.ts +47 -0
  178. package/dist/src/types/hooks.d.ts.map +1 -0
  179. package/dist/src/types/hooks.js +6 -0
  180. package/dist/src/types/hooks.js.map +1 -0
  181. package/dist/src/types/index.d.ts +7 -0
  182. package/dist/src/types/index.d.ts.map +1 -0
  183. package/dist/src/types/index.js +23 -0
  184. package/dist/src/types/index.js.map +1 -0
  185. package/dist/src/types/ipc.d.ts +43 -0
  186. package/dist/src/types/ipc.d.ts.map +1 -0
  187. package/dist/src/types/ipc.js +7 -0
  188. package/dist/src/types/ipc.js.map +1 -0
  189. package/dist/src/types/session.d.ts +87 -0
  190. package/dist/src/types/session.d.ts.map +1 -0
  191. package/dist/src/types/session.js +9 -0
  192. package/dist/src/types/session.js.map +1 -0
  193. package/dist/src/types/telegram.d.ts +58 -0
  194. package/dist/src/types/telegram.d.ts.map +1 -0
  195. package/dist/src/types/telegram.js +6 -0
  196. package/dist/src/types/telegram.js.map +1 -0
  197. package/dist/src/utils/active-check.d.ts +20 -0
  198. package/dist/src/utils/active-check.d.ts.map +1 -0
  199. package/dist/src/utils/active-check.js +42 -0
  200. package/dist/src/utils/active-check.js.map +1 -0
  201. package/dist/src/utils/callback-parser.d.ts +23 -0
  202. package/dist/src/utils/callback-parser.d.ts.map +1 -0
  203. package/dist/src/utils/callback-parser.js +85 -0
  204. package/dist/src/utils/callback-parser.js.map +1 -0
  205. package/dist/src/utils/controller-injector.d.ts +21 -0
  206. package/dist/src/utils/controller-injector.d.ts.map +1 -0
  207. package/dist/src/utils/controller-injector.js +108 -0
  208. package/dist/src/utils/controller-injector.js.map +1 -0
  209. package/dist/src/utils/conversation-tracker.d.ts +32 -0
  210. package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
  211. package/dist/src/utils/conversation-tracker.js +119 -0
  212. package/dist/src/utils/conversation-tracker.js.map +1 -0
  213. package/dist/src/utils/deep-link.d.ts +22 -0
  214. package/dist/src/utils/deep-link.d.ts.map +1 -0
  215. package/dist/src/utils/deep-link.js +43 -0
  216. package/dist/src/utils/deep-link.js.map +1 -0
  217. package/dist/src/utils/ghostty-session-manager.d.ts +81 -0
  218. package/dist/src/utils/ghostty-session-manager.d.ts.map +1 -0
  219. package/dist/src/utils/ghostty-session-manager.js +370 -0
  220. package/dist/src/utils/ghostty-session-manager.js.map +1 -0
  221. package/dist/src/utils/hook-definitions.d.ts +25 -0
  222. package/dist/src/utils/hook-definitions.d.ts.map +1 -0
  223. package/dist/src/utils/hook-definitions.js +36 -0
  224. package/dist/src/utils/hook-definitions.js.map +1 -0
  225. package/dist/src/utils/http-request.d.ts +25 -0
  226. package/dist/src/utils/http-request.d.ts.map +1 -0
  227. package/dist/src/utils/http-request.js +66 -0
  228. package/dist/src/utils/http-request.js.map +1 -0
  229. package/dist/src/utils/optional-require.d.ts +13 -0
  230. package/dist/src/utils/optional-require.d.ts.map +1 -0
  231. package/dist/src/utils/optional-require.js +37 -0
  232. package/dist/src/utils/optional-require.js.map +1 -0
  233. package/dist/src/utils/paths.d.ts +13 -0
  234. package/dist/src/utils/paths.d.ts.map +1 -0
  235. package/dist/src/utils/paths.js +30 -0
  236. package/dist/src/utils/paths.js.map +1 -0
  237. package/dist/src/utils/pty-session-manager.d.ts +43 -0
  238. package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
  239. package/dist/src/utils/pty-session-manager.js +183 -0
  240. package/dist/src/utils/pty-session-manager.js.map +1 -0
  241. package/dist/src/utils/subagent-tracker.d.ts +64 -0
  242. package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
  243. package/dist/src/utils/subagent-tracker.js +191 -0
  244. package/dist/src/utils/subagent-tracker.js.map +1 -0
  245. package/dist/src/utils/tmux-monitor.d.ts +102 -0
  246. package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
  247. package/dist/src/utils/tmux-monitor.js +642 -0
  248. package/dist/src/utils/tmux-monitor.js.map +1 -0
  249. package/dist/src/utils/trace-capture.d.ts +42 -0
  250. package/dist/src/utils/trace-capture.d.ts.map +1 -0
  251. package/dist/src/utils/trace-capture.js +102 -0
  252. package/dist/src/utils/trace-capture.js.map +1 -0
  253. package/dist/src/utils/transcript-reader.d.ts +57 -0
  254. package/dist/src/utils/transcript-reader.d.ts.map +1 -0
  255. package/dist/src/utils/transcript-reader.js +229 -0
  256. package/dist/src/utils/transcript-reader.js.map +1 -0
  257. package/dist/start-all-webhooks.d.ts +7 -0
  258. package/dist/start-all-webhooks.d.ts.map +1 -0
  259. package/dist/start-all-webhooks.js +98 -0
  260. package/dist/start-all-webhooks.js.map +1 -0
  261. package/dist/start-line-webhook.d.ts +7 -0
  262. package/dist/start-line-webhook.d.ts.map +1 -0
  263. package/dist/start-line-webhook.js +59 -0
  264. package/dist/start-line-webhook.js.map +1 -0
  265. package/dist/start-relay-pty.d.ts +7 -0
  266. package/dist/start-relay-pty.d.ts.map +1 -0
  267. package/dist/start-relay-pty.js +173 -0
  268. package/dist/start-relay-pty.js.map +1 -0
  269. package/dist/start-telegram-webhook.d.ts +7 -0
  270. package/dist/start-telegram-webhook.d.ts.map +1 -0
  271. package/dist/start-telegram-webhook.js +80 -0
  272. package/dist/start-telegram-webhook.js.map +1 -0
  273. package/dist/user-prompt-hook.d.ts +13 -0
  274. package/dist/user-prompt-hook.d.ts.map +1 -0
  275. package/dist/user-prompt-hook.js +45 -0
  276. package/dist/user-prompt-hook.js.map +1 -0
  277. package/dist/workspace-router.d.ts +114 -0
  278. package/dist/workspace-router.d.ts.map +1 -0
  279. package/dist/workspace-router.js +572 -0
  280. package/dist/workspace-router.js.map +1 -0
  281. package/dist/workspace-telegram-bot.d.ts +3 -0
  282. package/dist/workspace-telegram-bot.d.ts.map +1 -0
  283. package/dist/workspace-telegram-bot.js +1847 -0
  284. package/dist/workspace-telegram-bot.js.map +1 -0
  285. package/package.json +85 -0
  286. package/src/types/callbacks.ts +73 -0
  287. package/src/types/config.ts +63 -0
  288. package/src/types/hooks.ts +50 -0
  289. package/src/types/index.ts +6 -0
  290. package/src/types/ipc.ts +55 -0
  291. package/src/types/session.ts +91 -0
  292. package/src/types/telegram.ts +66 -0
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cheesyboy PTY Relay Startup Script
4
+ * Start node-pty based email command relay service
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-relay-pty.d.ts.map
@@ -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
+ * Cheesyboy 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 Cheesyboy 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 Cheesyboy 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,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Telegram Webhook Server
4
+ * Starts the Telegram webhook server for receiving messages
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-telegram-webhook.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-telegram-webhook.js","sourceRoot":"","sources":["../start-telegram-webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * UserPromptSubmit hook — called by Claude Code whenever the user submits a prompt.
4
+ *
5
+ * Writes the current Unix timestamp to /tmp/claude_last_msg_time so that
6
+ * active-check.ts can detect when the user is actively working at the terminal
7
+ * and suppress redundant Telegram notifications.
8
+ *
9
+ * Must be fast — registered with timeout: 2 in settings.json.
10
+ * No stdout output. No Telegram calls.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=user-prompt-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-prompt-hook.d.ts","sourceRoot":"","sources":["../user-prompt-hook.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * UserPromptSubmit hook — called by Claude Code whenever the user submits a prompt.
5
+ *
6
+ * Writes the current Unix timestamp to /tmp/claude_last_msg_time so that
7
+ * active-check.ts can detect when the user is actively working at the terminal
8
+ * and suppress redundant Telegram notifications.
9
+ *
10
+ * Must be fast — registered with timeout: 2 in settings.json.
11
+ * No stdout output. No Telegram calls.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const path_1 = __importDefault(require("path"));
18
+ const paths_1 = require("./src/utils/paths");
19
+ require('dotenv').config({ path: path_1.default.join(paths_1.PROJECT_ROOT, '.env'), quiet: true });
20
+ const fs_1 = __importDefault(require("fs"));
21
+ const LAST_MSG_FILE = '/tmp/claude_last_msg_time';
22
+ // Write current Unix timestamp immediately
23
+ try {
24
+ fs_1.default.writeFileSync(LAST_MSG_FILE, String(Math.floor(Date.now() / 1000)));
25
+ }
26
+ catch {
27
+ // Non-fatal — active-check will just assume user is inactive
28
+ }
29
+ // Drain stdin using the standard hook pattern (data not needed)
30
+ let resolved = false;
31
+ process.stdin.setEncoding('utf8');
32
+ process.stdin.on('data', () => { });
33
+ process.stdin.on('end', () => {
34
+ if (!resolved) {
35
+ resolved = true;
36
+ process.stdin.destroy();
37
+ }
38
+ });
39
+ setTimeout(() => {
40
+ if (!resolved) {
41
+ resolved = true;
42
+ process.stdin.destroy();
43
+ }
44
+ }, 500);
45
+ //# sourceMappingURL=user-prompt-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-prompt-hook.js","sourceRoot":"","sources":["../user-prompt-hook.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;GASG;;;;;AAEH,gDAAwB;AACxB,6CAAiD;AACjD,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjF,4CAAoB;AAEpB,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,2CAA2C;AAC3C,IAAI,CAAC;IACH,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAAC,MAAM,CAAC;IACP,6DAA6D;AAC/D,CAAC;AAED,gEAAgE;AAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AACH,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC9D,CAAC,EAAE,GAAG,CAAC,CAAC"}
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Workspace Router - Maps workspace names to Claude Code sessions.
4
+ *
5
+ * Reads the session map and resolves human-friendly project names
6
+ * (e.g. "wp-super-ai") to active tmux sessions so commands can be
7
+ * routed without memorising tokens.
8
+ */
9
+ import type { SessionEntry, SessionMap, ResolveResult, SessionHistoryEntry, RateLimitInfo } from './src/types';
10
+ declare const SESSION_MAP_PATH: string;
11
+ /**
12
+ * Extract a short project name from a cwd path.
13
+ * "/home/user/projects/my-project" -> "my-project"
14
+ */
15
+ declare function extractWorkspaceName(cwd: string | null): string | null;
16
+ /** Read the session map from disk. */
17
+ declare function readSessionMap(): SessionMap;
18
+ /** Write the session map to disk. */
19
+ declare function writeSessionMap(map: SessionMap): void;
20
+ /** Check whether a session has expired. */
21
+ declare function isExpired(session: SessionEntry | Record<string, unknown>): boolean;
22
+ /**
23
+ * Find the most recent non-expired session whose workspace name matches.
24
+ * Returns { token, session } or null.
25
+ */
26
+ declare function findSessionByWorkspace(workspaceName: string): {
27
+ token: string;
28
+ session: SessionEntry;
29
+ } | null;
30
+ /**
31
+ * List all active (non-expired) sessions grouped by workspace.
32
+ * Returns an array of { workspace, token, session, age }.
33
+ */
34
+ declare function listActiveSessions(): Array<{
35
+ workspace: string;
36
+ token: string;
37
+ session: SessionEntry;
38
+ age: string;
39
+ }>;
40
+ /**
41
+ * Register or update a session in the map.
42
+ * Called by the hook notifier when Claude starts/stops.
43
+ */
44
+ declare function upsertSession({ cwd, tmuxSession, status, sessionId, sessionType, rateLimit }: {
45
+ cwd: string;
46
+ tmuxSession: string;
47
+ status: string;
48
+ sessionId?: string | null;
49
+ sessionType?: 'tmux' | 'pty' | 'ghostty';
50
+ rateLimit?: RateLimitInfo;
51
+ }): {
52
+ token: string;
53
+ workspace: string | null;
54
+ };
55
+ /**
56
+ * Update rate limit info for a session by workspace name.
57
+ * Returns true if session was found and updated.
58
+ */
59
+ declare function updateSessionRateLimit(workspace: string, rateLimit: RateLimitInfo): boolean;
60
+ /**
61
+ * Get rate limit info for a session by workspace name.
62
+ */
63
+ declare function getSessionRateLimit(workspace: string): RateLimitInfo | undefined;
64
+ /**
65
+ * Find the newest non-expired session with the given tmuxSession name.
66
+ * Used by callback handlers that only have the session name from pending files.
67
+ */
68
+ declare function findSessionByTmuxName(tmuxName: string): SessionEntry | undefined;
69
+ /** Remove expired sessions from the map. */
70
+ declare function pruneExpired(): number;
71
+ /**
72
+ * Resolve a workspace name by exact match, then prefix match.
73
+ */
74
+ declare function resolveWorkspace(name: string): ResolveResult;
75
+ declare function getDefaultWorkspace(): string | null;
76
+ declare function setDefaultWorkspace(name: string | null): void;
77
+ /**
78
+ * Track which Telegram message_id belongs to which workspace.
79
+ * Prunes entries older than 24 hours on each write.
80
+ */
81
+ declare function trackNotificationMessage(messageId: number | string, workspace: string, type: string): void;
82
+ /**
83
+ * Look up which workspace a Telegram message belongs to.
84
+ * Returns the workspace name or null.
85
+ */
86
+ declare function getWorkspaceForMessage(messageId: number | string | null | undefined): string | null;
87
+ declare function recordProjectUsage(name: string, projectPath: string, sessionId?: string | null): void;
88
+ declare function getRecentProjects(limit?: number): Array<{
89
+ name: string;
90
+ path: string;
91
+ }>;
92
+ /**
93
+ * Return projects that have at least one stored Claude Code session ID.
94
+ * Used by /resume to list resumeable conversations.
95
+ */
96
+ declare function getResumeableProjects(limit?: number): Array<{
97
+ name: string;
98
+ path: string;
99
+ sessions: SessionHistoryEntry[];
100
+ }>;
101
+ /**
102
+ * Read Claude Code's session storage for a project directory and return
103
+ * the most recent sessions, sorted by file mtime (last activity).
104
+ *
105
+ * Claude Code stores sessions in ~/.claude/projects/<encoded-path>/<uuid>.jsonl
106
+ * where the path encoding replaces every "/" with "-" (including the leading slash).
107
+ */
108
+ declare function getClaudeSessionsForProject(projectPath: string, limit?: number): Array<{
109
+ id: string;
110
+ lastActivity: number;
111
+ snippet: string | null;
112
+ }>;
113
+ export { extractWorkspaceName, readSessionMap, writeSessionMap, findSessionByWorkspace, findSessionByTmuxName, resolveWorkspace, listActiveSessions, upsertSession, pruneExpired, isExpired, getDefaultWorkspace, setDefaultWorkspace, trackNotificationMessage, getWorkspaceForMessage, recordProjectUsage, getRecentProjects, getResumeableProjects, getClaudeSessionsForProject, updateSessionRateLimit, getSessionRateLimit, SESSION_MAP_PATH, };
114
+ //# sourceMappingURL=workspace-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-router.d.ts","sourceRoot":"","sources":["../workspace-router.ts"],"names":[],"mappings":"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"}