@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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Bot API types (subset used by Cheesyboy).
|
|
3
|
+
*/
|
|
4
|
+
export interface TelegramUser {
|
|
5
|
+
id: number;
|
|
6
|
+
is_bot: boolean;
|
|
7
|
+
first_name: string;
|
|
8
|
+
last_name?: string;
|
|
9
|
+
username?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface TelegramChat {
|
|
12
|
+
id: number;
|
|
13
|
+
type: string;
|
|
14
|
+
title?: string;
|
|
15
|
+
username?: string;
|
|
16
|
+
first_name?: string;
|
|
17
|
+
last_name?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface TelegramMessage {
|
|
20
|
+
message_id: number;
|
|
21
|
+
from?: TelegramUser;
|
|
22
|
+
chat: TelegramChat;
|
|
23
|
+
date: number;
|
|
24
|
+
text?: string;
|
|
25
|
+
reply_to_message?: TelegramMessage;
|
|
26
|
+
}
|
|
27
|
+
export interface TelegramCallbackQuery {
|
|
28
|
+
id: string;
|
|
29
|
+
from: TelegramUser;
|
|
30
|
+
message?: TelegramMessage;
|
|
31
|
+
data?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface TelegramUpdate {
|
|
34
|
+
update_id: number;
|
|
35
|
+
message?: TelegramMessage;
|
|
36
|
+
callback_query?: TelegramCallbackQuery;
|
|
37
|
+
}
|
|
38
|
+
export interface InlineKeyboardButton {
|
|
39
|
+
text: string;
|
|
40
|
+
callback_data?: string;
|
|
41
|
+
url?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface InlineKeyboardMarkup {
|
|
44
|
+
inline_keyboard: InlineKeyboardButton[][];
|
|
45
|
+
}
|
|
46
|
+
export interface SendMessageRequest {
|
|
47
|
+
chat_id: string | number;
|
|
48
|
+
text: string;
|
|
49
|
+
parse_mode?: 'Markdown' | 'HTML' | 'MarkdownV2';
|
|
50
|
+
reply_markup?: InlineKeyboardMarkup;
|
|
51
|
+
}
|
|
52
|
+
export interface TelegramApiResponse<T = unknown> {
|
|
53
|
+
ok: boolean;
|
|
54
|
+
result?: T;
|
|
55
|
+
description?: string;
|
|
56
|
+
error_code?: number;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=telegram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../../src/types/telegram.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,eAAe,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,oBAAoB,EAAE,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC;IAChD,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/types/telegram.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* active-check.ts — Detects whether the user is actively working at the terminal.
|
|
3
|
+
*
|
|
4
|
+
* Reads /tmp/claude_last_msg_time (written by the UserPromptSubmit hook in
|
|
5
|
+
* ~/.claude/settings.json) to determine when the user last sent a message to Claude.
|
|
6
|
+
*
|
|
7
|
+
* If the gap is below ACTIVE_THRESHOLD_SECONDS (default: 120 = 2 min), the user
|
|
8
|
+
* is considered active at the terminal and Telegram notifications should be
|
|
9
|
+
* suppressed (they can see the output directly). After 2 min idle, Telegram
|
|
10
|
+
* takes over so the user can answer permissions/questions from their phone.
|
|
11
|
+
*
|
|
12
|
+
* Applied to: enhanced-hook-notify (Stop/Notification), permission-hook (PermissionRequest).
|
|
13
|
+
* Skipped when: typing-active file exists (command was Telegram-injected).
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Returns true if the user sent a Claude message within the active threshold.
|
|
17
|
+
* @param thresholdSeconds - seconds since last message to consider user "active" (default 120)
|
|
18
|
+
*/
|
|
19
|
+
export declare function isUserActiveAtTerminal(thresholdSeconds?: number): boolean;
|
|
20
|
+
//# sourceMappingURL=active-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-check.d.ts","sourceRoot":"","sources":["../../../src/utils/active-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,gBAAgB,GAAE,MAAsF,GACvG,OAAO,CAWT"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* active-check.ts — Detects whether the user is actively working at the terminal.
|
|
4
|
+
*
|
|
5
|
+
* Reads /tmp/claude_last_msg_time (written by the UserPromptSubmit hook in
|
|
6
|
+
* ~/.claude/settings.json) to determine when the user last sent a message to Claude.
|
|
7
|
+
*
|
|
8
|
+
* If the gap is below ACTIVE_THRESHOLD_SECONDS (default: 120 = 2 min), the user
|
|
9
|
+
* is considered active at the terminal and Telegram notifications should be
|
|
10
|
+
* suppressed (they can see the output directly). After 2 min idle, Telegram
|
|
11
|
+
* takes over so the user can answer permissions/questions from their phone.
|
|
12
|
+
*
|
|
13
|
+
* Applied to: enhanced-hook-notify (Stop/Notification), permission-hook (PermissionRequest).
|
|
14
|
+
* Skipped when: typing-active file exists (command was Telegram-injected).
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.isUserActiveAtTerminal = isUserActiveAtTerminal;
|
|
21
|
+
const fs_1 = __importDefault(require("fs"));
|
|
22
|
+
const LAST_MSG_FILE = '/tmp/claude_last_msg_time';
|
|
23
|
+
const DEFAULT_THRESHOLD = 120; // 2 minutes — Cheesyboy default (was 300 in upstream ccgram)
|
|
24
|
+
/**
|
|
25
|
+
* Returns true if the user sent a Claude message within the active threshold.
|
|
26
|
+
* @param thresholdSeconds - seconds since last message to consider user "active" (default 120)
|
|
27
|
+
*/
|
|
28
|
+
function isUserActiveAtTerminal(thresholdSeconds = parseInt(process.env.ACTIVE_THRESHOLD_SECONDS || '', 10) || DEFAULT_THRESHOLD) {
|
|
29
|
+
try {
|
|
30
|
+
const raw = fs_1.default.readFileSync(LAST_MSG_FILE, 'utf8').trim();
|
|
31
|
+
const lastMsg = parseInt(raw, 10);
|
|
32
|
+
if (!lastMsg || isNaN(lastMsg))
|
|
33
|
+
return false;
|
|
34
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
35
|
+
return (nowSeconds - lastMsg) < thresholdSeconds;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// File doesn't exist — no session info, assume not active
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=active-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-check.js","sourceRoot":"","sources":["../../../src/utils/active-check.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;AAWH,wDAaC;AAtBD,4CAAoB;AAEpB,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAClD,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,6DAA6D;AAE5F;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,mBAA2B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,iBAAiB;IAExG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,gBAAgB,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callback Data Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Telegram inline keyboard callback_data strings into
|
|
5
|
+
* structured objects. Format: "type:promptId:action"
|
|
6
|
+
*
|
|
7
|
+
* Extracted from workspace-telegram-bot.js for testability.
|
|
8
|
+
*/
|
|
9
|
+
import type { ParsedCallback } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* Parse a callback_data string into a structured object.
|
|
12
|
+
*
|
|
13
|
+
* Return shapes:
|
|
14
|
+
* { type: 'new', projectName: string }
|
|
15
|
+
* { type: 'perm', promptId: string, action: string }
|
|
16
|
+
* { type: 'opt', promptId: string, optionIndex: number }
|
|
17
|
+
* { type: 'opt-submit', promptId: string }
|
|
18
|
+
* { type: 'qperm', promptId: string, optionIndex: number }
|
|
19
|
+
* { type: 'perm-denied', promptId: string, action: string }
|
|
20
|
+
* { type: 'pre-compact', promptId: string, action: string }
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseCallbackData(data: string | null | undefined): ParsedCallback | null;
|
|
23
|
+
//# sourceMappingURL=callback-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-parser.d.ts","sourceRoot":"","sources":["../../../src/utils/callback-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CA4DxF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Callback Data Parser
|
|
4
|
+
*
|
|
5
|
+
* Parses Telegram inline keyboard callback_data strings into
|
|
6
|
+
* structured objects. Format: "type:promptId:action"
|
|
7
|
+
*
|
|
8
|
+
* Extracted from workspace-telegram-bot.js for testability.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.parseCallbackData = parseCallbackData;
|
|
12
|
+
/**
|
|
13
|
+
* Parse a callback_data string into a structured object.
|
|
14
|
+
*
|
|
15
|
+
* Return shapes:
|
|
16
|
+
* { type: 'new', projectName: string }
|
|
17
|
+
* { type: 'perm', promptId: string, action: string }
|
|
18
|
+
* { type: 'opt', promptId: string, optionIndex: number }
|
|
19
|
+
* { type: 'opt-submit', promptId: string }
|
|
20
|
+
* { type: 'qperm', promptId: string, optionIndex: number }
|
|
21
|
+
* { type: 'perm-denied', promptId: string, action: string }
|
|
22
|
+
* { type: 'pre-compact', promptId: string, action: string }
|
|
23
|
+
*/
|
|
24
|
+
function parseCallbackData(data) {
|
|
25
|
+
if (!data)
|
|
26
|
+
return null;
|
|
27
|
+
const parts = data.split(':');
|
|
28
|
+
const type = parts[0];
|
|
29
|
+
// new:<projectName> (rejoin in case name has colons)
|
|
30
|
+
if (type === 'new') {
|
|
31
|
+
const projectName = parts.slice(1).join(':');
|
|
32
|
+
if (!projectName)
|
|
33
|
+
return null;
|
|
34
|
+
return { type: 'new', projectName };
|
|
35
|
+
}
|
|
36
|
+
// rp:<projectName> — resume project: show session list (rejoin like new:)
|
|
37
|
+
if (type === 'rp') {
|
|
38
|
+
const projectName = parts.slice(1).join(':');
|
|
39
|
+
if (!projectName)
|
|
40
|
+
return null;
|
|
41
|
+
return { type: 'rp', projectName };
|
|
42
|
+
}
|
|
43
|
+
// rs:<projectName>:<sessionIdx> — resume specific session
|
|
44
|
+
// rc:<projectName>:<sessionIdx> — confirmed resume (kill active + restart)
|
|
45
|
+
// sessionIdx is always the last segment; projectName is everything between
|
|
46
|
+
if (type === 'rs' || type === 'rc') {
|
|
47
|
+
if (parts.length < 3)
|
|
48
|
+
return null;
|
|
49
|
+
const sessionIdx = parseInt(parts[parts.length - 1], 10);
|
|
50
|
+
if (isNaN(sessionIdx))
|
|
51
|
+
return null;
|
|
52
|
+
const projectName = parts.slice(1, parts.length - 1).join(':');
|
|
53
|
+
if (!projectName)
|
|
54
|
+
return null;
|
|
55
|
+
return { type, projectName, sessionIdx };
|
|
56
|
+
}
|
|
57
|
+
// opt-submit:<promptId> (only 2 parts)
|
|
58
|
+
if (type === 'opt-submit') {
|
|
59
|
+
if (parts.length < 2 || !parts[1])
|
|
60
|
+
return null;
|
|
61
|
+
return { type: 'opt-submit', promptId: parts[1] };
|
|
62
|
+
}
|
|
63
|
+
// All other types need at least 3 parts: type:promptId:action
|
|
64
|
+
if (parts.length < 3)
|
|
65
|
+
return null;
|
|
66
|
+
const promptId = parts[1];
|
|
67
|
+
const action = parts[2];
|
|
68
|
+
if (!promptId)
|
|
69
|
+
return null;
|
|
70
|
+
switch (type) {
|
|
71
|
+
case 'perm':
|
|
72
|
+
return { type: 'perm', promptId, action };
|
|
73
|
+
case 'opt':
|
|
74
|
+
return { type: 'opt', promptId, optionIndex: parseInt(action, 10) };
|
|
75
|
+
case 'qperm':
|
|
76
|
+
return { type: 'qperm', promptId, optionIndex: parseInt(action, 10) };
|
|
77
|
+
case 'perm-denied':
|
|
78
|
+
return { type: 'perm-denied', promptId, action };
|
|
79
|
+
case 'pre-compact':
|
|
80
|
+
return { type: 'pre-compact', promptId, action };
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=callback-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-parser.js","sourceRoot":"","sources":["../../../src/utils/callback-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controller Injector
|
|
3
|
+
* Injects commands into tmux sessions or PTY
|
|
4
|
+
*/
|
|
5
|
+
import Logger from '../core/logger';
|
|
6
|
+
interface ControllerInjectorConfig {
|
|
7
|
+
mode?: string;
|
|
8
|
+
defaultSession?: string;
|
|
9
|
+
}
|
|
10
|
+
declare class ControllerInjector {
|
|
11
|
+
logger: Logger;
|
|
12
|
+
mode: string;
|
|
13
|
+
defaultSession: string;
|
|
14
|
+
constructor(config?: ControllerInjectorConfig);
|
|
15
|
+
injectCommand(command: string, sessionName?: string | null): Promise<boolean>;
|
|
16
|
+
_injectTmux(command: string, sessionName: string): boolean;
|
|
17
|
+
_injectPty(command: string, sessionName: string): boolean;
|
|
18
|
+
listSessions(): string[];
|
|
19
|
+
}
|
|
20
|
+
export = ControllerInjector;
|
|
21
|
+
//# sourceMappingURL=controller-injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-injector.d.ts","sourceRoot":"","sources":["../../../src/utils/controller-injector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,MAAM,MAAM,gBAAgB,CAAC;AAGpC,UAAU,wBAAwB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAWD,cAAM,kBAAkB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;gBAEX,MAAM,GAAE,wBAA6B;IAM3C,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzF,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAyB1D,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IA4BzD,YAAY,IAAI,MAAM,EAAE;CA2B3B;AAED,SAAS,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Controller Injector
|
|
4
|
+
* Injects commands into tmux sessions or PTY
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const logger_1 = __importDefault(require("../core/logger"));
|
|
13
|
+
const paths_1 = require("./paths");
|
|
14
|
+
class ControllerInjector {
|
|
15
|
+
logger;
|
|
16
|
+
mode;
|
|
17
|
+
defaultSession;
|
|
18
|
+
constructor(config = {}) {
|
|
19
|
+
this.logger = new logger_1.default('ControllerInjector');
|
|
20
|
+
this.mode = config.mode || process.env.INJECTION_MODE || 'pty';
|
|
21
|
+
this.defaultSession = config.defaultSession || process.env.TMUX_SESSION || 'claude-code';
|
|
22
|
+
}
|
|
23
|
+
async injectCommand(command, sessionName = null) {
|
|
24
|
+
const session = sessionName || this.defaultSession;
|
|
25
|
+
if (this.mode === 'tmux') {
|
|
26
|
+
return this._injectTmux(command, session);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return this._injectPty(command, session);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
_injectTmux(command, sessionName) {
|
|
33
|
+
try {
|
|
34
|
+
// Check if tmux session exists
|
|
35
|
+
try {
|
|
36
|
+
(0, child_process_1.execSync)(`tmux has-session -t ${sessionName}`, { stdio: 'ignore' });
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error(`Tmux session '${sessionName}' not found`);
|
|
40
|
+
}
|
|
41
|
+
// Send command to tmux session and execute it
|
|
42
|
+
const escapedCommand = command.replace(/'/g, "'\\''");
|
|
43
|
+
// Send command first
|
|
44
|
+
(0, child_process_1.execSync)(`tmux send-keys -t ${sessionName} '${escapedCommand}'`);
|
|
45
|
+
// Then send Enter as separate command
|
|
46
|
+
(0, child_process_1.execSync)(`tmux send-keys -t ${sessionName} Enter`);
|
|
47
|
+
this.logger.info(`Command injected to tmux session '${sessionName}'`);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
this.logger.error('Failed to inject command via tmux:', error.message);
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
_injectPty(command, sessionName) {
|
|
56
|
+
try {
|
|
57
|
+
// Find PTY session file
|
|
58
|
+
const sessionMapPath = process.env.SESSION_MAP_PATH ||
|
|
59
|
+
path_1.default.join(paths_1.PROJECT_ROOT, 'src/data/session-map.json');
|
|
60
|
+
if (!fs_1.default.existsSync(sessionMapPath)) {
|
|
61
|
+
throw new Error('Session map file not found');
|
|
62
|
+
}
|
|
63
|
+
const sessionMap = JSON.parse(fs_1.default.readFileSync(sessionMapPath, 'utf8'));
|
|
64
|
+
const sessionInfo = sessionMap[sessionName];
|
|
65
|
+
if (!sessionInfo || !sessionInfo.ptyPath) {
|
|
66
|
+
throw new Error(`PTY session '${sessionName}' not found`);
|
|
67
|
+
}
|
|
68
|
+
// Write command to PTY
|
|
69
|
+
fs_1.default.writeFileSync(sessionInfo.ptyPath, command + '\n');
|
|
70
|
+
this.logger.info(`Command injected to PTY session '${sessionName}'`);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.logger.error('Failed to inject command via PTY:', error.message);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
listSessions() {
|
|
79
|
+
if (this.mode === 'tmux') {
|
|
80
|
+
try {
|
|
81
|
+
const output = (0, child_process_1.execSync)('tmux list-sessions -F "#{session_name}"', {
|
|
82
|
+
encoding: 'utf8',
|
|
83
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
84
|
+
});
|
|
85
|
+
return output.trim().split('\n').filter(Boolean);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
try {
|
|
93
|
+
const sessionMapPath = process.env.SESSION_MAP_PATH ||
|
|
94
|
+
path_1.default.join(paths_1.PROJECT_ROOT, 'src/data/session-map.json');
|
|
95
|
+
if (!fs_1.default.existsSync(sessionMapPath)) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
const sessionMap = JSON.parse(fs_1.default.readFileSync(sessionMapPath, 'utf8'));
|
|
99
|
+
return Object.keys(sessionMap);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
module.exports = ControllerInjector;
|
|
108
|
+
//# sourceMappingURL=controller-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-injector.js","sourceRoot":"","sources":["../../../src/utils/controller-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Tracker - Used to capture user questions and Claude responses
|
|
3
|
+
*/
|
|
4
|
+
interface ConversationMessage {
|
|
5
|
+
type: 'user' | 'claude';
|
|
6
|
+
content: string;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
}
|
|
9
|
+
interface ConversationSession {
|
|
10
|
+
created: string;
|
|
11
|
+
messages: ConversationMessage[];
|
|
12
|
+
}
|
|
13
|
+
interface ConversationMap {
|
|
14
|
+
[sessionId: string]: ConversationSession;
|
|
15
|
+
}
|
|
16
|
+
interface RecentConversation {
|
|
17
|
+
userQuestion: string;
|
|
18
|
+
claudeResponse: string;
|
|
19
|
+
}
|
|
20
|
+
declare class ConversationTracker {
|
|
21
|
+
conversationPath: string;
|
|
22
|
+
constructor();
|
|
23
|
+
ensureDataDir(): void;
|
|
24
|
+
recordUserMessage(sessionId: string, message: string): void;
|
|
25
|
+
recordClaudeResponse(sessionId: string, response: string): void;
|
|
26
|
+
getRecentConversation(sessionId: string, limit?: number): RecentConversation;
|
|
27
|
+
cleanupOldConversations(): number;
|
|
28
|
+
loadConversations(): ConversationMap;
|
|
29
|
+
saveConversations(conversations: ConversationMap): void;
|
|
30
|
+
}
|
|
31
|
+
export = ConversationTracker;
|
|
32
|
+
//# sourceMappingURL=conversation-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-tracker.d.ts","sourceRoot":"","sources":["../../../src/utils/conversation-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,UAAU,mBAAmB;IACzB,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,mBAAmB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,UAAU,eAAe;IACrB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAAC;CAC5C;AAED,UAAU,kBAAkB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,cAAM,mBAAmB;IACrB,gBAAgB,EAAE,MAAM,CAAC;;IAOzB,aAAa,IAAI,IAAI;IAQrB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAmB3D,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmB/D,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,kBAAkB;IA+B/E,uBAAuB,IAAI,MAAM;IAiBjC,iBAAiB,IAAI,eAAe;IAapC,iBAAiB,CAAC,aAAa,EAAE,eAAe,GAAG,IAAI;CAO1D;AAED,SAAS,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Conversation Tracker - Used to capture user questions and Claude responses
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const paths_1 = require("./paths");
|
|
11
|
+
class ConversationTracker {
|
|
12
|
+
conversationPath;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.conversationPath = path_1.default.join(paths_1.PROJECT_ROOT, 'src/data/conversations.json');
|
|
15
|
+
this.ensureDataDir();
|
|
16
|
+
}
|
|
17
|
+
ensureDataDir() {
|
|
18
|
+
const dir = path_1.default.dirname(this.conversationPath);
|
|
19
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
20
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Record user question
|
|
24
|
+
recordUserMessage(sessionId, message) {
|
|
25
|
+
const conversations = this.loadConversations();
|
|
26
|
+
if (!conversations[sessionId]) {
|
|
27
|
+
conversations[sessionId] = {
|
|
28
|
+
created: new Date().toISOString(),
|
|
29
|
+
messages: []
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
conversations[sessionId].messages.push({
|
|
33
|
+
type: 'user',
|
|
34
|
+
content: message,
|
|
35
|
+
timestamp: new Date().toISOString()
|
|
36
|
+
});
|
|
37
|
+
this.saveConversations(conversations);
|
|
38
|
+
}
|
|
39
|
+
// Record Claude response
|
|
40
|
+
recordClaudeResponse(sessionId, response) {
|
|
41
|
+
const conversations = this.loadConversations();
|
|
42
|
+
if (!conversations[sessionId]) {
|
|
43
|
+
conversations[sessionId] = {
|
|
44
|
+
created: new Date().toISOString(),
|
|
45
|
+
messages: []
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
conversations[sessionId].messages.push({
|
|
49
|
+
type: 'claude',
|
|
50
|
+
content: response,
|
|
51
|
+
timestamp: new Date().toISOString()
|
|
52
|
+
});
|
|
53
|
+
this.saveConversations(conversations);
|
|
54
|
+
}
|
|
55
|
+
// Get recent conversation content
|
|
56
|
+
getRecentConversation(sessionId, limit = 2) {
|
|
57
|
+
const conversations = this.loadConversations();
|
|
58
|
+
const session = conversations[sessionId];
|
|
59
|
+
if (!session || !session.messages.length) {
|
|
60
|
+
return { userQuestion: '', claudeResponse: '' };
|
|
61
|
+
}
|
|
62
|
+
const messages = session.messages.slice(-limit * 2); // Get recent user-Claude conversation
|
|
63
|
+
let userQuestion = '';
|
|
64
|
+
let claudeResponse = '';
|
|
65
|
+
// Find most recent user question and Claude response from back to front
|
|
66
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
67
|
+
const msg = messages[i];
|
|
68
|
+
if (msg.type === 'claude' && !claudeResponse) {
|
|
69
|
+
claudeResponse = msg.content;
|
|
70
|
+
}
|
|
71
|
+
else if (msg.type === 'user' && !userQuestion) {
|
|
72
|
+
userQuestion = msg.content;
|
|
73
|
+
}
|
|
74
|
+
if (userQuestion && claudeResponse)
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
userQuestion: userQuestion || 'Unrecorded user question',
|
|
79
|
+
claudeResponse: claudeResponse || 'Unrecorded Claude response'
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Clean up expired conversations (older than 7 days)
|
|
83
|
+
cleanupOldConversations() {
|
|
84
|
+
const conversations = this.loadConversations();
|
|
85
|
+
const now = new Date();
|
|
86
|
+
const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
87
|
+
const cleaned = {};
|
|
88
|
+
for (const [sessionId, session] of Object.entries(conversations)) {
|
|
89
|
+
const created = new Date(session.created);
|
|
90
|
+
if (created > sevenDaysAgo) {
|
|
91
|
+
cleaned[sessionId] = session;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.saveConversations(cleaned);
|
|
95
|
+
return Object.keys(conversations).length - Object.keys(cleaned).length;
|
|
96
|
+
}
|
|
97
|
+
loadConversations() {
|
|
98
|
+
if (!fs_1.default.existsSync(this.conversationPath)) {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
return JSON.parse(fs_1.default.readFileSync(this.conversationPath, 'utf8'));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error('Failed to load conversations:', error);
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
saveConversations(conversations) {
|
|
110
|
+
try {
|
|
111
|
+
fs_1.default.writeFileSync(this.conversationPath, JSON.stringify(conversations, null, 2));
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error('Failed to save conversations:', error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
module.exports = ConversationTracker;
|
|
119
|
+
//# sourceMappingURL=conversation-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-tracker.js","sourceRoot":"","sources":["../../../src/utils/conversation-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Link Utility — Generate Claude Code deep links.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code supports `claude-cli://open?q=...` deep links (v2.1.85+).
|
|
5
|
+
* - Up to 5,000 characters
|
|
6
|
+
* - Multi-line support via %0A
|
|
7
|
+
* - Opens in user's preferred terminal
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Generate a Claude Code deep link for the given prompt.
|
|
11
|
+
* Returns null if prompt is too long.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateDeepLink(prompt: string): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Generate a deep link with a specific working directory.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateDeepLinkWithCwd(prompt: string, cwd: string): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a prompt can be converted to a deep link.
|
|
20
|
+
*/
|
|
21
|
+
export declare function canGenerateDeepLink(prompt: string): boolean;
|
|
22
|
+
//# sourceMappingURL=deep-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-link.d.ts","sourceRoot":"","sources":["../../../src/utils/deep-link.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deep Link Utility — Generate Claude Code deep links.
|
|
4
|
+
*
|
|
5
|
+
* Claude Code supports `claude-cli://open?q=...` deep links (v2.1.85+).
|
|
6
|
+
* - Up to 5,000 characters
|
|
7
|
+
* - Multi-line support via %0A
|
|
8
|
+
* - Opens in user's preferred terminal
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.generateDeepLink = generateDeepLink;
|
|
12
|
+
exports.generateDeepLinkWithCwd = generateDeepLinkWithCwd;
|
|
13
|
+
exports.canGenerateDeepLink = canGenerateDeepLink;
|
|
14
|
+
const MAX_PROMPT_LENGTH = 4500; // Leave room for URL overhead
|
|
15
|
+
/**
|
|
16
|
+
* Generate a Claude Code deep link for the given prompt.
|
|
17
|
+
* Returns null if prompt is too long.
|
|
18
|
+
*/
|
|
19
|
+
function generateDeepLink(prompt) {
|
|
20
|
+
if (prompt.length > MAX_PROMPT_LENGTH) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const encoded = encodeURIComponent(prompt);
|
|
24
|
+
return `claude-cli://open?q=${encoded}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generate a deep link with a specific working directory.
|
|
28
|
+
*/
|
|
29
|
+
function generateDeepLinkWithCwd(prompt, cwd) {
|
|
30
|
+
if (prompt.length + cwd.length > MAX_PROMPT_LENGTH) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const encodedPrompt = encodeURIComponent(prompt);
|
|
34
|
+
const encodedCwd = encodeURIComponent(cwd);
|
|
35
|
+
return `claude-cli://open?q=${encodedPrompt}&cwd=${encodedCwd}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if a prompt can be converted to a deep link.
|
|
39
|
+
*/
|
|
40
|
+
function canGenerateDeepLink(prompt) {
|
|
41
|
+
return prompt.length <= MAX_PROMPT_LENGTH;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=deep-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-link.js","sourceRoot":"","sources":["../../../src/utils/deep-link.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAQH,4CAMC;AAKD,0DAOC;AAKD,kDAEC;AA/BD,MAAM,iBAAiB,GAAG,IAAI,CAAC,CAAC,8BAA8B;AAE9D;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,uBAAuB,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,MAAc,EAAE,GAAW;IACjE,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,uBAAuB,aAAa,QAAQ,UAAU,EAAE,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,MAAc;IAChD,OAAO,MAAM,CAAC,MAAM,IAAI,iBAAiB,CAAC;AAC5C,CAAC"}
|