ccpoke 1.6.4 → 1.6.6

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 (56) hide show
  1. package/README.en.md +5 -5
  2. package/README.md +6 -6
  3. package/README.zh.md +197 -0
  4. package/dist/agent/agent-handler.d.ts +19 -0
  5. package/dist/agent/agent-handler.js +64 -1
  6. package/dist/agent/agent-handler.js.map +1 -1
  7. package/dist/agent/claude-code/claude-code-installer.d.ts +2 -0
  8. package/dist/agent/claude-code/claude-code-installer.js +76 -5
  9. package/dist/agent/claude-code/claude-code-installer.js.map +1 -1
  10. package/dist/channel/telegram/ask-question-handler.d.ts +30 -0
  11. package/dist/channel/telegram/ask-question-handler.js +305 -0
  12. package/dist/channel/telegram/ask-question-handler.js.map +1 -0
  13. package/dist/channel/telegram/ask-question-keyboard-builder.d.ts +4 -0
  14. package/dist/channel/telegram/ask-question-keyboard-builder.js +26 -0
  15. package/dist/channel/telegram/ask-question-keyboard-builder.js.map +1 -0
  16. package/dist/channel/telegram/ask-question-tui-injector.d.ts +14 -0
  17. package/dist/channel/telegram/ask-question-tui-injector.js +53 -0
  18. package/dist/channel/telegram/ask-question-tui-injector.js.map +1 -0
  19. package/dist/channel/telegram/escape-markdown.d.ts +1 -0
  20. package/dist/channel/telegram/escape-markdown.js +4 -0
  21. package/dist/channel/telegram/escape-markdown.js.map +1 -0
  22. package/dist/channel/telegram/prompt-handler.js +6 -5
  23. package/dist/channel/telegram/prompt-handler.js.map +1 -1
  24. package/dist/channel/telegram/session-list.js +1 -3
  25. package/dist/channel/telegram/session-list.js.map +1 -1
  26. package/dist/channel/telegram/telegram-channel.d.ts +5 -1
  27. package/dist/channel/telegram/telegram-channel.js +87 -30
  28. package/dist/channel/telegram/telegram-channel.js.map +1 -1
  29. package/dist/channel/telegram/telegram-sender.js +1 -1
  30. package/dist/channel/telegram/telegram-sender.js.map +1 -1
  31. package/dist/i18n/locales/en.js +17 -0
  32. package/dist/i18n/locales/en.js.map +1 -1
  33. package/dist/i18n/locales/vi.js +18 -1
  34. package/dist/i18n/locales/vi.js.map +1 -1
  35. package/dist/i18n/locales/zh.js +17 -0
  36. package/dist/i18n/locales/zh.js.map +1 -1
  37. package/dist/i18n/types.d.ts +17 -0
  38. package/dist/index.js +3 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/server/api-server.js +13 -0
  41. package/dist/server/api-server.js.map +1 -1
  42. package/dist/tmux/tmux-bridge.d.ts +5 -0
  43. package/dist/tmux/tmux-bridge.js +65 -15
  44. package/dist/tmux/tmux-bridge.js.map +1 -1
  45. package/dist/tmux/tmux-session-resolver.js +8 -2
  46. package/dist/tmux/tmux-session-resolver.js.map +1 -1
  47. package/dist/utils/constants.d.ts +1 -0
  48. package/dist/utils/constants.js +1 -0
  49. package/dist/utils/constants.js.map +1 -1
  50. package/dist/utils/log.d.ts +1 -0
  51. package/dist/utils/log.js +61 -8
  52. package/dist/utils/log.js.map +1 -1
  53. package/dist/utils/paths.d.ts +1 -0
  54. package/dist/utils/paths.js +1 -0
  55. package/dist/utils/paths.js.map +1 -1
  56. package/package.json +2 -2
package/README.en.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 🐾 ccpoke — AI Agent Notification Bridge
2
2
 
3
- [Tiếng Việt](./README.md)
3
+ [Tiếng Việt](./README.md) · [中文](./README.zh.md)
4
4
 
5
5
  > Get Telegram notifications when your AI agent (Claude Code, Cursor, ...) completes a response — with git diff, processing time, and result summary.
6
6
 
@@ -24,10 +24,10 @@ AI agent completes response
24
24
 
25
25
  ## Supported Agents
26
26
 
27
- | Agent | Status |
28
- |-------|--------|
29
- | Claude Code | ✅ Supported |
30
- | Cursor | ✅ Supported |
27
+ | | Claude Code | Cursor |
28
+ |---|---|---|
29
+ | Telegram notifications | ✅ macOS · Linux · Windows | ✅ macOS · Linux · Windows |
30
+ | 2-way chat (Telegram ↔ Agent) | ✅ macOS · Linux | ❌ |
31
31
 
32
32
  Adding new agents is easy via the plugin architecture — contributions welcome!
33
33
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 🐾 ccpoke — AI Agent Notification Bridge
2
2
 
3
- [English](./README.en.md)
3
+ [English](./README.en.md) · [中文](./README.zh.md)
4
4
 
5
5
  > Nhận thông báo Telegram khi AI agent (Claude Code, Cursor, ...) hoàn thành response — kèm git diff, thời gian xử lý, và tóm tắt kết quả.
6
6
 
@@ -22,12 +22,12 @@ AI agent xong response
22
22
  Telegram notification 📱
23
23
  ```
24
24
 
25
- ## Supported Agents
25
+ ## Hỗ trợ Agent
26
26
 
27
- | Agent | Trạng thái |
28
- |-------|-----------|
29
- | Claude Code | ✅ Hỗ trợ |
30
- | Cursor | ✅ Hỗ trợ |
27
+ | | Claude Code | Cursor |
28
+ |---|---|---|
29
+ | Notification Telegram | ✅ macOS · Linux · Windows | ✅ macOS · Linux · Windows |
30
+ | Chat 2 chiều (Telegram ↔ Agent) | ✅ macOS · Linux | ❌ |
31
31
 
32
32
  Thêm agent mới qua kiến trúc plugin — contributions welcome!
33
33
 
package/README.zh.md ADDED
@@ -0,0 +1,197 @@
1
+ # 🐾 ccpoke — AI Agent Notification Bridge
2
+
3
+ [English](./README.en.md) · [Tiếng Việt](./README.md)
4
+
5
+ > 当 AI agent(Claude Code、Cursor 等)完成响应时,通过 Telegram 接收通知——附带 git diff、处理时间和结果摘要。
6
+
7
+ ---
8
+
9
+ ## 解决的问题
10
+
11
+ 你在电脑上使用 Claude Code 或 Cursor。出门只带手机,却不知道 AI agent 是否已完成、修改了哪些文件。
12
+
13
+ **ccpoke** 是 AI agent 与 Telegram 之间的轻量桥接——agent 完成后,你立即在手机上收到通知。
14
+
15
+ ```
16
+ AI agent 完成响应
17
+
18
+ Stop Hook 触发
19
+
20
+ ccpoke 接收事件
21
+
22
+ Telegram 通知 📱
23
+ ```
24
+
25
+ ## 支持的 Agent
26
+
27
+ | | Claude Code | Cursor |
28
+ |---|---|---|
29
+ | Telegram 通知 | ✅ macOS · Linux · Windows | ✅ macOS · Linux · Windows |
30
+ | 双向聊天 (Telegram ↔ Agent) | ✅ macOS · Linux | ❌ |
31
+
32
+ 通过插件架构轻松添加新 agent——欢迎贡献!
33
+
34
+ ## 功能
35
+
36
+ - 🤖 **多 Agent** — 支持 Claude Code、Cursor 及更多
37
+ - 🔔 **自动通知** — AI agent 完成 → Telegram 立即推送
38
+ - 📂 **附带 Git diff** — 无需打开电脑即可查看文件变更
39
+ - ⏱ **处理时间** — 了解 agent 运行了多久
40
+ - 📝 **响应摘要** — 快速查看 agent 的回复内容
41
+ - 🔐 **用户白名单** — 仅授权用户可使用 bot
42
+ - 📄 **自动分页** — 长消息自动分页 `[1/N]`
43
+
44
+ ## 前置要求
45
+
46
+ - **Node.js** ≥ 18
47
+ - **Telegram Bot Token** — 从 [@BotFather](https://t.me/BotFather) 创建
48
+
49
+ ## 快速开始
50
+
51
+ ### 方式一:npx(推荐——零安装)
52
+
53
+ ```bash
54
+ npx ccpoke
55
+ ```
56
+
57
+ 首次运行 → 自动设置 → 启动 bot。一条命令搞定。
58
+
59
+ ### 方式二:全局安装(日常使用,启动更快)
60
+
61
+ ```bash
62
+ npm i -g ccpoke
63
+ ccpoke
64
+ ```
65
+
66
+ ### 方式三:克隆仓库(用于开发)
67
+
68
+ ```bash
69
+ git clone https://github.com/palooza-kaida/ccpoke.git
70
+ cd ccpoke
71
+ pnpm install
72
+ pnpm dev
73
+ ```
74
+
75
+ 设置向导将逐步引导你:
76
+
77
+ ```
78
+ ┌ 🤖 ccpoke setup
79
+
80
+ ◇ Language
81
+ │ English
82
+
83
+ ◇ Telegram Bot Token
84
+ │ your-bot-token
85
+
86
+ ◇ ✓ Bot: @your_bot
87
+
88
+ ◇ Scan QR or open link to connect:
89
+ │ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
90
+ │ █ ▄▄▄▄▄ █▄▄████▀ ▄██▄▄█ ▄▄▄▄▄ █
91
+ │ █ █ █ █ ▀█ ▄▄▄▄▀▀▄▀ █ █ █ █
92
+ │ █ █▄▄▄█ █▄ ▄▄▀▄▀██▄ ▄█ █▄▄▄█ █
93
+ │ █▄▄▄▄▄▄▄█▄▀▄▀▄▀ █▄▀▄█▄█▄▄▄▄▄▄▄█
94
+ │ ...
95
+ │ █▄▄▄▄▄▄▄█▄███▄█▄███▄▄▄▄███▄█▄██
96
+ │ https://t.me/your_bot?start=setup
97
+
98
+ ◇ Waiting for you to send /start to the bot...
99
+
100
+ ◆ ✓ Connected! User ID: 123456789
101
+
102
+ ◇ 选择 AI agents(按空格选择)
103
+ │ Claude Code, Cursor
104
+
105
+ ◆ Config saved
106
+ ◆ Hook installed for Claude Code
107
+ ◆ Hook installed for Cursor
108
+ ◆ Chat ID registered
109
+
110
+ └ 🎉 Setup complete!
111
+ ```
112
+
113
+ <details>
114
+ <summary>手动设置(不使用向导)</summary>
115
+
116
+ 创建文件 `~/.ccpoke/config.json`:
117
+
118
+ ```json
119
+ {
120
+ "telegram_bot_token": "123456:ABC-xxx",
121
+ "user_id": 123456789,
122
+ "hook_port": 9377
123
+ }
124
+ ```
125
+
126
+ 然后运行 `ccpoke setup` 安装 hook 并注册 chat ID。
127
+
128
+ </details>
129
+
130
+ ## 使用方法
131
+
132
+ ### 启动 bot
133
+
134
+ ```bash
135
+ # npx(零安装)
136
+ npx ccpoke
137
+
138
+ # 或全局安装
139
+ ccpoke
140
+
141
+ # 或本地开发
142
+ pnpm dev
143
+ ```
144
+
145
+ Bot 启动后 → 正常使用 Claude Code / Cursor → 通知自动发送到 Telegram。
146
+
147
+ ### Telegram 命令
148
+
149
+ | 命令 | 功能 |
150
+ |-----------|-----------------------------------------------|
151
+ | `/start` | 重新注册聊天(设置时自动完成,很少需要) |
152
+ | `/ping` | 检查 bot 是否在线 |
153
+ | `/status` | 查看 bot 状态 |
154
+
155
+ ### 通知示例
156
+
157
+ ```
158
+ 🤖 Claude Code Response
159
+ 📂 my-project | ⏱ 45s
160
+
161
+ 修复了 login.go 中的认证 bug。主要变更:
162
+ - 修复第 42 行缺失的错误检查
163
+ - 添加输入验证...
164
+
165
+ 📂 Changes:
166
+ ✏️ src/login.go
167
+ ➕ src/validator.go
168
+ ❌ src/old_auth.go
169
+ ```
170
+
171
+ ## 卸载
172
+
173
+ ```bash
174
+ ccpoke uninstall
175
+ ```
176
+
177
+ ```
178
+ ┌ 🗑️ Uninstalling ccpoke
179
+
180
+ ◆ Hook removed from Claude Code
181
+ ◆ Hook removed from Cursor
182
+ ◆ Removed ~/.ccpoke/ (config, state, hooks)
183
+
184
+ └ ccpoke uninstalled
185
+ ```
186
+
187
+ ## License
188
+
189
+ MIT
190
+
191
+ ## Contributors
192
+ <a href="https://github.com/lethai2597">
193
+ <img src="https://github.com/lethai2597.png" width="50" />
194
+ </a>
195
+ <a href="https://github.com/palooza-kaida">
196
+ <img src="https://github.com/palooza-kaida.png" width="50" />
197
+ </a>
@@ -10,6 +10,22 @@ export interface NotificationEvent {
10
10
  title?: string;
11
11
  cwd?: string;
12
12
  }
13
+ export interface AskUserQuestionOption {
14
+ label: string;
15
+ description: string;
16
+ }
17
+ export interface AskUserQuestionItem {
18
+ question: string;
19
+ header: string;
20
+ multiSelect: boolean;
21
+ options: AskUserQuestionOption[];
22
+ }
23
+ export interface AskUserQuestionEvent {
24
+ sessionId: string;
25
+ tmuxTarget?: string;
26
+ cwd?: string;
27
+ questions: AskUserQuestionItem[];
28
+ }
13
29
  export declare class AgentHandler {
14
30
  private registry;
15
31
  private channel;
@@ -21,7 +37,10 @@ export declare class AgentHandler {
21
37
  handleSessionStart(rawEvent: unknown): Promise<void>;
22
38
  onSessionStart?: (rawEvent: unknown) => void;
23
39
  onNotification?: (event: NotificationEvent) => void;
40
+ onAskUserQuestion?: (event: AskUserQuestionEvent) => void;
41
+ handleAskUserQuestion(rawEvent: unknown): Promise<void>;
24
42
  handleNotification(rawEvent: unknown): Promise<void>;
25
43
  private buildResponseUrl;
44
+ private parseAskUserQuestionEvent;
26
45
  private parseNotificationEvent;
27
46
  }
@@ -1,6 +1,6 @@
1
1
  import { t } from "../i18n/index.js";
2
2
  import { MINI_APP_BASE_URL } from "../utils/constants.js";
3
- import { log, logError } from "../utils/log.js";
3
+ import { log, logDebug, logError } from "../utils/log.js";
4
4
  import { responseStore } from "../utils/response-store.js";
5
5
  export class AgentHandler {
6
6
  registry;
@@ -25,9 +25,11 @@ export class AgentHandler {
25
25
  await new Promise((resolve) => setTimeout(resolve, provider.settleDelayMs));
26
26
  }
27
27
  const result = provider.parseEvent(rawEvent);
28
+ logDebug(`[Stop:raw] agent=${agentName} agentSessionId=${result.agentSessionId ?? "NONE"} project=${result.projectName} tmuxTarget=${result.tmuxTarget ?? "NONE"} cwd=${result.cwd ?? "NONE"}`);
28
29
  let chatSessionId;
29
30
  if (this.chatResolver) {
30
31
  chatSessionId = this.chatResolver.resolveSessionId(result.agentSessionId ?? "", result.projectName, result.cwd, result.tmuxTarget);
32
+ logDebug(`[Stop:resolved] chatSessionId=${chatSessionId ?? "NONE"}`);
31
33
  }
32
34
  const data = {
33
35
  agent: provider.name,
@@ -48,17 +50,35 @@ export class AgentHandler {
48
50
  }
49
51
  onSessionStart;
50
52
  onNotification;
53
+ onAskUserQuestion;
54
+ async handleAskUserQuestion(rawEvent) {
55
+ const event = this.parseAskUserQuestionEvent(rawEvent);
56
+ if (!event)
57
+ return;
58
+ logDebug(`[AskQ:raw] agentSessionId=${event.sessionId} tmuxTarget=${event.tmuxTarget ?? "NONE"} cwd=${event.cwd ?? "NONE"} questions=${event.questions.length}`);
59
+ let sessionId;
60
+ if (this.chatResolver) {
61
+ sessionId = this.chatResolver.resolveSessionId(event.sessionId, "", event.cwd, event.tmuxTarget);
62
+ logDebug(`[AskQ:resolved] agentSessionId=${event.sessionId} → resolvedSessionId=${sessionId ?? "NONE"}`);
63
+ }
64
+ const finalSessionId = sessionId ?? event.sessionId;
65
+ logDebug(`[AskQ:forward] finalSessionId=${finalSessionId} tmuxTarget=${event.tmuxTarget ?? "NONE"}`);
66
+ this.onAskUserQuestion?.({ ...event, sessionId: finalSessionId });
67
+ }
51
68
  async handleNotification(rawEvent) {
52
69
  const event = this.parseNotificationEvent(rawEvent);
53
70
  if (!event)
54
71
  return;
72
+ logDebug(`[Notif:raw] agentSessionId=${event.sessionId} tmuxTarget=${event.tmuxTarget ?? "NONE"} type=${event.notificationType}`);
55
73
  let sessionId;
56
74
  if (this.chatResolver) {
57
75
  sessionId = this.chatResolver.resolveSessionId(event.sessionId, "", event.cwd, event.tmuxTarget);
76
+ logDebug(`[Notif:resolved] ${event.sessionId} → ${sessionId ?? "NONE"}`);
58
77
  }
59
78
  if (!sessionId) {
60
79
  sessionId = event.sessionId;
61
80
  }
81
+ logDebug(`[Notif:forward] finalSessionId=${sessionId} tmuxTarget=${event.tmuxTarget ?? "NONE"}`);
62
82
  this.onNotification?.({ ...event, sessionId });
63
83
  }
64
84
  buildResponseUrl(data) {
@@ -73,6 +93,49 @@ export class AgentHandler {
73
93
  });
74
94
  return `${MINI_APP_BASE_URL}/response/?${params.toString()}`;
75
95
  }
96
+ parseAskUserQuestionEvent(raw) {
97
+ if (!raw || typeof raw !== "object")
98
+ return null;
99
+ const obj = raw;
100
+ const sessionId = typeof obj.session_id === "string" ? obj.session_id : "";
101
+ if (!sessionId)
102
+ return null;
103
+ const toolInput = (typeof obj.tool_input === "object" && obj.tool_input !== null ? obj.tool_input : obj);
104
+ const rawQuestions = Array.isArray(toolInput.questions) ? toolInput.questions : [];
105
+ if (rawQuestions.length === 0)
106
+ return null;
107
+ const questions = [];
108
+ for (const q of rawQuestions) {
109
+ if (!q || typeof q !== "object")
110
+ continue;
111
+ const qObj = q;
112
+ const question = typeof qObj.question === "string" ? qObj.question : "";
113
+ const header = typeof qObj.header === "string" ? qObj.header : "";
114
+ const multiSelect = qObj.multiSelect === true;
115
+ const opts = Array.isArray(qObj.options) ? qObj.options : [];
116
+ const options = [];
117
+ for (const o of opts) {
118
+ if (!o || typeof o !== "object")
119
+ continue;
120
+ const oObj = o;
121
+ options.push({
122
+ label: typeof oObj.label === "string" ? oObj.label : "",
123
+ description: typeof oObj.description === "string" ? oObj.description : "",
124
+ });
125
+ }
126
+ if (question && options.length > 0) {
127
+ questions.push({ question, header, multiSelect, options });
128
+ }
129
+ }
130
+ if (questions.length === 0)
131
+ return null;
132
+ return {
133
+ sessionId,
134
+ tmuxTarget: typeof obj.tmux_target === "string" ? obj.tmux_target : undefined,
135
+ cwd: typeof obj.cwd === "string" ? obj.cwd : undefined,
136
+ questions,
137
+ };
138
+ }
76
139
  parseNotificationEvent(raw) {
77
140
  if (!raw || typeof raw !== "object")
78
141
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-handler.js","sourceRoot":"","sources":["../../src/agent/agent-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-handler.js","sourceRoot":"","sources":["../../src/agent/agent-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAiC3D,MAAM,OAAO,YAAY;IAEb;IACA;IACA;IACA;IACA;IALV,YACU,QAAuB,EACvB,OAA4B,EAC5B,QAAgB,EAChB,aAA4B,EAC5B,YAAkC;QAJlC,aAAQ,GAAR,QAAQ,CAAe;QACvB,YAAO,GAAP,OAAO,CAAqB;QAC5B,aAAQ,GAAR,QAAQ,CAAQ;QAChB,kBAAa,GAAb,aAAa,CAAe;QAC5B,iBAAY,GAAZ,YAAY,CAAsB;IACzC,CAAC;IAEJ,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,QAAiB;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7C,QAAQ,CACN,oBAAoB,SAAS,mBAAmB,MAAM,CAAC,cAAc,IAAI,MAAM,YAAY,MAAM,CAAC,WAAW,eAAe,MAAM,CAAC,UAAU,IAAI,MAAM,QAAQ,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CACtL,CAAC;QAEF,IAAI,aAAiC,CAAC;QACtC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAChD,MAAM,CAAC,cAAc,IAAI,EAAE,EAC3B,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,UAAU,CAClB,CAAC;YACF,QAAQ,CAAC,iCAAiC,aAAa,IAAI,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,IAAI,GAAqB;YAC7B,KAAK,EAAE,QAAQ,CAAC,IAAI;YACpB,gBAAgB,EAAE,QAAQ,CAAC,WAAW;YACtC,SAAS,EAAE,aAAa;YACxB,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,aAAa,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtE,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAiB;QACxC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,cAAc,CAA+B;IAE7C,cAAc,CAAsC;IACpD,iBAAiB,CAAyC;IAE1D,KAAK,CAAC,qBAAqB,CAAC,QAAiB;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,QAAQ,CACN,6BAA6B,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,UAAU,IAAI,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM,cAAc,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CACvJ,CAAC;QAEF,IAAI,SAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAC5C,KAAK,CAAC,SAAS,EACf,EAAE,EACF,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,UAAU,CACjB,CAAC;YACF,QAAQ,CACN,kCAAkC,KAAK,CAAC,SAAS,wBAAwB,SAAS,IAAI,MAAM,EAAE,CAC/F,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QACpD,QAAQ,CACN,iCAAiC,cAAc,eAAe,KAAK,CAAC,UAAU,IAAI,MAAM,EAAE,CAC3F,CAAC;QACF,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAAiB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,QAAQ,CACN,8BAA8B,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,UAAU,IAAI,MAAM,SAAS,KAAK,CAAC,gBAAgB,EAAE,CACxH,CAAC;QAEF,IAAI,SAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAC5C,KAAK,CAAC,SAAS,EACf,EAAE,EACF,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,UAAU,CACjB,CAAC;YACF,QAAQ,CAAC,oBAAoB,KAAK,CAAC,SAAS,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAC9B,CAAC;QAED,QAAQ,CACN,kCAAkC,SAAS,eAAe,KAAK,CAAC,UAAU,IAAI,MAAM,EAAE,CACvF,CAAC;QACF,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACjD,CAAC;IAEO,gBAAgB,CAAC,IAAsB;QAC7C,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,oBAAoB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,EAAE;YACF,GAAG,EAAE,OAAO;YACZ,CAAC,EAAE,IAAI,CAAC,WAAW;YACnB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YAC1B,CAAC,EAAE,IAAI,CAAC,KAAK;SACd,CAAC,CAAC;QACH,OAAO,GAAG,iBAAiB,cAAc,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC/D,CAAC;IAEO,yBAAyB,CAAC,GAAY;QAC5C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,GAAG,GAAG,GAA8B,CAAC;QAE3C,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,SAAS,GAAG,CAChB,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAC1D,CAAC;QAE7B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,SAAS,GAA0B,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,SAAS;YAC1C,MAAM,IAAI,GAAG,CAA4B,CAAC;YAC1C,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,OAAO,GAA4B,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,SAAS;gBAC1C,MAAM,IAAI,GAAG,CAA4B,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBACvD,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;iBAC1E,CAAC,CAAC;YACL,CAAC;YACD,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAExC,OAAO;YACL,SAAS;YACT,UAAU,EAAE,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YAC7E,GAAG,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YACtD,SAAS;SACV,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,GAAY;QACzC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,GAAG,GAAG,GAA8B,CAAC;QAE3C,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnE,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAExC,MAAM,gBAAgB,GACpB,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ,IAAI,GAAG,CAAC,iBAAiB;YAChE,CAAC,CAAC,GAAG,CAAC,iBAAiB;YACvB,CAAC,CAAC,cAAc,CAAC;QAErB,OAAO;YACL,SAAS;YACT,gBAAgB;YAChB,OAAO;YACP,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC5D,GAAG,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YACtD,UAAU,EAAE,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC9E,CAAC;IACJ,CAAC;CACF"}
@@ -9,9 +9,11 @@ export declare class ClaudeCodeInstaller {
9
9
  private static writeStopScript;
10
10
  private static writeSessionStartScript;
11
11
  private static writeNotificationScript;
12
+ private static writePreToolUseScript;
12
13
  private static removeStopScript;
13
14
  private static removeSessionStartScript;
14
15
  private static removeNotificationScript;
16
+ private static removePreToolUseScript;
15
17
  private static removeFromSettings;
16
18
  private static readSettings;
17
19
  }
@@ -33,7 +33,8 @@ export class ClaudeCodeInstaller {
33
33
  const settings = ClaudeCodeInstaller.readSettings();
34
34
  return (hasCcpokeHook(settings.hooks?.Stop ?? []) &&
35
35
  hasCcpokeHook(settings.hooks?.SessionStart ?? []) &&
36
- hasCcpokeHook(settings.hooks?.Notification ?? []));
36
+ hasCcpokeHook(settings.hooks?.Notification ?? []) &&
37
+ hasCcpokeHook(settings.hooks?.PreToolUse ?? []));
37
38
  }
38
39
  catch {
39
40
  return false;
@@ -49,6 +50,8 @@ export class ClaudeCodeInstaller {
49
50
  missing.push("SessionStart hook in settings");
50
51
  if (!hasCcpokeHook(settings.hooks?.Notification ?? []))
51
52
  missing.push("Notification hook in settings");
53
+ if (!hasCcpokeHook(settings.hooks?.PreToolUse ?? []))
54
+ missing.push("PreToolUse hook in settings");
52
55
  }
53
56
  catch {
54
57
  missing.push("settings.json");
@@ -59,12 +62,16 @@ export class ClaudeCodeInstaller {
59
62
  missing.push("session-start script file");
60
63
  if (!existsSync(paths.claudeCodeNotificationScript))
61
64
  missing.push("notification script file");
65
+ if (!existsSync(paths.claudeCodePreToolUseScript))
66
+ missing.push("pretooluse script file");
62
67
  if (isScriptOutdated(paths.claudeCodeHookScript))
63
68
  missing.push("outdated stop script");
64
69
  if (isScriptOutdated(paths.claudeCodeSessionStartScript))
65
70
  missing.push("outdated session-start script");
66
71
  if (isScriptOutdated(paths.claudeCodeNotificationScript))
67
72
  missing.push("outdated notification script");
73
+ if (isScriptOutdated(paths.claudeCodePreToolUseScript))
74
+ missing.push("outdated pretooluse script");
68
75
  return { complete: missing.length === 0, missing };
69
76
  }
70
77
  static install(hookPort, hookSecret) {
@@ -85,6 +92,13 @@ export class ClaudeCodeInstaller {
85
92
  ...(settings.hooks.Notification ?? []),
86
93
  { hooks: [{ type: "command", command: paths.claudeCodeNotificationScript, timeout: 10 }] },
87
94
  ];
95
+ settings.hooks.PreToolUse = [
96
+ ...(settings.hooks.PreToolUse ?? []),
97
+ {
98
+ matcher: "AskUserQuestion",
99
+ hooks: [{ type: "command", command: paths.claudeCodePreToolUseScript, timeout: 5 }],
100
+ },
101
+ ];
88
102
  }
89
103
  mkdirSync(paths.claudeDir, { recursive: true });
90
104
  const tmpSettings = `${paths.claudeSettings}.tmp`;
@@ -93,12 +107,14 @@ export class ClaudeCodeInstaller {
93
107
  ClaudeCodeInstaller.writeStopScript(hookPort, hookSecret);
94
108
  ClaudeCodeInstaller.writeSessionStartScript(hookPort, hookSecret);
95
109
  ClaudeCodeInstaller.writeNotificationScript(hookPort, hookSecret);
110
+ ClaudeCodeInstaller.writePreToolUseScript(hookPort, hookSecret);
96
111
  }
97
112
  static uninstall() {
98
113
  ClaudeCodeInstaller.removeFromSettings();
99
114
  ClaudeCodeInstaller.removeStopScript();
100
115
  ClaudeCodeInstaller.removeSessionStartScript();
101
116
  ClaudeCodeInstaller.removeNotificationScript();
117
+ ClaudeCodeInstaller.removePreToolUseScript();
102
118
  }
103
119
  static writeStopScript(hookPort, hookSecret) {
104
120
  mkdirSync(paths.hooksDir, { recursive: true });
@@ -114,7 +130,11 @@ export class ClaudeCodeInstaller {
114
130
  # ccpoke-version: ${version}
115
131
  INPUT=$(cat | tr -d '\\n\\r')
116
132
  TMUX_TARGET=""
117
- [ -n "$TMUX" ] && TMUX_TARGET=$(tmux display-message -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
133
+ if [ -n "$TMUX_PANE" ]; then
134
+ TMUX_TARGET=$(tmux display-message -t "$TMUX_PANE" -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
135
+ elif [ -n "$TMUX" ]; then
136
+ TMUX_TARGET=$(tmux display-message -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
137
+ fi
118
138
  if [ -n "$TMUX_TARGET" ] && echo "$TMUX_TARGET" | grep -qE '^[a-zA-Z0-9_.:/@ -]+$'; then
119
139
  INPUT=$(echo "$INPUT" | sed 's/}$/,"tmux_target":"'"$TMUX_TARGET"'"}/')
120
140
  fi
@@ -136,7 +156,11 @@ echo "$INPUT" | curl -s -X POST "http://localhost:${hookPort}${ApiRoute.HookStop
136
156
  INPUT=$(cat)
137
157
  SESSION_ID=$(echo "$INPUT" | grep -o '"session_id":"[^"]*"' | head -1 | cut -d'"' -f4)
138
158
  CWD=$(echo "$INPUT" | grep -o '"cwd":"[^"]*"' | head -1 | cut -d'"' -f4)
139
- TMUX_TARGET=$(tmux display-message -p '#{session_name}:#{window_index}.#{pane_index}')
159
+ if [ -n "$TMUX_PANE" ]; then
160
+ TMUX_TARGET=$(tmux display-message -t "$TMUX_PANE" -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null)
161
+ else
162
+ TMUX_TARGET=$(tmux display-message -p '#{session_name}:#{window_index}.#{pane_index}')
163
+ fi
140
164
 
141
165
  [ -z "$SESSION_ID" ] && exit 0
142
166
 
@@ -167,7 +191,11 @@ SESSION_ID=$(echo "$INPUT" | grep -o '"session_id":"[^"]*"' | head -1 | cut -d'"
167
191
  [ -z "$SESSION_ID" ] && exit 0
168
192
 
169
193
  TMUX_TARGET=""
170
- [ -n "$TMUX" ] && TMUX_TARGET=$(tmux display-message -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
194
+ if [ -n "$TMUX_PANE" ]; then
195
+ TMUX_TARGET=$(tmux display-message -t "$TMUX_PANE" -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
196
+ elif [ -n "$TMUX" ]; then
197
+ TMUX_TARGET=$(tmux display-message -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
198
+ fi
171
199
 
172
200
  # Inject tmux_target into the raw JSON from Claude Code
173
201
  if [ -n "$TMUX_TARGET" ] && echo "$TMUX_TARGET" | grep -qE '^[a-zA-Z0-9_.:/@ -]+$'; then
@@ -184,6 +212,41 @@ echo "$PAYLOAD" | curl -s -X POST "http://127.0.0.1:${hookPort}${ApiRoute.HookNo
184
212
  `;
185
213
  writeFileSync(paths.claudeCodeNotificationScript, script, { mode: 0o700 });
186
214
  }
215
+ static writePreToolUseScript(hookPort, hookSecret) {
216
+ mkdirSync(paths.hooksDir, { recursive: true });
217
+ if (process.platform === "win32")
218
+ return;
219
+ const version = getPackageVersion();
220
+ const script = `#!/bin/bash
221
+ # ccpoke-version: ${version}
222
+ INPUT=$(cat)
223
+ TOOL_NAME=$(echo "$INPUT" | grep -o '"tool_name":"[^"]*"' | head -1 | cut -d'"' -f4)
224
+ [ "$TOOL_NAME" != "AskUserQuestion" ] && exit 0
225
+
226
+ SESSION_ID=$(echo "$INPUT" | grep -o '"session_id":"[^"]*"' | head -1 | cut -d'"' -f4)
227
+ [ -z "$SESSION_ID" ] && exit 0
228
+
229
+ TMUX_TARGET=""
230
+ if [ -n "$TMUX_PANE" ]; then
231
+ TMUX_TARGET=$(tmux display-message -t "$TMUX_PANE" -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
232
+ elif [ -n "$TMUX" ]; then
233
+ TMUX_TARGET=$(tmux display-message -p '#{session_name}:#{window_index}.#{pane_index}' 2>/dev/null || echo "")
234
+ fi
235
+
236
+ if [ -n "$TMUX_TARGET" ] && echo "$TMUX_TARGET" | grep -qE '^[a-zA-Z0-9_.:/@ -]+$'; then
237
+ PAYLOAD=$(echo "$INPUT" | sed 's/}$/,"tmux_target":"'"$TMUX_TARGET"'"}/')
238
+ else
239
+ PAYLOAD="$INPUT"
240
+ fi
241
+
242
+ echo "$PAYLOAD" | curl -s -X POST "http://127.0.0.1:${hookPort}${ApiRoute.HookAskUserQuestion}" \\
243
+ -H "Content-Type: application/json" \\
244
+ -H "X-CCPoke-Secret: ${hookSecret}" \\
245
+ --data-binary @- \\
246
+ --max-time 3 > /dev/null 2>&1 || true
247
+ `;
248
+ writeFileSync(paths.claudeCodePreToolUseScript, script, { mode: 0o700 });
249
+ }
187
250
  static removeStopScript() {
188
251
  try {
189
252
  unlinkSync(paths.claudeCodeHookScript);
@@ -208,11 +271,19 @@ echo "$PAYLOAD" | curl -s -X POST "http://127.0.0.1:${hookPort}${ApiRoute.HookNo
208
271
  /* may not exist */
209
272
  }
210
273
  }
274
+ static removePreToolUseScript() {
275
+ try {
276
+ unlinkSync(paths.claudeCodePreToolUseScript);
277
+ }
278
+ catch {
279
+ /* may not exist */
280
+ }
281
+ }
211
282
  static removeFromSettings() {
212
283
  const settings = ClaudeCodeInstaller.readSettings();
213
284
  if (!settings.hooks)
214
285
  return;
215
- for (const hookType of ["Stop", "SessionStart", "Notification"]) {
286
+ for (const hookType of ["Stop", "SessionStart", "Notification", "PreToolUse"]) {
216
287
  const entries = settings.hooks[hookType];
217
288
  if (!entries)
218
289
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-installer.js","sourceRoot":"","sources":["../../../src/agent/claude-code/claude-code-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-code-installer.js","sourceRoot":"","sources":["../../../src/agent/claude-code/claude-code-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type TelegramBot from "node-telegram-bot-api";
2
+ import type { AskUserQuestionEvent } from "../../agent/agent-handler.js";
3
+ import type { TmuxBridge } from "../../tmux/tmux-bridge.js";
4
+ export declare class AskQuestionHandler {
5
+ private bot;
6
+ private chatId;
7
+ private pending;
8
+ private pendingById;
9
+ private nextPendingId;
10
+ private timers;
11
+ private injector;
12
+ private callbackLocks;
13
+ private processedCallbacks;
14
+ constructor(bot: TelegramBot, chatId: () => number | null, tmuxBridge: TmuxBridge);
15
+ forwardQuestion(event: AskUserQuestionEvent): Promise<void>;
16
+ handleCallback(query: TelegramBot.CallbackQuery): Promise<void>;
17
+ private processCallback;
18
+ hasPendingOtherReply(_chatId: number, _messageId: number): boolean;
19
+ handleOtherTextReply(_chatId: number, _messageId: number, _text: string): Promise<boolean>;
20
+ destroy(): void;
21
+ private sendQuestion;
22
+ private handleSingleSelectCallback;
23
+ private handleMultiSelectCallback;
24
+ private handleMultiSelectConfirm;
25
+ private injectAnswer;
26
+ private advanceToNext;
27
+ private findPendingByNumericId;
28
+ private setPending;
29
+ private clearPending;
30
+ }