@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.
Files changed (55) hide show
  1. package/.env.example +3 -0
  2. package/README.md +82 -51
  3. package/dist/elicitation-notify.d.ts +20 -0
  4. package/dist/elicitation-notify.d.ts.map +1 -0
  5. package/dist/elicitation-notify.js +241 -0
  6. package/dist/elicitation-notify.js.map +1 -0
  7. package/dist/enhanced-hook-notify.d.ts +8 -1
  8. package/dist/enhanced-hook-notify.d.ts.map +1 -1
  9. package/dist/enhanced-hook-notify.js +119 -5
  10. package/dist/enhanced-hook-notify.js.map +1 -1
  11. package/dist/permission-denied-notify.d.ts +11 -0
  12. package/dist/permission-denied-notify.d.ts.map +1 -0
  13. package/dist/permission-denied-notify.js +193 -0
  14. package/dist/permission-denied-notify.js.map +1 -0
  15. package/dist/permission-hook.js +43 -18
  16. package/dist/permission-hook.js.map +1 -1
  17. package/dist/pre-compact-notify.d.ts +13 -0
  18. package/dist/pre-compact-notify.d.ts.map +1 -0
  19. package/dist/pre-compact-notify.js +197 -0
  20. package/dist/pre-compact-notify.js.map +1 -0
  21. package/dist/question-notify.d.ts +6 -5
  22. package/dist/question-notify.d.ts.map +1 -1
  23. package/dist/question-notify.js +107 -23
  24. package/dist/question-notify.js.map +1 -1
  25. package/dist/setup.js +26 -10
  26. package/dist/setup.js.map +1 -1
  27. package/dist/src/types/callbacks.d.ts +11 -1
  28. package/dist/src/types/callbacks.d.ts.map +1 -1
  29. package/dist/src/types/session.d.ts +13 -1
  30. package/dist/src/types/session.d.ts.map +1 -1
  31. package/dist/src/utils/callback-parser.d.ts +7 -5
  32. package/dist/src/utils/callback-parser.d.ts.map +1 -1
  33. package/dist/src/utils/callback-parser.js +11 -5
  34. package/dist/src/utils/callback-parser.js.map +1 -1
  35. package/dist/src/utils/deep-link.d.ts +22 -0
  36. package/dist/src/utils/deep-link.d.ts.map +1 -0
  37. package/dist/src/utils/deep-link.js +43 -0
  38. package/dist/src/utils/deep-link.js.map +1 -0
  39. package/dist/src/utils/ghostty-session-manager.d.ts +81 -0
  40. package/dist/src/utils/ghostty-session-manager.d.ts.map +1 -0
  41. package/dist/src/utils/ghostty-session-manager.js +370 -0
  42. package/dist/src/utils/ghostty-session-manager.js.map +1 -0
  43. package/dist/src/utils/transcript-reader.d.ts +57 -0
  44. package/dist/src/utils/transcript-reader.d.ts.map +1 -0
  45. package/dist/src/utils/transcript-reader.js +229 -0
  46. package/dist/src/utils/transcript-reader.js.map +1 -0
  47. package/dist/workspace-router.d.ts +19 -4
  48. package/dist/workspace-router.d.ts.map +1 -1
  49. package/dist/workspace-router.js +57 -1
  50. package/dist/workspace-router.js.map +1 -1
  51. package/dist/workspace-telegram-bot.js +515 -114
  52. package/dist/workspace-telegram-bot.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/types/callbacks.ts +15 -1
  55. 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
- * Non-blocking: sends a Telegram message with option buttons, then returns
6
- * without stdout output. AskUserQuestion must be in the permissions allow
7
- * list (settings.json) so Claude Code handles permission automatically.
8
- * The bot callback handler later injects the selected option number via tmux.
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: (none intentionally omitted so Claude Code shows the interactive question UI)
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;;;;;;;;;;;;GAYG"}
1
+ {"version":3,"file":"question-notify.d.ts","sourceRoot":"","sources":["../question-notify.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
@@ -3,15 +3,16 @@
3
3
  /**
4
4
  * Question Notify — Called by Claude Code's PreToolUse hook (matcher: AskUserQuestion).
5
5
  *
6
- * Non-blocking: sends a Telegram message with option buttons, then returns
7
- * without stdout output. AskUserQuestion must be in the permissions allow
8
- * list (settings.json) so Claude Code handles permission automatically.
9
- * The bot callback handler later injects the selected option number via tmux.
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: (none intentionally omitted so Claude Code shows the interactive question UI)
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 keystroke injection (tmux preferred, CWD-derived fallback)
60
+ // Detect session name (for session map, even though we don't inject keystrokes)
65
61
  const tmuxSession = detectSessionName(cwd);
66
- const totalQuestions = questions.length;
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 === totalQuestions - 1;
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 = q.multiSelect ? '\u2610 ' : '';
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 (q.multiSelect) {
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 knows the tmux session
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: q.multiSelect || false,
102
- selectedOptions: q.multiSelect ? options.map(() => false) : undefined,
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. Derive from CWD apply the same sanitization /new uses for session names
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":"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"}
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: 5, matcher: 'AskUserQuestion' },
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(' Without tmux, /new starts headless PTY sessions (Telegram-only control).'));
177
- console.log(dim(` For full terminal+Telegram experience: ${isMac ? 'brew install tmux' : 'sudo apt install tmux'}`));
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 || 'tmux';
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 or pty)', injectionMode)).toLowerCase();
568
- if (!['tmux', 'pty'].includes(injectionMode)) {
569
- console.log(' ' + warning('Invalid injection mode, defaulting to tmux'));
570
- injectionMode = 'tmux';
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 (advancedConfigured || existingEnv.INJECTION_MODE)
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 a tmux session');
656
+ console.log(' 2. Start Claude Code in tmux, Ghostty, or any terminal');
641
657
  console.log();
642
658
  }
643
659
  main().catch((err) => {