@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,642 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tmux Monitor - Enhanced for real-time monitoring with Telegram/LINE automation
|
|
4
|
+
* Monitors tmux session output for Claude completion patterns
|
|
5
|
+
* Based on the original email automation mechanism but adapted for real-time notifications
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const events_1 = __importDefault(require("events"));
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const trace_capture_1 = __importDefault(require("./trace-capture"));
|
|
15
|
+
class TmuxMonitor extends events_1.default {
|
|
16
|
+
sessionName;
|
|
17
|
+
captureDir;
|
|
18
|
+
isMonitoring;
|
|
19
|
+
monitorInterval;
|
|
20
|
+
lastPaneContent;
|
|
21
|
+
outputBuffer;
|
|
22
|
+
maxBufferSize;
|
|
23
|
+
checkInterval;
|
|
24
|
+
completionPatterns;
|
|
25
|
+
waitingPatterns;
|
|
26
|
+
traceCapture;
|
|
27
|
+
constructor(sessionName = null) {
|
|
28
|
+
super();
|
|
29
|
+
this.sessionName = sessionName || process.env.TMUX_SESSION || 'claude-real';
|
|
30
|
+
this.captureDir = path_1.default.join(__dirname, '../data/tmux-captures');
|
|
31
|
+
this.isMonitoring = false;
|
|
32
|
+
this.monitorInterval = null;
|
|
33
|
+
this.lastPaneContent = '';
|
|
34
|
+
this.outputBuffer = [];
|
|
35
|
+
this.maxBufferSize = 1000; // Keep last 1000 lines
|
|
36
|
+
this.checkInterval = 2000; // Check every 2 seconds
|
|
37
|
+
// Claude completion patterns (adapted for Claude Code's actual output format)
|
|
38
|
+
this.completionPatterns = [
|
|
39
|
+
// Task completion indicators
|
|
40
|
+
/task.*completed/i,
|
|
41
|
+
/successfully.*completed/i,
|
|
42
|
+
/completed.*successfully/i,
|
|
43
|
+
/implementation.*complete/i,
|
|
44
|
+
/changes.*made/i,
|
|
45
|
+
/created.*successfully/i,
|
|
46
|
+
/updated.*successfully/i,
|
|
47
|
+
/file.*created/i,
|
|
48
|
+
/file.*updated/i,
|
|
49
|
+
/finished/i,
|
|
50
|
+
/done/i,
|
|
51
|
+
/✅/,
|
|
52
|
+
/All set/i,
|
|
53
|
+
/Ready/i,
|
|
54
|
+
// Claude Code specific patterns
|
|
55
|
+
/The file.*has been updated/i,
|
|
56
|
+
/File created successfully/i,
|
|
57
|
+
/Command executed successfully/i,
|
|
58
|
+
/Operation completed/i,
|
|
59
|
+
// Look for prompt return (indicating Claude finished responding)
|
|
60
|
+
/╰.*╯\s*$/, // Box ending
|
|
61
|
+
/^\s*>\s*$/ // Empty prompt ready for input
|
|
62
|
+
];
|
|
63
|
+
// Waiting patterns (when Claude needs input)
|
|
64
|
+
this.waitingPatterns = [
|
|
65
|
+
/waiting.*for/i,
|
|
66
|
+
/need.*input/i,
|
|
67
|
+
/please.*provide/i,
|
|
68
|
+
/what.*would you like/i,
|
|
69
|
+
/how.*can I help/i,
|
|
70
|
+
/⏳/,
|
|
71
|
+
/What would you like me to/i,
|
|
72
|
+
/Is there anything else/i,
|
|
73
|
+
/Any other/i,
|
|
74
|
+
/Do you want/i,
|
|
75
|
+
/Would you like/i,
|
|
76
|
+
// Claude Code specific waiting patterns
|
|
77
|
+
/\? for shortcuts/i, // Claude Code waiting indicator
|
|
78
|
+
/╭.*─.*╮/, // Start of response box
|
|
79
|
+
/>\s*$/ // Empty prompt
|
|
80
|
+
];
|
|
81
|
+
this._ensureCaptureDir();
|
|
82
|
+
this.traceCapture = new trace_capture_1.default();
|
|
83
|
+
}
|
|
84
|
+
_ensureCaptureDir() {
|
|
85
|
+
if (!fs_1.default.existsSync(this.captureDir)) {
|
|
86
|
+
fs_1.default.mkdirSync(this.captureDir, { recursive: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Real-time monitoring methods (new functionality)
|
|
90
|
+
start() {
|
|
91
|
+
if (this.isMonitoring) {
|
|
92
|
+
console.log('⚠️ TmuxMonitor already running');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Verify tmux session exists
|
|
96
|
+
if (!this._sessionExists()) {
|
|
97
|
+
console.error(`❌ Tmux session '${this.sessionName}' not found`);
|
|
98
|
+
throw new Error(`Tmux session '${this.sessionName}' not found`);
|
|
99
|
+
}
|
|
100
|
+
this.isMonitoring = true;
|
|
101
|
+
this._startRealTimeMonitoring();
|
|
102
|
+
console.log(`🔍 Started monitoring tmux session: ${this.sessionName}`);
|
|
103
|
+
}
|
|
104
|
+
stop() {
|
|
105
|
+
if (!this.isMonitoring) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this.isMonitoring = false;
|
|
109
|
+
if (this.monitorInterval) {
|
|
110
|
+
clearInterval(this.monitorInterval);
|
|
111
|
+
this.monitorInterval = null;
|
|
112
|
+
}
|
|
113
|
+
console.log('⏹️ TmuxMonitor stopped');
|
|
114
|
+
}
|
|
115
|
+
_sessionExists() {
|
|
116
|
+
try {
|
|
117
|
+
const sessions = (0, child_process_1.execSync)('tmux list-sessions -F "#{session_name}"', {
|
|
118
|
+
encoding: 'utf8',
|
|
119
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
120
|
+
}).trim().split('\n');
|
|
121
|
+
return sessions.includes(this.sessionName);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
_startRealTimeMonitoring() {
|
|
128
|
+
// Initial capture
|
|
129
|
+
this._captureCurrentContent();
|
|
130
|
+
// Set up periodic monitoring
|
|
131
|
+
this.monitorInterval = setInterval(() => {
|
|
132
|
+
if (this.isMonitoring) {
|
|
133
|
+
this._checkForChanges();
|
|
134
|
+
}
|
|
135
|
+
}, this.checkInterval);
|
|
136
|
+
}
|
|
137
|
+
_captureCurrentContent() {
|
|
138
|
+
try {
|
|
139
|
+
// Capture current pane content
|
|
140
|
+
const content = (0, child_process_1.execSync)(`tmux capture-pane -t ${this.sessionName} -p`, {
|
|
141
|
+
encoding: 'utf8',
|
|
142
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
143
|
+
});
|
|
144
|
+
return content;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error('Error capturing tmux content:', error.message);
|
|
148
|
+
return '';
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
_checkForChanges() {
|
|
152
|
+
const currentContent = this._captureCurrentContent();
|
|
153
|
+
if (currentContent !== this.lastPaneContent) {
|
|
154
|
+
// Get new content (lines that were added)
|
|
155
|
+
const newLines = this._getNewLines(this.lastPaneContent, currentContent);
|
|
156
|
+
if (newLines.length > 0) {
|
|
157
|
+
// Add to buffer
|
|
158
|
+
this.outputBuffer.push(...newLines);
|
|
159
|
+
// Trim buffer if too large
|
|
160
|
+
if (this.outputBuffer.length > this.maxBufferSize) {
|
|
161
|
+
this.outputBuffer = this.outputBuffer.slice(-this.maxBufferSize);
|
|
162
|
+
}
|
|
163
|
+
// Check for completion patterns
|
|
164
|
+
this._analyzeNewContent(newLines);
|
|
165
|
+
}
|
|
166
|
+
this.lastPaneContent = currentContent;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
_getNewLines(oldContent, newContent) {
|
|
170
|
+
const oldLines = oldContent.split('\n');
|
|
171
|
+
const newLines = newContent.split('\n');
|
|
172
|
+
// Find lines that were added
|
|
173
|
+
const addedLines = [];
|
|
174
|
+
// Simple approach: compare line by line from the end
|
|
175
|
+
const oldLength = oldLines.length;
|
|
176
|
+
const newLength = newLines.length;
|
|
177
|
+
if (newLength > oldLength) {
|
|
178
|
+
// New lines were added
|
|
179
|
+
const numNewLines = newLength - oldLength;
|
|
180
|
+
addedLines.push(...newLines.slice(-numNewLines));
|
|
181
|
+
}
|
|
182
|
+
else if (newLength === oldLength) {
|
|
183
|
+
// Same number of lines, check if last lines changed
|
|
184
|
+
for (let i = Math.max(0, newLength - 5); i < newLength; i++) {
|
|
185
|
+
if (i < oldLength && newLines[i] !== oldLines[i]) {
|
|
186
|
+
addedLines.push(newLines[i]);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return addedLines.filter(line => line.trim().length > 0);
|
|
191
|
+
}
|
|
192
|
+
_analyzeNewContent(newLines) {
|
|
193
|
+
const recentText = newLines.join('\n');
|
|
194
|
+
// Also check the entire recent buffer for context
|
|
195
|
+
const bufferText = this.outputBuffer.slice(-20).join('\n');
|
|
196
|
+
console.log('🔍 Analyzing new content:', newLines.slice(0, 2).map(line => line.substring(0, 50))); // Debug log
|
|
197
|
+
// Look for Claude response completion patterns
|
|
198
|
+
const hasResponseEnd = this._detectResponseCompletion(recentText, bufferText);
|
|
199
|
+
const hasTaskCompletion = this._detectTaskCompletion(recentText, bufferText);
|
|
200
|
+
if (hasTaskCompletion || hasResponseEnd) {
|
|
201
|
+
console.log('🎯 Task completion detected');
|
|
202
|
+
this._handleTaskCompletion(newLines);
|
|
203
|
+
}
|
|
204
|
+
// Don't constantly trigger waiting notifications for static content
|
|
205
|
+
else if (this._shouldTriggerWaitingNotification(recentText)) {
|
|
206
|
+
console.log('⏳ New waiting state detected');
|
|
207
|
+
this._handleWaitingForInput(newLines);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
_detectResponseCompletion(recentText, bufferText) {
|
|
211
|
+
// Look for Claude response completion indicators
|
|
212
|
+
const completionIndicators = [
|
|
213
|
+
/The file.*has been updated/i,
|
|
214
|
+
/File created successfully/i,
|
|
215
|
+
/successfully/i,
|
|
216
|
+
/completed/i,
|
|
217
|
+
/✅/,
|
|
218
|
+
/done/i
|
|
219
|
+
];
|
|
220
|
+
// Claude Code specific pattern: ⏺ response followed by box
|
|
221
|
+
const hasClaudeResponse = /⏺.*/.test(bufferText) || /⏺.*/.test(recentText);
|
|
222
|
+
const hasBoxStart = /╭.*╮/.test(recentText);
|
|
223
|
+
const hasBoxEnd = /╰.*╯/.test(recentText);
|
|
224
|
+
// Look for the pattern: ⏺ response -> box -> empty prompt
|
|
225
|
+
const isCompleteResponse = hasClaudeResponse && (hasBoxStart || hasBoxEnd);
|
|
226
|
+
return completionIndicators.some(pattern => pattern.test(recentText)) ||
|
|
227
|
+
isCompleteResponse;
|
|
228
|
+
}
|
|
229
|
+
_detectTaskCompletion(recentText, _bufferText) {
|
|
230
|
+
// Look for specific completion patterns
|
|
231
|
+
return this.completionPatterns.some(pattern => pattern.test(recentText));
|
|
232
|
+
}
|
|
233
|
+
_shouldTriggerWaitingNotification(recentText) {
|
|
234
|
+
// Only trigger waiting notification for new meaningful content
|
|
235
|
+
// Avoid triggering on static "? for shortcuts" that doesn't change
|
|
236
|
+
const meaningfulWaitingPatterns = [
|
|
237
|
+
/waiting.*for/i,
|
|
238
|
+
/need.*input/i,
|
|
239
|
+
/please.*provide/i,
|
|
240
|
+
/what.*would you like/i,
|
|
241
|
+
/Do you want/i,
|
|
242
|
+
/Would you like/i
|
|
243
|
+
];
|
|
244
|
+
return meaningfulWaitingPatterns.some(pattern => pattern.test(recentText)) &&
|
|
245
|
+
!recentText.includes('? for shortcuts'); // Ignore static shortcuts line
|
|
246
|
+
}
|
|
247
|
+
_handleTaskCompletion(newLines) {
|
|
248
|
+
const conversation = this._extractRecentConversation();
|
|
249
|
+
console.log('🎉 Claude task completion detected!');
|
|
250
|
+
this.emit('taskCompleted', {
|
|
251
|
+
type: 'completed',
|
|
252
|
+
sessionName: this.sessionName,
|
|
253
|
+
timestamp: new Date().toISOString(),
|
|
254
|
+
newOutput: newLines,
|
|
255
|
+
conversation: conversation,
|
|
256
|
+
triggerText: newLines.join('\n')
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
_handleWaitingForInput(newLines) {
|
|
260
|
+
const conversation = this._extractRecentConversation();
|
|
261
|
+
console.log('⏳ Claude waiting for input detected!');
|
|
262
|
+
this.emit('waitingForInput', {
|
|
263
|
+
type: 'waiting',
|
|
264
|
+
sessionName: this.sessionName,
|
|
265
|
+
timestamp: new Date().toISOString(),
|
|
266
|
+
newOutput: newLines,
|
|
267
|
+
conversation: conversation,
|
|
268
|
+
triggerText: newLines.join('\n')
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
_extractRecentConversation() {
|
|
272
|
+
// Extract recent conversation from buffer
|
|
273
|
+
const recentBuffer = this.outputBuffer.slice(-50); // Last 50 lines
|
|
274
|
+
const text = recentBuffer.join('\n');
|
|
275
|
+
// Try to identify user question and Claude response using Claude Code patterns
|
|
276
|
+
let userQuestion = '';
|
|
277
|
+
let claudeResponse = '';
|
|
278
|
+
// Look for Claude Code specific patterns
|
|
279
|
+
const lines = recentBuffer;
|
|
280
|
+
for (let i = 0; i < lines.length; i++) {
|
|
281
|
+
const line = lines[i].trim();
|
|
282
|
+
// Look for user input (after > prompt)
|
|
283
|
+
if (line.startsWith('> ') && line.length > 2) {
|
|
284
|
+
userQuestion = line.substring(2).trim();
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
// Look for Claude response (⏺ prefix)
|
|
288
|
+
if (line.startsWith('⏺ ') && line.length > 2) {
|
|
289
|
+
claudeResponse = line.substring(2).trim();
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// If we didn't find the specific format, use fallback
|
|
294
|
+
if (!userQuestion || !claudeResponse) {
|
|
295
|
+
for (let i = 0; i < lines.length; i++) {
|
|
296
|
+
const line = lines[i].trim();
|
|
297
|
+
// Skip system lines
|
|
298
|
+
if (!line || line.startsWith('[') || line.startsWith('$') ||
|
|
299
|
+
line.startsWith('#') || line.includes('? for shortcuts') ||
|
|
300
|
+
line.match(/^[╭╰│─]+$/)) {
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (!userQuestion && line.length > 2) {
|
|
304
|
+
userQuestion = line;
|
|
305
|
+
}
|
|
306
|
+
else if (userQuestion && !claudeResponse && line.length > 5 && line !== userQuestion) {
|
|
307
|
+
claudeResponse = line;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
userQuestion: userQuestion || 'Recent command',
|
|
314
|
+
claudeResponse: claudeResponse || 'Task completed',
|
|
315
|
+
fullContext: text
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
// Manual trigger methods for testing
|
|
319
|
+
triggerCompletionTest() {
|
|
320
|
+
this._handleTaskCompletion(['Test completion notification']);
|
|
321
|
+
}
|
|
322
|
+
triggerWaitingTest() {
|
|
323
|
+
this._handleWaitingForInput(['Test waiting notification']);
|
|
324
|
+
}
|
|
325
|
+
// Original capture methods (legacy support)
|
|
326
|
+
/**
|
|
327
|
+
* Start capturing a tmux session
|
|
328
|
+
*/
|
|
329
|
+
startCapture(sessionName) {
|
|
330
|
+
try {
|
|
331
|
+
const captureFile = path_1.default.join(this.captureDir, `${sessionName}.log`);
|
|
332
|
+
// Start pipe-pane to capture all session output
|
|
333
|
+
(0, child_process_1.execSync)(`tmux pipe-pane -t ${sessionName} -o "cat >> ${captureFile}"`, {
|
|
334
|
+
encoding: 'utf8',
|
|
335
|
+
stdio: 'ignore'
|
|
336
|
+
});
|
|
337
|
+
return captureFile;
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
console.error(`Failed to start capture for session ${sessionName}:`, error.message);
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Stop capturing a tmux session
|
|
346
|
+
*/
|
|
347
|
+
stopCapture(sessionName) {
|
|
348
|
+
try {
|
|
349
|
+
(0, child_process_1.execSync)(`tmux pipe-pane -t ${sessionName}`, {
|
|
350
|
+
encoding: 'utf8',
|
|
351
|
+
stdio: 'ignore'
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
console.error(`Failed to stop capture for session ${sessionName}:`, error.message);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get recent conversation from a tmux session
|
|
360
|
+
*/
|
|
361
|
+
getRecentConversation(sessionName, lines = 200) {
|
|
362
|
+
try {
|
|
363
|
+
const captureFile = path_1.default.join(this.captureDir, `${sessionName}.log`);
|
|
364
|
+
if (!fs_1.default.existsSync(captureFile)) {
|
|
365
|
+
// If no capture file, try to get from tmux buffer
|
|
366
|
+
return this.getFromTmuxBuffer(sessionName, lines);
|
|
367
|
+
}
|
|
368
|
+
// Read the capture file
|
|
369
|
+
const content = fs_1.default.readFileSync(captureFile, 'utf8');
|
|
370
|
+
const allLines = content.split('\n');
|
|
371
|
+
const recentLines = allLines.slice(-lines);
|
|
372
|
+
return this.extractConversation(recentLines.join('\n'), sessionName);
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
console.error(`Failed to get conversation for session ${sessionName}:`, error.message);
|
|
376
|
+
return { userQuestion: '', claudeResponse: '' };
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get conversation from tmux buffer
|
|
381
|
+
*/
|
|
382
|
+
getFromTmuxBuffer(sessionName, lines = 200) {
|
|
383
|
+
try {
|
|
384
|
+
// Capture the pane contents
|
|
385
|
+
const buffer = (0, child_process_1.execSync)(`tmux capture-pane -t ${sessionName} -p -S -${lines}`, {
|
|
386
|
+
encoding: 'utf8',
|
|
387
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
388
|
+
});
|
|
389
|
+
return this.extractConversation(buffer, sessionName);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
console.error(`Failed to get tmux buffer for session ${sessionName}:`, error.message);
|
|
393
|
+
return { userQuestion: '', claudeResponse: '' };
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Get full execution trace from tmux session
|
|
398
|
+
*/
|
|
399
|
+
getFullExecutionTrace(sessionName, lines = 1000) {
|
|
400
|
+
try {
|
|
401
|
+
let content;
|
|
402
|
+
if (!fs_1.default.existsSync(path_1.default.join(this.captureDir, `${sessionName}.log`))) {
|
|
403
|
+
// If no capture file, try to get from tmux buffer
|
|
404
|
+
content = this.getFullTraceFromTmuxBuffer(sessionName, lines);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
// Read the capture file
|
|
408
|
+
content = fs_1.default.readFileSync(path_1.default.join(this.captureDir, `${sessionName}.log`), 'utf8');
|
|
409
|
+
}
|
|
410
|
+
// Always filter content to only show from last user input
|
|
411
|
+
content = this._filterByTimestamp(content);
|
|
412
|
+
// Clean up the trace by removing the command prompt box
|
|
413
|
+
return this._cleanExecutionTrace(content);
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
console.error(`Failed to get full trace for session ${sessionName}:`, error.message);
|
|
417
|
+
return '';
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Filter content to only include lines after the last user input
|
|
422
|
+
*/
|
|
423
|
+
_filterByTimestamp(content, _timestamp) {
|
|
424
|
+
const lines = content.split('\n');
|
|
425
|
+
let lastUserInputIndex = -1;
|
|
426
|
+
// Find the LAST occurrence of user input (line starting with "> ")
|
|
427
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
428
|
+
const line = lines[i];
|
|
429
|
+
// Check for user input pattern: "> " at the start of the line
|
|
430
|
+
if (line.startsWith('> ') && line.length > 2) {
|
|
431
|
+
lastUserInputIndex = i;
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// If we found user input, return everything from that point
|
|
436
|
+
if (lastUserInputIndex >= 0) {
|
|
437
|
+
return lines.slice(lastUserInputIndex).join('\n');
|
|
438
|
+
}
|
|
439
|
+
// If no user input found, return last 100 lines as fallback
|
|
440
|
+
return lines.slice(-100).join('\n');
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Clean execution trace by removing command prompt and status line
|
|
444
|
+
* Also removes the complete user input and final Claude response
|
|
445
|
+
*/
|
|
446
|
+
_cleanExecutionTrace(trace) {
|
|
447
|
+
const lines = trace.split('\n');
|
|
448
|
+
const cleanedLines = [];
|
|
449
|
+
let inUserInput = false;
|
|
450
|
+
let skipNextEmptyLine = false;
|
|
451
|
+
let lastClaudeResponseStart = -1;
|
|
452
|
+
// Find where the last Claude response starts
|
|
453
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
454
|
+
if (lines[i].startsWith('⏺ ')) {
|
|
455
|
+
lastClaudeResponseStart = i;
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
for (let i = 0; i < lines.length; i++) {
|
|
460
|
+
const line = lines[i];
|
|
461
|
+
// Skip everything from the last Claude response onward
|
|
462
|
+
if (lastClaudeResponseStart !== -1 && i >= lastClaudeResponseStart) {
|
|
463
|
+
// But we want to show everything BEFORE the last response
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
466
|
+
// Start of user input
|
|
467
|
+
if (line.startsWith('> ')) {
|
|
468
|
+
inUserInput = true;
|
|
469
|
+
skipNextEmptyLine = true;
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
// Still in user input (continuation lines)
|
|
473
|
+
if (inUserInput) {
|
|
474
|
+
// Check if we've reached the end of user input
|
|
475
|
+
if (line.trim() === '' || line.startsWith('⏺')) {
|
|
476
|
+
inUserInput = false;
|
|
477
|
+
if (skipNextEmptyLine && line.trim() === '') {
|
|
478
|
+
skipNextEmptyLine = false;
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
continue; // Skip user input continuation lines
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// Check if we've hit the command prompt box
|
|
487
|
+
if (line.includes('╭─') && line.includes('─╮')) {
|
|
488
|
+
break;
|
|
489
|
+
}
|
|
490
|
+
// Skip empty command prompt lines
|
|
491
|
+
if (line.match(/^│\s*>\s*│$/)) {
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
cleanedLines.push(line);
|
|
495
|
+
}
|
|
496
|
+
// Remove empty lines at the beginning and end
|
|
497
|
+
while (cleanedLines.length > 0 && cleanedLines[0].trim() === '') {
|
|
498
|
+
cleanedLines.shift();
|
|
499
|
+
}
|
|
500
|
+
while (cleanedLines.length > 0 && cleanedLines[cleanedLines.length - 1].trim() === '') {
|
|
501
|
+
cleanedLines.pop();
|
|
502
|
+
}
|
|
503
|
+
return cleanedLines.join('\n');
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Get full trace from tmux buffer
|
|
507
|
+
*/
|
|
508
|
+
getFullTraceFromTmuxBuffer(sessionName, lines = 1000) {
|
|
509
|
+
try {
|
|
510
|
+
// Capture the pane contents
|
|
511
|
+
const buffer = (0, child_process_1.execSync)(`tmux capture-pane -t ${sessionName} -p -S -${lines}`, {
|
|
512
|
+
encoding: 'utf8',
|
|
513
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
514
|
+
});
|
|
515
|
+
return buffer;
|
|
516
|
+
}
|
|
517
|
+
catch (error) {
|
|
518
|
+
console.error(`Failed to get tmux buffer for session ${sessionName}:`, error.message);
|
|
519
|
+
return '';
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Extract user question and Claude response from captured text
|
|
524
|
+
*/
|
|
525
|
+
extractConversation(text, sessionName = null) {
|
|
526
|
+
const lines = text.split('\n');
|
|
527
|
+
let userQuestion = '';
|
|
528
|
+
let claudeResponse = '';
|
|
529
|
+
let responseLines = [];
|
|
530
|
+
let inResponse = false;
|
|
531
|
+
// Find the most recent user question and Claude response
|
|
532
|
+
let inUserInput = false;
|
|
533
|
+
let userQuestionLines = [];
|
|
534
|
+
for (let i = 0; i < lines.length; i++) {
|
|
535
|
+
const line = lines[i].trim();
|
|
536
|
+
// Detect user input (line starting with "> " followed by content)
|
|
537
|
+
if (line.startsWith('> ') && line.length > 2) {
|
|
538
|
+
userQuestionLines = [line.substring(2).trim()];
|
|
539
|
+
inUserInput = true;
|
|
540
|
+
inResponse = false; // Reset response capture
|
|
541
|
+
responseLines = []; // Clear previous response
|
|
542
|
+
// Record user input timestamp if session name provided
|
|
543
|
+
if (sessionName) {
|
|
544
|
+
this.traceCapture.recordUserInput(sessionName);
|
|
545
|
+
}
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
// Continue capturing multi-line user input
|
|
549
|
+
if (inUserInput && !line.startsWith('⏺') && line.length > 0) {
|
|
550
|
+
userQuestionLines.push(line);
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
// End of user input
|
|
554
|
+
if (inUserInput && (line.startsWith('⏺') || line.length === 0)) {
|
|
555
|
+
inUserInput = false;
|
|
556
|
+
userQuestion = userQuestionLines.join(' ');
|
|
557
|
+
}
|
|
558
|
+
// Detect Claude response (line starting with "⏺ " or other response indicators)
|
|
559
|
+
if (line.startsWith('⏺ ') ||
|
|
560
|
+
(inResponse && line.length > 0 &&
|
|
561
|
+
!line.startsWith('╭') && !line.startsWith('│') && !line.startsWith('╰') &&
|
|
562
|
+
!line.startsWith('> ') && !line.includes('? for shortcuts'))) {
|
|
563
|
+
if (line.startsWith('⏺ ')) {
|
|
564
|
+
inResponse = true;
|
|
565
|
+
responseLines = [line.substring(2).trim()]; // Remove "⏺ " prefix
|
|
566
|
+
}
|
|
567
|
+
else if (inResponse) {
|
|
568
|
+
responseLines.push(line);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
// Stop capturing response when we hit another prompt or box boundary
|
|
572
|
+
if (inResponse && (line.startsWith('╭') || line.startsWith('│ > ') || line.includes('? for shortcuts'))) {
|
|
573
|
+
inResponse = false;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
// Join response lines and clean up
|
|
577
|
+
claudeResponse = responseLines.join('\n').trim();
|
|
578
|
+
// Remove box characters but preserve formatting
|
|
579
|
+
claudeResponse = claudeResponse
|
|
580
|
+
.replace(/[╭╰│]/g, '')
|
|
581
|
+
.replace(/^\s*│\s*/gm, '')
|
|
582
|
+
// Don't collapse multiple spaces - preserve code formatting
|
|
583
|
+
// .replace(/\s+/g, ' ')
|
|
584
|
+
.trim();
|
|
585
|
+
// Don't limit response length - we want the full response
|
|
586
|
+
// if (claudeResponse.length > 500) {
|
|
587
|
+
// claudeResponse = claudeResponse.substring(0, 497) + '...';
|
|
588
|
+
// }
|
|
589
|
+
// If we didn't find a question in the standard format, look for any recent text input
|
|
590
|
+
if (!userQuestion) {
|
|
591
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
592
|
+
const line = lines[i].trim();
|
|
593
|
+
if (line.startsWith('> ') && line.length > 2) {
|
|
594
|
+
userQuestion = line.substring(2).trim();
|
|
595
|
+
break;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
return {
|
|
600
|
+
userQuestion: userQuestion || 'No user input',
|
|
601
|
+
claudeResponse: claudeResponse || 'No Claude response'
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Clean up old capture files
|
|
606
|
+
*/
|
|
607
|
+
cleanupOldCaptures(daysToKeep = 7) {
|
|
608
|
+
try {
|
|
609
|
+
const files = fs_1.default.readdirSync(this.captureDir);
|
|
610
|
+
const now = Date.now();
|
|
611
|
+
const maxAge = daysToKeep * 24 * 60 * 60 * 1000;
|
|
612
|
+
files.forEach(file => {
|
|
613
|
+
const filePath = path_1.default.join(this.captureDir, file);
|
|
614
|
+
const stats = fs_1.default.statSync(filePath);
|
|
615
|
+
if (now - stats.mtime.getTime() > maxAge) {
|
|
616
|
+
fs_1.default.unlinkSync(filePath);
|
|
617
|
+
console.log(`Cleaned up old capture file: ${file}`);
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
catch (error) {
|
|
622
|
+
console.error('Failed to cleanup captures:', error.message);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
// Enhanced status method
|
|
626
|
+
getStatus() {
|
|
627
|
+
return {
|
|
628
|
+
isMonitoring: this.isMonitoring,
|
|
629
|
+
sessionName: this.sessionName,
|
|
630
|
+
sessionExists: this._sessionExists(),
|
|
631
|
+
bufferSize: this.outputBuffer.length,
|
|
632
|
+
checkInterval: this.checkInterval,
|
|
633
|
+
patterns: {
|
|
634
|
+
completion: this.completionPatterns.length,
|
|
635
|
+
waiting: this.waitingPatterns.length
|
|
636
|
+
},
|
|
637
|
+
lastCheck: new Date().toISOString()
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
module.exports = TmuxMonitor;
|
|
642
|
+
//# sourceMappingURL=tmux-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux-monitor.js","sourceRoot":"","sources":["../../../src/utils/tmux-monitor.ts"],"names":[],"mappings":"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"}
|