@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,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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"}