@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.
- package/.env.example +19 -0
- package/LICENSE +21 -0
- package/README.md +338 -0
- package/ccgram.service +24 -0
- package/config/channels.json +58 -0
- package/config/default.json +27 -0
- package/config/defaults/config.json +16 -0
- package/config/defaults/i18n.json +32 -0
- package/config/email-template.json +31 -0
- package/config/test-with-subagent.json +16 -0
- package/config/user.json +27 -0
- package/dist/claude-hook-notify.d.ts +7 -0
- package/dist/claude-hook-notify.d.ts.map +1 -0
- package/dist/claude-hook-notify.js +154 -0
- package/dist/claude-hook-notify.js.map +1 -0
- package/dist/claude-remote.d.ts +50 -0
- package/dist/claude-remote.d.ts.map +1 -0
- package/dist/claude-remote.js +927 -0
- package/dist/claude-remote.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +110 -0
- package/dist/cli.js.map +1 -0
- package/dist/enhanced-hook-notify.d.ts +16 -0
- package/dist/enhanced-hook-notify.d.ts.map +1 -0
- package/dist/enhanced-hook-notify.js +288 -0
- package/dist/enhanced-hook-notify.js.map +1 -0
- package/dist/permission-hook.d.ts +15 -0
- package/dist/permission-hook.d.ts.map +1 -0
- package/dist/permission-hook.js +357 -0
- package/dist/permission-hook.js.map +1 -0
- package/dist/prompt-bridge.d.ts +50 -0
- package/dist/prompt-bridge.d.ts.map +1 -0
- package/dist/prompt-bridge.js +173 -0
- package/dist/prompt-bridge.js.map +1 -0
- package/dist/question-notify.d.ts +16 -0
- package/dist/question-notify.d.ts.map +1 -0
- package/dist/question-notify.js +272 -0
- package/dist/question-notify.js.map +1 -0
- package/dist/setup.d.ts +10 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +649 -0
- package/dist/setup.js.map +1 -0
- package/dist/smart-monitor.d.ts +7 -0
- package/dist/smart-monitor.d.ts.map +1 -0
- package/dist/smart-monitor.js +256 -0
- package/dist/smart-monitor.js.map +1 -0
- package/dist/src/automation/claude-automation.d.ts +45 -0
- package/dist/src/automation/claude-automation.d.ts.map +1 -0
- package/dist/src/automation/claude-automation.js +367 -0
- package/dist/src/automation/claude-automation.js.map +1 -0
- package/dist/src/automation/clipboard-automation.d.ts +35 -0
- package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
- package/dist/src/automation/clipboard-automation.js +242 -0
- package/dist/src/automation/clipboard-automation.js.map +1 -0
- package/dist/src/automation/simple-automation.d.ts +56 -0
- package/dist/src/automation/simple-automation.d.ts.map +1 -0
- package/dist/src/automation/simple-automation.js +283 -0
- package/dist/src/automation/simple-automation.js.map +1 -0
- package/dist/src/channels/base/channel.d.ts +60 -0
- package/dist/src/channels/base/channel.d.ts.map +1 -0
- package/dist/src/channels/base/channel.js +96 -0
- package/dist/src/channels/base/channel.js.map +1 -0
- package/dist/src/channels/email/smtp.d.ts +74 -0
- package/dist/src/channels/email/smtp.d.ts.map +1 -0
- package/dist/src/channels/email/smtp.js +605 -0
- package/dist/src/channels/email/smtp.js.map +1 -0
- package/dist/src/channels/line/line.d.ts +36 -0
- package/dist/src/channels/line/line.d.ts.map +1 -0
- package/dist/src/channels/line/line.js +180 -0
- package/dist/src/channels/line/line.js.map +1 -0
- package/dist/src/channels/line/webhook.d.ts +55 -0
- package/dist/src/channels/line/webhook.d.ts.map +1 -0
- package/dist/src/channels/line/webhook.js +191 -0
- package/dist/src/channels/line/webhook.js.map +1 -0
- package/dist/src/channels/local/desktop.d.ts +30 -0
- package/dist/src/channels/local/desktop.d.ts.map +1 -0
- package/dist/src/channels/local/desktop.js +161 -0
- package/dist/src/channels/local/desktop.js.map +1 -0
- package/dist/src/channels/telegram/telegram.d.ts +43 -0
- package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
- package/dist/src/channels/telegram/telegram.js +223 -0
- package/dist/src/channels/telegram/telegram.js.map +1 -0
- package/dist/src/channels/telegram/webhook.d.ts +75 -0
- package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
- package/dist/src/channels/telegram/webhook.js +278 -0
- package/dist/src/channels/telegram/webhook.js.map +1 -0
- package/dist/src/config-manager.d.ts +16 -0
- package/dist/src/config-manager.d.ts.map +1 -0
- package/dist/src/config-manager.js +152 -0
- package/dist/src/config-manager.js.map +1 -0
- package/dist/src/core/config.d.ts +28 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +248 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/logger.d.ts +19 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +47 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/notifier.d.ts +45 -0
- package/dist/src/core/notifier.d.ts.map +1 -0
- package/dist/src/core/notifier.js +189 -0
- package/dist/src/core/notifier.js.map +1 -0
- package/dist/src/daemon/taskping-daemon.d.ts +38 -0
- package/dist/src/daemon/taskping-daemon.d.ts.map +1 -0
- package/dist/src/daemon/taskping-daemon.js +306 -0
- package/dist/src/daemon/taskping-daemon.js.map +1 -0
- package/dist/src/relay/claude-command-bridge.d.ts +57 -0
- package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
- package/dist/src/relay/claude-command-bridge.js +188 -0
- package/dist/src/relay/claude-command-bridge.js.map +1 -0
- package/dist/src/relay/command-relay.d.ts +94 -0
- package/dist/src/relay/command-relay.d.ts.map +1 -0
- package/dist/src/relay/command-relay.js +463 -0
- package/dist/src/relay/command-relay.js.map +1 -0
- package/dist/src/relay/email-listener.d.ts +65 -0
- package/dist/src/relay/email-listener.d.ts.map +1 -0
- package/dist/src/relay/email-listener.js +460 -0
- package/dist/src/relay/email-listener.js.map +1 -0
- package/dist/src/relay/relay-pty.d.ts +21 -0
- package/dist/src/relay/relay-pty.d.ts.map +1 -0
- package/dist/src/relay/relay-pty.js +696 -0
- package/dist/src/relay/relay-pty.js.map +1 -0
- package/dist/src/relay/smart-injector.d.ts +30 -0
- package/dist/src/relay/smart-injector.d.ts.map +1 -0
- package/dist/src/relay/smart-injector.js +233 -0
- package/dist/src/relay/smart-injector.js.map +1 -0
- package/dist/src/relay/tmux-injector.d.ts +46 -0
- package/dist/src/relay/tmux-injector.d.ts.map +1 -0
- package/dist/src/relay/tmux-injector.js +413 -0
- package/dist/src/relay/tmux-injector.js.map +1 -0
- package/dist/src/tools/config-manager.d.ts +33 -0
- package/dist/src/tools/config-manager.d.ts.map +1 -0
- package/dist/src/tools/config-manager.js +448 -0
- package/dist/src/tools/config-manager.js.map +1 -0
- package/dist/src/tools/installer.d.ts +38 -0
- package/dist/src/tools/installer.d.ts.map +1 -0
- package/dist/src/tools/installer.js +222 -0
- package/dist/src/tools/installer.js.map +1 -0
- package/dist/src/types/callbacks.d.ts +29 -0
- package/dist/src/types/callbacks.d.ts.map +1 -0
- package/dist/src/types/callbacks.js +7 -0
- package/dist/src/types/callbacks.js.map +1 -0
- package/dist/src/types/config.d.ts +56 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +6 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/hooks.d.ts +47 -0
- package/dist/src/types/hooks.d.ts.map +1 -0
- package/dist/src/types/hooks.js +6 -0
- package/dist/src/types/hooks.js.map +1 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +23 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/ipc.d.ts +43 -0
- package/dist/src/types/ipc.d.ts.map +1 -0
- package/dist/src/types/ipc.js +7 -0
- package/dist/src/types/ipc.js.map +1 -0
- package/dist/src/types/session.d.ts +70 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +9 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/telegram.d.ts +58 -0
- package/dist/src/types/telegram.d.ts.map +1 -0
- package/dist/src/types/telegram.js +6 -0
- package/dist/src/types/telegram.js.map +1 -0
- package/dist/src/utils/active-check.d.ts +19 -0
- package/dist/src/utils/active-check.d.ts.map +1 -0
- package/dist/src/utils/active-check.js +41 -0
- package/dist/src/utils/active-check.js.map +1 -0
- package/dist/src/utils/callback-parser.d.ts +21 -0
- package/dist/src/utils/callback-parser.d.ts.map +1 -0
- package/dist/src/utils/callback-parser.js +58 -0
- package/dist/src/utils/callback-parser.js.map +1 -0
- package/dist/src/utils/controller-injector.d.ts +21 -0
- package/dist/src/utils/controller-injector.d.ts.map +1 -0
- package/dist/src/utils/controller-injector.js +108 -0
- package/dist/src/utils/controller-injector.js.map +1 -0
- package/dist/src/utils/conversation-tracker.d.ts +32 -0
- package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
- package/dist/src/utils/conversation-tracker.js +119 -0
- package/dist/src/utils/conversation-tracker.js.map +1 -0
- package/dist/src/utils/http-request.d.ts +25 -0
- package/dist/src/utils/http-request.d.ts.map +1 -0
- package/dist/src/utils/http-request.js +66 -0
- package/dist/src/utils/http-request.js.map +1 -0
- package/dist/src/utils/optional-require.d.ts +13 -0
- package/dist/src/utils/optional-require.d.ts.map +1 -0
- package/dist/src/utils/optional-require.js +37 -0
- package/dist/src/utils/optional-require.js.map +1 -0
- package/dist/src/utils/paths.d.ts +11 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +28 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/pty-session-manager.d.ts +42 -0
- package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
- package/dist/src/utils/pty-session-manager.js +182 -0
- package/dist/src/utils/pty-session-manager.js.map +1 -0
- package/dist/src/utils/subagent-tracker.d.ts +64 -0
- package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
- package/dist/src/utils/subagent-tracker.js +191 -0
- package/dist/src/utils/subagent-tracker.js.map +1 -0
- package/dist/src/utils/tmux-monitor.d.ts +102 -0
- package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
- package/dist/src/utils/tmux-monitor.js +642 -0
- package/dist/src/utils/tmux-monitor.js.map +1 -0
- package/dist/src/utils/trace-capture.d.ts +42 -0
- package/dist/src/utils/trace-capture.d.ts.map +1 -0
- package/dist/src/utils/trace-capture.js +102 -0
- package/dist/src/utils/trace-capture.js.map +1 -0
- package/dist/start-all-webhooks.d.ts +7 -0
- package/dist/start-all-webhooks.d.ts.map +1 -0
- package/dist/start-all-webhooks.js +98 -0
- package/dist/start-all-webhooks.js.map +1 -0
- package/dist/start-line-webhook.d.ts +7 -0
- package/dist/start-line-webhook.d.ts.map +1 -0
- package/dist/start-line-webhook.js +59 -0
- package/dist/start-line-webhook.js.map +1 -0
- package/dist/start-relay-pty.d.ts +7 -0
- package/dist/start-relay-pty.d.ts.map +1 -0
- package/dist/start-relay-pty.js +173 -0
- package/dist/start-relay-pty.js.map +1 -0
- package/dist/start-telegram-webhook.d.ts +7 -0
- package/dist/start-telegram-webhook.d.ts.map +1 -0
- package/dist/start-telegram-webhook.js +80 -0
- package/dist/start-telegram-webhook.js.map +1 -0
- package/dist/user-prompt-hook.d.ts +13 -0
- package/dist/user-prompt-hook.d.ts.map +1 -0
- package/dist/user-prompt-hook.js +45 -0
- package/dist/user-prompt-hook.js.map +1 -0
- package/dist/workspace-router.d.ts +78 -0
- package/dist/workspace-router.d.ts.map +1 -0
- package/dist/workspace-router.js +408 -0
- package/dist/workspace-router.js.map +1 -0
- package/dist/workspace-telegram-bot.d.ts +3 -0
- package/dist/workspace-telegram-bot.d.ts.map +1 -0
- package/dist/workspace-telegram-bot.js +1172 -0
- package/dist/workspace-telegram-bot.js.map +1 -0
- package/package.json +80 -0
- package/src/types/callbacks.ts +39 -0
- package/src/types/config.ts +63 -0
- package/src/types/hooks.ts +50 -0
- package/src/types/index.ts +6 -0
- package/src/types/ipc.ts +55 -0
- package/src/types/session.ts +72 -0
- 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"}
|