@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,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Prompt Bridge — File-based IPC for Claude Code interactive prompts.
|
|
4
|
+
*
|
|
5
|
+
* Manages /tmp/claude-prompts/ directory with pending/response files
|
|
6
|
+
* so that hooks (permission-hook.js, question-notify.js) can communicate
|
|
7
|
+
* with the Telegram bot's callback query handler.
|
|
8
|
+
*
|
|
9
|
+
* File format:
|
|
10
|
+
* pending-<id>.json — written by hook, read by bot callback handler
|
|
11
|
+
* response-<id>.json — written by bot callback handler, read by hook
|
|
12
|
+
*/
|
|
13
|
+
declare const PROMPTS_DIR: string;
|
|
14
|
+
/** Generate a unique 8-char prompt ID. */
|
|
15
|
+
declare function generatePromptId(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Write a pending prompt file.
|
|
18
|
+
*/
|
|
19
|
+
declare function writePending(id: string, data: Record<string, unknown>): void;
|
|
20
|
+
/**
|
|
21
|
+
* Write a response file (from bot callback).
|
|
22
|
+
*/
|
|
23
|
+
declare function writeResponse(id: string, data: Record<string, unknown>): void;
|
|
24
|
+
/**
|
|
25
|
+
* Read a response file if it exists.
|
|
26
|
+
*/
|
|
27
|
+
declare function readResponse(id: string): Record<string, unknown> | null;
|
|
28
|
+
/**
|
|
29
|
+
* Read a pending prompt file.
|
|
30
|
+
*/
|
|
31
|
+
declare function readPending(id: string): Record<string, unknown> | null;
|
|
32
|
+
/**
|
|
33
|
+
* Check if there's a pending prompt for a given workspace.
|
|
34
|
+
* Used by enhanced-hook-notify.js for deduplication.
|
|
35
|
+
*/
|
|
36
|
+
declare function hasPendingForWorkspace(workspace: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Remove pending and response files older than EXPIRY_MS.
|
|
39
|
+
*/
|
|
40
|
+
declare function cleanExpired(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Remove pending and response files for a given prompt ID.
|
|
43
|
+
*/
|
|
44
|
+
declare function cleanPrompt(id: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Update fields on an existing pending prompt file.
|
|
47
|
+
*/
|
|
48
|
+
declare function updatePending(id: string, updates: Record<string, unknown>): void;
|
|
49
|
+
export { generatePromptId, writePending, updatePending, writeResponse, readResponse, readPending, hasPendingForWorkspace, cleanExpired, cleanPrompt, PROMPTS_DIR, };
|
|
50
|
+
//# sourceMappingURL=prompt-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-bridge.d.ts","sourceRoot":"","sources":["../prompt-bridge.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAMH,QAAA,MAAM,WAAW,QAAmD,CAAC;AAUrE,0CAA0C;AAC1C,iBAAS,gBAAgB,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,iBAAS,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKrE;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAItE;AAED;;GAEG;AACH,iBAAS,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQhE;AAED;;GAEG;AACH,iBAAS,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQ/D;AAED;;;GAGG;AACH,iBAAS,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAyB1D;AAED;;GAEG;AACH,iBAAS,YAAY,IAAI,IAAI,CAqB5B;AAED;;GAEG;AACH,iBAAS,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAKrC;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKzE;AAED,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,WAAW,GACZ,CAAC"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Prompt Bridge — File-based IPC for Claude Code interactive prompts.
|
|
5
|
+
*
|
|
6
|
+
* Manages /tmp/claude-prompts/ directory with pending/response files
|
|
7
|
+
* so that hooks (permission-hook.js, question-notify.js) can communicate
|
|
8
|
+
* with the Telegram bot's callback query handler.
|
|
9
|
+
*
|
|
10
|
+
* File format:
|
|
11
|
+
* pending-<id>.json — written by hook, read by bot callback handler
|
|
12
|
+
* response-<id>.json — written by bot callback handler, read by hook
|
|
13
|
+
*/
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.PROMPTS_DIR = void 0;
|
|
19
|
+
exports.generatePromptId = generatePromptId;
|
|
20
|
+
exports.writePending = writePending;
|
|
21
|
+
exports.updatePending = updatePending;
|
|
22
|
+
exports.writeResponse = writeResponse;
|
|
23
|
+
exports.readResponse = readResponse;
|
|
24
|
+
exports.readPending = readPending;
|
|
25
|
+
exports.hasPendingForWorkspace = hasPendingForWorkspace;
|
|
26
|
+
exports.cleanExpired = cleanExpired;
|
|
27
|
+
exports.cleanPrompt = cleanPrompt;
|
|
28
|
+
const fs_1 = __importDefault(require("fs"));
|
|
29
|
+
const path_1 = __importDefault(require("path"));
|
|
30
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
31
|
+
const PROMPTS_DIR = process.env.PROMPTS_DIR || '/tmp/claude-prompts';
|
|
32
|
+
exports.PROMPTS_DIR = PROMPTS_DIR;
|
|
33
|
+
const EXPIRY_MS = 5 * 60 * 1000; // 5 minutes
|
|
34
|
+
/** Ensure the prompts directory exists. */
|
|
35
|
+
function ensureDir() {
|
|
36
|
+
if (!fs_1.default.existsSync(PROMPTS_DIR)) {
|
|
37
|
+
fs_1.default.mkdirSync(PROMPTS_DIR, { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Generate a unique 8-char prompt ID. */
|
|
41
|
+
function generatePromptId() {
|
|
42
|
+
return crypto_1.default.randomBytes(4).toString('hex');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Write a pending prompt file.
|
|
46
|
+
*/
|
|
47
|
+
function writePending(id, data) {
|
|
48
|
+
ensureDir();
|
|
49
|
+
cleanExpired();
|
|
50
|
+
const filePath = path_1.default.join(PROMPTS_DIR, `pending-${id}.json`);
|
|
51
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify({ ...data, createdAt: Date.now() }, null, 2));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Write a response file (from bot callback).
|
|
55
|
+
*/
|
|
56
|
+
function writeResponse(id, data) {
|
|
57
|
+
ensureDir();
|
|
58
|
+
const filePath = path_1.default.join(PROMPTS_DIR, `response-${id}.json`);
|
|
59
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify({ ...data, respondedAt: Date.now() }, null, 2));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Read a response file if it exists.
|
|
63
|
+
*/
|
|
64
|
+
function readResponse(id) {
|
|
65
|
+
const filePath = path_1.default.join(PROMPTS_DIR, `response-${id}.json`);
|
|
66
|
+
try {
|
|
67
|
+
const raw = fs_1.default.readFileSync(filePath, 'utf8');
|
|
68
|
+
return JSON.parse(raw);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read a pending prompt file.
|
|
76
|
+
*/
|
|
77
|
+
function readPending(id) {
|
|
78
|
+
const filePath = path_1.default.join(PROMPTS_DIR, `pending-${id}.json`);
|
|
79
|
+
try {
|
|
80
|
+
const raw = fs_1.default.readFileSync(filePath, 'utf8');
|
|
81
|
+
return JSON.parse(raw);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if there's a pending prompt for a given workspace.
|
|
89
|
+
* Used by enhanced-hook-notify.js for deduplication.
|
|
90
|
+
*/
|
|
91
|
+
function hasPendingForWorkspace(workspace) {
|
|
92
|
+
ensureDir();
|
|
93
|
+
try {
|
|
94
|
+
const files = fs_1.default.readdirSync(PROMPTS_DIR);
|
|
95
|
+
for (const file of files) {
|
|
96
|
+
if (!file.startsWith('pending-'))
|
|
97
|
+
continue;
|
|
98
|
+
try {
|
|
99
|
+
const raw = fs_1.default.readFileSync(path_1.default.join(PROMPTS_DIR, file), 'utf8');
|
|
100
|
+
const data = JSON.parse(raw);
|
|
101
|
+
// Only count non-expired pending files
|
|
102
|
+
if (data.workspace === workspace && (Date.now() - data.createdAt) < EXPIRY_MS) {
|
|
103
|
+
// Check that no response exists for this prompt
|
|
104
|
+
const id = file.replace('pending-', '').replace('.json', '');
|
|
105
|
+
if (!readResponse(id)) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Skip malformed files
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Directory read failed
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Remove pending and response files older than EXPIRY_MS.
|
|
122
|
+
*/
|
|
123
|
+
function cleanExpired() {
|
|
124
|
+
try {
|
|
125
|
+
if (!fs_1.default.existsSync(PROMPTS_DIR))
|
|
126
|
+
return;
|
|
127
|
+
const files = fs_1.default.readdirSync(PROMPTS_DIR);
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
for (const file of files) {
|
|
130
|
+
if (!file.endsWith('.json'))
|
|
131
|
+
continue;
|
|
132
|
+
const filePath = path_1.default.join(PROMPTS_DIR, file);
|
|
133
|
+
try {
|
|
134
|
+
const stat = fs_1.default.statSync(filePath);
|
|
135
|
+
if (now - stat.mtimeMs > EXPIRY_MS) {
|
|
136
|
+
fs_1.default.unlinkSync(filePath);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Skip if file was already removed
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Directory doesn't exist or isn't readable
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Remove pending and response files for a given prompt ID.
|
|
150
|
+
*/
|
|
151
|
+
function cleanPrompt(id) {
|
|
152
|
+
const pending = path_1.default.join(PROMPTS_DIR, `pending-${id}.json`);
|
|
153
|
+
const response = path_1.default.join(PROMPTS_DIR, `response-${id}.json`);
|
|
154
|
+
try {
|
|
155
|
+
fs_1.default.unlinkSync(pending);
|
|
156
|
+
}
|
|
157
|
+
catch { }
|
|
158
|
+
try {
|
|
159
|
+
fs_1.default.unlinkSync(response);
|
|
160
|
+
}
|
|
161
|
+
catch { }
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Update fields on an existing pending prompt file.
|
|
165
|
+
*/
|
|
166
|
+
function updatePending(id, updates) {
|
|
167
|
+
const existing = readPending(id);
|
|
168
|
+
if (!existing)
|
|
169
|
+
return;
|
|
170
|
+
const filePath = path_1.default.join(PROMPTS_DIR, `pending-${id}.json`);
|
|
171
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify({ ...existing, ...updates }, null, 2));
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=prompt-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-bridge.js","sourceRoot":"","sources":["../prompt-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Question Notify — Called by Claude Code's PreToolUse hook (matcher: AskUserQuestion).
|
|
4
|
+
*
|
|
5
|
+
* BLOCKING mode (v2.0): Sends Telegram notification with option buttons, polls for
|
|
6
|
+
* user selection, then outputs `updatedInput` via stdout so Claude Code receives
|
|
7
|
+
* the answer directly — no keystroke injection needed!
|
|
8
|
+
*
|
|
9
|
+
* This works with ANY terminal (tmux, Ghostty, bare terminal).
|
|
10
|
+
*
|
|
11
|
+
* Stdin JSON: { tool_name, tool_input, cwd, session_id, hook_event_name }
|
|
12
|
+
* tool_input.questions: [{ question, header, options: [{ label, description }], multiSelect }]
|
|
13
|
+
*
|
|
14
|
+
* Stdout: { hookSpecificOutput: { updatedInput: { questions: [...] }, permissionDecision: "allow" } }
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=question-notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question-notify.d.ts","sourceRoot":"","sources":["../question-notify.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Question Notify — Called by Claude Code's PreToolUse hook (matcher: AskUserQuestion).
|
|
5
|
+
*
|
|
6
|
+
* BLOCKING mode (v2.0): Sends Telegram notification with option buttons, polls for
|
|
7
|
+
* user selection, then outputs `updatedInput` via stdout so Claude Code receives
|
|
8
|
+
* the answer directly — no keystroke injection needed!
|
|
9
|
+
*
|
|
10
|
+
* This works with ANY terminal (tmux, Ghostty, bare terminal).
|
|
11
|
+
*
|
|
12
|
+
* Stdin JSON: { tool_name, tool_input, cwd, session_id, hook_event_name }
|
|
13
|
+
* tool_input.questions: [{ question, header, options: [{ label, description }], multiSelect }]
|
|
14
|
+
*
|
|
15
|
+
* Stdout: { hookSpecificOutput: { updatedInput: { questions: [...] }, permissionDecision: "allow" } }
|
|
16
|
+
*/
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
const path_1 = __importDefault(require("path"));
|
|
22
|
+
const paths_1 = require("./src/utils/paths");
|
|
23
|
+
require('dotenv').config({ path: path_1.default.join(paths_1.PROJECT_ROOT, '.env'), quiet: true });
|
|
24
|
+
const fs_1 = __importDefault(require("fs"));
|
|
25
|
+
const https_1 = __importDefault(require("https"));
|
|
26
|
+
const workspace_router_1 = require("./workspace-router");
|
|
27
|
+
const prompt_bridge_1 = require("./prompt-bridge");
|
|
28
|
+
const active_check_1 = require("./src/utils/active-check");
|
|
29
|
+
const BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN;
|
|
30
|
+
const CHAT_ID = process.env.TELEGRAM_CHAT_ID;
|
|
31
|
+
// Polling configuration (same as permission-hook.ts)
|
|
32
|
+
const POLL_INTERVAL_MS = 500;
|
|
33
|
+
const POLL_TIMEOUT_MS = 90000; // 90 seconds
|
|
34
|
+
// ── Main ────────────────────────────────────────────────────────
|
|
35
|
+
async function main() {
|
|
36
|
+
const raw = await readStdin();
|
|
37
|
+
// Skip Telegram notification if user is at terminal AND this wasn't Telegram-injected.
|
|
38
|
+
// If the command came from Telegram, the question must go back to Telegram.
|
|
39
|
+
const typingActivePath = path_1.default.join(paths_1.PROJECT_ROOT, 'src/data', 'typing-active');
|
|
40
|
+
const isTelegramInjected = fs_1.default.existsSync(typingActivePath);
|
|
41
|
+
if (!isTelegramInjected && (0, active_check_1.isUserActiveAtTerminal)()) {
|
|
42
|
+
// User is at terminal — let Claude Code show its native UI
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
let payload;
|
|
46
|
+
try {
|
|
47
|
+
payload = JSON.parse(raw);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const toolInput = (payload.tool_input || {});
|
|
53
|
+
const cwd = payload.cwd || process.cwd();
|
|
54
|
+
const workspace = (0, workspace_router_1.extractWorkspaceName)(cwd);
|
|
55
|
+
// Extract questions from tool_input
|
|
56
|
+
const questions = (toolInput.questions || []);
|
|
57
|
+
if (questions.length === 0) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Detect session name (for session map, even though we don't inject keystrokes)
|
|
61
|
+
const tmuxSession = detectSessionName(cwd);
|
|
62
|
+
// Collect answers: map of question text → selected label(s)
|
|
63
|
+
// Multi-select: join labels with commas (Claude Code format).
|
|
64
|
+
const answers = {};
|
|
65
|
+
// Process each question (usually just one)
|
|
66
|
+
for (let qi = 0; qi < questions.length; qi++) {
|
|
67
|
+
const q = questions[qi];
|
|
68
|
+
const promptId = (0, prompt_bridge_1.generatePromptId)(); // Unique ID per question
|
|
69
|
+
const questionText = q.question || 'Question';
|
|
70
|
+
const options = q.options || [];
|
|
71
|
+
const isLast = qi === questions.length - 1;
|
|
72
|
+
const isMultiSelect = q.multiSelect || false;
|
|
73
|
+
let messageText = `\u2753 *Question* — ${escapeMarkdown(workspace)}\n\n${escapeMarkdown(questionText)}`;
|
|
74
|
+
if (options.length > 0) {
|
|
75
|
+
// Build inline keyboard with numbered options
|
|
76
|
+
const prefix = isMultiSelect ? '\u2610 ' : '';
|
|
77
|
+
const buttons = options.map((opt, idx) => ({
|
|
78
|
+
text: `${prefix}${idx + 1}. ${opt.label}`,
|
|
79
|
+
callback_data: `opt:${promptId}:${idx + 1}`,
|
|
80
|
+
}));
|
|
81
|
+
// Arrange buttons in rows (max 2 per row for readability)
|
|
82
|
+
const keyboard = [];
|
|
83
|
+
for (let i = 0; i < buttons.length; i += 2) {
|
|
84
|
+
keyboard.push(buttons.slice(i, i + 2));
|
|
85
|
+
}
|
|
86
|
+
// Add Submit button for multi-select questions
|
|
87
|
+
if (isMultiSelect) {
|
|
88
|
+
keyboard.push([{ text: '\u2705 Submit', callback_data: `opt-submit:${promptId}` }]);
|
|
89
|
+
}
|
|
90
|
+
// Add option descriptions to the message
|
|
91
|
+
const optionLines = options.map((opt, idx) => `*${idx + 1}.* ${escapeMarkdown(opt.label)}${opt.description ? ` — _${escapeMarkdown(opt.description)}_` : ''}`);
|
|
92
|
+
messageText += '\n\n' + optionLines.join('\n');
|
|
93
|
+
// Write pending file so bot callback handler can write response
|
|
94
|
+
(0, prompt_bridge_1.writePending)(promptId, {
|
|
95
|
+
type: 'question',
|
|
96
|
+
workspace,
|
|
97
|
+
tmuxSession,
|
|
98
|
+
questionText,
|
|
99
|
+
options: options.map(o => o.label),
|
|
100
|
+
multiSelect: isMultiSelect,
|
|
101
|
+
selectedOptions: isMultiSelect ? options.map(() => false) : undefined,
|
|
102
|
+
isLast,
|
|
103
|
+
});
|
|
104
|
+
// Send Telegram message with inline keyboard
|
|
105
|
+
try {
|
|
106
|
+
const result = await sendTelegramWithKeyboard(messageText, { inline_keyboard: keyboard });
|
|
107
|
+
if (result && result.message_id) {
|
|
108
|
+
(0, workspace_router_1.trackNotificationMessage)(result.message_id, workspace, 'question');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
process.stderr.write(`[question-notify] Telegram send failed: ${err.message}\n`);
|
|
113
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
114
|
+
return; // Can't notify — exit without output
|
|
115
|
+
}
|
|
116
|
+
// Poll for response
|
|
117
|
+
const response = await pollForResponse(promptId);
|
|
118
|
+
if (response) {
|
|
119
|
+
// Extract answer from response
|
|
120
|
+
if (isMultiSelect) {
|
|
121
|
+
// Multi-select: response.selectedLabels is string[] — join with commas
|
|
122
|
+
const selectedLabels = response.selectedLabels || [];
|
|
123
|
+
answers[questionText] = selectedLabels.join(',');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Single-select: response.selectedLabel is string
|
|
127
|
+
const selectedLabel = response.selectedLabel || '';
|
|
128
|
+
answers[questionText] = selectedLabel;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Timed out — exit without output (Claude Code will show native UI on retry)
|
|
133
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// No options — free text question
|
|
140
|
+
messageText += `\n\n_Reply to this message with your answer_`;
|
|
141
|
+
(0, prompt_bridge_1.writePending)(promptId, {
|
|
142
|
+
type: 'question-freetext',
|
|
143
|
+
workspace,
|
|
144
|
+
tmuxSession,
|
|
145
|
+
questionText,
|
|
146
|
+
isLast,
|
|
147
|
+
});
|
|
148
|
+
try {
|
|
149
|
+
const result = await sendTelegram(messageText);
|
|
150
|
+
if (result && result.message_id) {
|
|
151
|
+
(0, workspace_router_1.trackNotificationMessage)(result.message_id, workspace, 'question-freetext');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
process.stderr.write(`[question-notify] Telegram send failed: ${err.message}\n`);
|
|
156
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Poll for response
|
|
160
|
+
const response = await pollForResponse(promptId);
|
|
161
|
+
if (response) {
|
|
162
|
+
const textAnswer = response.textAnswer || '';
|
|
163
|
+
answers[questionText] = textAnswer;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Output updatedInput to stdout so Claude Code receives the answers directly.
|
|
173
|
+
// Format: echo back original questions + separate `answers` object.
|
|
174
|
+
if (Object.keys(answers).length > 0) {
|
|
175
|
+
const output = {
|
|
176
|
+
hookSpecificOutput: {
|
|
177
|
+
hookEventName: 'PreToolUse',
|
|
178
|
+
permissionDecision: 'allow',
|
|
179
|
+
updatedInput: {
|
|
180
|
+
questions,
|
|
181
|
+
answers,
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
process.stdout.write(JSON.stringify(output) + '\n');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// ── Polling ─────────────────────────────────────────────────────
|
|
189
|
+
function pollForResponse(promptId) {
|
|
190
|
+
return new Promise((resolve) => {
|
|
191
|
+
const responseFile = path_1.default.join(prompt_bridge_1.PROMPTS_DIR, `response-${promptId}.json`);
|
|
192
|
+
const startTime = Date.now();
|
|
193
|
+
const interval = setInterval(() => {
|
|
194
|
+
// Check timeout
|
|
195
|
+
if (Date.now() - startTime > POLL_TIMEOUT_MS) {
|
|
196
|
+
clearInterval(interval);
|
|
197
|
+
process.stderr.write(`[question-notify] Timed out waiting for response\n`);
|
|
198
|
+
resolve(null);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Check for response file
|
|
202
|
+
try {
|
|
203
|
+
if (fs_1.default.existsSync(responseFile)) {
|
|
204
|
+
const raw = fs_1.default.readFileSync(responseFile, 'utf8');
|
|
205
|
+
const data = JSON.parse(raw);
|
|
206
|
+
clearInterval(interval);
|
|
207
|
+
resolve(data);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// File not ready yet or parse error — keep polling
|
|
212
|
+
}
|
|
213
|
+
}, POLL_INTERVAL_MS);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// ── Telegram ────────────────────────────────────────────────────
|
|
217
|
+
function sendTelegramWithKeyboard(text, replyMarkup) {
|
|
218
|
+
return new Promise((resolve, reject) => {
|
|
219
|
+
const body = JSON.stringify({
|
|
220
|
+
chat_id: CHAT_ID,
|
|
221
|
+
text,
|
|
222
|
+
parse_mode: 'Markdown',
|
|
223
|
+
reply_markup: replyMarkup,
|
|
224
|
+
});
|
|
225
|
+
const options = {
|
|
226
|
+
hostname: 'api.telegram.org',
|
|
227
|
+
path: `/bot${BOT_TOKEN}/sendMessage`,
|
|
228
|
+
method: 'POST',
|
|
229
|
+
headers: {
|
|
230
|
+
'Content-Type': 'application/json',
|
|
231
|
+
'Content-Length': Buffer.byteLength(body),
|
|
232
|
+
},
|
|
233
|
+
timeout: 5000,
|
|
234
|
+
};
|
|
235
|
+
const req = https_1.default.request(options, (res) => {
|
|
236
|
+
let data = '';
|
|
237
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
238
|
+
res.on('end', () => {
|
|
239
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
240
|
+
try {
|
|
241
|
+
const parsed = JSON.parse(data);
|
|
242
|
+
resolve(parsed.result || null);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
resolve(null);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
reject(new Error(`Telegram API ${res.statusCode}: ${data}`));
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
req.on('error', reject);
|
|
254
|
+
req.on('timeout', () => {
|
|
255
|
+
req.destroy();
|
|
256
|
+
reject(new Error('Telegram request timed out'));
|
|
257
|
+
});
|
|
258
|
+
req.write(body);
|
|
259
|
+
req.end();
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function sendTelegram(text) {
|
|
263
|
+
return new Promise((resolve, reject) => {
|
|
264
|
+
const body = JSON.stringify({
|
|
265
|
+
chat_id: CHAT_ID,
|
|
266
|
+
text,
|
|
267
|
+
parse_mode: 'Markdown',
|
|
268
|
+
});
|
|
269
|
+
const options = {
|
|
270
|
+
hostname: 'api.telegram.org',
|
|
271
|
+
path: `/bot${BOT_TOKEN}/sendMessage`,
|
|
272
|
+
method: 'POST',
|
|
273
|
+
headers: {
|
|
274
|
+
'Content-Type': 'application/json',
|
|
275
|
+
'Content-Length': Buffer.byteLength(body),
|
|
276
|
+
},
|
|
277
|
+
timeout: 5000,
|
|
278
|
+
};
|
|
279
|
+
const req = https_1.default.request(options, (res) => {
|
|
280
|
+
let data = '';
|
|
281
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
282
|
+
res.on('end', () => {
|
|
283
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
284
|
+
try {
|
|
285
|
+
const parsed = JSON.parse(data);
|
|
286
|
+
resolve(parsed.result || null);
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
resolve(null);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
reject(new Error(`Telegram API ${res.statusCode}: ${data}`));
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
req.on('error', reject);
|
|
298
|
+
req.on('timeout', () => {
|
|
299
|
+
req.destroy();
|
|
300
|
+
reject(new Error('Telegram request timed out'));
|
|
301
|
+
});
|
|
302
|
+
req.write(body);
|
|
303
|
+
req.end();
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
// ── Helpers ──────────────────────────────────────────────────────
|
|
307
|
+
function readStdin() {
|
|
308
|
+
return new Promise((resolve) => {
|
|
309
|
+
let data = '';
|
|
310
|
+
let resolved = false;
|
|
311
|
+
process.stdin.setEncoding('utf8');
|
|
312
|
+
process.stdin.on('data', (chunk) => { data += chunk; });
|
|
313
|
+
process.stdin.on('end', () => {
|
|
314
|
+
if (!resolved) {
|
|
315
|
+
resolved = true;
|
|
316
|
+
resolve(data);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
setTimeout(() => {
|
|
320
|
+
if (!resolved) {
|
|
321
|
+
resolved = true;
|
|
322
|
+
process.stdin.destroy();
|
|
323
|
+
resolve(data || '{}');
|
|
324
|
+
}
|
|
325
|
+
}, 500);
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
function detectSessionName(cwd) {
|
|
329
|
+
// 1. Try tmux (existing behaviour)
|
|
330
|
+
if (process.env.TMUX) {
|
|
331
|
+
try {
|
|
332
|
+
const { execSync } = require('child_process');
|
|
333
|
+
return execSync('tmux display-message -p "#S"', { encoding: 'utf8' }).trim();
|
|
334
|
+
}
|
|
335
|
+
catch { }
|
|
336
|
+
}
|
|
337
|
+
// 2. Ghostty — derive from CWD (explicit for clarity, same result as fallback)
|
|
338
|
+
if (process.env.TERM_PROGRAM === 'ghostty') {
|
|
339
|
+
const raw = (0, workspace_router_1.extractWorkspaceName)(cwd);
|
|
340
|
+
return raw ? raw.replace(/[.:\s]/g, '-') : null;
|
|
341
|
+
}
|
|
342
|
+
// 3. Derive from CWD — apply the same sanitization /new uses for session names
|
|
343
|
+
// (dots, colons, spaces → hyphens) so the name matches the PTY handle key
|
|
344
|
+
const raw = (0, workspace_router_1.extractWorkspaceName)(cwd);
|
|
345
|
+
if (!raw)
|
|
346
|
+
return null;
|
|
347
|
+
return raw.replace(/[.:\s]/g, '-');
|
|
348
|
+
}
|
|
349
|
+
function escapeMarkdown(text) {
|
|
350
|
+
return text.replace(/([_*`\[])/g, '\\$1');
|
|
351
|
+
}
|
|
352
|
+
// ── Run ─────────────────────────────────────────────────────────
|
|
353
|
+
main().catch((err) => {
|
|
354
|
+
process.stderr.write(`[question-notify] Fatal: ${err.message}\n`);
|
|
355
|
+
});
|
|
356
|
+
//# sourceMappingURL=question-notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question-notify.js","sourceRoot":"","sources":["../question-notify.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cheesyboy interactive setup (fork of ccgram).
|
|
4
|
+
* - Guides user through Telegram bot configuration
|
|
5
|
+
* - Installs to ~/.ccgram/ for persistent hook paths
|
|
6
|
+
* - Merges required hooks into ~/.claude/settings.json
|
|
7
|
+
* - Generates launchd/systemd service file
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../setup.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
|