@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 @@
|
|
|
1
|
+
{"version":3,"file":"start-relay-pty.d.ts","sourceRoot":"","sources":["../start-relay-pty.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Cheesyboy PTY Relay Startup Script
|
|
5
|
+
* Start node-pty based email command relay service
|
|
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 paths_1 = require("./src/utils/paths");
|
|
15
|
+
// Check environment configuration
|
|
16
|
+
function checkConfig() {
|
|
17
|
+
const envPath = path_1.default.join(paths_1.PROJECT_ROOT, '.env');
|
|
18
|
+
if (!fs_1.default.existsSync(envPath)) {
|
|
19
|
+
console.error('\u274C Error: .env configuration file not found');
|
|
20
|
+
console.log('\nPlease first copy .env.example to .env and configure your email information:');
|
|
21
|
+
console.log(' cp .env.example .env');
|
|
22
|
+
console.log(' Then edit .env file to fill in your email configuration\n');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
// Load environment variables
|
|
26
|
+
require('dotenv').config({ path: envPath });
|
|
27
|
+
// Check required configuration
|
|
28
|
+
const required = ['IMAP_HOST', 'IMAP_USER', 'IMAP_PASS'];
|
|
29
|
+
const missing = required.filter(key => !process.env[key]);
|
|
30
|
+
if (missing.length > 0) {
|
|
31
|
+
console.error('\u274C Error: Missing required environment variables:');
|
|
32
|
+
missing.forEach(key => console.log(` - ${key}`));
|
|
33
|
+
console.log('\nPlease edit .env file and fill in all required configurations\n');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
console.log('\u2705 Configuration check passed');
|
|
37
|
+
console.log(`\u{1F4E7} IMAP server: ${process.env.IMAP_HOST}`);
|
|
38
|
+
console.log(`\u{1F464} Email account: ${process.env.IMAP_USER}`);
|
|
39
|
+
console.log(`\u{1F512} Whitelist senders: ${process.env.ALLOWED_SENDERS || '(Not set, will accept all emails)'}`);
|
|
40
|
+
console.log(`\u{1F4BE} Session storage path: ${process.env.SESSION_MAP_PATH || '(Using default path)'}`);
|
|
41
|
+
console.log('');
|
|
42
|
+
}
|
|
43
|
+
// Create example session
|
|
44
|
+
function createExampleSession() {
|
|
45
|
+
const sessionMapPath = process.env.SESSION_MAP_PATH || path_1.default.join(paths_1.PROJECT_ROOT, 'src/data/session-map.json');
|
|
46
|
+
const sessionDir = path_1.default.dirname(sessionMapPath);
|
|
47
|
+
// Ensure directory exists
|
|
48
|
+
if (!fs_1.default.existsSync(sessionDir)) {
|
|
49
|
+
fs_1.default.mkdirSync(sessionDir, { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
// If session file doesn't exist, create an example
|
|
52
|
+
if (!fs_1.default.existsSync(sessionMapPath)) {
|
|
53
|
+
const exampleToken = 'TEST123';
|
|
54
|
+
const exampleSession = {
|
|
55
|
+
[exampleToken]: {
|
|
56
|
+
type: 'pty',
|
|
57
|
+
createdAt: Math.floor(Date.now() / 1000),
|
|
58
|
+
expiresAt: Math.floor((Date.now() + 24 * 60 * 60 * 1000) / 1000),
|
|
59
|
+
cwd: process.cwd(),
|
|
60
|
+
description: 'Test session - Include [CCGram #TEST123] in email subject when sending'
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
fs_1.default.writeFileSync(sessionMapPath, JSON.stringify(exampleSession, null, 2));
|
|
64
|
+
console.log(`\u{1F4DD} Created example session file: ${sessionMapPath}`);
|
|
65
|
+
console.log(`\u{1F511} Test Token: ${exampleToken}`);
|
|
66
|
+
console.log(' When sending test email, include in subject: [CCGram #TEST123]');
|
|
67
|
+
console.log('');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// PID file path
|
|
71
|
+
const PID_FILE = path_1.default.join(paths_1.PROJECT_ROOT, 'relay-pty.pid');
|
|
72
|
+
// Check if an instance is already running
|
|
73
|
+
function checkSingleInstance() {
|
|
74
|
+
if (fs_1.default.existsSync(PID_FILE)) {
|
|
75
|
+
try {
|
|
76
|
+
const oldPid = parseInt(fs_1.default.readFileSync(PID_FILE, 'utf8'));
|
|
77
|
+
// Check if process is actually running
|
|
78
|
+
process.kill(oldPid, 0);
|
|
79
|
+
// If no error thrown, process is still running
|
|
80
|
+
console.error('\u274C Error: relay-pty service is already running (PID: ' + oldPid + ')');
|
|
81
|
+
console.log('\nIf you\'re sure the service is not running, you can delete the PID file:');
|
|
82
|
+
console.log(' rm ' + PID_FILE);
|
|
83
|
+
console.log('\nOr stop existing service:');
|
|
84
|
+
console.log(' kill ' + oldPid);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Process doesn't exist, delete old PID file
|
|
89
|
+
fs_1.default.unlinkSync(PID_FILE);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Write current process PID
|
|
93
|
+
fs_1.default.writeFileSync(PID_FILE, process.pid.toString());
|
|
94
|
+
}
|
|
95
|
+
// Clean up PID file
|
|
96
|
+
function cleanupPidFile() {
|
|
97
|
+
if (fs_1.default.existsSync(PID_FILE)) {
|
|
98
|
+
fs_1.default.unlinkSync(PID_FILE);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Start service
|
|
102
|
+
function startService() {
|
|
103
|
+
// Check single instance
|
|
104
|
+
checkSingleInstance();
|
|
105
|
+
console.log('\u{1F680} Starting Cheesyboy PTY Relay service...\n');
|
|
106
|
+
const relayPath = path_1.default.join(__dirname, 'src/relay/relay-pty.js');
|
|
107
|
+
// Use node to run directly, so we can see complete log output
|
|
108
|
+
const relay = (0, child_process_1.spawn)('node', [relayPath], {
|
|
109
|
+
stdio: 'inherit',
|
|
110
|
+
env: {
|
|
111
|
+
...process.env,
|
|
112
|
+
INJECTION_MODE: 'pty'
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
// Handle exit
|
|
116
|
+
process.on('SIGINT', () => {
|
|
117
|
+
console.log('\n\u23F9\uFE0F Stopping service...');
|
|
118
|
+
relay.kill('SIGINT');
|
|
119
|
+
cleanupPidFile();
|
|
120
|
+
process.exit(0);
|
|
121
|
+
});
|
|
122
|
+
process.on('exit', cleanupPidFile);
|
|
123
|
+
process.on('SIGTERM', cleanupPidFile);
|
|
124
|
+
relay.on('error', (error) => {
|
|
125
|
+
console.error('\u274C Startup failed:', error.message);
|
|
126
|
+
cleanupPidFile();
|
|
127
|
+
process.exit(1);
|
|
128
|
+
});
|
|
129
|
+
relay.on('exit', (code, signal) => {
|
|
130
|
+
cleanupPidFile();
|
|
131
|
+
if (signal) {
|
|
132
|
+
console.log(`\nService stopped (signal: ${signal})`);
|
|
133
|
+
}
|
|
134
|
+
else if (code !== 0) {
|
|
135
|
+
console.error(`\nService exited abnormally (code: ${code})`);
|
|
136
|
+
process.exit(code ?? 1);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Show usage instructions
|
|
141
|
+
function showInstructions() {
|
|
142
|
+
console.log('\u{1F4D6} Usage instructions:');
|
|
143
|
+
console.log('1. When executing tasks in Claude Code, reminder emails containing Token will be sent');
|
|
144
|
+
console.log('2. Reply to that email with the commands to execute');
|
|
145
|
+
console.log('3. Supported command formats:');
|
|
146
|
+
console.log(' - Enter command text directly');
|
|
147
|
+
console.log(' - Use CMD: prefix, like "CMD: continue"');
|
|
148
|
+
console.log(' - Use code block wrapping, like:');
|
|
149
|
+
console.log(' ```');
|
|
150
|
+
console.log(' your command');
|
|
151
|
+
console.log(' ```');
|
|
152
|
+
console.log('4. System will automatically extract commands and inject them into corresponding Claude Code session');
|
|
153
|
+
console.log('\n\u2328\uFE0F Press Ctrl+C to stop service\n');
|
|
154
|
+
console.log('\u2501'.repeat(60) + '\n');
|
|
155
|
+
}
|
|
156
|
+
// Main function
|
|
157
|
+
function main() {
|
|
158
|
+
console.log('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557');
|
|
159
|
+
console.log('\u2551 Cheesyboy PTY Relay Service \u2551');
|
|
160
|
+
console.log('\u2551 Email Command Relay Service - node-pty based PTY mode \u2551');
|
|
161
|
+
console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n');
|
|
162
|
+
// Check configuration
|
|
163
|
+
checkConfig();
|
|
164
|
+
// Create example session
|
|
165
|
+
createExampleSession();
|
|
166
|
+
// Show usage instructions
|
|
167
|
+
showInstructions();
|
|
168
|
+
// Start service
|
|
169
|
+
startService();
|
|
170
|
+
}
|
|
171
|
+
// Run
|
|
172
|
+
main();
|
|
173
|
+
//# sourceMappingURL=start-relay-pty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-relay-pty.js","sourceRoot":"","sources":["../start-relay-pty.ts"],"names":[],"mappings":";;AAEA;;;GAGG;;;;;AAEH,iDAAoD;AACpD,gDAAwB;AACxB,4CAAoB;AACpB,6CAAiD;AAEjD,kCAAkC;AAClC,SAAS,WAAW;IAChB,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAE5C,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE1D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,gCAAgC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,mCAAmC,EAAE,CAAC,CAAC;IAClH,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,sBAAsB,EAAE,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED,yBAAyB;AACzB,SAAS,oBAAoB;IACzB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,2BAA2B,CAAC,CAAC;IAC5G,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAEhD,0BAA0B;IAC1B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,mDAAmD;IACnD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,SAAS,CAAC;QAC/B,MAAM,cAAc,GAAG;YACnB,CAAC,YAAY,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK;gBACX,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBACxC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;gBAChE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;gBAClB,WAAW,EAAE,wEAAwE;aACxF;SACJ,CAAC;QAEF,YAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,2CAA2C,cAAc,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,eAAe,CAAC,CAAC;AAE1D,0CAA0C;AAC1C,SAAS,mBAAmB;IACxB,IAAI,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3D,uCAAuC;YACvC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxB,+CAA+C;YAC/C,OAAO,CAAC,KAAK,CAAC,2DAA2D,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACL,6CAA6C;YAC7C,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,oBAAoB;AACpB,SAAS,cAAc;IACnB,IAAI,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;AACL,CAAC;AAED,gBAAgB;AAChB,SAAS,YAAY;IACjB,wBAAwB;IACxB,mBAAmB,EAAE,CAAC;IAEtB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IAEnE,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IAEjE,8DAA8D;IAC9D,MAAM,KAAK,GAAiB,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;QACnD,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE;YACD,GAAG,OAAO,CAAC,GAAG;YACd,cAAc,EAAE,KAAK;SACxB;KACJ,CAAC,CAAC;IAEH,cAAc;IACd,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEtC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACvD,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,MAAqB,EAAE,EAAE;QAC5D,cAAc,EAAE,CAAC;QACjB,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,GAAG,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,0BAA0B;AAC1B,SAAS,gBAAgB;IACrB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;IACpH,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,gBAAgB;AAChB,SAAS,IAAI;IACT,OAAO,CAAC,GAAG,CAAC,0WAA0W,CAAC,CAAC;IACxX,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,4WAA4W,CAAC,CAAC;IAE1X,sBAAsB;IACtB,WAAW,EAAE,CAAC;IAEd,yBAAyB;IACzB,oBAAoB,EAAE,CAAC;IAEvB,0BAA0B;IAC1B,gBAAgB,EAAE,CAAC;IAEnB,gBAAgB;IAChB,YAAY,EAAE,CAAC;AACnB,CAAC;AAED,MAAM;AACN,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-telegram-webhook.d.ts","sourceRoot":"","sources":["../start-telegram-webhook.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Telegram Webhook Server
|
|
5
|
+
* Starts the Telegram 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 TelegramWebhookHandler = require('./src/channels/telegram/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('Telegram-Webhook-Server');
|
|
23
|
+
// Load configuration
|
|
24
|
+
const config = {
|
|
25
|
+
botToken: process.env.TELEGRAM_BOT_TOKEN,
|
|
26
|
+
chatId: process.env.TELEGRAM_CHAT_ID,
|
|
27
|
+
groupId: process.env.TELEGRAM_GROUP_ID,
|
|
28
|
+
whitelist: process.env.TELEGRAM_WHITELIST ? process.env.TELEGRAM_WHITELIST.split(',').map(id => id.trim()) : [],
|
|
29
|
+
port: process.env.TELEGRAM_WEBHOOK_PORT || 3001,
|
|
30
|
+
webhookUrl: process.env.TELEGRAM_WEBHOOK_URL
|
|
31
|
+
};
|
|
32
|
+
// Validate configuration
|
|
33
|
+
if (!config.botToken) {
|
|
34
|
+
logger.error('TELEGRAM_BOT_TOKEN must be set in .env file');
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
if (!config.chatId && !config.groupId) {
|
|
38
|
+
logger.error('Either TELEGRAM_CHAT_ID or TELEGRAM_GROUP_ID must be set in .env file');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
// Create and start webhook handler
|
|
42
|
+
const webhookHandler = new TelegramWebhookHandler(config);
|
|
43
|
+
async function start() {
|
|
44
|
+
logger.info('Starting Telegram webhook server...');
|
|
45
|
+
logger.info(`Configuration:`);
|
|
46
|
+
logger.info(`- Port: ${config.port}`);
|
|
47
|
+
logger.info(`- Chat ID: ${config.chatId || 'Not set'}`);
|
|
48
|
+
logger.info(`- Group ID: ${config.groupId || 'Not set'}`);
|
|
49
|
+
logger.info(`- Whitelist: ${config.whitelist.length > 0 ? config.whitelist.join(', ') : 'None (using configured IDs)'}`);
|
|
50
|
+
// Set webhook if URL is provided
|
|
51
|
+
if (config.webhookUrl) {
|
|
52
|
+
try {
|
|
53
|
+
const webhookEndpoint = `${config.webhookUrl}/webhook/telegram`;
|
|
54
|
+
logger.info(`Setting webhook to: ${webhookEndpoint}`);
|
|
55
|
+
await webhookHandler.setWebhook(webhookEndpoint);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
logger.error('Failed to set webhook:', error.message);
|
|
59
|
+
logger.info('You can manually set the webhook using:');
|
|
60
|
+
logger.info(`curl -X POST https://api.telegram.org/bot${config.botToken}/setWebhook -d "url=${config.webhookUrl}/webhook/telegram"`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
logger.warn('TELEGRAM_WEBHOOK_URL not set. Please set the webhook manually.');
|
|
65
|
+
logger.info('To set webhook manually, use:');
|
|
66
|
+
logger.info(`curl -X POST https://api.telegram.org/bot${config.botToken}/setWebhook -d "url=https://your-domain.com/webhook/telegram"`);
|
|
67
|
+
}
|
|
68
|
+
webhookHandler.start(config.port);
|
|
69
|
+
}
|
|
70
|
+
start();
|
|
71
|
+
// Handle graceful shutdown
|
|
72
|
+
process.on('SIGINT', () => {
|
|
73
|
+
logger.info('Shutting down Telegram webhook server...');
|
|
74
|
+
process.exit(0);
|
|
75
|
+
});
|
|
76
|
+
process.on('SIGTERM', () => {
|
|
77
|
+
logger.info('Shutting down Telegram webhook server...');
|
|
78
|
+
process.exit(0);
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=start-telegram-webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-telegram-webhook.js","sourceRoot":"","sources":["../start-telegram-webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* UserPromptSubmit hook — called by Claude Code whenever the user submits a prompt.
|
|
4
|
+
*
|
|
5
|
+
* Writes the current Unix timestamp to /tmp/claude_last_msg_time so that
|
|
6
|
+
* active-check.ts can detect when the user is actively working at the terminal
|
|
7
|
+
* and suppress redundant Telegram notifications.
|
|
8
|
+
*
|
|
9
|
+
* Must be fast — registered with timeout: 2 in settings.json.
|
|
10
|
+
* No stdout output. No Telegram calls.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=user-prompt-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt-hook.d.ts","sourceRoot":"","sources":["../user-prompt-hook.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* UserPromptSubmit hook — called by Claude Code whenever the user submits a prompt.
|
|
5
|
+
*
|
|
6
|
+
* Writes the current Unix timestamp to /tmp/claude_last_msg_time so that
|
|
7
|
+
* active-check.ts can detect when the user is actively working at the terminal
|
|
8
|
+
* and suppress redundant Telegram notifications.
|
|
9
|
+
*
|
|
10
|
+
* Must be fast — registered with timeout: 2 in settings.json.
|
|
11
|
+
* No stdout output. No Telegram calls.
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const path_1 = __importDefault(require("path"));
|
|
18
|
+
const paths_1 = require("./src/utils/paths");
|
|
19
|
+
require('dotenv').config({ path: path_1.default.join(paths_1.PROJECT_ROOT, '.env'), quiet: true });
|
|
20
|
+
const fs_1 = __importDefault(require("fs"));
|
|
21
|
+
const LAST_MSG_FILE = '/tmp/claude_last_msg_time';
|
|
22
|
+
// Write current Unix timestamp immediately
|
|
23
|
+
try {
|
|
24
|
+
fs_1.default.writeFileSync(LAST_MSG_FILE, String(Math.floor(Date.now() / 1000)));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Non-fatal — active-check will just assume user is inactive
|
|
28
|
+
}
|
|
29
|
+
// Drain stdin using the standard hook pattern (data not needed)
|
|
30
|
+
let resolved = false;
|
|
31
|
+
process.stdin.setEncoding('utf8');
|
|
32
|
+
process.stdin.on('data', () => { });
|
|
33
|
+
process.stdin.on('end', () => {
|
|
34
|
+
if (!resolved) {
|
|
35
|
+
resolved = true;
|
|
36
|
+
process.stdin.destroy();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
if (!resolved) {
|
|
41
|
+
resolved = true;
|
|
42
|
+
process.stdin.destroy();
|
|
43
|
+
}
|
|
44
|
+
}, 500);
|
|
45
|
+
//# sourceMappingURL=user-prompt-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt-hook.js","sourceRoot":"","sources":["../user-prompt-hook.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;GASG;;;;;AAEH,gDAAwB;AACxB,6CAAiD;AACjD,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjF,4CAAoB;AAEpB,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,2CAA2C;AAC3C,IAAI,CAAC;IACH,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAAC,MAAM,CAAC;IACP,6DAA6D;AAC/D,CAAC;AAED,gEAAgE;AAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AACH,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC9D,CAAC,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Workspace Router - Maps workspace names to Claude Code sessions.
|
|
4
|
+
*
|
|
5
|
+
* Reads the session map and resolves human-friendly project names
|
|
6
|
+
* (e.g. "wp-super-ai") to active tmux sessions so commands can be
|
|
7
|
+
* routed without memorising tokens.
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionEntry, SessionMap, ResolveResult, SessionHistoryEntry, RateLimitInfo } from './src/types';
|
|
10
|
+
declare const SESSION_MAP_PATH: string;
|
|
11
|
+
/**
|
|
12
|
+
* Extract a short project name from a cwd path.
|
|
13
|
+
* "/home/user/projects/my-project" -> "my-project"
|
|
14
|
+
*/
|
|
15
|
+
declare function extractWorkspaceName(cwd: string | null): string | null;
|
|
16
|
+
/** Read the session map from disk. */
|
|
17
|
+
declare function readSessionMap(): SessionMap;
|
|
18
|
+
/** Write the session map to disk. */
|
|
19
|
+
declare function writeSessionMap(map: SessionMap): void;
|
|
20
|
+
/** Check whether a session has expired. */
|
|
21
|
+
declare function isExpired(session: SessionEntry | Record<string, unknown>): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Find the most recent non-expired session whose workspace name matches.
|
|
24
|
+
* Returns { token, session } or null.
|
|
25
|
+
*/
|
|
26
|
+
declare function findSessionByWorkspace(workspaceName: string): {
|
|
27
|
+
token: string;
|
|
28
|
+
session: SessionEntry;
|
|
29
|
+
} | null;
|
|
30
|
+
/**
|
|
31
|
+
* List all active (non-expired) sessions grouped by workspace.
|
|
32
|
+
* Returns an array of { workspace, token, session, age }.
|
|
33
|
+
*/
|
|
34
|
+
declare function listActiveSessions(): Array<{
|
|
35
|
+
workspace: string;
|
|
36
|
+
token: string;
|
|
37
|
+
session: SessionEntry;
|
|
38
|
+
age: string;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Register or update a session in the map.
|
|
42
|
+
* Called by the hook notifier when Claude starts/stops.
|
|
43
|
+
*/
|
|
44
|
+
declare function upsertSession({ cwd, tmuxSession, status, sessionId, sessionType, rateLimit }: {
|
|
45
|
+
cwd: string;
|
|
46
|
+
tmuxSession: string;
|
|
47
|
+
status: string;
|
|
48
|
+
sessionId?: string | null;
|
|
49
|
+
sessionType?: 'tmux' | 'pty' | 'ghostty';
|
|
50
|
+
rateLimit?: RateLimitInfo;
|
|
51
|
+
}): {
|
|
52
|
+
token: string;
|
|
53
|
+
workspace: string | null;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Update rate limit info for a session by workspace name.
|
|
57
|
+
* Returns true if session was found and updated.
|
|
58
|
+
*/
|
|
59
|
+
declare function updateSessionRateLimit(workspace: string, rateLimit: RateLimitInfo): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Get rate limit info for a session by workspace name.
|
|
62
|
+
*/
|
|
63
|
+
declare function getSessionRateLimit(workspace: string): RateLimitInfo | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Find the newest non-expired session with the given tmuxSession name.
|
|
66
|
+
* Used by callback handlers that only have the session name from pending files.
|
|
67
|
+
*/
|
|
68
|
+
declare function findSessionByTmuxName(tmuxName: string): SessionEntry | undefined;
|
|
69
|
+
/** Remove expired sessions from the map. */
|
|
70
|
+
declare function pruneExpired(): number;
|
|
71
|
+
/**
|
|
72
|
+
* Resolve a workspace name by exact match, then prefix match.
|
|
73
|
+
*/
|
|
74
|
+
declare function resolveWorkspace(name: string): ResolveResult;
|
|
75
|
+
declare function getDefaultWorkspace(): string | null;
|
|
76
|
+
declare function setDefaultWorkspace(name: string | null): void;
|
|
77
|
+
/**
|
|
78
|
+
* Track which Telegram message_id belongs to which workspace.
|
|
79
|
+
* Prunes entries older than 24 hours on each write.
|
|
80
|
+
*/
|
|
81
|
+
declare function trackNotificationMessage(messageId: number | string, workspace: string, type: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Look up which workspace a Telegram message belongs to.
|
|
84
|
+
* Returns the workspace name or null.
|
|
85
|
+
*/
|
|
86
|
+
declare function getWorkspaceForMessage(messageId: number | string | null | undefined): string | null;
|
|
87
|
+
declare function recordProjectUsage(name: string, projectPath: string, sessionId?: string | null): void;
|
|
88
|
+
declare function getRecentProjects(limit?: number): Array<{
|
|
89
|
+
name: string;
|
|
90
|
+
path: string;
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Return projects that have at least one stored Claude Code session ID.
|
|
94
|
+
* Used by /resume to list resumeable conversations.
|
|
95
|
+
*/
|
|
96
|
+
declare function getResumeableProjects(limit?: number): Array<{
|
|
97
|
+
name: string;
|
|
98
|
+
path: string;
|
|
99
|
+
sessions: SessionHistoryEntry[];
|
|
100
|
+
}>;
|
|
101
|
+
/**
|
|
102
|
+
* Read Claude Code's session storage for a project directory and return
|
|
103
|
+
* the most recent sessions, sorted by file mtime (last activity).
|
|
104
|
+
*
|
|
105
|
+
* Claude Code stores sessions in ~/.claude/projects/<encoded-path>/<uuid>.jsonl
|
|
106
|
+
* where the path encoding replaces every "/" with "-" (including the leading slash).
|
|
107
|
+
*/
|
|
108
|
+
declare function getClaudeSessionsForProject(projectPath: string, limit?: number): Array<{
|
|
109
|
+
id: string;
|
|
110
|
+
lastActivity: number;
|
|
111
|
+
snippet: string | null;
|
|
112
|
+
}>;
|
|
113
|
+
export { extractWorkspaceName, readSessionMap, writeSessionMap, findSessionByWorkspace, findSessionByTmuxName, resolveWorkspace, listActiveSessions, upsertSession, pruneExpired, isExpired, getDefaultWorkspace, setDefaultWorkspace, trackNotificationMessage, getWorkspaceForMessage, recordProjectUsage, getRecentProjects, getResumeableProjects, getClaudeSessionsForProject, updateSessionRateLimit, getSessionRateLimit, SESSION_MAP_PATH, };
|
|
114
|
+
//# sourceMappingURL=workspace-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-router.d.ts","sourceRoot":"","sources":["../workspace-router.ts"],"names":[],"mappings":"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"}
|