@jsayubi/ccgram 1.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 (247) hide show
  1. package/.env.example +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +338 -0
  4. package/ccgram.service +24 -0
  5. package/config/channels.json +58 -0
  6. package/config/default.json +27 -0
  7. package/config/defaults/config.json +16 -0
  8. package/config/defaults/i18n.json +32 -0
  9. package/config/email-template.json +31 -0
  10. package/config/test-with-subagent.json +16 -0
  11. package/config/user.json +27 -0
  12. package/dist/claude-hook-notify.d.ts +7 -0
  13. package/dist/claude-hook-notify.d.ts.map +1 -0
  14. package/dist/claude-hook-notify.js +154 -0
  15. package/dist/claude-hook-notify.js.map +1 -0
  16. package/dist/claude-remote.d.ts +50 -0
  17. package/dist/claude-remote.d.ts.map +1 -0
  18. package/dist/claude-remote.js +927 -0
  19. package/dist/claude-remote.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +110 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/enhanced-hook-notify.d.ts +16 -0
  25. package/dist/enhanced-hook-notify.d.ts.map +1 -0
  26. package/dist/enhanced-hook-notify.js +288 -0
  27. package/dist/enhanced-hook-notify.js.map +1 -0
  28. package/dist/permission-hook.d.ts +15 -0
  29. package/dist/permission-hook.d.ts.map +1 -0
  30. package/dist/permission-hook.js +357 -0
  31. package/dist/permission-hook.js.map +1 -0
  32. package/dist/prompt-bridge.d.ts +50 -0
  33. package/dist/prompt-bridge.d.ts.map +1 -0
  34. package/dist/prompt-bridge.js +173 -0
  35. package/dist/prompt-bridge.js.map +1 -0
  36. package/dist/question-notify.d.ts +16 -0
  37. package/dist/question-notify.d.ts.map +1 -0
  38. package/dist/question-notify.js +272 -0
  39. package/dist/question-notify.js.map +1 -0
  40. package/dist/setup.d.ts +10 -0
  41. package/dist/setup.d.ts.map +1 -0
  42. package/dist/setup.js +649 -0
  43. package/dist/setup.js.map +1 -0
  44. package/dist/smart-monitor.d.ts +7 -0
  45. package/dist/smart-monitor.d.ts.map +1 -0
  46. package/dist/smart-monitor.js +256 -0
  47. package/dist/smart-monitor.js.map +1 -0
  48. package/dist/src/automation/claude-automation.d.ts +45 -0
  49. package/dist/src/automation/claude-automation.d.ts.map +1 -0
  50. package/dist/src/automation/claude-automation.js +367 -0
  51. package/dist/src/automation/claude-automation.js.map +1 -0
  52. package/dist/src/automation/clipboard-automation.d.ts +35 -0
  53. package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
  54. package/dist/src/automation/clipboard-automation.js +242 -0
  55. package/dist/src/automation/clipboard-automation.js.map +1 -0
  56. package/dist/src/automation/simple-automation.d.ts +56 -0
  57. package/dist/src/automation/simple-automation.d.ts.map +1 -0
  58. package/dist/src/automation/simple-automation.js +283 -0
  59. package/dist/src/automation/simple-automation.js.map +1 -0
  60. package/dist/src/channels/base/channel.d.ts +60 -0
  61. package/dist/src/channels/base/channel.d.ts.map +1 -0
  62. package/dist/src/channels/base/channel.js +96 -0
  63. package/dist/src/channels/base/channel.js.map +1 -0
  64. package/dist/src/channels/email/smtp.d.ts +74 -0
  65. package/dist/src/channels/email/smtp.d.ts.map +1 -0
  66. package/dist/src/channels/email/smtp.js +605 -0
  67. package/dist/src/channels/email/smtp.js.map +1 -0
  68. package/dist/src/channels/line/line.d.ts +36 -0
  69. package/dist/src/channels/line/line.d.ts.map +1 -0
  70. package/dist/src/channels/line/line.js +180 -0
  71. package/dist/src/channels/line/line.js.map +1 -0
  72. package/dist/src/channels/line/webhook.d.ts +55 -0
  73. package/dist/src/channels/line/webhook.d.ts.map +1 -0
  74. package/dist/src/channels/line/webhook.js +191 -0
  75. package/dist/src/channels/line/webhook.js.map +1 -0
  76. package/dist/src/channels/local/desktop.d.ts +30 -0
  77. package/dist/src/channels/local/desktop.d.ts.map +1 -0
  78. package/dist/src/channels/local/desktop.js +161 -0
  79. package/dist/src/channels/local/desktop.js.map +1 -0
  80. package/dist/src/channels/telegram/telegram.d.ts +43 -0
  81. package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
  82. package/dist/src/channels/telegram/telegram.js +223 -0
  83. package/dist/src/channels/telegram/telegram.js.map +1 -0
  84. package/dist/src/channels/telegram/webhook.d.ts +75 -0
  85. package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
  86. package/dist/src/channels/telegram/webhook.js +278 -0
  87. package/dist/src/channels/telegram/webhook.js.map +1 -0
  88. package/dist/src/config-manager.d.ts +16 -0
  89. package/dist/src/config-manager.d.ts.map +1 -0
  90. package/dist/src/config-manager.js +152 -0
  91. package/dist/src/config-manager.js.map +1 -0
  92. package/dist/src/core/config.d.ts +28 -0
  93. package/dist/src/core/config.d.ts.map +1 -0
  94. package/dist/src/core/config.js +248 -0
  95. package/dist/src/core/config.js.map +1 -0
  96. package/dist/src/core/logger.d.ts +19 -0
  97. package/dist/src/core/logger.d.ts.map +1 -0
  98. package/dist/src/core/logger.js +47 -0
  99. package/dist/src/core/logger.js.map +1 -0
  100. package/dist/src/core/notifier.d.ts +45 -0
  101. package/dist/src/core/notifier.d.ts.map +1 -0
  102. package/dist/src/core/notifier.js +189 -0
  103. package/dist/src/core/notifier.js.map +1 -0
  104. package/dist/src/daemon/taskping-daemon.d.ts +38 -0
  105. package/dist/src/daemon/taskping-daemon.d.ts.map +1 -0
  106. package/dist/src/daemon/taskping-daemon.js +306 -0
  107. package/dist/src/daemon/taskping-daemon.js.map +1 -0
  108. package/dist/src/relay/claude-command-bridge.d.ts +57 -0
  109. package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
  110. package/dist/src/relay/claude-command-bridge.js +188 -0
  111. package/dist/src/relay/claude-command-bridge.js.map +1 -0
  112. package/dist/src/relay/command-relay.d.ts +94 -0
  113. package/dist/src/relay/command-relay.d.ts.map +1 -0
  114. package/dist/src/relay/command-relay.js +463 -0
  115. package/dist/src/relay/command-relay.js.map +1 -0
  116. package/dist/src/relay/email-listener.d.ts +65 -0
  117. package/dist/src/relay/email-listener.d.ts.map +1 -0
  118. package/dist/src/relay/email-listener.js +460 -0
  119. package/dist/src/relay/email-listener.js.map +1 -0
  120. package/dist/src/relay/relay-pty.d.ts +21 -0
  121. package/dist/src/relay/relay-pty.d.ts.map +1 -0
  122. package/dist/src/relay/relay-pty.js +696 -0
  123. package/dist/src/relay/relay-pty.js.map +1 -0
  124. package/dist/src/relay/smart-injector.d.ts +30 -0
  125. package/dist/src/relay/smart-injector.d.ts.map +1 -0
  126. package/dist/src/relay/smart-injector.js +233 -0
  127. package/dist/src/relay/smart-injector.js.map +1 -0
  128. package/dist/src/relay/tmux-injector.d.ts +46 -0
  129. package/dist/src/relay/tmux-injector.d.ts.map +1 -0
  130. package/dist/src/relay/tmux-injector.js +413 -0
  131. package/dist/src/relay/tmux-injector.js.map +1 -0
  132. package/dist/src/tools/config-manager.d.ts +33 -0
  133. package/dist/src/tools/config-manager.d.ts.map +1 -0
  134. package/dist/src/tools/config-manager.js +448 -0
  135. package/dist/src/tools/config-manager.js.map +1 -0
  136. package/dist/src/tools/installer.d.ts +38 -0
  137. package/dist/src/tools/installer.d.ts.map +1 -0
  138. package/dist/src/tools/installer.js +222 -0
  139. package/dist/src/tools/installer.js.map +1 -0
  140. package/dist/src/types/callbacks.d.ts +29 -0
  141. package/dist/src/types/callbacks.d.ts.map +1 -0
  142. package/dist/src/types/callbacks.js +7 -0
  143. package/dist/src/types/callbacks.js.map +1 -0
  144. package/dist/src/types/config.d.ts +56 -0
  145. package/dist/src/types/config.d.ts.map +1 -0
  146. package/dist/src/types/config.js +6 -0
  147. package/dist/src/types/config.js.map +1 -0
  148. package/dist/src/types/hooks.d.ts +47 -0
  149. package/dist/src/types/hooks.d.ts.map +1 -0
  150. package/dist/src/types/hooks.js +6 -0
  151. package/dist/src/types/hooks.js.map +1 -0
  152. package/dist/src/types/index.d.ts +7 -0
  153. package/dist/src/types/index.d.ts.map +1 -0
  154. package/dist/src/types/index.js +23 -0
  155. package/dist/src/types/index.js.map +1 -0
  156. package/dist/src/types/ipc.d.ts +43 -0
  157. package/dist/src/types/ipc.d.ts.map +1 -0
  158. package/dist/src/types/ipc.js +7 -0
  159. package/dist/src/types/ipc.js.map +1 -0
  160. package/dist/src/types/session.d.ts +70 -0
  161. package/dist/src/types/session.d.ts.map +1 -0
  162. package/dist/src/types/session.js +9 -0
  163. package/dist/src/types/session.js.map +1 -0
  164. package/dist/src/types/telegram.d.ts +58 -0
  165. package/dist/src/types/telegram.d.ts.map +1 -0
  166. package/dist/src/types/telegram.js +6 -0
  167. package/dist/src/types/telegram.js.map +1 -0
  168. package/dist/src/utils/active-check.d.ts +19 -0
  169. package/dist/src/utils/active-check.d.ts.map +1 -0
  170. package/dist/src/utils/active-check.js +41 -0
  171. package/dist/src/utils/active-check.js.map +1 -0
  172. package/dist/src/utils/callback-parser.d.ts +21 -0
  173. package/dist/src/utils/callback-parser.d.ts.map +1 -0
  174. package/dist/src/utils/callback-parser.js +58 -0
  175. package/dist/src/utils/callback-parser.js.map +1 -0
  176. package/dist/src/utils/controller-injector.d.ts +21 -0
  177. package/dist/src/utils/controller-injector.d.ts.map +1 -0
  178. package/dist/src/utils/controller-injector.js +108 -0
  179. package/dist/src/utils/controller-injector.js.map +1 -0
  180. package/dist/src/utils/conversation-tracker.d.ts +32 -0
  181. package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
  182. package/dist/src/utils/conversation-tracker.js +119 -0
  183. package/dist/src/utils/conversation-tracker.js.map +1 -0
  184. package/dist/src/utils/http-request.d.ts +25 -0
  185. package/dist/src/utils/http-request.d.ts.map +1 -0
  186. package/dist/src/utils/http-request.js +66 -0
  187. package/dist/src/utils/http-request.js.map +1 -0
  188. package/dist/src/utils/optional-require.d.ts +13 -0
  189. package/dist/src/utils/optional-require.d.ts.map +1 -0
  190. package/dist/src/utils/optional-require.js +37 -0
  191. package/dist/src/utils/optional-require.js.map +1 -0
  192. package/dist/src/utils/paths.d.ts +11 -0
  193. package/dist/src/utils/paths.d.ts.map +1 -0
  194. package/dist/src/utils/paths.js +28 -0
  195. package/dist/src/utils/paths.js.map +1 -0
  196. package/dist/src/utils/pty-session-manager.d.ts +42 -0
  197. package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
  198. package/dist/src/utils/pty-session-manager.js +182 -0
  199. package/dist/src/utils/pty-session-manager.js.map +1 -0
  200. package/dist/src/utils/subagent-tracker.d.ts +64 -0
  201. package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
  202. package/dist/src/utils/subagent-tracker.js +191 -0
  203. package/dist/src/utils/subagent-tracker.js.map +1 -0
  204. package/dist/src/utils/tmux-monitor.d.ts +102 -0
  205. package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
  206. package/dist/src/utils/tmux-monitor.js +642 -0
  207. package/dist/src/utils/tmux-monitor.js.map +1 -0
  208. package/dist/src/utils/trace-capture.d.ts +42 -0
  209. package/dist/src/utils/trace-capture.d.ts.map +1 -0
  210. package/dist/src/utils/trace-capture.js +102 -0
  211. package/dist/src/utils/trace-capture.js.map +1 -0
  212. package/dist/start-all-webhooks.d.ts +7 -0
  213. package/dist/start-all-webhooks.d.ts.map +1 -0
  214. package/dist/start-all-webhooks.js +98 -0
  215. package/dist/start-all-webhooks.js.map +1 -0
  216. package/dist/start-line-webhook.d.ts +7 -0
  217. package/dist/start-line-webhook.d.ts.map +1 -0
  218. package/dist/start-line-webhook.js +59 -0
  219. package/dist/start-line-webhook.js.map +1 -0
  220. package/dist/start-relay-pty.d.ts +7 -0
  221. package/dist/start-relay-pty.d.ts.map +1 -0
  222. package/dist/start-relay-pty.js +173 -0
  223. package/dist/start-relay-pty.js.map +1 -0
  224. package/dist/start-telegram-webhook.d.ts +7 -0
  225. package/dist/start-telegram-webhook.d.ts.map +1 -0
  226. package/dist/start-telegram-webhook.js +80 -0
  227. package/dist/start-telegram-webhook.js.map +1 -0
  228. package/dist/user-prompt-hook.d.ts +13 -0
  229. package/dist/user-prompt-hook.d.ts.map +1 -0
  230. package/dist/user-prompt-hook.js +45 -0
  231. package/dist/user-prompt-hook.js.map +1 -0
  232. package/dist/workspace-router.d.ts +78 -0
  233. package/dist/workspace-router.d.ts.map +1 -0
  234. package/dist/workspace-router.js +408 -0
  235. package/dist/workspace-router.js.map +1 -0
  236. package/dist/workspace-telegram-bot.d.ts +3 -0
  237. package/dist/workspace-telegram-bot.d.ts.map +1 -0
  238. package/dist/workspace-telegram-bot.js +1172 -0
  239. package/dist/workspace-telegram-bot.js.map +1 -0
  240. package/package.json +80 -0
  241. package/src/types/callbacks.ts +39 -0
  242. package/src/types/config.ts +63 -0
  243. package/src/types/hooks.ts +50 -0
  244. package/src/types/index.ts +6 -0
  245. package/src/types/ipc.ts +55 -0
  246. package/src/types/session.ts +72 -0
  247. package/src/types/telegram.ts +66 -0
@@ -0,0 +1,413 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Tmux Command Injector - Unattended remote control solution
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
+ class TmuxInjector {
13
+ log;
14
+ sessionName;
15
+ logFile;
16
+ constructor(logger, sessionName = null) {
17
+ this.log = logger || console;
18
+ this.sessionName = sessionName || 'claude-taskping';
19
+ this.logFile = path_1.default.join(__dirname, '../logs/tmux-injection.log');
20
+ this.ensureLogDir();
21
+ }
22
+ ensureLogDir() {
23
+ const logDir = path_1.default.dirname(this.logFile);
24
+ if (!fs_1.default.existsSync(logDir)) {
25
+ fs_1.default.mkdirSync(logDir, { recursive: true });
26
+ }
27
+ }
28
+ // Check if tmux is installed
29
+ async checkTmuxAvailable() {
30
+ return new Promise((resolve) => {
31
+ (0, child_process_1.exec)('which tmux', (error) => {
32
+ resolve(!error);
33
+ });
34
+ });
35
+ }
36
+ // Check if Claude tmux session exists
37
+ async checkClaudeSession() {
38
+ return new Promise((resolve) => {
39
+ (0, child_process_1.exec)(`tmux has-session -t ${this.sessionName} 2>/dev/null`, (error) => {
40
+ resolve(!error);
41
+ });
42
+ });
43
+ }
44
+ // Create Claude tmux session
45
+ async createClaudeSession() {
46
+ return new Promise((resolve) => {
47
+ // Use clauderun command to start Claude (without pre-filling any commands)
48
+ const command = `tmux new-session -d -s ${this.sessionName} -c "${process.cwd()}" clauderun`;
49
+ this.log.info(`Creating tmux session with clauderun command: ${command}`);
50
+ (0, child_process_1.exec)(command, (error, stdout, stderr) => {
51
+ if (error) {
52
+ this.log.warn(`Failed to create tmux session with clauderun: ${error.message}`);
53
+ // If clauderun fails, try using full path command
54
+ this.log.info('Fallback to full path command...');
55
+ const claudePath = process.env.CLAUDE_CLI_PATH || 'claude';
56
+ const fallbackCommand = `tmux new-session -d -s ${this.sessionName} -c "${process.cwd()}" ${claudePath} --dangerously-skip-permissions`;
57
+ (0, child_process_1.exec)(fallbackCommand, (fallbackError) => {
58
+ if (fallbackError) {
59
+ this.log.error(`Failed to create tmux session with fallback: ${fallbackError.message}`);
60
+ resolve({ success: false, error: fallbackError.message });
61
+ }
62
+ else {
63
+ this.log.info('Tmux Claude session created successfully (full path)');
64
+ setTimeout(() => {
65
+ resolve({ success: true });
66
+ }, 3000);
67
+ }
68
+ });
69
+ }
70
+ else {
71
+ this.log.info('Tmux Claude session created successfully (clauderun)');
72
+ // Wait for Claude initialization
73
+ setTimeout(() => {
74
+ resolve({ success: true });
75
+ }, 3000);
76
+ }
77
+ });
78
+ });
79
+ }
80
+ // Inject command into tmux session (intelligently handle Claude confirmations)
81
+ async injectCommand(command) {
82
+ return new Promise(async (resolve) => {
83
+ try {
84
+ // 1. Clear input field
85
+ const clearCommand = `tmux send-keys -t ${this.sessionName} C-u`;
86
+ // 2. Send command
87
+ const escapedCommand = command.replace(/'/g, "'\"'\"'");
88
+ const sendCommand = `tmux send-keys -t ${this.sessionName} '${escapedCommand}'`;
89
+ // 3. Send enter
90
+ const enterCommand = `tmux send-keys -t ${this.sessionName} C-m`;
91
+ this.log.debug(`Injecting command via tmux: ${command}`);
92
+ // Execute three steps
93
+ (0, child_process_1.exec)(clearCommand, (clearError) => {
94
+ if (clearError) {
95
+ this.log.error(`Failed to clear input: ${clearError.message}`);
96
+ resolve({ success: false, error: clearError.message });
97
+ return;
98
+ }
99
+ // Brief wait
100
+ setTimeout(() => {
101
+ (0, child_process_1.exec)(sendCommand, (sendError) => {
102
+ if (sendError) {
103
+ this.log.error(`Failed to send command: ${sendError.message}`);
104
+ resolve({ success: false, error: sendError.message });
105
+ return;
106
+ }
107
+ // Brief wait
108
+ setTimeout(() => {
109
+ (0, child_process_1.exec)(enterCommand, async (enterError) => {
110
+ if (enterError) {
111
+ this.log.error(`Failed to send enter: ${enterError.message}`);
112
+ resolve({ success: false, error: enterError.message });
113
+ return;
114
+ }
115
+ this.log.debug('Command sent successfully in 3 steps');
116
+ // Brief wait for command sending
117
+ await new Promise(r => setTimeout(r, 1000));
118
+ // Check if command is already displayed in Claude
119
+ const capture = await this.getCaptureOutput();
120
+ if (capture.success) {
121
+ this.log.debug(`Claude state after injection: ${capture.output.slice(-200).replace(/\n/g, ' ')}`);
122
+ }
123
+ // Wait and check if confirmation is needed
124
+ await this.handleConfirmations();
125
+ // Record injection log
126
+ this.logInjection(command);
127
+ resolve({ success: true });
128
+ });
129
+ }, 200);
130
+ });
131
+ }, 200);
132
+ });
133
+ }
134
+ catch (error) {
135
+ resolve({ success: false, error: error.message });
136
+ }
137
+ });
138
+ }
139
+ // Automatically handle Claude confirmation dialogs
140
+ async handleConfirmations() {
141
+ const maxAttempts = 8;
142
+ let attempts = 0;
143
+ while (attempts < maxAttempts) {
144
+ attempts++;
145
+ // Wait for Claude processing
146
+ await new Promise(resolve => setTimeout(resolve, 1500));
147
+ // Get current screen content
148
+ const capture = await this.getCaptureOutput();
149
+ if (!capture.success) {
150
+ break;
151
+ }
152
+ const output = capture.output;
153
+ this.log.debug(`Confirmation check ${attempts}: ${output.slice(-200).replace(/\n/g, ' ')}`);
154
+ // Check for multi-option confirmation dialog (priority handling)
155
+ if (output.includes('Do you want to proceed?') &&
156
+ (output.includes('1. Yes') || output.includes('2. Yes, and don\'t ask again'))) {
157
+ this.log.info(`Detected multi-option confirmation, selecting option 2 (attempt ${attempts})`);
158
+ // Select "2. Yes, and don't ask again" to avoid future confirmation dialogs
159
+ await new Promise((resolve) => {
160
+ (0, child_process_1.exec)(`tmux send-keys -t ${this.sessionName} '2'`, (error) => {
161
+ if (error) {
162
+ this.log.warn('Failed to send option 2');
163
+ }
164
+ else {
165
+ this.log.info('Auto-confirmation sent (option 2)');
166
+ // Send Enter key
167
+ setTimeout(() => {
168
+ (0, child_process_1.exec)(`tmux send-keys -t ${this.sessionName} 'Enter'`, (enterError) => {
169
+ if (enterError) {
170
+ this.log.warn('Failed to send Enter after option 2');
171
+ }
172
+ else {
173
+ this.log.info('Enter sent after option 2 - no future dialogs');
174
+ }
175
+ resolve();
176
+ });
177
+ }, 300);
178
+ }
179
+ });
180
+ });
181
+ // Wait for confirmation to take effect
182
+ await new Promise(resolve => setTimeout(resolve, 2000));
183
+ continue;
184
+ }
185
+ // Check for single option confirmation
186
+ if (output.includes('❯ 1. Yes') || output.includes('▷ 1. Yes')) {
187
+ this.log.info(`Detected single option confirmation, selecting option 1 (attempt ${attempts})`);
188
+ await new Promise((resolve) => {
189
+ (0, child_process_1.exec)(`tmux send-keys -t ${this.sessionName} '1'`, (error) => {
190
+ if (error) {
191
+ this.log.warn('Failed to send option 1');
192
+ }
193
+ else {
194
+ this.log.info('Auto-confirmation sent (option 1)');
195
+ // Send Enter key
196
+ setTimeout(() => {
197
+ (0, child_process_1.exec)(`tmux send-keys -t ${this.sessionName} 'Enter'`, (enterError) => {
198
+ if (enterError) {
199
+ this.log.warn('Failed to send Enter after option 1');
200
+ }
201
+ else {
202
+ this.log.info('Enter sent after option 1');
203
+ }
204
+ resolve();
205
+ });
206
+ }, 300);
207
+ }
208
+ });
209
+ });
210
+ continue;
211
+ }
212
+ // Check for simple Y/N confirmation
213
+ if (output.includes('(y/n)') || output.includes('[Y/n]') || output.includes('[y/N]')) {
214
+ this.log.info(`Detected y/n prompt, sending 'y' (attempt ${attempts})`);
215
+ await new Promise((resolve) => {
216
+ (0, child_process_1.exec)(`tmux send-keys -t ${this.sessionName} 'y'`, (error) => {
217
+ if (error) {
218
+ this.log.warn('Failed to send y');
219
+ }
220
+ else {
221
+ this.log.info('Auto-confirmation sent (y)');
222
+ // Send Enter key
223
+ setTimeout(() => {
224
+ (0, child_process_1.exec)(`tmux send-keys -t ${this.sessionName} 'Enter'`, (enterError) => {
225
+ if (enterError) {
226
+ this.log.warn('Failed to send Enter after y');
227
+ }
228
+ else {
229
+ this.log.info('Enter sent after y');
230
+ }
231
+ resolve();
232
+ });
233
+ }, 300);
234
+ }
235
+ });
236
+ });
237
+ continue;
238
+ }
239
+ // Check for press Enter to continue prompts
240
+ if (output.includes('Press Enter to continue') ||
241
+ output.includes('Enter to confirm') ||
242
+ output.includes('Press Enter')) {
243
+ this.log.info(`Detected Enter prompt, sending Enter (attempt ${attempts})`);
244
+ await new Promise((resolve) => {
245
+ (0, child_process_1.exec)(`tmux send-keys -t ${this.sessionName} 'Enter'`, (error) => {
246
+ if (error) {
247
+ this.log.warn('Failed to send Enter');
248
+ }
249
+ else {
250
+ this.log.info('Auto-Enter sent');
251
+ }
252
+ resolve();
253
+ });
254
+ });
255
+ continue;
256
+ }
257
+ // Check if command is currently executing
258
+ if (output.includes('Clauding…') ||
259
+ output.includes('Waiting…') ||
260
+ output.includes('Processing…') ||
261
+ output.includes('Working…')) {
262
+ this.log.info('Command appears to be executing, waiting...');
263
+ continue;
264
+ }
265
+ // Check for new empty input box (indicates completion)
266
+ if ((output.includes('│ >') || output.includes('> ')) &&
267
+ !output.includes('Do you want to proceed?') &&
268
+ !output.includes('1. Yes') &&
269
+ !output.includes('(y/n)')) {
270
+ this.log.debug('New input prompt detected, command likely completed');
271
+ break;
272
+ }
273
+ // Check for error messages
274
+ if (output.includes('Error:') || output.includes('error:') || output.includes('failed')) {
275
+ this.log.warn('Detected error in output, stopping confirmation attempts');
276
+ break;
277
+ }
278
+ // If nothing detected, wait longer before checking again
279
+ if (attempts < maxAttempts) {
280
+ this.log.info('No confirmation prompts detected, waiting longer...');
281
+ await new Promise(resolve => setTimeout(resolve, 2000));
282
+ }
283
+ }
284
+ this.log.info(`Confirmation handling completed after ${attempts} attempts`);
285
+ // Final state check
286
+ const finalCapture = await this.getCaptureOutput();
287
+ if (finalCapture.success) {
288
+ this.log.debug(`Final state: ${finalCapture.output.slice(-100).replace(/\n/g, ' ')}`);
289
+ }
290
+ }
291
+ // Get tmux session output
292
+ async getCaptureOutput() {
293
+ return new Promise((resolve) => {
294
+ const command = `tmux capture-pane -t ${this.sessionName} -p`;
295
+ (0, child_process_1.exec)(command, (error, stdout, stderr) => {
296
+ if (error) {
297
+ resolve({ success: false, error: error.message });
298
+ }
299
+ else {
300
+ resolve({ success: true, output: stdout });
301
+ }
302
+ });
303
+ });
304
+ }
305
+ // Restart Claude session
306
+ async restartClaudeSession() {
307
+ return new Promise(async (resolve) => {
308
+ this.log.info('Restarting Claude tmux session...');
309
+ // Kill existing session
310
+ (0, child_process_1.exec)(`tmux kill-session -t ${this.sessionName} 2>/dev/null`, async () => {
311
+ // Wait a moment
312
+ await new Promise(r => setTimeout(r, 1000));
313
+ // Create new session
314
+ const result = await this.createClaudeSession();
315
+ resolve(result);
316
+ });
317
+ });
318
+ }
319
+ // Complete command injection workflow
320
+ async injectCommandFull(token, command) {
321
+ try {
322
+ this.log.debug(`Starting tmux command injection (Token: ${token})`);
323
+ // 1. Check if tmux is available
324
+ const tmuxAvailable = await this.checkTmuxAvailable();
325
+ if (!tmuxAvailable) {
326
+ return { success: false, error: 'tmux_not_installed', message: 'Need to install tmux: brew install tmux' };
327
+ }
328
+ // 2. Check if Claude session exists
329
+ const sessionExists = await this.checkClaudeSession();
330
+ if (!sessionExists) {
331
+ this.log.warn('Claude tmux session not found, creating new session...');
332
+ const createResult = await this.createClaudeSession();
333
+ if (!createResult.success) {
334
+ return { success: false, error: 'session_creation_failed', message: createResult.error };
335
+ }
336
+ }
337
+ // 3. Inject command
338
+ const injectResult = await this.injectCommand(command);
339
+ if (injectResult.success) {
340
+ // 4. Send success notification
341
+ await this.sendSuccessNotification(command);
342
+ return {
343
+ success: true,
344
+ message: 'Command successfully injected into Claude tmux session',
345
+ session: this.sessionName
346
+ };
347
+ }
348
+ else {
349
+ return {
350
+ success: false,
351
+ error: 'injection_failed',
352
+ message: injectResult.error
353
+ };
354
+ }
355
+ }
356
+ catch (error) {
357
+ this.log.error(`Tmux injection error: ${error.message}`);
358
+ return { success: false, error: 'unexpected_error', message: error.message };
359
+ }
360
+ }
361
+ // Send success notification
362
+ async sendSuccessNotification(command) {
363
+ const shortCommand = command.length > 30 ? command.substring(0, 30) + '...' : command;
364
+ const notificationScript = `
365
+ display notification "🎉 Command automatically injected into Claude! No manual operation needed" with title "TaskPing Remote Control Success" subtitle "${shortCommand.replace(/"/g, '\\"')}" sound name "Glass"
366
+ `;
367
+ (0, child_process_1.exec)(`osascript -e '${notificationScript}'`, (error) => {
368
+ if (error) {
369
+ this.log.warn('Failed to send success notification');
370
+ }
371
+ else {
372
+ this.log.info('Success notification sent');
373
+ }
374
+ });
375
+ }
376
+ // Record injection log
377
+ logInjection(command) {
378
+ const logEntry = {
379
+ timestamp: new Date().toISOString(),
380
+ command: command,
381
+ session: this.sessionName,
382
+ pid: process.pid
383
+ };
384
+ const logLine = JSON.stringify(logEntry) + '\n';
385
+ try {
386
+ fs_1.default.appendFileSync(this.logFile, logLine);
387
+ }
388
+ catch (error) {
389
+ this.log.warn(`Failed to write injection log: ${error.message}`);
390
+ }
391
+ }
392
+ // Get session status information
393
+ async getSessionInfo() {
394
+ return new Promise((resolve) => {
395
+ const command = `tmux list-sessions | grep ${this.sessionName}`;
396
+ (0, child_process_1.exec)(command, (error, stdout, stderr) => {
397
+ if (error) {
398
+ resolve({ exists: false });
399
+ }
400
+ else {
401
+ const sessionInfo = stdout.trim();
402
+ resolve({
403
+ exists: true,
404
+ info: sessionInfo,
405
+ name: this.sessionName
406
+ });
407
+ }
408
+ });
409
+ });
410
+ }
411
+ }
412
+ module.exports = TmuxInjector;
413
+ //# sourceMappingURL=tmux-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-injector.js","sourceRoot":"","sources":["../../../src/relay/tmux-injector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CCGram Configuration Manager
3
+ * Interactive configuration tool for managing settings
4
+ */
5
+ import readline from 'readline';
6
+ import Logger from '../core/logger';
7
+ import ConfigManager from '../core/config';
8
+ declare class ConfigurationManager {
9
+ config: ConfigManager;
10
+ logger: Logger;
11
+ rl: readline.Interface;
12
+ constructor(configManager: ConfigManager);
13
+ run(args?: string[]): Promise<void>;
14
+ question(prompt: string): Promise<string>;
15
+ displayCurrentConfig(): void;
16
+ showMainMenu(): Promise<void>;
17
+ configureBasicSettings(): Promise<void>;
18
+ configureLanguage(): Promise<void>;
19
+ toggleEnabled(): Promise<void>;
20
+ configureTimeout(): Promise<void>;
21
+ configureSounds(): Promise<void>;
22
+ selectSoundFromCategories(soundCategories: Record<string, string[]>, type: string): Promise<string | null>;
23
+ selectSoundFromList(sounds: string[], type: string): Promise<string | null>;
24
+ configureChannels(): Promise<void>;
25
+ configureRelay(): Promise<void>;
26
+ configureCustomMessages(): Promise<void>;
27
+ testNotifications(): Promise<void>;
28
+ configureEmailChannel(): Promise<void>;
29
+ testEmailChannel(): Promise<void>;
30
+ showHelp(): void;
31
+ }
32
+ export = ConfigurationManager;
33
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/tools/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,MAAM,MAAM,gBAAgB,CAAC;AACpC,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,cAAM,oBAAoB;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC;gBAEX,aAAa,EAAE,aAAa;IAgBlC,GAAG,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM/C,oBAAoB,IAAI,IAAI;IAUtB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD7B,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BvC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBlC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBhC,yBAAyB,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2B1G,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsC3E,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoClC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBxC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBlC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwGtC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BvC,QAAQ,IAAI,IAAI;CAkBnB;AAED,SAAS,oBAAoB,CAAC"}