@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.
- package/.env.example +22 -0
- package/CHANGELOG.md +268 -0
- package/LICENSE +21 -0
- package/README.md +394 -0
- package/ccgram.service +24 -0
- package/config/channels.json +58 -0
- package/config/default.json +27 -0
- package/config/defaults/config.json +16 -0
- package/config/defaults/i18n.json +32 -0
- package/config/email-template.json +31 -0
- package/config/test-with-subagent.json +16 -0
- package/config/user.json +27 -0
- package/dist/claude-hook-notify.d.ts +7 -0
- package/dist/claude-hook-notify.d.ts.map +1 -0
- package/dist/claude-hook-notify.js +154 -0
- package/dist/claude-hook-notify.js.map +1 -0
- package/dist/claude-remote.d.ts +50 -0
- package/dist/claude-remote.d.ts.map +1 -0
- package/dist/claude-remote.js +927 -0
- package/dist/claude-remote.js.map +1 -0
- package/dist/elicitation-notify.d.ts +20 -0
- package/dist/elicitation-notify.d.ts.map +1 -0
- package/dist/elicitation-notify.js +241 -0
- package/dist/elicitation-notify.js.map +1 -0
- package/dist/enhanced-hook-notify.d.ts +23 -0
- package/dist/enhanced-hook-notify.d.ts.map +1 -0
- package/dist/enhanced-hook-notify.js +402 -0
- package/dist/enhanced-hook-notify.js.map +1 -0
- package/dist/permission-denied-notify.d.ts +11 -0
- package/dist/permission-denied-notify.d.ts.map +1 -0
- package/dist/permission-denied-notify.js +193 -0
- package/dist/permission-denied-notify.js.map +1 -0
- package/dist/permission-hook.d.ts +15 -0
- package/dist/permission-hook.d.ts.map +1 -0
- package/dist/permission-hook.js +386 -0
- package/dist/permission-hook.js.map +1 -0
- package/dist/pre-compact-notify.d.ts +13 -0
- package/dist/pre-compact-notify.d.ts.map +1 -0
- package/dist/pre-compact-notify.js +197 -0
- package/dist/pre-compact-notify.js.map +1 -0
- package/dist/prompt-bridge.d.ts +50 -0
- package/dist/prompt-bridge.d.ts.map +1 -0
- package/dist/prompt-bridge.js +173 -0
- package/dist/prompt-bridge.js.map +1 -0
- package/dist/question-notify.d.ts +17 -0
- package/dist/question-notify.d.ts.map +1 -0
- package/dist/question-notify.js +356 -0
- package/dist/question-notify.js.map +1 -0
- package/dist/setup.d.ts +10 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +649 -0
- package/dist/setup.js.map +1 -0
- package/dist/smart-monitor.d.ts +7 -0
- package/dist/smart-monitor.d.ts.map +1 -0
- package/dist/smart-monitor.js +256 -0
- package/dist/smart-monitor.js.map +1 -0
- package/dist/src/automation/clipboard-automation.d.ts +35 -0
- package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
- package/dist/src/automation/clipboard-automation.js +242 -0
- package/dist/src/automation/clipboard-automation.js.map +1 -0
- package/dist/src/channels/base/channel.d.ts +60 -0
- package/dist/src/channels/base/channel.d.ts.map +1 -0
- package/dist/src/channels/base/channel.js +96 -0
- package/dist/src/channels/base/channel.js.map +1 -0
- package/dist/src/channels/email/smtp.d.ts +74 -0
- package/dist/src/channels/email/smtp.d.ts.map +1 -0
- package/dist/src/channels/email/smtp.js +605 -0
- package/dist/src/channels/email/smtp.js.map +1 -0
- package/dist/src/channels/line/line.d.ts +36 -0
- package/dist/src/channels/line/line.d.ts.map +1 -0
- package/dist/src/channels/line/line.js +180 -0
- package/dist/src/channels/line/line.js.map +1 -0
- package/dist/src/channels/line/webhook.d.ts +55 -0
- package/dist/src/channels/line/webhook.d.ts.map +1 -0
- package/dist/src/channels/line/webhook.js +191 -0
- package/dist/src/channels/line/webhook.js.map +1 -0
- package/dist/src/channels/local/desktop.d.ts +30 -0
- package/dist/src/channels/local/desktop.d.ts.map +1 -0
- package/dist/src/channels/local/desktop.js +161 -0
- package/dist/src/channels/local/desktop.js.map +1 -0
- package/dist/src/channels/telegram/telegram.d.ts +43 -0
- package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
- package/dist/src/channels/telegram/telegram.js +223 -0
- package/dist/src/channels/telegram/telegram.js.map +1 -0
- package/dist/src/channels/telegram/webhook.d.ts +75 -0
- package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
- package/dist/src/channels/telegram/webhook.js +278 -0
- package/dist/src/channels/telegram/webhook.js.map +1 -0
- package/dist/src/cli.d.ts +9 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +99 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/hooks.d.ts +10 -0
- package/dist/src/commands/hooks.d.ts.map +1 -0
- package/dist/src/commands/hooks.js +50 -0
- package/dist/src/commands/hooks.js.map +1 -0
- package/dist/src/commands/init.d.ts +20 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +173 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/license.d.ts +15 -0
- package/dist/src/commands/license.d.ts.map +1 -0
- package/dist/src/commands/license.js +107 -0
- package/dist/src/commands/license.js.map +1 -0
- package/dist/src/commands/start.d.ts +17 -0
- package/dist/src/commands/start.d.ts.map +1 -0
- package/dist/src/commands/start.js +150 -0
- package/dist/src/commands/start.js.map +1 -0
- package/dist/src/commands/status.d.ts +8 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +95 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/stop.d.ts +8 -0
- package/dist/src/commands/stop.d.ts.map +1 -0
- package/dist/src/commands/stop.js +64 -0
- package/dist/src/commands/stop.js.map +1 -0
- package/dist/src/config-manager.d.ts +16 -0
- package/dist/src/config-manager.d.ts.map +1 -0
- package/dist/src/config-manager.js +152 -0
- package/dist/src/config-manager.js.map +1 -0
- package/dist/src/core/config.d.ts +28 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +248 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/logger.d.ts +19 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +47 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/notifier.d.ts +45 -0
- package/dist/src/core/notifier.d.ts.map +1 -0
- package/dist/src/core/notifier.js +189 -0
- package/dist/src/core/notifier.js.map +1 -0
- package/dist/src/lib/license-validator.d.ts +120 -0
- package/dist/src/lib/license-validator.d.ts.map +1 -0
- package/dist/src/lib/license-validator.js +294 -0
- package/dist/src/lib/license-validator.js.map +1 -0
- package/dist/src/lib/preflight.d.ts +28 -0
- package/dist/src/lib/preflight.d.ts.map +1 -0
- package/dist/src/lib/preflight.js +90 -0
- package/dist/src/lib/preflight.js.map +1 -0
- package/dist/src/relay/claude-command-bridge.d.ts +57 -0
- package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
- package/dist/src/relay/claude-command-bridge.js +188 -0
- package/dist/src/relay/claude-command-bridge.js.map +1 -0
- package/dist/src/relay/email-listener.d.ts +65 -0
- package/dist/src/relay/email-listener.d.ts.map +1 -0
- package/dist/src/relay/email-listener.js +460 -0
- package/dist/src/relay/email-listener.js.map +1 -0
- package/dist/src/relay/relay-pty.d.ts +21 -0
- package/dist/src/relay/relay-pty.d.ts.map +1 -0
- package/dist/src/relay/relay-pty.js +696 -0
- package/dist/src/relay/relay-pty.js.map +1 -0
- package/dist/src/relay/smart-injector.d.ts +30 -0
- package/dist/src/relay/smart-injector.d.ts.map +1 -0
- package/dist/src/relay/smart-injector.js +233 -0
- package/dist/src/relay/smart-injector.js.map +1 -0
- package/dist/src/relay/tmux-injector.d.ts +46 -0
- package/dist/src/relay/tmux-injector.d.ts.map +1 -0
- package/dist/src/relay/tmux-injector.js +413 -0
- package/dist/src/relay/tmux-injector.js.map +1 -0
- package/dist/src/tools/config-manager.d.ts +33 -0
- package/dist/src/tools/config-manager.d.ts.map +1 -0
- package/dist/src/tools/config-manager.js +448 -0
- package/dist/src/tools/config-manager.js.map +1 -0
- package/dist/src/tools/installer.d.ts +38 -0
- package/dist/src/tools/installer.d.ts.map +1 -0
- package/dist/src/tools/installer.js +222 -0
- package/dist/src/tools/installer.js.map +1 -0
- package/dist/src/types/callbacks.d.ts +53 -0
- package/dist/src/types/callbacks.d.ts.map +1 -0
- package/dist/src/types/callbacks.js +7 -0
- package/dist/src/types/callbacks.js.map +1 -0
- package/dist/src/types/config.d.ts +56 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +6 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/hooks.d.ts +47 -0
- package/dist/src/types/hooks.d.ts.map +1 -0
- package/dist/src/types/hooks.js +6 -0
- package/dist/src/types/hooks.js.map +1 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +23 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/ipc.d.ts +43 -0
- package/dist/src/types/ipc.d.ts.map +1 -0
- package/dist/src/types/ipc.js +7 -0
- package/dist/src/types/ipc.js.map +1 -0
- package/dist/src/types/session.d.ts +87 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +9 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/telegram.d.ts +58 -0
- package/dist/src/types/telegram.d.ts.map +1 -0
- package/dist/src/types/telegram.js +6 -0
- package/dist/src/types/telegram.js.map +1 -0
- package/dist/src/utils/active-check.d.ts +20 -0
- package/dist/src/utils/active-check.d.ts.map +1 -0
- package/dist/src/utils/active-check.js +42 -0
- package/dist/src/utils/active-check.js.map +1 -0
- package/dist/src/utils/callback-parser.d.ts +23 -0
- package/dist/src/utils/callback-parser.d.ts.map +1 -0
- package/dist/src/utils/callback-parser.js +85 -0
- package/dist/src/utils/callback-parser.js.map +1 -0
- package/dist/src/utils/controller-injector.d.ts +21 -0
- package/dist/src/utils/controller-injector.d.ts.map +1 -0
- package/dist/src/utils/controller-injector.js +108 -0
- package/dist/src/utils/controller-injector.js.map +1 -0
- package/dist/src/utils/conversation-tracker.d.ts +32 -0
- package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
- package/dist/src/utils/conversation-tracker.js +119 -0
- package/dist/src/utils/conversation-tracker.js.map +1 -0
- package/dist/src/utils/deep-link.d.ts +22 -0
- package/dist/src/utils/deep-link.d.ts.map +1 -0
- package/dist/src/utils/deep-link.js +43 -0
- package/dist/src/utils/deep-link.js.map +1 -0
- package/dist/src/utils/ghostty-session-manager.d.ts +81 -0
- package/dist/src/utils/ghostty-session-manager.d.ts.map +1 -0
- package/dist/src/utils/ghostty-session-manager.js +370 -0
- package/dist/src/utils/ghostty-session-manager.js.map +1 -0
- package/dist/src/utils/hook-definitions.d.ts +25 -0
- package/dist/src/utils/hook-definitions.d.ts.map +1 -0
- package/dist/src/utils/hook-definitions.js +36 -0
- package/dist/src/utils/hook-definitions.js.map +1 -0
- package/dist/src/utils/http-request.d.ts +25 -0
- package/dist/src/utils/http-request.d.ts.map +1 -0
- package/dist/src/utils/http-request.js +66 -0
- package/dist/src/utils/http-request.js.map +1 -0
- package/dist/src/utils/optional-require.d.ts +13 -0
- package/dist/src/utils/optional-require.d.ts.map +1 -0
- package/dist/src/utils/optional-require.js +37 -0
- package/dist/src/utils/optional-require.js.map +1 -0
- package/dist/src/utils/paths.d.ts +13 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +30 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/pty-session-manager.d.ts +43 -0
- package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
- package/dist/src/utils/pty-session-manager.js +183 -0
- package/dist/src/utils/pty-session-manager.js.map +1 -0
- package/dist/src/utils/subagent-tracker.d.ts +64 -0
- package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
- package/dist/src/utils/subagent-tracker.js +191 -0
- package/dist/src/utils/subagent-tracker.js.map +1 -0
- package/dist/src/utils/tmux-monitor.d.ts +102 -0
- package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
- package/dist/src/utils/tmux-monitor.js +642 -0
- package/dist/src/utils/tmux-monitor.js.map +1 -0
- package/dist/src/utils/trace-capture.d.ts +42 -0
- package/dist/src/utils/trace-capture.d.ts.map +1 -0
- package/dist/src/utils/trace-capture.js +102 -0
- package/dist/src/utils/trace-capture.js.map +1 -0
- package/dist/src/utils/transcript-reader.d.ts +57 -0
- package/dist/src/utils/transcript-reader.d.ts.map +1 -0
- package/dist/src/utils/transcript-reader.js +229 -0
- package/dist/src/utils/transcript-reader.js.map +1 -0
- package/dist/start-all-webhooks.d.ts +7 -0
- package/dist/start-all-webhooks.d.ts.map +1 -0
- package/dist/start-all-webhooks.js +98 -0
- package/dist/start-all-webhooks.js.map +1 -0
- package/dist/start-line-webhook.d.ts +7 -0
- package/dist/start-line-webhook.d.ts.map +1 -0
- package/dist/start-line-webhook.js +59 -0
- package/dist/start-line-webhook.js.map +1 -0
- package/dist/start-relay-pty.d.ts +7 -0
- package/dist/start-relay-pty.d.ts.map +1 -0
- package/dist/start-relay-pty.js +173 -0
- package/dist/start-relay-pty.js.map +1 -0
- package/dist/start-telegram-webhook.d.ts +7 -0
- package/dist/start-telegram-webhook.d.ts.map +1 -0
- package/dist/start-telegram-webhook.js +80 -0
- package/dist/start-telegram-webhook.js.map +1 -0
- package/dist/user-prompt-hook.d.ts +13 -0
- package/dist/user-prompt-hook.d.ts.map +1 -0
- package/dist/user-prompt-hook.js +45 -0
- package/dist/user-prompt-hook.js.map +1 -0
- package/dist/workspace-router.d.ts +114 -0
- package/dist/workspace-router.d.ts.map +1 -0
- package/dist/workspace-router.js +572 -0
- package/dist/workspace-router.js.map +1 -0
- package/dist/workspace-telegram-bot.d.ts +3 -0
- package/dist/workspace-telegram-bot.d.ts.map +1 -0
- package/dist/workspace-telegram-bot.js +1847 -0
- package/dist/workspace-telegram-bot.js.map +1 -0
- package/package.json +85 -0
- package/src/types/callbacks.ts +73 -0
- package/src/types/config.ts +63 -0
- package/src/types/hooks.ts +50 -0
- package/src/types/index.ts +6 -0
- package/src/types/ipc.ts +55 -0
- package/src/types/session.ts +91 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":";;AAEA;;;GAGG;;;;;AAEH,gDAAwB;AACxB,4CAAoB;AACpB,oDAA4B;AAC5B,6CAAiD;AACjD,+DAAuC;AAEvC,MAAM,kBAAkB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAElE,6BAA6B;AAC7B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,MAAM,CAAC,CAAC;AAChD,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,gBAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjD,qBAAqB;AACrB,MAAM,MAAM,GAAG;IACX,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACzD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;IAC9C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;IAChC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IAClC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;IACvG,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI;CAC9C,CAAC;AAEF,yBAAyB;AACzB,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACtD,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,mCAAmC;AACnC,MAAM,cAAc,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;AAC/C,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACtC,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AACxD,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;AAC1D,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC;AAEzH,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAElC,2BAA2B;AAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|