@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,306 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * CCGram Daemon Service
5
+ * Background daemon process for monitoring emails and processing remote commands
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const child_process_1 = require("child_process");
13
+ const logger_1 = __importDefault(require("../core/logger"));
14
+ const config_1 = __importDefault(require("../core/config"));
15
+ class ClaudeCodeRemoteDaemon {
16
+ logger;
17
+ config;
18
+ pidFile;
19
+ logFile;
20
+ relayService;
21
+ isRunning;
22
+ constructor() {
23
+ this.logger = new logger_1.default('Daemon');
24
+ this.config = new config_1.default();
25
+ this.pidFile = path_1.default.join(__dirname, '../data/ccgram-daemon.pid');
26
+ this.logFile = path_1.default.join(__dirname, '../data/daemon.log');
27
+ this.relayService = null;
28
+ this.isRunning = false;
29
+ // Ensure data directory exists
30
+ const dataDir = path_1.default.dirname(this.pidFile);
31
+ if (!fs_1.default.existsSync(dataDir)) {
32
+ fs_1.default.mkdirSync(dataDir, { recursive: true });
33
+ }
34
+ }
35
+ async start(detached = true) {
36
+ try {
37
+ // Check if already running
38
+ if (this.isAlreadyRunning()) {
39
+ console.log('❌ CCGram daemon is already running');
40
+ console.log('💡 Use "claude-remote daemon stop" to stop existing service');
41
+ process.exit(1);
42
+ }
43
+ if (detached) {
44
+ // Start in daemon mode
45
+ await this.startDetached();
46
+ }
47
+ else {
48
+ // Run directly in current process
49
+ await this.startForeground();
50
+ }
51
+ }
52
+ catch (error) {
53
+ this.logger.error('Failed to start daemon:', error);
54
+ throw error;
55
+ }
56
+ }
57
+ async startDetached() {
58
+ console.log('🚀 Starting CCGram daemon...');
59
+ // Create child process
60
+ const child = (0, child_process_1.spawn)(process.execPath, [__filename, '--foreground'], {
61
+ detached: true,
62
+ stdio: ['ignore', 'pipe', 'pipe']
63
+ });
64
+ // Redirect logs
65
+ const logStream = fs_1.default.createWriteStream(this.logFile, { flags: 'a' });
66
+ child.stdout.pipe(logStream);
67
+ child.stderr.pipe(logStream);
68
+ // Save PID
69
+ fs_1.default.writeFileSync(this.pidFile, child.pid.toString());
70
+ // Detach child process
71
+ child.unref();
72
+ console.log(`✅ CCGram daemon started (PID: ${child.pid})`);
73
+ console.log(`📝 Log file: ${this.logFile}`);
74
+ console.log('💡 Use "claude-remote daemon status" to view status');
75
+ console.log('💡 Use "claude-remote daemon stop" to stop service');
76
+ }
77
+ async startForeground() {
78
+ console.log('🚀 CCGram daemon starting...');
79
+ this.isRunning = true;
80
+ process.title = 'ccgram-daemon';
81
+ // Load configuration
82
+ this.config.load();
83
+ // Initialize email relay service
84
+ const emailConfig = this.config.getChannel('email');
85
+ if (!emailConfig || !emailConfig.enabled) {
86
+ this.logger.warn('Email channel not configured or disabled');
87
+ return;
88
+ }
89
+ const CommandRelayService = require('../relay/command-relay');
90
+ this.relayService = new CommandRelayService(emailConfig.config);
91
+ // Setup event handlers
92
+ this.setupEventHandlers();
93
+ // Start service
94
+ await this.relayService.start();
95
+ this.logger.info('Email relay service started');
96
+ // Keep process running
97
+ this.keepAlive();
98
+ }
99
+ setupEventHandlers() {
100
+ // Graceful shutdown
101
+ const gracefulShutdown = async (signal) => {
102
+ this.logger.info(`Received ${signal}, shutting down gracefully...`);
103
+ this.isRunning = false;
104
+ if (this.relayService) {
105
+ await this.relayService.stop();
106
+ }
107
+ // Delete PID file
108
+ if (fs_1.default.existsSync(this.pidFile)) {
109
+ fs_1.default.unlinkSync(this.pidFile);
110
+ }
111
+ process.exit(0);
112
+ };
113
+ process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
114
+ process.on('SIGINT', () => gracefulShutdown('SIGINT'));
115
+ process.on('SIGHUP', () => {
116
+ this.logger.info('Received SIGHUP, reloading configuration...');
117
+ this.config.load();
118
+ });
119
+ // Relay service events
120
+ if (this.relayService) {
121
+ this.relayService.on('started', () => {
122
+ this.logger.info('Command relay service started');
123
+ });
124
+ this.relayService.on('commandQueued', (command) => {
125
+ this.logger.info(`Command queued: ${command.id}`);
126
+ });
127
+ this.relayService.on('commandExecuted', (command) => {
128
+ this.logger.info(`Command executed: ${command.id}`);
129
+ });
130
+ this.relayService.on('commandFailed', (command, error) => {
131
+ this.logger.error(`Command failed: ${command.id} - ${error.message}`);
132
+ });
133
+ }
134
+ // Uncaught exception handling
135
+ process.on('uncaughtException', (error) => {
136
+ this.logger.error('Uncaught exception:', error);
137
+ process.exit(1);
138
+ });
139
+ process.on('unhandledRejection', (reason, promise) => {
140
+ this.logger.error('Unhandled rejection at:', promise, 'reason:', reason);
141
+ process.exit(1);
142
+ });
143
+ }
144
+ keepAlive() {
145
+ // Keep process running
146
+ const heartbeat = setInterval(() => {
147
+ if (!this.isRunning) {
148
+ clearInterval(heartbeat);
149
+ return;
150
+ }
151
+ this.logger.debug('Heartbeat');
152
+ }, 60000); // Output heartbeat log every minute
153
+ }
154
+ async stop() {
155
+ if (!this.isAlreadyRunning()) {
156
+ console.log('❌ CCGram daemon is not running');
157
+ return;
158
+ }
159
+ try {
160
+ const pid = this.getPid();
161
+ console.log(`🛑 Stopping CCGram daemon (PID: ${pid})...`);
162
+ // Send SIGTERM signal
163
+ process.kill(pid, 'SIGTERM');
164
+ // Wait for process to end
165
+ await this.waitForStop(pid);
166
+ console.log('✅ CCGram daemon stopped');
167
+ }
168
+ catch (error) {
169
+ console.error('❌ Failed to stop daemon:', error.message);
170
+ // Force delete PID file
171
+ if (fs_1.default.existsSync(this.pidFile)) {
172
+ fs_1.default.unlinkSync(this.pidFile);
173
+ console.log('🧹 PID file cleaned up');
174
+ }
175
+ }
176
+ }
177
+ async restart() {
178
+ console.log('🔄 Restarting CCGram daemon...');
179
+ await this.stop();
180
+ await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2 seconds
181
+ await this.start();
182
+ }
183
+ getStatus() {
184
+ const isRunning = this.isAlreadyRunning();
185
+ const pid = isRunning ? this.getPid() : null;
186
+ return {
187
+ running: isRunning,
188
+ pid: pid,
189
+ pidFile: this.pidFile,
190
+ logFile: this.logFile,
191
+ uptime: isRunning ? this.getUptime(pid) : null
192
+ };
193
+ }
194
+ showStatus() {
195
+ const status = this.getStatus();
196
+ console.log('📊 CCGram daemon status\n');
197
+ if (status.running) {
198
+ console.log('✅ Status: Running');
199
+ console.log(`🆔 PID: ${status.pid}`);
200
+ console.log(`⏱️ Uptime: ${status.uptime || 'Unknown'}`);
201
+ }
202
+ else {
203
+ console.log('❌ Status: Not running');
204
+ }
205
+ console.log(`📝 Log file: ${status.logFile}`);
206
+ console.log(`📁 PID file: ${status.pidFile}`);
207
+ // Show recent logs
208
+ if (fs_1.default.existsSync(status.logFile)) {
209
+ console.log('\n📋 Recent logs:');
210
+ try {
211
+ const logs = fs_1.default.readFileSync(status.logFile, 'utf8');
212
+ const lines = logs.split('\n').filter((line) => line.trim()).slice(-5);
213
+ lines.forEach((line) => console.log(` ${line}`));
214
+ }
215
+ catch (error) {
216
+ console.log(' Unable to read log file');
217
+ }
218
+ }
219
+ }
220
+ isAlreadyRunning() {
221
+ if (!fs_1.default.existsSync(this.pidFile)) {
222
+ return false;
223
+ }
224
+ try {
225
+ const pid = parseInt(fs_1.default.readFileSync(this.pidFile, 'utf8'));
226
+ // Check if process is still running
227
+ process.kill(pid, 0);
228
+ return true;
229
+ }
230
+ catch (error) {
231
+ // Process doesn't exist, delete outdated PID file
232
+ fs_1.default.unlinkSync(this.pidFile);
233
+ return false;
234
+ }
235
+ }
236
+ getPid() {
237
+ if (!fs_1.default.existsSync(this.pidFile)) {
238
+ return null;
239
+ }
240
+ return parseInt(fs_1.default.readFileSync(this.pidFile, 'utf8'));
241
+ }
242
+ async waitForStop(pid, timeout = 10000) {
243
+ const startTime = Date.now();
244
+ while (Date.now() - startTime < timeout) {
245
+ try {
246
+ process.kill(pid, 0);
247
+ await new Promise(resolve => setTimeout(resolve, 100));
248
+ }
249
+ catch (error) {
250
+ // Process has stopped
251
+ return;
252
+ }
253
+ }
254
+ // Timeout, force termination
255
+ throw new Error('Process stop timeout, may need manual termination');
256
+ }
257
+ getUptime(pid) {
258
+ try {
259
+ // Get process start time on macOS and Linux
260
+ const result = (0, child_process_1.execSync)(`ps -o lstart= -p ${pid}`, { encoding: 'utf8' });
261
+ const startTime = new Date(result.trim());
262
+ const uptime = Date.now() - startTime.getTime();
263
+ const hours = Math.floor(uptime / (1000 * 60 * 60));
264
+ const minutes = Math.floor((uptime % (1000 * 60 * 60)) / (1000 * 60));
265
+ return `${hours}h ${minutes}m`;
266
+ }
267
+ catch (error) {
268
+ return 'Unknown';
269
+ }
270
+ }
271
+ }
272
+ // Command line interface
273
+ if (require.main === module) {
274
+ const daemon = new ClaudeCodeRemoteDaemon();
275
+ const command = process.argv[2];
276
+ (async () => {
277
+ try {
278
+ switch (command) {
279
+ case 'start':
280
+ await daemon.start(true);
281
+ break;
282
+ case '--foreground':
283
+ await daemon.start(false);
284
+ break;
285
+ case 'stop':
286
+ await daemon.stop();
287
+ break;
288
+ case 'restart':
289
+ await daemon.restart();
290
+ break;
291
+ case 'status':
292
+ daemon.showStatus();
293
+ break;
294
+ default:
295
+ console.log('Usage: ccgram-daemon <start|stop|restart|status>');
296
+ process.exit(1);
297
+ }
298
+ }
299
+ catch (error) {
300
+ console.error('Error:', error.message);
301
+ process.exit(1);
302
+ }
303
+ })();
304
+ }
305
+ module.exports = ClaudeCodeRemoteDaemon;
306
+ //# sourceMappingURL=taskping-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskping-daemon.js","sourceRoot":"","sources":["../../../src/daemon/taskping-daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Claude Command Bridge
3
+ * Bridge for communicating with Claude Code via file system
4
+ */
5
+ import Logger from '../core/logger';
6
+ interface CommandData {
7
+ id: string;
8
+ sessionId: string;
9
+ command: string;
10
+ timestamp: string;
11
+ status: string;
12
+ source: string;
13
+ processedAt?: string;
14
+ response?: string;
15
+ }
16
+ interface BridgeStatus {
17
+ pendingCommands: number;
18
+ processedCommands: number;
19
+ commandsDir?: string;
20
+ responseDir?: string;
21
+ recentCommands?: Array<{
22
+ id: string;
23
+ command: string;
24
+ timestamp: string;
25
+ }>;
26
+ error?: string;
27
+ }
28
+ declare class ClaudeCommandBridge {
29
+ logger: Logger;
30
+ commandsDir: string;
31
+ responseDir: string;
32
+ constructor();
33
+ _ensureDirectories(): void;
34
+ /**
35
+ * Send command to Claude Code
36
+ */
37
+ sendCommand(command: string, sessionId: string): Promise<boolean>;
38
+ _sendSystemNotification(command: string, commandId: string): Promise<void>;
39
+ /**
40
+ * Get pending commands
41
+ */
42
+ getPendingCommands(): CommandData[];
43
+ /**
44
+ * Mark command as processed
45
+ */
46
+ markCommandProcessed(commandId: string, status?: string, response?: string): void;
47
+ /**
48
+ * Clean up old command and response files
49
+ */
50
+ cleanup(maxAge?: number): void;
51
+ /**
52
+ * Get bridge status
53
+ */
54
+ getStatus(): BridgeStatus;
55
+ }
56
+ export = ClaudeCommandBridge;
57
+ //# sourceMappingURL=claude-command-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-command-bridge.d.ts","sourceRoot":"","sources":["../../../src/relay/claude-command-bridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,MAAM,MAAM,gBAAgB,CAAC;AAEpC,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,cAAM,mBAAmB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;;IAUpB,kBAAkB,IAAI,IAAI;IAQ1B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCjE,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhF;;OAEG;IACH,kBAAkB,IAAI,WAAW,EAAE;IA2BnC;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAoB,EAAE,QAAQ,GAAE,MAAW,GAAG,IAAI;IAwBlG;;OAEG;IACH,OAAO,CAAC,MAAM,GAAE,MAAW,GAAG,IAAI;IA2BlC;;OAEG;IACH,SAAS,IAAI,YAAY;CAyB5B;AAED,SAAS,mBAAmB,CAAC"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * Claude Command Bridge
4
+ * Bridge for communicating with Claude Code via file system
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const child_process_1 = require("child_process");
12
+ const logger_1 = __importDefault(require("../core/logger"));
13
+ class ClaudeCommandBridge {
14
+ logger;
15
+ commandsDir;
16
+ responseDir;
17
+ constructor() {
18
+ this.logger = new logger_1.default('CommandBridge');
19
+ this.commandsDir = path_1.default.join(__dirname, '../data/commands');
20
+ this.responseDir = path_1.default.join(__dirname, '../data/responses');
21
+ this._ensureDirectories();
22
+ }
23
+ _ensureDirectories() {
24
+ [this.commandsDir, this.responseDir].forEach(dir => {
25
+ if (!fs_1.default.existsSync(dir)) {
26
+ fs_1.default.mkdirSync(dir, { recursive: true });
27
+ }
28
+ });
29
+ }
30
+ /**
31
+ * Send command to Claude Code
32
+ */
33
+ async sendCommand(command, sessionId) {
34
+ try {
35
+ const timestamp = Date.now();
36
+ const commandId = `${sessionId}_${timestamp}`;
37
+ // Create command file
38
+ const commandFile = path_1.default.join(this.commandsDir, `${commandId}.json`);
39
+ const commandData = {
40
+ id: commandId,
41
+ sessionId,
42
+ command,
43
+ timestamp: new Date().toISOString(),
44
+ status: 'pending',
45
+ source: 'email'
46
+ };
47
+ fs_1.default.writeFileSync(commandFile, JSON.stringify(commandData, null, 2));
48
+ // Create notification file (Claude Code can monitor this file for changes)
49
+ const notificationFile = path_1.default.join(this.commandsDir, '.new_command');
50
+ fs_1.default.writeFileSync(notificationFile, commandId);
51
+ this.logger.info(`Command sent via file bridge: ${commandId}`);
52
+ // Try to use system notification
53
+ await this._sendSystemNotification(command, commandId);
54
+ return true;
55
+ }
56
+ catch (error) {
57
+ this.logger.error('Failed to send command via bridge:', error.message);
58
+ return false;
59
+ }
60
+ }
61
+ async _sendSystemNotification(command, commandId) {
62
+ try {
63
+ const title = 'TaskPing - New Email Command';
64
+ const body = `Command: ${command.length > 50 ? command.substring(0, 50) + '...' : command}\n\nClick to view details or enter command in Claude Code`;
65
+ if (process.platform === 'darwin') {
66
+ // macOS notification
67
+ const script = `
68
+ display notification "${body.replace(/"/g, '\\"')}" with title "${title}" sound name "default"
69
+ `;
70
+ (0, child_process_1.spawn)('osascript', ['-e', script]);
71
+ }
72
+ else if (process.platform === 'linux') {
73
+ // Linux notification
74
+ (0, child_process_1.spawn)('notify-send', [title, body]);
75
+ }
76
+ this.logger.debug('System notification sent');
77
+ }
78
+ catch (error) {
79
+ this.logger.warn('Failed to send system notification:', error.message);
80
+ }
81
+ }
82
+ /**
83
+ * Get pending commands
84
+ */
85
+ getPendingCommands() {
86
+ try {
87
+ const files = fs_1.default.readdirSync(this.commandsDir)
88
+ .filter(file => file.endsWith('.json'))
89
+ .sort();
90
+ const commands = [];
91
+ for (const file of files) {
92
+ try {
93
+ const commandData = JSON.parse(fs_1.default.readFileSync(path_1.default.join(this.commandsDir, file), 'utf8'));
94
+ if (commandData.status === 'pending') {
95
+ commands.push(commandData);
96
+ }
97
+ }
98
+ catch (error) {
99
+ this.logger.warn(`Failed to parse command file ${file}:`, error.message);
100
+ }
101
+ }
102
+ return commands;
103
+ }
104
+ catch (error) {
105
+ this.logger.error('Failed to get pending commands:', error.message);
106
+ return [];
107
+ }
108
+ }
109
+ /**
110
+ * Mark command as processed
111
+ */
112
+ markCommandProcessed(commandId, status = 'completed', response = '') {
113
+ try {
114
+ const commandFile = path_1.default.join(this.commandsDir, `${commandId}.json`);
115
+ if (fs_1.default.existsSync(commandFile)) {
116
+ const commandData = JSON.parse(fs_1.default.readFileSync(commandFile, 'utf8'));
117
+ commandData.status = status;
118
+ commandData.processedAt = new Date().toISOString();
119
+ commandData.response = response;
120
+ // Save to response directory
121
+ const responseFile = path_1.default.join(this.responseDir, `${commandId}.json`);
122
+ fs_1.default.writeFileSync(responseFile, JSON.stringify(commandData, null, 2));
123
+ // Delete original command file
124
+ fs_1.default.unlinkSync(commandFile);
125
+ this.logger.info(`Command ${commandId} marked as ${status}`);
126
+ }
127
+ }
128
+ catch (error) {
129
+ this.logger.error(`Failed to mark command ${commandId} as processed:`, error.message);
130
+ }
131
+ }
132
+ /**
133
+ * Clean up old command and response files
134
+ */
135
+ cleanup(maxAge = 24) {
136
+ const cutoff = Date.now() - (maxAge * 60 * 60 * 1000);
137
+ let cleaned = 0;
138
+ [this.commandsDir, this.responseDir].forEach(dir => {
139
+ try {
140
+ const files = fs_1.default.readdirSync(dir).filter(file => file.endsWith('.json'));
141
+ for (const file of files) {
142
+ const filePath = path_1.default.join(dir, file);
143
+ const stats = fs_1.default.statSync(filePath);
144
+ if (stats.mtime.getTime() < cutoff) {
145
+ fs_1.default.unlinkSync(filePath);
146
+ cleaned++;
147
+ }
148
+ }
149
+ }
150
+ catch (error) {
151
+ this.logger.warn(`Failed to cleanup directory ${dir}:`, error.message);
152
+ }
153
+ });
154
+ if (cleaned > 0) {
155
+ this.logger.info(`Cleaned up ${cleaned} old command files`);
156
+ }
157
+ }
158
+ /**
159
+ * Get bridge status
160
+ */
161
+ getStatus() {
162
+ try {
163
+ const pendingCommands = this.getPendingCommands();
164
+ const responseFiles = fs_1.default.readdirSync(this.responseDir).filter(f => f.endsWith('.json'));
165
+ return {
166
+ pendingCommands: pendingCommands.length,
167
+ processedCommands: responseFiles.length,
168
+ commandsDir: this.commandsDir,
169
+ responseDir: this.responseDir,
170
+ recentCommands: pendingCommands.slice(-5).map(cmd => ({
171
+ id: cmd.id,
172
+ command: cmd.command.substring(0, 50) + '...',
173
+ timestamp: cmd.timestamp
174
+ }))
175
+ };
176
+ }
177
+ catch (error) {
178
+ this.logger.error('Failed to get bridge status:', error.message);
179
+ return {
180
+ pendingCommands: 0,
181
+ processedCommands: 0,
182
+ error: error.message
183
+ };
184
+ }
185
+ }
186
+ }
187
+ module.exports = ClaudeCommandBridge;
188
+ //# sourceMappingURL=claude-command-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-command-bridge.js","sourceRoot":"","sources":["../../../src/relay/claude-command-bridge.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,iDAAsC;AACtC,4DAAoC;AAsBpC,MAAM,mBAAmB;IACrB,MAAM,CAAS;IACf,WAAW,CAAS;IACpB,WAAW,CAAS;IAEpB;QACI,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC,eAAe,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE7D,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,kBAAkB;QACd,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC/C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,SAAiB;QAChD,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;YAE9C,sBAAsB;YACtB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;YACrE,MAAM,WAAW,GAAgB;gBAC7B,EAAE,EAAE,SAAS;gBACb,SAAS;gBACT,OAAO;gBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,OAAO;aAClB,CAAC;YAEF,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEpE,2EAA2E;YAC3E,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACrE,YAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;YAE9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;YAE/D,iCAAiC;YACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAEvD,OAAO,IAAI,CAAC;QAEhB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAClF,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,OAAe,EAAE,SAAiB;QAC5D,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,8BAA8B,CAAC;YAC7C,MAAM,IAAI,GAAG,YAAY,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,2DAA2D,CAAC;YAErJ,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,qBAAqB;gBACrB,MAAM,MAAM,GAAG;4CACa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,iBAAiB,KAAK;iBAC1E,CAAC;gBACF,IAAA,qBAAK,EAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACtC,qBAAqB;gBACrB,IAAA,qBAAK,EAAC,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAED;;OAEG;IACH,kBAAkB;QACd,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;iBACzC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBACtC,IAAI,EAAE,CAAC;YAEZ,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACD,MAAM,WAAW,GAAgB,IAAI,CAAC,KAAK,CACvC,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAC7D,CAAC;oBACF,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC/B,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAc,EAAE,CAAC;oBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,GAAG,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;gBACxF,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC/E,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,SAAiB,EAAE,SAAiB,WAAW,EAAE,WAAmB,EAAE;QACvF,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;YAErE,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,MAAM,WAAW,GAAgB,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;gBAClF,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC5B,WAAW,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACnD,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAEhC,6BAA6B;gBAC7B,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;gBACtE,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAErE,+BAA+B;gBAC/B,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBAE3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,SAAS,cAAc,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,SAAS,gBAAgB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACrG,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,SAAiB,EAAE;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACtD,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC/C,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACtC,MAAM,KAAK,GAAG,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAEpC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;wBACjC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;wBACxB,OAAO,EAAE,CAAC;oBACd,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,GAAG,GAAG,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YACtF,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,oBAAoB,CAAC,CAAC;QAChE,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QACL,IAAI,CAAC;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAClD,MAAM,aAAa,GAAG,YAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAExF,OAAO;gBACH,eAAe,EAAE,eAAe,CAAC,MAAM;gBACvC,iBAAiB,EAAE,aAAa,CAAC,MAAM;gBACvC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClD,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;oBAC7C,SAAS,EAAE,GAAG,CAAC,SAAS;iBAC3B,CAAC,CAAC;aACN,CAAC;QACN,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5E,OAAO;gBACH,eAAe,EAAE,CAAC;gBAClB,iBAAiB,EAAE,CAAC;gBACpB,KAAK,EAAG,KAAe,CAAC,OAAO;aAClC,CAAC;QACN,CAAC;IACL,CAAC;CACJ;AAED,iBAAS,mBAAmB,CAAC"}