@selucas12/cheesy 2.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 (292) hide show
  1. package/.env.example +22 -0
  2. package/CHANGELOG.md +268 -0
  3. package/LICENSE +21 -0
  4. package/README.md +394 -0
  5. package/ccgram.service +24 -0
  6. package/config/channels.json +58 -0
  7. package/config/default.json +27 -0
  8. package/config/defaults/config.json +16 -0
  9. package/config/defaults/i18n.json +32 -0
  10. package/config/email-template.json +31 -0
  11. package/config/test-with-subagent.json +16 -0
  12. package/config/user.json +27 -0
  13. package/dist/claude-hook-notify.d.ts +7 -0
  14. package/dist/claude-hook-notify.d.ts.map +1 -0
  15. package/dist/claude-hook-notify.js +154 -0
  16. package/dist/claude-hook-notify.js.map +1 -0
  17. package/dist/claude-remote.d.ts +50 -0
  18. package/dist/claude-remote.d.ts.map +1 -0
  19. package/dist/claude-remote.js +927 -0
  20. package/dist/claude-remote.js.map +1 -0
  21. package/dist/elicitation-notify.d.ts +20 -0
  22. package/dist/elicitation-notify.d.ts.map +1 -0
  23. package/dist/elicitation-notify.js +241 -0
  24. package/dist/elicitation-notify.js.map +1 -0
  25. package/dist/enhanced-hook-notify.d.ts +23 -0
  26. package/dist/enhanced-hook-notify.d.ts.map +1 -0
  27. package/dist/enhanced-hook-notify.js +402 -0
  28. package/dist/enhanced-hook-notify.js.map +1 -0
  29. package/dist/permission-denied-notify.d.ts +11 -0
  30. package/dist/permission-denied-notify.d.ts.map +1 -0
  31. package/dist/permission-denied-notify.js +193 -0
  32. package/dist/permission-denied-notify.js.map +1 -0
  33. package/dist/permission-hook.d.ts +15 -0
  34. package/dist/permission-hook.d.ts.map +1 -0
  35. package/dist/permission-hook.js +386 -0
  36. package/dist/permission-hook.js.map +1 -0
  37. package/dist/pre-compact-notify.d.ts +13 -0
  38. package/dist/pre-compact-notify.d.ts.map +1 -0
  39. package/dist/pre-compact-notify.js +197 -0
  40. package/dist/pre-compact-notify.js.map +1 -0
  41. package/dist/prompt-bridge.d.ts +50 -0
  42. package/dist/prompt-bridge.d.ts.map +1 -0
  43. package/dist/prompt-bridge.js +173 -0
  44. package/dist/prompt-bridge.js.map +1 -0
  45. package/dist/question-notify.d.ts +17 -0
  46. package/dist/question-notify.d.ts.map +1 -0
  47. package/dist/question-notify.js +356 -0
  48. package/dist/question-notify.js.map +1 -0
  49. package/dist/setup.d.ts +10 -0
  50. package/dist/setup.d.ts.map +1 -0
  51. package/dist/setup.js +649 -0
  52. package/dist/setup.js.map +1 -0
  53. package/dist/smart-monitor.d.ts +7 -0
  54. package/dist/smart-monitor.d.ts.map +1 -0
  55. package/dist/smart-monitor.js +256 -0
  56. package/dist/smart-monitor.js.map +1 -0
  57. package/dist/src/automation/clipboard-automation.d.ts +35 -0
  58. package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
  59. package/dist/src/automation/clipboard-automation.js +242 -0
  60. package/dist/src/automation/clipboard-automation.js.map +1 -0
  61. package/dist/src/channels/base/channel.d.ts +60 -0
  62. package/dist/src/channels/base/channel.d.ts.map +1 -0
  63. package/dist/src/channels/base/channel.js +96 -0
  64. package/dist/src/channels/base/channel.js.map +1 -0
  65. package/dist/src/channels/email/smtp.d.ts +74 -0
  66. package/dist/src/channels/email/smtp.d.ts.map +1 -0
  67. package/dist/src/channels/email/smtp.js +605 -0
  68. package/dist/src/channels/email/smtp.js.map +1 -0
  69. package/dist/src/channels/line/line.d.ts +36 -0
  70. package/dist/src/channels/line/line.d.ts.map +1 -0
  71. package/dist/src/channels/line/line.js +180 -0
  72. package/dist/src/channels/line/line.js.map +1 -0
  73. package/dist/src/channels/line/webhook.d.ts +55 -0
  74. package/dist/src/channels/line/webhook.d.ts.map +1 -0
  75. package/dist/src/channels/line/webhook.js +191 -0
  76. package/dist/src/channels/line/webhook.js.map +1 -0
  77. package/dist/src/channels/local/desktop.d.ts +30 -0
  78. package/dist/src/channels/local/desktop.d.ts.map +1 -0
  79. package/dist/src/channels/local/desktop.js +161 -0
  80. package/dist/src/channels/local/desktop.js.map +1 -0
  81. package/dist/src/channels/telegram/telegram.d.ts +43 -0
  82. package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
  83. package/dist/src/channels/telegram/telegram.js +223 -0
  84. package/dist/src/channels/telegram/telegram.js.map +1 -0
  85. package/dist/src/channels/telegram/webhook.d.ts +75 -0
  86. package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
  87. package/dist/src/channels/telegram/webhook.js +278 -0
  88. package/dist/src/channels/telegram/webhook.js.map +1 -0
  89. package/dist/src/cli.d.ts +9 -0
  90. package/dist/src/cli.d.ts.map +1 -0
  91. package/dist/src/cli.js +99 -0
  92. package/dist/src/cli.js.map +1 -0
  93. package/dist/src/commands/hooks.d.ts +10 -0
  94. package/dist/src/commands/hooks.d.ts.map +1 -0
  95. package/dist/src/commands/hooks.js +50 -0
  96. package/dist/src/commands/hooks.js.map +1 -0
  97. package/dist/src/commands/init.d.ts +20 -0
  98. package/dist/src/commands/init.d.ts.map +1 -0
  99. package/dist/src/commands/init.js +173 -0
  100. package/dist/src/commands/init.js.map +1 -0
  101. package/dist/src/commands/license.d.ts +15 -0
  102. package/dist/src/commands/license.d.ts.map +1 -0
  103. package/dist/src/commands/license.js +107 -0
  104. package/dist/src/commands/license.js.map +1 -0
  105. package/dist/src/commands/start.d.ts +17 -0
  106. package/dist/src/commands/start.d.ts.map +1 -0
  107. package/dist/src/commands/start.js +150 -0
  108. package/dist/src/commands/start.js.map +1 -0
  109. package/dist/src/commands/status.d.ts +8 -0
  110. package/dist/src/commands/status.d.ts.map +1 -0
  111. package/dist/src/commands/status.js +95 -0
  112. package/dist/src/commands/status.js.map +1 -0
  113. package/dist/src/commands/stop.d.ts +8 -0
  114. package/dist/src/commands/stop.d.ts.map +1 -0
  115. package/dist/src/commands/stop.js +64 -0
  116. package/dist/src/commands/stop.js.map +1 -0
  117. package/dist/src/config-manager.d.ts +16 -0
  118. package/dist/src/config-manager.d.ts.map +1 -0
  119. package/dist/src/config-manager.js +152 -0
  120. package/dist/src/config-manager.js.map +1 -0
  121. package/dist/src/core/config.d.ts +28 -0
  122. package/dist/src/core/config.d.ts.map +1 -0
  123. package/dist/src/core/config.js +248 -0
  124. package/dist/src/core/config.js.map +1 -0
  125. package/dist/src/core/logger.d.ts +19 -0
  126. package/dist/src/core/logger.d.ts.map +1 -0
  127. package/dist/src/core/logger.js +47 -0
  128. package/dist/src/core/logger.js.map +1 -0
  129. package/dist/src/core/notifier.d.ts +45 -0
  130. package/dist/src/core/notifier.d.ts.map +1 -0
  131. package/dist/src/core/notifier.js +189 -0
  132. package/dist/src/core/notifier.js.map +1 -0
  133. package/dist/src/lib/license-validator.d.ts +120 -0
  134. package/dist/src/lib/license-validator.d.ts.map +1 -0
  135. package/dist/src/lib/license-validator.js +294 -0
  136. package/dist/src/lib/license-validator.js.map +1 -0
  137. package/dist/src/lib/preflight.d.ts +28 -0
  138. package/dist/src/lib/preflight.d.ts.map +1 -0
  139. package/dist/src/lib/preflight.js +90 -0
  140. package/dist/src/lib/preflight.js.map +1 -0
  141. package/dist/src/relay/claude-command-bridge.d.ts +57 -0
  142. package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
  143. package/dist/src/relay/claude-command-bridge.js +188 -0
  144. package/dist/src/relay/claude-command-bridge.js.map +1 -0
  145. package/dist/src/relay/email-listener.d.ts +65 -0
  146. package/dist/src/relay/email-listener.d.ts.map +1 -0
  147. package/dist/src/relay/email-listener.js +460 -0
  148. package/dist/src/relay/email-listener.js.map +1 -0
  149. package/dist/src/relay/relay-pty.d.ts +21 -0
  150. package/dist/src/relay/relay-pty.d.ts.map +1 -0
  151. package/dist/src/relay/relay-pty.js +696 -0
  152. package/dist/src/relay/relay-pty.js.map +1 -0
  153. package/dist/src/relay/smart-injector.d.ts +30 -0
  154. package/dist/src/relay/smart-injector.d.ts.map +1 -0
  155. package/dist/src/relay/smart-injector.js +233 -0
  156. package/dist/src/relay/smart-injector.js.map +1 -0
  157. package/dist/src/relay/tmux-injector.d.ts +46 -0
  158. package/dist/src/relay/tmux-injector.d.ts.map +1 -0
  159. package/dist/src/relay/tmux-injector.js +413 -0
  160. package/dist/src/relay/tmux-injector.js.map +1 -0
  161. package/dist/src/tools/config-manager.d.ts +33 -0
  162. package/dist/src/tools/config-manager.d.ts.map +1 -0
  163. package/dist/src/tools/config-manager.js +448 -0
  164. package/dist/src/tools/config-manager.js.map +1 -0
  165. package/dist/src/tools/installer.d.ts +38 -0
  166. package/dist/src/tools/installer.d.ts.map +1 -0
  167. package/dist/src/tools/installer.js +222 -0
  168. package/dist/src/tools/installer.js.map +1 -0
  169. package/dist/src/types/callbacks.d.ts +53 -0
  170. package/dist/src/types/callbacks.d.ts.map +1 -0
  171. package/dist/src/types/callbacks.js +7 -0
  172. package/dist/src/types/callbacks.js.map +1 -0
  173. package/dist/src/types/config.d.ts +56 -0
  174. package/dist/src/types/config.d.ts.map +1 -0
  175. package/dist/src/types/config.js +6 -0
  176. package/dist/src/types/config.js.map +1 -0
  177. package/dist/src/types/hooks.d.ts +47 -0
  178. package/dist/src/types/hooks.d.ts.map +1 -0
  179. package/dist/src/types/hooks.js +6 -0
  180. package/dist/src/types/hooks.js.map +1 -0
  181. package/dist/src/types/index.d.ts +7 -0
  182. package/dist/src/types/index.d.ts.map +1 -0
  183. package/dist/src/types/index.js +23 -0
  184. package/dist/src/types/index.js.map +1 -0
  185. package/dist/src/types/ipc.d.ts +43 -0
  186. package/dist/src/types/ipc.d.ts.map +1 -0
  187. package/dist/src/types/ipc.js +7 -0
  188. package/dist/src/types/ipc.js.map +1 -0
  189. package/dist/src/types/session.d.ts +87 -0
  190. package/dist/src/types/session.d.ts.map +1 -0
  191. package/dist/src/types/session.js +9 -0
  192. package/dist/src/types/session.js.map +1 -0
  193. package/dist/src/types/telegram.d.ts +58 -0
  194. package/dist/src/types/telegram.d.ts.map +1 -0
  195. package/dist/src/types/telegram.js +6 -0
  196. package/dist/src/types/telegram.js.map +1 -0
  197. package/dist/src/utils/active-check.d.ts +20 -0
  198. package/dist/src/utils/active-check.d.ts.map +1 -0
  199. package/dist/src/utils/active-check.js +42 -0
  200. package/dist/src/utils/active-check.js.map +1 -0
  201. package/dist/src/utils/callback-parser.d.ts +23 -0
  202. package/dist/src/utils/callback-parser.d.ts.map +1 -0
  203. package/dist/src/utils/callback-parser.js +85 -0
  204. package/dist/src/utils/callback-parser.js.map +1 -0
  205. package/dist/src/utils/controller-injector.d.ts +21 -0
  206. package/dist/src/utils/controller-injector.d.ts.map +1 -0
  207. package/dist/src/utils/controller-injector.js +108 -0
  208. package/dist/src/utils/controller-injector.js.map +1 -0
  209. package/dist/src/utils/conversation-tracker.d.ts +32 -0
  210. package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
  211. package/dist/src/utils/conversation-tracker.js +119 -0
  212. package/dist/src/utils/conversation-tracker.js.map +1 -0
  213. package/dist/src/utils/deep-link.d.ts +22 -0
  214. package/dist/src/utils/deep-link.d.ts.map +1 -0
  215. package/dist/src/utils/deep-link.js +43 -0
  216. package/dist/src/utils/deep-link.js.map +1 -0
  217. package/dist/src/utils/ghostty-session-manager.d.ts +81 -0
  218. package/dist/src/utils/ghostty-session-manager.d.ts.map +1 -0
  219. package/dist/src/utils/ghostty-session-manager.js +370 -0
  220. package/dist/src/utils/ghostty-session-manager.js.map +1 -0
  221. package/dist/src/utils/hook-definitions.d.ts +25 -0
  222. package/dist/src/utils/hook-definitions.d.ts.map +1 -0
  223. package/dist/src/utils/hook-definitions.js +36 -0
  224. package/dist/src/utils/hook-definitions.js.map +1 -0
  225. package/dist/src/utils/http-request.d.ts +25 -0
  226. package/dist/src/utils/http-request.d.ts.map +1 -0
  227. package/dist/src/utils/http-request.js +66 -0
  228. package/dist/src/utils/http-request.js.map +1 -0
  229. package/dist/src/utils/optional-require.d.ts +13 -0
  230. package/dist/src/utils/optional-require.d.ts.map +1 -0
  231. package/dist/src/utils/optional-require.js +37 -0
  232. package/dist/src/utils/optional-require.js.map +1 -0
  233. package/dist/src/utils/paths.d.ts +13 -0
  234. package/dist/src/utils/paths.d.ts.map +1 -0
  235. package/dist/src/utils/paths.js +30 -0
  236. package/dist/src/utils/paths.js.map +1 -0
  237. package/dist/src/utils/pty-session-manager.d.ts +43 -0
  238. package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
  239. package/dist/src/utils/pty-session-manager.js +183 -0
  240. package/dist/src/utils/pty-session-manager.js.map +1 -0
  241. package/dist/src/utils/subagent-tracker.d.ts +64 -0
  242. package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
  243. package/dist/src/utils/subagent-tracker.js +191 -0
  244. package/dist/src/utils/subagent-tracker.js.map +1 -0
  245. package/dist/src/utils/tmux-monitor.d.ts +102 -0
  246. package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
  247. package/dist/src/utils/tmux-monitor.js +642 -0
  248. package/dist/src/utils/tmux-monitor.js.map +1 -0
  249. package/dist/src/utils/trace-capture.d.ts +42 -0
  250. package/dist/src/utils/trace-capture.d.ts.map +1 -0
  251. package/dist/src/utils/trace-capture.js +102 -0
  252. package/dist/src/utils/trace-capture.js.map +1 -0
  253. package/dist/src/utils/transcript-reader.d.ts +57 -0
  254. package/dist/src/utils/transcript-reader.d.ts.map +1 -0
  255. package/dist/src/utils/transcript-reader.js +229 -0
  256. package/dist/src/utils/transcript-reader.js.map +1 -0
  257. package/dist/start-all-webhooks.d.ts +7 -0
  258. package/dist/start-all-webhooks.d.ts.map +1 -0
  259. package/dist/start-all-webhooks.js +98 -0
  260. package/dist/start-all-webhooks.js.map +1 -0
  261. package/dist/start-line-webhook.d.ts +7 -0
  262. package/dist/start-line-webhook.d.ts.map +1 -0
  263. package/dist/start-line-webhook.js +59 -0
  264. package/dist/start-line-webhook.js.map +1 -0
  265. package/dist/start-relay-pty.d.ts +7 -0
  266. package/dist/start-relay-pty.d.ts.map +1 -0
  267. package/dist/start-relay-pty.js +173 -0
  268. package/dist/start-relay-pty.js.map +1 -0
  269. package/dist/start-telegram-webhook.d.ts +7 -0
  270. package/dist/start-telegram-webhook.d.ts.map +1 -0
  271. package/dist/start-telegram-webhook.js +80 -0
  272. package/dist/start-telegram-webhook.js.map +1 -0
  273. package/dist/user-prompt-hook.d.ts +13 -0
  274. package/dist/user-prompt-hook.d.ts.map +1 -0
  275. package/dist/user-prompt-hook.js +45 -0
  276. package/dist/user-prompt-hook.js.map +1 -0
  277. package/dist/workspace-router.d.ts +114 -0
  278. package/dist/workspace-router.d.ts.map +1 -0
  279. package/dist/workspace-router.js +572 -0
  280. package/dist/workspace-router.js.map +1 -0
  281. package/dist/workspace-telegram-bot.d.ts +3 -0
  282. package/dist/workspace-telegram-bot.d.ts.map +1 -0
  283. package/dist/workspace-telegram-bot.js +1847 -0
  284. package/dist/workspace-telegram-bot.js.map +1 -0
  285. package/package.json +85 -0
  286. package/src/types/callbacks.ts +73 -0
  287. package/src/types/config.ts +63 -0
  288. package/src/types/hooks.ts +50 -0
  289. package/src/types/index.ts +6 -0
  290. package/src/types/ipc.ts +55 -0
  291. package/src/types/session.ts +91 -0
  292. package/src/types/telegram.ts +66 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Trace Capture Utility
3
+ * Tracks user input timestamps for smart execution trace capture
4
+ */
5
+ interface InputEntry {
6
+ timestamp: number;
7
+ date: string;
8
+ }
9
+ interface SessionTimestamps {
10
+ inputs: InputEntry[];
11
+ }
12
+ interface TimestampsMap {
13
+ [sessionName: string]: SessionTimestamps;
14
+ }
15
+ declare class TraceCapture {
16
+ dataDir: string;
17
+ timestampFile: string;
18
+ constructor();
19
+ _ensureDataDir(): void;
20
+ /**
21
+ * Load timestamp data
22
+ */
23
+ _loadTimestamps(): TimestampsMap;
24
+ /**
25
+ * Save timestamp data
26
+ */
27
+ _saveTimestamps(data: TimestampsMap): void;
28
+ /**
29
+ * Record user input timestamp for a session
30
+ */
31
+ recordUserInput(sessionName: string, timestamp?: number): void;
32
+ /**
33
+ * Get the most recent user input timestamp for a session
34
+ */
35
+ getLastUserInputTime(sessionName: string): number | null;
36
+ /**
37
+ * Clean up old session data (older than 7 days)
38
+ */
39
+ cleanup(): void;
40
+ }
41
+ export = TraceCapture;
42
+ //# sourceMappingURL=trace-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-capture.d.ts","sourceRoot":"","sources":["../../../src/utils/trace-capture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,UAAU,UAAU;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACvB,MAAM,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,UAAU,aAAa;IACnB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAAC;CAC5C;AAED,cAAM,YAAY;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;;IAQtB,cAAc,IAAI,IAAI;IAMtB;;OAEG;IACH,eAAe,IAAI,aAAa;IAYhC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAQ1C;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAAmB,GAAG,IAAI;IAsB1E;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWxD;;OAEG;IACH,OAAO,IAAI,IAAI;CAmBlB;AAED,SAAS,YAAY,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * Trace Capture Utility
4
+ * Tracks user input timestamps for smart execution trace capture
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 paths_1 = require("./paths");
12
+ class TraceCapture {
13
+ dataDir;
14
+ timestampFile;
15
+ constructor() {
16
+ this.dataDir = path_1.default.join(paths_1.PROJECT_ROOT, 'src/data');
17
+ this.timestampFile = path_1.default.join(this.dataDir, 'user-input-timestamps.json');
18
+ this._ensureDataDir();
19
+ }
20
+ _ensureDataDir() {
21
+ if (!fs_1.default.existsSync(this.dataDir)) {
22
+ fs_1.default.mkdirSync(this.dataDir, { recursive: true });
23
+ }
24
+ }
25
+ /**
26
+ * Load timestamp data
27
+ */
28
+ _loadTimestamps() {
29
+ try {
30
+ if (fs_1.default.existsSync(this.timestampFile)) {
31
+ const data = fs_1.default.readFileSync(this.timestampFile, 'utf8');
32
+ return JSON.parse(data);
33
+ }
34
+ }
35
+ catch (error) {
36
+ console.error('Failed to load timestamps:', error.message);
37
+ }
38
+ return {};
39
+ }
40
+ /**
41
+ * Save timestamp data
42
+ */
43
+ _saveTimestamps(data) {
44
+ try {
45
+ fs_1.default.writeFileSync(this.timestampFile, JSON.stringify(data, null, 2));
46
+ }
47
+ catch (error) {
48
+ console.error('Failed to save timestamps:', error.message);
49
+ }
50
+ }
51
+ /**
52
+ * Record user input timestamp for a session
53
+ */
54
+ recordUserInput(sessionName, timestamp = Date.now()) {
55
+ const timestamps = this._loadTimestamps();
56
+ if (!timestamps[sessionName]) {
57
+ timestamps[sessionName] = {
58
+ inputs: []
59
+ };
60
+ }
61
+ timestamps[sessionName].inputs.push({
62
+ timestamp: timestamp,
63
+ date: new Date(timestamp).toISOString()
64
+ });
65
+ // Keep only last 10 inputs per session to avoid growing too large
66
+ if (timestamps[sessionName].inputs.length > 10) {
67
+ timestamps[sessionName].inputs = timestamps[sessionName].inputs.slice(-10);
68
+ }
69
+ this._saveTimestamps(timestamps);
70
+ }
71
+ /**
72
+ * Get the most recent user input timestamp for a session
73
+ */
74
+ getLastUserInputTime(sessionName) {
75
+ const timestamps = this._loadTimestamps();
76
+ if (timestamps[sessionName] && timestamps[sessionName].inputs.length > 0) {
77
+ const lastInput = timestamps[sessionName].inputs[timestamps[sessionName].inputs.length - 1];
78
+ return lastInput.timestamp;
79
+ }
80
+ return null;
81
+ }
82
+ /**
83
+ * Clean up old session data (older than 7 days)
84
+ */
85
+ cleanup() {
86
+ const timestamps = this._loadTimestamps();
87
+ const now = Date.now();
88
+ const sevenDaysAgo = now - (7 * 24 * 60 * 60 * 1000);
89
+ for (const sessionName in timestamps) {
90
+ const session = timestamps[sessionName];
91
+ // Remove old inputs
92
+ session.inputs = session.inputs.filter(input => input.timestamp > sevenDaysAgo);
93
+ // Remove session if no inputs remain
94
+ if (session.inputs.length === 0) {
95
+ delete timestamps[sessionName];
96
+ }
97
+ }
98
+ this._saveTimestamps(timestamps);
99
+ }
100
+ }
101
+ module.exports = TraceCapture;
102
+ //# sourceMappingURL=trace-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-capture.js","sourceRoot":"","sources":["../../../src/utils/trace-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Transcript Reader — reads Claude Code session JSONL transcripts to surface
3
+ * developer-useful status info (model, context %, last assistant message, etc.)
4
+ *
5
+ * Path: ~/.claude/projects/<encoded-cwd>/<sessionId>.jsonl
6
+ * Encoding: cwd with `/` replaced by `-` (so `/Users/foo/bar` → `-Users-foo-bar`)
7
+ */
8
+ /** Status fields parsed from a session transcript. */
9
+ export interface TranscriptStatus {
10
+ model?: string;
11
+ version?: string;
12
+ gitBranch?: string;
13
+ slug?: string;
14
+ cwd?: string;
15
+ sessionId?: string;
16
+ /** Total prompt+output tokens from the most recent assistant turn. */
17
+ contextTokens?: number;
18
+ /** Inferred from model name; null if unknown. */
19
+ contextLimit?: number | null;
20
+ /** 0-100, omitted when contextLimit is null. */
21
+ contextPct?: number;
22
+ /** Plain-text snippet of the last assistant message, truncated. */
23
+ lastAssistantMessage?: string;
24
+ /** ISO timestamp of the last assistant message. */
25
+ lastAssistantTimestamp?: string;
26
+ }
27
+ /** Encode a cwd into Claude Code's project directory name. */
28
+ export declare function encodeCwd(cwd: string): string;
29
+ /** Build the full path to a session's JSONL transcript. */
30
+ export declare function getTranscriptPath(cwd: string, sessionId: string): string;
31
+ /**
32
+ * Find the most recently modified transcript for a cwd when sessionId is unknown.
33
+ * Returns null if no transcripts exist for that cwd.
34
+ */
35
+ export declare function findLatestTranscript(cwd: string): {
36
+ sessionId: string;
37
+ path: string;
38
+ mtimeMs: number;
39
+ } | null;
40
+ /**
41
+ * Inferred context window size for known model name patterns.
42
+ * Returns null when we don't know the limit (caller should omit % display).
43
+ *
44
+ * Note: the [1m] suffix that enables 1M context is an API parameter — the model
45
+ * field in transcripts does NOT include it. So we conservatively assume 200K
46
+ * for Opus 4.6 unless we find a way to detect 1m mode.
47
+ */
48
+ export declare function inferContextLimit(model: string | undefined): number | null;
49
+ /**
50
+ * Read the latest status info from a session's transcript.
51
+ * Returns null when the transcript file doesn't exist or is unreadable.
52
+ *
53
+ * `maxAssistantChars` truncates the last-message snippet to keep Telegram
54
+ * messages under their 4096-char limit.
55
+ */
56
+ export declare function readTranscriptStatus(cwd: string, sessionId: string | undefined, maxAssistantChars?: number): TranscriptStatus | null;
57
+ //# sourceMappingURL=transcript-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-reader.d.ts","sourceRoot":"","sources":["../../../src/utils/transcript-reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mDAAmD;IACnD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgB7G;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO1E;AA6DD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,iBAAiB,GAAE,MAAY,GAC9B,gBAAgB,GAAG,IAAI,CAsFzB"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ /**
3
+ * Transcript Reader — reads Claude Code session JSONL transcripts to surface
4
+ * developer-useful status info (model, context %, last assistant message, etc.)
5
+ *
6
+ * Path: ~/.claude/projects/<encoded-cwd>/<sessionId>.jsonl
7
+ * Encoding: cwd with `/` replaced by `-` (so `/Users/foo/bar` → `-Users-foo-bar`)
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.encodeCwd = encodeCwd;
14
+ exports.getTranscriptPath = getTranscriptPath;
15
+ exports.findLatestTranscript = findLatestTranscript;
16
+ exports.inferContextLimit = inferContextLimit;
17
+ exports.readTranscriptStatus = readTranscriptStatus;
18
+ const fs_1 = __importDefault(require("fs"));
19
+ const os_1 = __importDefault(require("os"));
20
+ const path_1 = __importDefault(require("path"));
21
+ /** Encode a cwd into Claude Code's project directory name. */
22
+ function encodeCwd(cwd) {
23
+ return cwd.replace(/\//g, '-');
24
+ }
25
+ /** Build the full path to a session's JSONL transcript. */
26
+ function getTranscriptPath(cwd, sessionId) {
27
+ const encoded = encodeCwd(cwd);
28
+ return path_1.default.join(os_1.default.homedir(), '.claude', 'projects', encoded, `${sessionId}.jsonl`);
29
+ }
30
+ /**
31
+ * Find the most recently modified transcript for a cwd when sessionId is unknown.
32
+ * Returns null if no transcripts exist for that cwd.
33
+ */
34
+ function findLatestTranscript(cwd) {
35
+ const dir = path_1.default.join(os_1.default.homedir(), '.claude', 'projects', encodeCwd(cwd));
36
+ if (!fs_1.default.existsSync(dir))
37
+ return null;
38
+ let latest = null;
39
+ for (const entry of fs_1.default.readdirSync(dir)) {
40
+ if (!entry.endsWith('.jsonl'))
41
+ continue;
42
+ const full = path_1.default.join(dir, entry);
43
+ try {
44
+ const mtimeMs = fs_1.default.statSync(full).mtimeMs;
45
+ if (!latest || mtimeMs > latest.mtimeMs) {
46
+ latest = { sessionId: entry.replace(/\.jsonl$/, ''), path: full, mtimeMs };
47
+ }
48
+ }
49
+ catch { }
50
+ }
51
+ return latest;
52
+ }
53
+ /**
54
+ * Inferred context window size for known model name patterns.
55
+ * Returns null when we don't know the limit (caller should omit % display).
56
+ *
57
+ * Note: the [1m] suffix that enables 1M context is an API parameter — the model
58
+ * field in transcripts does NOT include it. So we conservatively assume 200K
59
+ * for Opus 4.6 unless we find a way to detect 1m mode.
60
+ */
61
+ function inferContextLimit(model) {
62
+ if (!model)
63
+ return null;
64
+ const m = model.toLowerCase();
65
+ if (m.includes('opus-4-6') || m.includes('sonnet-4-6') || m.includes('haiku-4-5'))
66
+ return 200000;
67
+ if (m.includes('opus-4-5') || m.includes('sonnet-4-5') || m.includes('haiku-4-1'))
68
+ return 200000;
69
+ if (m.includes('opus') || m.includes('sonnet') || m.includes('haiku'))
70
+ return 200000;
71
+ return null;
72
+ }
73
+ /**
74
+ * Sum the tokens that count toward the context window from a `usage` object.
75
+ * Cache reads count — they are still in-context. Output tokens count too,
76
+ * because they become part of the next turn's prompt.
77
+ */
78
+ function sumContextTokens(usage) {
79
+ const input = usage.input_tokens || 0;
80
+ const cacheRead = usage.cache_read_input_tokens || 0;
81
+ const cacheCreate = usage.cache_creation_input_tokens || 0;
82
+ const output = usage.output_tokens || 0;
83
+ return input + cacheRead + cacheCreate + output;
84
+ }
85
+ /**
86
+ * Read the tail of a JSONL file efficiently, returning up to `maxLines`
87
+ * trailing lines as parsed JSON objects. Lines that fail to parse are skipped.
88
+ */
89
+ function readTailLines(filePath, maxLines) {
90
+ const stat = fs_1.default.statSync(filePath);
91
+ // Read up to ~256KB from the end — enough for ~hundreds of small entries.
92
+ const readBytes = Math.min(stat.size, 262144);
93
+ const fd = fs_1.default.openSync(filePath, 'r');
94
+ try {
95
+ const buf = Buffer.alloc(readBytes);
96
+ fs_1.default.readSync(fd, buf, 0, readBytes, stat.size - readBytes);
97
+ const text = buf.toString('utf8');
98
+ // Drop any partial first line if we didn't read from byte 0.
99
+ const lines = text.split('\n');
100
+ if (stat.size > readBytes)
101
+ lines.shift();
102
+ const tail = lines.slice(-maxLines).filter(l => l.trim().length > 0);
103
+ const out = [];
104
+ for (const line of tail) {
105
+ try {
106
+ out.push(JSON.parse(line));
107
+ }
108
+ catch { }
109
+ }
110
+ return out;
111
+ }
112
+ finally {
113
+ fs_1.default.closeSync(fd);
114
+ }
115
+ }
116
+ /**
117
+ * Extract plain text from a Claude API `content` array, ignoring tool_use blocks.
118
+ */
119
+ function extractAssistantText(message) {
120
+ const content = message.content;
121
+ if (typeof content === 'string')
122
+ return content;
123
+ if (!Array.isArray(content))
124
+ return '';
125
+ const parts = [];
126
+ for (const block of content) {
127
+ if (block && typeof block === 'object' && block.type === 'text') {
128
+ const text = block.text;
129
+ if (typeof text === 'string')
130
+ parts.push(text);
131
+ }
132
+ }
133
+ return parts.join('\n').trim();
134
+ }
135
+ /**
136
+ * Read the latest status info from a session's transcript.
137
+ * Returns null when the transcript file doesn't exist or is unreadable.
138
+ *
139
+ * `maxAssistantChars` truncates the last-message snippet to keep Telegram
140
+ * messages under their 4096-char limit.
141
+ */
142
+ function readTranscriptStatus(cwd, sessionId, maxAssistantChars = 600) {
143
+ let filePath;
144
+ let resolvedSessionId;
145
+ if (sessionId) {
146
+ filePath = getTranscriptPath(cwd, sessionId);
147
+ resolvedSessionId = sessionId;
148
+ if (!fs_1.default.existsSync(filePath)) {
149
+ // Fall through to the latest-transcript fallback when the named session
150
+ // is gone (e.g. user resumed and the bot has stale state).
151
+ const latest = findLatestTranscript(cwd);
152
+ if (!latest)
153
+ return null;
154
+ filePath = latest.path;
155
+ resolvedSessionId = latest.sessionId;
156
+ }
157
+ }
158
+ else {
159
+ const latest = findLatestTranscript(cwd);
160
+ if (!latest)
161
+ return null;
162
+ filePath = latest.path;
163
+ resolvedSessionId = latest.sessionId;
164
+ }
165
+ let entries;
166
+ try {
167
+ entries = readTailLines(filePath, 100);
168
+ }
169
+ catch {
170
+ return null;
171
+ }
172
+ if (entries.length === 0)
173
+ return null;
174
+ const status = { sessionId: resolvedSessionId };
175
+ // Walk backward to find the most recent assistant entry — that's where model
176
+ // / usage / metadata live. Static metadata (cwd, version, gitBranch, slug)
177
+ // is on every entry, so the last one is fine.
178
+ const last = entries[entries.length - 1];
179
+ if (typeof last.cwd === 'string')
180
+ status.cwd = last.cwd;
181
+ if (typeof last.version === 'string')
182
+ status.version = last.version;
183
+ if (typeof last.gitBranch === 'string')
184
+ status.gitBranch = last.gitBranch;
185
+ if (typeof last.slug === 'string')
186
+ status.slug = last.slug;
187
+ for (let i = entries.length - 1; i >= 0; i--) {
188
+ const entry = entries[i];
189
+ if (entry.type !== 'assistant')
190
+ continue;
191
+ const message = entry.message || {};
192
+ if (!status.model && typeof message.model === 'string') {
193
+ status.model = message.model;
194
+ }
195
+ if (status.contextTokens === undefined) {
196
+ const usage = message.usage;
197
+ if (usage) {
198
+ status.contextTokens = sumContextTokens(usage);
199
+ // 1h ephemeral cache is only available in extended-context (1M) mode,
200
+ // so its presence is a reliable signal that the limit is 1M.
201
+ const cacheCreation = usage.cache_creation;
202
+ const has1hCache = cacheCreation && cacheCreation.ephemeral_1h_input_tokens > 0;
203
+ status.contextLimit = has1hCache ? 1000000 : inferContextLimit(status.model);
204
+ if (status.contextLimit && status.contextLimit > 0) {
205
+ // Don't cap — if tokens exceed the assumed limit, the user is on a
206
+ // larger-context mode we couldn't detect; showing >100% is more honest
207
+ // than silently flooring the value.
208
+ status.contextPct = Math.round((status.contextTokens / status.contextLimit) * 100);
209
+ }
210
+ }
211
+ }
212
+ if (status.lastAssistantMessage === undefined) {
213
+ const text = extractAssistantText(message);
214
+ if (text.length > 0) {
215
+ status.lastAssistantMessage = text.length > maxAssistantChars
216
+ ? text.slice(0, maxAssistantChars).trimEnd() + '…'
217
+ : text;
218
+ if (typeof entry.timestamp === 'string') {
219
+ status.lastAssistantTimestamp = entry.timestamp;
220
+ }
221
+ }
222
+ }
223
+ if (status.model && status.contextTokens !== undefined && status.lastAssistantMessage !== undefined) {
224
+ break;
225
+ }
226
+ }
227
+ return status;
228
+ }
229
+ //# sourceMappingURL=transcript-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-reader.js","sourceRoot":"","sources":["../../../src/utils/transcript-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Multi-Platform Webhook Server
4
+ * Starts all enabled webhook servers (Telegram, LINE) in parallel
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-all-webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-all-webhooks.d.ts","sourceRoot":"","sources":["../start-all-webhooks.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Multi-Platform Webhook Server
5
+ * Starts all enabled webhook servers (Telegram, LINE) in parallel
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const child_process_1 = require("child_process");
12
+ const path_1 = __importDefault(require("path"));
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const dotenv_1 = __importDefault(require("dotenv"));
15
+ const paths_1 = require("./src/utils/paths");
16
+ // Load environment variables
17
+ const envPath = path_1.default.join(paths_1.PROJECT_ROOT, '.env');
18
+ if (fs_1.default.existsSync(envPath)) {
19
+ dotenv_1.default.config({ path: envPath });
20
+ }
21
+ console.log('\u{1F680} Starting Claude Code Remote Multi-Platform Webhook Server...\n');
22
+ const processes = [];
23
+ // Start Telegram webhook if enabled
24
+ if (process.env.TELEGRAM_ENABLED === 'true' && process.env.TELEGRAM_BOT_TOKEN) {
25
+ console.log('\u{1F4F1} Starting Telegram webhook server...');
26
+ const telegramProcess = (0, child_process_1.spawn)('node', [path_1.default.join(__dirname, 'start-telegram-webhook.js')], {
27
+ stdio: ['inherit', 'inherit', 'inherit'],
28
+ env: process.env
29
+ });
30
+ telegramProcess.on('exit', (code) => {
31
+ console.log(`\u{1F4F1} Telegram webhook server exited with code ${code}`);
32
+ });
33
+ processes.push({ name: 'Telegram', process: telegramProcess });
34
+ }
35
+ // Start LINE webhook if enabled
36
+ if (process.env.LINE_ENABLED === 'true' && process.env.LINE_CHANNEL_ACCESS_TOKEN) {
37
+ console.log('\u{1F4F1} Starting LINE webhook server...');
38
+ const lineProcess = (0, child_process_1.spawn)('node', [path_1.default.join(__dirname, 'start-line-webhook.js')], {
39
+ stdio: ['inherit', 'inherit', 'inherit'],
40
+ env: process.env
41
+ });
42
+ lineProcess.on('exit', (code) => {
43
+ console.log(`\u{1F4F1} LINE webhook server exited with code ${code}`);
44
+ });
45
+ processes.push({ name: 'LINE', process: lineProcess });
46
+ }
47
+ // Start Email daemon if enabled
48
+ if (process.env.EMAIL_ENABLED === 'true' && process.env.SMTP_USER) {
49
+ console.log('\u{1F4E7} Starting email daemon...');
50
+ const emailProcess = (0, child_process_1.spawn)('node', [path_1.default.join(__dirname, 'claude-remote.js'), 'daemon', 'start'], {
51
+ stdio: ['inherit', 'inherit', 'inherit'],
52
+ env: process.env
53
+ });
54
+ emailProcess.on('exit', (code) => {
55
+ console.log(`\u{1F4E7} Email daemon exited with code ${code}`);
56
+ });
57
+ processes.push({ name: 'Email', process: emailProcess });
58
+ }
59
+ if (processes.length === 0) {
60
+ console.log('\u274C No platforms enabled. Please configure at least one platform in .env file:');
61
+ console.log(' - Set TELEGRAM_ENABLED=true and configure TELEGRAM_BOT_TOKEN');
62
+ console.log(' - Set LINE_ENABLED=true and configure LINE_CHANNEL_ACCESS_TOKEN');
63
+ console.log(' - Set EMAIL_ENABLED=true and configure SMTP_USER');
64
+ console.log('\n Tip: run `npm run setup` for an interactive configuration wizard.');
65
+ process.exit(1);
66
+ }
67
+ console.log(`\n\u2705 Started ${processes.length} webhook server(s):`);
68
+ processes.forEach(p => {
69
+ console.log(` - ${p.name}`);
70
+ });
71
+ console.log('\n\u{1F4CB} Platform Command Formats:');
72
+ if (process.env.TELEGRAM_ENABLED === 'true') {
73
+ console.log(' Telegram: /cmd TOKEN123 <command>');
74
+ }
75
+ if (process.env.LINE_ENABLED === 'true') {
76
+ console.log(' LINE: Token TOKEN123 <command>');
77
+ }
78
+ if (process.env.EMAIL_ENABLED === 'true') {
79
+ console.log(' Email: Reply to notification emails');
80
+ }
81
+ console.log('\n\u{1F527} To stop all services, press Ctrl+C\n');
82
+ // Handle graceful shutdown
83
+ function shutdown() {
84
+ console.log('\n\u{1F6D1} Shutting down all webhook servers...');
85
+ processes.forEach(p => {
86
+ console.log(` Stopping ${p.name}...`);
87
+ p.process.kill('SIGTERM');
88
+ });
89
+ setTimeout(() => {
90
+ console.log('\u2705 All services stopped');
91
+ process.exit(0);
92
+ }, 2000);
93
+ }
94
+ process.on('SIGINT', shutdown);
95
+ process.on('SIGTERM', shutdown);
96
+ // Keep the main process alive
97
+ process.stdin.resume();
98
+ //# sourceMappingURL=start-all-webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-all-webhooks.js","sourceRoot":"","sources":["../start-all-webhooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * LINE Webhook Server
4
+ * Starts the LINE webhook server for receiving messages
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=start-line-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-line-webhook.d.ts","sourceRoot":"","sources":["../start-line-webhook.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * LINE Webhook Server
5
+ * Starts the LINE webhook server for receiving messages
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const dotenv_1 = __importDefault(require("dotenv"));
14
+ const paths_1 = require("./src/utils/paths");
15
+ const logger_1 = __importDefault(require("./src/core/logger"));
16
+ const LINEWebhookHandler = require('./src/channels/line/webhook');
17
+ // Load environment variables
18
+ const envPath = path_1.default.join(paths_1.PROJECT_ROOT, '.env');
19
+ if (fs_1.default.existsSync(envPath)) {
20
+ dotenv_1.default.config({ path: envPath });
21
+ }
22
+ const logger = new logger_1.default('LINE-Webhook-Server');
23
+ // Load configuration
24
+ const config = {
25
+ channelAccessToken: process.env.LINE_CHANNEL_ACCESS_TOKEN,
26
+ channelSecret: process.env.LINE_CHANNEL_SECRET,
27
+ userId: process.env.LINE_USER_ID,
28
+ groupId: process.env.LINE_GROUP_ID,
29
+ whitelist: process.env.LINE_WHITELIST ? process.env.LINE_WHITELIST.split(',').map(id => id.trim()) : [],
30
+ port: process.env.LINE_WEBHOOK_PORT || 3000
31
+ };
32
+ // Validate configuration
33
+ if (!config.channelAccessToken || !config.channelSecret) {
34
+ logger.error('LINE_CHANNEL_ACCESS_TOKEN and LINE_CHANNEL_SECRET must be set in .env file');
35
+ process.exit(1);
36
+ }
37
+ if (!config.userId && !config.groupId) {
38
+ logger.error('Either LINE_USER_ID or LINE_GROUP_ID must be set in .env file');
39
+ process.exit(1);
40
+ }
41
+ // Create and start webhook handler
42
+ const webhookHandler = new LINEWebhookHandler(config);
43
+ logger.info('Starting LINE webhook server...');
44
+ logger.info(`Configuration:`);
45
+ logger.info(`- Port: ${config.port}`);
46
+ logger.info(`- User ID: ${config.userId || 'Not set'}`);
47
+ logger.info(`- Group ID: ${config.groupId || 'Not set'}`);
48
+ logger.info(`- Whitelist: ${config.whitelist.length > 0 ? config.whitelist.join(', ') : 'None (using configured IDs)'}`);
49
+ webhookHandler.start(config.port);
50
+ // Handle graceful shutdown
51
+ process.on('SIGINT', () => {
52
+ logger.info('Shutting down LINE webhook server...');
53
+ process.exit(0);
54
+ });
55
+ process.on('SIGTERM', () => {
56
+ logger.info('Shutting down LINE webhook server...');
57
+ process.exit(0);
58
+ });
59
+ //# sourceMappingURL=start-line-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-line-webhook.js","sourceRoot":"","sources":["../start-line-webhook.ts"],"names":[],"mappings":"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"}