@jsayubi/ccgram 1.1.1 → 1.2.1
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 +3 -0
- package/README.md +82 -51
- 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 +8 -1
- package/dist/enhanced-hook-notify.d.ts.map +1 -1
- package/dist/enhanced-hook-notify.js +119 -5
- package/dist/enhanced-hook-notify.js.map +1 -1
- 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.js +43 -18
- package/dist/permission-hook.js.map +1 -1
- 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/question-notify.d.ts +6 -5
- package/dist/question-notify.d.ts.map +1 -1
- package/dist/question-notify.js +107 -23
- package/dist/question-notify.js.map +1 -1
- package/dist/setup.js +26 -10
- package/dist/setup.js.map +1 -1
- package/dist/src/types/callbacks.d.ts +11 -1
- package/dist/src/types/callbacks.d.ts.map +1 -1
- package/dist/src/types/session.d.ts +13 -1
- package/dist/src/types/session.d.ts.map +1 -1
- package/dist/src/utils/callback-parser.d.ts +7 -5
- package/dist/src/utils/callback-parser.d.ts.map +1 -1
- package/dist/src/utils/callback-parser.js +11 -5
- package/dist/src/utils/callback-parser.js.map +1 -1
- 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/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/workspace-router.d.ts +19 -4
- package/dist/workspace-router.d.ts.map +1 -1
- package/dist/workspace-router.js +57 -1
- package/dist/workspace-router.js.map +1 -1
- package/dist/workspace-telegram-bot.js +515 -114
- package/dist/workspace-telegram-bot.js.map +1 -1
- package/package.json +1 -1
- package/src/types/callbacks.ts +15 -1
- package/src/types/session.ts +14 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Pre-Compact Notify — Called by Claude Code's PreCompact hook.
|
|
5
|
+
*
|
|
6
|
+
* BLOCKING mode: Notifies user before context compaction, allows them to
|
|
7
|
+
* block it if they want to preserve context.
|
|
8
|
+
*
|
|
9
|
+
* Stdin JSON: { cwd, session_id, tokens_current, ... }
|
|
10
|
+
* Stdout: { hookSpecificOutput: { decision: "block" } } — to prevent compaction
|
|
11
|
+
* (or exit silently to allow compaction)
|
|
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 https_1 = __importDefault(require("https"));
|
|
22
|
+
const workspace_router_1 = require("./workspace-router");
|
|
23
|
+
const prompt_bridge_1 = require("./prompt-bridge");
|
|
24
|
+
const active_check_1 = require("./src/utils/active-check");
|
|
25
|
+
const BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN;
|
|
26
|
+
const CHAT_ID = process.env.TELEGRAM_CHAT_ID;
|
|
27
|
+
// Polling configuration
|
|
28
|
+
const POLL_INTERVAL_MS = 500;
|
|
29
|
+
const POLL_TIMEOUT_MS = 30000; // 30 seconds to decide
|
|
30
|
+
// ── Main ────────────────────────────────────────────────────────
|
|
31
|
+
async function main() {
|
|
32
|
+
const raw = await readStdin();
|
|
33
|
+
// Skip Telegram notification if user is at terminal AND this wasn't Telegram-injected
|
|
34
|
+
const typingActivePath = path_1.default.join(paths_1.PROJECT_ROOT, 'src/data', 'typing-active');
|
|
35
|
+
const isTelegramInjected = fs_1.default.existsSync(typingActivePath);
|
|
36
|
+
if (!isTelegramInjected && (0, active_check_1.isUserActiveAtTerminal)()) {
|
|
37
|
+
// User is at terminal — let compaction proceed automatically
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let payload;
|
|
41
|
+
try {
|
|
42
|
+
payload = JSON.parse(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const cwd = payload.cwd || process.cwd();
|
|
48
|
+
const workspace = (0, workspace_router_1.extractWorkspaceName)(cwd);
|
|
49
|
+
const tokensCurrent = payload.tokens_current;
|
|
50
|
+
const promptId = (0, prompt_bridge_1.generatePromptId)();
|
|
51
|
+
let messageText = `\u{1F4E6} *Context Compaction* — ${escapeMarkdown(workspace)}\n\n`;
|
|
52
|
+
messageText += `Context is getting large and will be compacted.`;
|
|
53
|
+
if (tokensCurrent) {
|
|
54
|
+
messageText += `\n\n_Current tokens: ${tokensCurrent.toLocaleString()}_`;
|
|
55
|
+
}
|
|
56
|
+
// Build inline keyboard with Proceed/Block buttons
|
|
57
|
+
const keyboard = [
|
|
58
|
+
[
|
|
59
|
+
{ text: '\u2705 Proceed', callback_data: `pre-compact:${promptId}:proceed` },
|
|
60
|
+
{ text: '\u{1F6D1} Block', callback_data: `pre-compact:${promptId}:block` },
|
|
61
|
+
],
|
|
62
|
+
];
|
|
63
|
+
// Write pending file
|
|
64
|
+
(0, prompt_bridge_1.writePending)(promptId, {
|
|
65
|
+
type: 'pre-compact',
|
|
66
|
+
workspace,
|
|
67
|
+
tokensCurrent,
|
|
68
|
+
});
|
|
69
|
+
// Send Telegram message
|
|
70
|
+
try {
|
|
71
|
+
const result = await sendTelegramWithKeyboard(messageText, { inline_keyboard: keyboard });
|
|
72
|
+
if (result && result.message_id) {
|
|
73
|
+
(0, workspace_router_1.trackNotificationMessage)(result.message_id, workspace, 'pre-compact');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
process.stderr.write(`[pre-compact-notify] Telegram send failed: ${err.message}\n`);
|
|
78
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
79
|
+
return; // Let compaction proceed on send failure
|
|
80
|
+
}
|
|
81
|
+
// Poll for response
|
|
82
|
+
const response = await pollForResponse(promptId);
|
|
83
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
84
|
+
if (response && response.action === 'block') {
|
|
85
|
+
const output = {
|
|
86
|
+
decision: 'block',
|
|
87
|
+
reason: 'User blocked compaction via Telegram to preserve context',
|
|
88
|
+
hookSpecificOutput: {
|
|
89
|
+
hookEventName: 'PreCompact',
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
process.stdout.write(JSON.stringify(output) + '\n');
|
|
93
|
+
}
|
|
94
|
+
// If proceed or timeout, exit silently — compaction proceeds
|
|
95
|
+
}
|
|
96
|
+
// ── Polling ─────────────────────────────────────────────────────
|
|
97
|
+
function pollForResponse(promptId) {
|
|
98
|
+
return new Promise((resolve) => {
|
|
99
|
+
const responseFile = path_1.default.join(prompt_bridge_1.PROMPTS_DIR, `response-${promptId}.json`);
|
|
100
|
+
const startTime = Date.now();
|
|
101
|
+
const interval = setInterval(() => {
|
|
102
|
+
if (Date.now() - startTime > POLL_TIMEOUT_MS) {
|
|
103
|
+
clearInterval(interval);
|
|
104
|
+
process.stderr.write(`[pre-compact-notify] Timed out — allowing compaction\n`);
|
|
105
|
+
resolve(null);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
if (fs_1.default.existsSync(responseFile)) {
|
|
110
|
+
const raw = fs_1.default.readFileSync(responseFile, 'utf8');
|
|
111
|
+
const data = JSON.parse(raw);
|
|
112
|
+
clearInterval(interval);
|
|
113
|
+
resolve(data);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// File not ready yet or parse error — keep polling
|
|
118
|
+
}
|
|
119
|
+
}, POLL_INTERVAL_MS);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// ── Telegram ────────────────────────────────────────────────────
|
|
123
|
+
function sendTelegramWithKeyboard(text, replyMarkup) {
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
const body = JSON.stringify({
|
|
126
|
+
chat_id: CHAT_ID,
|
|
127
|
+
text,
|
|
128
|
+
parse_mode: 'Markdown',
|
|
129
|
+
reply_markup: replyMarkup,
|
|
130
|
+
});
|
|
131
|
+
const options = {
|
|
132
|
+
hostname: 'api.telegram.org',
|
|
133
|
+
path: `/bot${BOT_TOKEN}/sendMessage`,
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: {
|
|
136
|
+
'Content-Type': 'application/json',
|
|
137
|
+
'Content-Length': Buffer.byteLength(body),
|
|
138
|
+
},
|
|
139
|
+
timeout: 5000,
|
|
140
|
+
};
|
|
141
|
+
const req = https_1.default.request(options, (res) => {
|
|
142
|
+
let data = '';
|
|
143
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
144
|
+
res.on('end', () => {
|
|
145
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
146
|
+
try {
|
|
147
|
+
const parsed = JSON.parse(data);
|
|
148
|
+
resolve(parsed.result || null);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
resolve(null);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
reject(new Error(`Telegram API ${res.statusCode}: ${data}`));
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
req.on('error', reject);
|
|
160
|
+
req.on('timeout', () => {
|
|
161
|
+
req.destroy();
|
|
162
|
+
reject(new Error('Telegram request timed out'));
|
|
163
|
+
});
|
|
164
|
+
req.write(body);
|
|
165
|
+
req.end();
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// ── Helpers ──────────────────────────────────────────────────────
|
|
169
|
+
function readStdin() {
|
|
170
|
+
return new Promise((resolve) => {
|
|
171
|
+
let data = '';
|
|
172
|
+
let resolved = false;
|
|
173
|
+
process.stdin.setEncoding('utf8');
|
|
174
|
+
process.stdin.on('data', (chunk) => { data += chunk; });
|
|
175
|
+
process.stdin.on('end', () => {
|
|
176
|
+
if (!resolved) {
|
|
177
|
+
resolved = true;
|
|
178
|
+
resolve(data);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
setTimeout(() => {
|
|
182
|
+
if (!resolved) {
|
|
183
|
+
resolved = true;
|
|
184
|
+
process.stdin.destroy();
|
|
185
|
+
resolve(data || '{}');
|
|
186
|
+
}
|
|
187
|
+
}, 500);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
function escapeMarkdown(text) {
|
|
191
|
+
return text.replace(/([_*`\[])/g, '\\$1');
|
|
192
|
+
}
|
|
193
|
+
// ── Run ─────────────────────────────────────────────────────────
|
|
194
|
+
main().catch((err) => {
|
|
195
|
+
process.stderr.write(`[pre-compact-notify] Fatal: ${err.message}\n`);
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=pre-compact-notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-compact-notify.js","sourceRoot":"","sources":["../pre-compact-notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Question Notify — Called by Claude Code's PreToolUse hook (matcher: AskUserQuestion).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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).
|
|
9
10
|
*
|
|
10
11
|
* Stdin JSON: { tool_name, tool_input, cwd, session_id, hook_event_name }
|
|
11
12
|
* tool_input.questions: [{ question, header, options: [{ label, description }], multiSelect }]
|
|
12
13
|
*
|
|
13
|
-
* Stdout:
|
|
14
|
+
* Stdout: { hookSpecificOutput: { updatedInput: { questions: [...] }, permissionDecision: "allow" } }
|
|
14
15
|
*/
|
|
15
16
|
export {};
|
|
16
17
|
//# sourceMappingURL=question-notify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"question-notify.d.ts","sourceRoot":"","sources":["../question-notify.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"question-notify.d.ts","sourceRoot":"","sources":["../question-notify.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
|
package/dist/question-notify.js
CHANGED
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* Question Notify — Called by Claude Code's PreToolUse hook (matcher: AskUserQuestion).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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).
|
|
10
11
|
*
|
|
11
12
|
* Stdin JSON: { tool_name, tool_input, cwd, session_id, hook_event_name }
|
|
12
13
|
* tool_input.questions: [{ question, header, options: [{ label, description }], multiSelect }]
|
|
13
14
|
*
|
|
14
|
-
* Stdout:
|
|
15
|
+
* Stdout: { hookSpecificOutput: { updatedInput: { questions: [...] }, permissionDecision: "allow" } }
|
|
15
16
|
*/
|
|
16
17
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
18
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -27,25 +28,20 @@ const prompt_bridge_1 = require("./prompt-bridge");
|
|
|
27
28
|
const active_check_1 = require("./src/utils/active-check");
|
|
28
29
|
const BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN;
|
|
29
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
|
|
30
34
|
// ── Main ────────────────────────────────────────────────────────
|
|
31
35
|
async function main() {
|
|
32
|
-
// NOTE: We intentionally do NOT output permissionDecision to stdout.
|
|
33
|
-
// If we output "allow" here, Claude Code bypasses the interactive
|
|
34
|
-
// question UI entirely. This hook only sends the Telegram notification
|
|
35
|
-
// for remote answering. Permission is handled by the PermissionRequest hook.
|
|
36
|
-
//
|
|
37
|
-
// We delay 2s so the permission notification (from PermissionRequest hook)
|
|
38
|
-
// appears first in Telegram. The user must click Allow before answering.
|
|
39
36
|
const raw = await readStdin();
|
|
40
37
|
// Skip Telegram notification if user is at terminal AND this wasn't Telegram-injected.
|
|
41
38
|
// If the command came from Telegram, the question must go back to Telegram.
|
|
42
39
|
const typingActivePath = path_1.default.join(paths_1.PROJECT_ROOT, 'src/data', 'typing-active');
|
|
43
40
|
const isTelegramInjected = fs_1.default.existsSync(typingActivePath);
|
|
44
41
|
if (!isTelegramInjected && (0, active_check_1.isUserActiveAtTerminal)()) {
|
|
42
|
+
// User is at terminal — let Claude Code show its native UI
|
|
45
43
|
return;
|
|
46
44
|
}
|
|
47
|
-
// Delay so permission notification appears first in Telegram
|
|
48
|
-
await new Promise(r => setTimeout(r, 2000));
|
|
49
45
|
let payload;
|
|
50
46
|
try {
|
|
51
47
|
payload = JSON.parse(raw);
|
|
@@ -61,20 +57,23 @@ async function main() {
|
|
|
61
57
|
if (questions.length === 0) {
|
|
62
58
|
return;
|
|
63
59
|
}
|
|
64
|
-
// Detect session name for
|
|
60
|
+
// Detect session name (for session map, even though we don't inject keystrokes)
|
|
65
61
|
const tmuxSession = detectSessionName(cwd);
|
|
66
|
-
|
|
62
|
+
// Collect answers: map of question text → selected label(s)
|
|
63
|
+
// Multi-select: join labels with commas (Claude Code format).
|
|
64
|
+
const answers = {};
|
|
67
65
|
// Process each question (usually just one)
|
|
68
66
|
for (let qi = 0; qi < questions.length; qi++) {
|
|
69
67
|
const q = questions[qi];
|
|
70
68
|
const promptId = (0, prompt_bridge_1.generatePromptId)(); // Unique ID per question
|
|
71
69
|
const questionText = q.question || 'Question';
|
|
72
70
|
const options = q.options || [];
|
|
73
|
-
const isLast = qi ===
|
|
71
|
+
const isLast = qi === questions.length - 1;
|
|
72
|
+
const isMultiSelect = q.multiSelect || false;
|
|
74
73
|
let messageText = `\u2753 *Question* — ${escapeMarkdown(workspace)}\n\n${escapeMarkdown(questionText)}`;
|
|
75
74
|
if (options.length > 0) {
|
|
76
75
|
// Build inline keyboard with numbered options
|
|
77
|
-
const prefix =
|
|
76
|
+
const prefix = isMultiSelect ? '\u2610 ' : '';
|
|
78
77
|
const buttons = options.map((opt, idx) => ({
|
|
79
78
|
text: `${prefix}${idx + 1}. ${opt.label}`,
|
|
80
79
|
callback_data: `opt:${promptId}:${idx + 1}`,
|
|
@@ -85,21 +84,21 @@ async function main() {
|
|
|
85
84
|
keyboard.push(buttons.slice(i, i + 2));
|
|
86
85
|
}
|
|
87
86
|
// Add Submit button for multi-select questions
|
|
88
|
-
if (
|
|
87
|
+
if (isMultiSelect) {
|
|
89
88
|
keyboard.push([{ text: '\u2705 Submit', callback_data: `opt-submit:${promptId}` }]);
|
|
90
89
|
}
|
|
91
90
|
// Add option descriptions to the message
|
|
92
91
|
const optionLines = options.map((opt, idx) => `*${idx + 1}.* ${escapeMarkdown(opt.label)}${opt.description ? ` — _${escapeMarkdown(opt.description)}_` : ''}`);
|
|
93
92
|
messageText += '\n\n' + optionLines.join('\n');
|
|
94
|
-
// Write pending file so bot callback handler
|
|
93
|
+
// Write pending file so bot callback handler can write response
|
|
95
94
|
(0, prompt_bridge_1.writePending)(promptId, {
|
|
96
95
|
type: 'question',
|
|
97
96
|
workspace,
|
|
98
97
|
tmuxSession,
|
|
99
98
|
questionText,
|
|
100
99
|
options: options.map(o => o.label),
|
|
101
|
-
multiSelect:
|
|
102
|
-
selectedOptions:
|
|
100
|
+
multiSelect: isMultiSelect,
|
|
101
|
+
selectedOptions: isMultiSelect ? options.map(() => false) : undefined,
|
|
103
102
|
isLast,
|
|
104
103
|
});
|
|
105
104
|
// Send Telegram message with inline keyboard
|
|
@@ -111,7 +110,30 @@ async function main() {
|
|
|
111
110
|
}
|
|
112
111
|
catch (err) {
|
|
113
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;
|
|
114
135
|
}
|
|
136
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
115
137
|
}
|
|
116
138
|
else {
|
|
117
139
|
// No options — free text question
|
|
@@ -121,6 +143,7 @@ async function main() {
|
|
|
121
143
|
workspace,
|
|
122
144
|
tmuxSession,
|
|
123
145
|
questionText,
|
|
146
|
+
isLast,
|
|
124
147
|
});
|
|
125
148
|
try {
|
|
126
149
|
const result = await sendTelegram(messageText);
|
|
@@ -130,9 +153,65 @@ async function main() {
|
|
|
130
153
|
}
|
|
131
154
|
catch (err) {
|
|
132
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;
|
|
133
168
|
}
|
|
169
|
+
(0, prompt_bridge_1.cleanPrompt)(promptId);
|
|
134
170
|
}
|
|
135
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
|
+
});
|
|
136
215
|
}
|
|
137
216
|
// ── Telegram ────────────────────────────────────────────────────
|
|
138
217
|
function sendTelegramWithKeyboard(text, replyMarkup) {
|
|
@@ -255,7 +334,12 @@ function detectSessionName(cwd) {
|
|
|
255
334
|
}
|
|
256
335
|
catch { }
|
|
257
336
|
}
|
|
258
|
-
// 2.
|
|
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
|
|
259
343
|
// (dots, colons, spaces → hyphens) so the name matches the PTY handle key
|
|
260
344
|
const raw = (0, workspace_router_1.extractWorkspaceName)(cwd);
|
|
261
345
|
if (!raw)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"question-notify.js","sourceRoot":"","sources":["../question-notify.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"question-notify.js","sourceRoot":"","sources":["../question-notify.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;;;;;GAaG;;;;;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;AACpB,kDAA0B;AAC1B,yDAAoF;AACpF,mDAAyG;AACzG,2DAAkE;AAGlE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AACjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAE7C,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,aAAa;AAsB5C,mEAAmE;AAEnE,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAE9B,uFAAuF;IACvF,4EAA4E;IAC5E,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAC9E,MAAM,kBAAkB,GAAG,YAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,CAAC,kBAAkB,IAAI,IAAA,qCAAsB,GAAE,EAAE,CAAC;QACpD,2DAA2D;QAC3D,OAAO;IACT,CAAC;IAED,IAAI,OAAgC,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;IACxE,MAAM,GAAG,GAAI,OAAO,CAAC,GAAc,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,IAAA,uCAAoB,EAAC,GAAG,CAAE,CAAC;IAE7C,oCAAoC;IACpC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAA0B,CAAC;IACvE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,gFAAgF;IAChF,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAE3C,4DAA4D;IAC5D,8DAA8D;IAC9D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,2CAA2C;IAC3C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAA,gCAAgB,GAAE,CAAC,CAAC,yBAAyB;QAC9D,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC;QAC9C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,EAAE,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC;QAE7C,IAAI,WAAW,GAAG,uBAAuB,cAAc,CAAC,SAAS,CAAC,OAAO,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;QAExG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,8CAA8C;YAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,GAA2B,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;gBACjE,IAAI,EAAE,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE;gBACzC,aAAa,EAAE,OAAO,QAAQ,IAAI,GAAG,GAAG,CAAC,EAAE;aAC5C,CAAC,CAAC,CAAC;YAEJ,0DAA0D;YAC1D,MAAM,QAAQ,GAA6B,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,+CAA+C;YAC/C,IAAI,aAAa,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YACtF,CAAC;YAED,yCAAyC;YACzC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAC3C,IAAI,GAAG,GAAG,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAChH,CAAC;YACF,WAAW,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE/C,gEAAgE;YAChE,IAAA,4BAAY,EAAC,QAAQ,EAAE;gBACrB,IAAI,EAAE,UAAU;gBAChB,SAAS;gBACT,WAAW;gBACX,YAAY;gBACZ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBAClC,WAAW,EAAE,aAAa;gBAC1B,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrE,MAAM;aACP,CAAC,CAAC;YAEH,6CAA6C;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1F,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBAChC,IAAA,2CAAwB,EAAC,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA4C,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;gBAC5F,IAAA,2BAAW,EAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO,CAAC,qCAAqC;YAC/C,CAAC;YAED,oBAAoB;YACpB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAEjD,IAAI,QAAQ,EAAE,CAAC;gBACb,+BAA+B;gBAC/B,IAAI,aAAa,EAAE,CAAC;oBAClB,uEAAuE;oBACvE,MAAM,cAAc,GAAI,QAAQ,CAAC,cAA2B,IAAI,EAAE,CAAC;oBACnE,OAAO,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,kDAAkD;oBAClD,MAAM,aAAa,GAAI,QAAQ,CAAC,aAAwB,IAAI,EAAE,CAAC;oBAC/D,OAAO,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC;gBACxC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6EAA6E;gBAC7E,IAAA,2BAAW,EAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAA,2BAAW,EAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,WAAW,IAAI,8CAA8C,CAAC;YAE9D,IAAA,4BAAY,EAAC,QAAQ,EAAE;gBACrB,IAAI,EAAE,mBAAmB;gBACzB,SAAS;gBACT,WAAW;gBACX,YAAY;gBACZ,MAAM;aACP,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;gBAC/C,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBAChC,IAAA,2CAAwB,EAAC,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA4C,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;gBAC5F,IAAA,2BAAW,EAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,oBAAoB;YACpB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAEjD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,UAAU,GAAI,QAAQ,CAAC,UAAqB,IAAI,EAAE,CAAC;gBACzD,OAAO,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,IAAA,2BAAW,EAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAA,2BAAW,EAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,oEAAoE;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAuB;YACjC,kBAAkB,EAAE;gBAClB,aAAa,EAAE,YAAY;gBAC3B,kBAAkB,EAAE,OAAO;gBAC3B,YAAY,EAAE;oBACZ,SAAS;oBACT,OAAO;iBACR;aACF;SACF,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,mEAAmE;AAEnE,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,2BAAW,EAAE,YAAY,QAAQ,OAAO,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,gBAAgB;YAChB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,eAAe,EAAE,CAAC;gBAC7C,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBAC3E,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,0BAA0B;YAC1B,IAAI,CAAC;gBACH,IAAI,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChC,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;oBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC7B,aAAa,CAAC,QAAQ,CAAC,CAAC;oBACxB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;QACH,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mEAAmE;AAEnE,SAAS,wBAAwB,CAAC,IAAY,EAAE,WAAiC;IAC/E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,OAAO,EAAE,OAAO;YAChB,IAAI;YACJ,UAAU,EAAE,UAAU;YACtB,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAyB;YACpC,QAAQ,EAAE,kBAAkB;YAC5B,IAAI,EAAE,OAAO,SAAS,cAAc;YACpC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;aAC1C;YACD,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,MAAM,GAAG,GAAG,eAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,UAAW,IAAI,GAAG,IAAI,GAAG,CAAC,UAAW,GAAG,GAAG,EAAE,CAAC;oBACpD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAChC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;oBACjC,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACrB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,OAAO,EAAE,OAAO;YAChB,IAAI;YACJ,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAyB;YACpC,QAAQ,EAAE,kBAAkB;YAC5B,IAAI,EAAE,OAAO,SAAS,cAAc;YACpC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;aAC1C;YACD,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,MAAM,GAAG,GAAG,eAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,GAAG,CAAC,UAAW,IAAI,GAAG,IAAI,GAAG,CAAC,UAAW,GAAG,GAAG,EAAE,CAAC;oBACpD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAChC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;oBACjC,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACrB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oEAAoE;AAEpE,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,mCAAmC;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YAC9C,OAAO,QAAQ,CAAC,8BAA8B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,+EAA+E;IAC/E,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAA,uCAAoB,EAAC,GAAG,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IACD,+EAA+E;IAC/E,0EAA0E;IAC1E,MAAM,GAAG,GAAG,IAAA,uCAAoB,EAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,mEAAmE;AAEnE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC"}
|
package/dist/setup.js
CHANGED
|
@@ -24,14 +24,24 @@ let envPath = path_1.default.join(projectRoot, '.env');
|
|
|
24
24
|
let defaultSessionMap = path_1.default.join(paths_1.PROJECT_ROOT, 'src', 'data', 'session-map.json');
|
|
25
25
|
// Hook definitions for Claude Code integration
|
|
26
26
|
const HOOK_DEFINITIONS = [
|
|
27
|
+
// Core hooks
|
|
27
28
|
{ event: 'PermissionRequest', script: 'permission-hook.js', timeout: 120 },
|
|
28
|
-
{ event: 'PreToolUse', script: 'question-notify.js', timeout:
|
|
29
|
+
{ event: 'PreToolUse', script: 'question-notify.js', timeout: 120, matcher: 'AskUserQuestion' },
|
|
29
30
|
{ event: 'Stop', script: 'enhanced-hook-notify.js', args: 'completed', timeout: 5 },
|
|
30
31
|
{ event: 'Notification', script: 'enhanced-hook-notify.js', args: 'waiting', timeout: 5, matcher: 'permission_prompt' },
|
|
31
32
|
{ event: 'UserPromptSubmit', script: 'user-prompt-hook.js', timeout: 2 },
|
|
32
33
|
{ event: 'SessionStart', script: 'enhanced-hook-notify.js', args: 'session-start', timeout: 5 },
|
|
33
34
|
{ event: 'SessionEnd', script: 'enhanced-hook-notify.js', args: 'session-end', timeout: 5 },
|
|
34
35
|
{ event: 'SubagentStop', script: 'enhanced-hook-notify.js', args: 'subagent-done', timeout: 5 },
|
|
36
|
+
// Phase 2: New hook events (Claude Code v2.1.76+)
|
|
37
|
+
{ event: 'PermissionDenied', script: 'permission-denied-notify.js', timeout: 30 },
|
|
38
|
+
{ event: 'StopFailure', script: 'enhanced-hook-notify.js', args: 'stop-failure', timeout: 5 },
|
|
39
|
+
{ event: 'PostCompact', script: 'enhanced-hook-notify.js', args: 'post-compact', timeout: 5 },
|
|
40
|
+
{ event: 'PreCompact', script: 'pre-compact-notify.js', timeout: 30 },
|
|
41
|
+
{ event: 'Elicitation', script: 'elicitation-notify.js', timeout: 120 },
|
|
42
|
+
{ event: 'TaskCreated', script: 'enhanced-hook-notify.js', args: 'task-created', timeout: 5 },
|
|
43
|
+
{ event: 'CwdChanged', script: 'enhanced-hook-notify.js', args: 'cwd-changed', timeout: 5 },
|
|
44
|
+
{ event: 'InstructionsLoaded', script: 'enhanced-hook-notify.js', args: 'instructions-loaded', timeout: 5 },
|
|
35
45
|
];
|
|
36
46
|
// ANSI color codes
|
|
37
47
|
const colors = {
|
|
@@ -173,8 +183,8 @@ function checkTmux() {
|
|
|
173
183
|
catch {
|
|
174
184
|
const isMac = process.platform === 'darwin';
|
|
175
185
|
console.log(' ' + warning('tmux not found.'));
|
|
176
|
-
console.log(dim('
|
|
177
|
-
console.log(dim(` For
|
|
186
|
+
console.log(dim(' If you use Ghostty, ccgram will auto-detect it as the injection backend.'));
|
|
187
|
+
console.log(dim(` For tmux: ${isMac ? 'brew install tmux' : 'sudo apt install tmux'}`));
|
|
178
188
|
return false;
|
|
179
189
|
}
|
|
180
190
|
}
|
|
@@ -266,6 +276,8 @@ function buildHooksJSON() {
|
|
|
266
276
|
const entry = {};
|
|
267
277
|
if (def.matcher)
|
|
268
278
|
entry.matcher = def.matcher;
|
|
279
|
+
if (def.if)
|
|
280
|
+
entry.if = def.if;
|
|
269
281
|
entry.hooks = [{ type: 'command', command: makeHookCommand(def), timeout: def.timeout }];
|
|
270
282
|
if (!hooks[def.event])
|
|
271
283
|
hooks[def.event] = [];
|
|
@@ -305,6 +317,8 @@ function ensureHooksFile() {
|
|
|
305
317
|
const entry = {};
|
|
306
318
|
if (def.matcher)
|
|
307
319
|
entry.matcher = def.matcher;
|
|
320
|
+
if (def.if)
|
|
321
|
+
entry.if = def.if;
|
|
308
322
|
entry.hooks = [{ type: 'command', command, timeout: def.timeout }];
|
|
309
323
|
eventHooks.push(entry);
|
|
310
324
|
}
|
|
@@ -547,7 +561,7 @@ async function main() {
|
|
|
547
561
|
let webhookUrl = existingEnv.TELEGRAM_WEBHOOK_URL || '';
|
|
548
562
|
let webhookPort = existingEnv.TELEGRAM_WEBHOOK_PORT || '3001';
|
|
549
563
|
let forceIPv4 = existingEnv.TELEGRAM_FORCE_IPV4 === 'true';
|
|
550
|
-
let injectionMode = existingEnv.INJECTION_MODE || '
|
|
564
|
+
let injectionMode = existingEnv.INJECTION_MODE || '';
|
|
551
565
|
let logLevel = existingEnv.LOG_LEVEL || 'info';
|
|
552
566
|
let sessionMapPath = existingEnv.SESSION_MAP_PATH || defaultSessionMap;
|
|
553
567
|
let activeThreshold = existingEnv.ACTIVE_THRESHOLD_SECONDS || '300';
|
|
@@ -564,10 +578,12 @@ async function main() {
|
|
|
564
578
|
webhookPort = await ask('Webhook port', webhookPort);
|
|
565
579
|
}
|
|
566
580
|
forceIPv4 = await askYesNo('Force IPv4 for Telegram API?', forceIPv4);
|
|
567
|
-
injectionMode = (await ask('Injection mode (tmux
|
|
568
|
-
if (
|
|
569
|
-
|
|
570
|
-
|
|
581
|
+
injectionMode = (await ask('Injection mode (auto, tmux, ghostty, pty)', injectionMode || 'auto')).toLowerCase();
|
|
582
|
+
if (injectionMode === 'auto')
|
|
583
|
+
injectionMode = '';
|
|
584
|
+
if (injectionMode && !['tmux', 'ghostty', 'pty'].includes(injectionMode)) {
|
|
585
|
+
console.log(' ' + warning('Invalid injection mode, using auto-detect'));
|
|
586
|
+
injectionMode = '';
|
|
571
587
|
}
|
|
572
588
|
logLevel = await ask('Log level (debug, info, warn, error)', logLevel);
|
|
573
589
|
sessionMapPath = await ask('Session map path', sessionMapPath);
|
|
@@ -591,7 +607,7 @@ async function main() {
|
|
|
591
607
|
envValues.TELEGRAM_WEBHOOK_PORT = webhookPort;
|
|
592
608
|
if (forceIPv4)
|
|
593
609
|
envValues.TELEGRAM_FORCE_IPV4 = 'true';
|
|
594
|
-
if (
|
|
610
|
+
if (injectionMode)
|
|
595
611
|
envValues.INJECTION_MODE = injectionMode;
|
|
596
612
|
if (advancedConfigured || existingEnv.SESSION_MAP_PATH)
|
|
597
613
|
envValues.SESSION_MAP_PATH = sessionMapPath;
|
|
@@ -637,7 +653,7 @@ async function main() {
|
|
|
637
653
|
console.log();
|
|
638
654
|
console.log(' ' + bold('Next steps:'));
|
|
639
655
|
console.log(' 1. Open Telegram and message your bot');
|
|
640
|
-
console.log(' 2. Start Claude Code in
|
|
656
|
+
console.log(' 2. Start Claude Code — in tmux, Ghostty, or any terminal');
|
|
641
657
|
console.log();
|
|
642
658
|
}
|
|
643
659
|
main().catch((err) => {
|