ccpoke 1.6.3 → 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 (75) 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 +69 -8
  6. package/dist/agent/agent-handler.js.map +1 -1
  7. package/dist/agent/chat-session-resolver.d.ts +1 -2
  8. package/dist/agent/claude-code/claude-code-installer.d.ts +2 -0
  9. package/dist/agent/claude-code/claude-code-installer.js +120 -22
  10. package/dist/agent/claude-code/claude-code-installer.js.map +1 -1
  11. package/dist/agent/cursor/cursor-installer.d.ts +4 -0
  12. package/dist/agent/cursor/cursor-installer.js +44 -9
  13. package/dist/agent/cursor/cursor-installer.js.map +1 -1
  14. package/dist/agent/cursor/cursor-provider.js +1 -1
  15. package/dist/agent/cursor/cursor-provider.js.map +1 -1
  16. package/dist/channel/telegram/ask-question-handler.d.ts +30 -0
  17. package/dist/channel/telegram/ask-question-handler.js +305 -0
  18. package/dist/channel/telegram/ask-question-handler.js.map +1 -0
  19. package/dist/channel/telegram/ask-question-keyboard-builder.d.ts +4 -0
  20. package/dist/channel/telegram/ask-question-keyboard-builder.js +26 -0
  21. package/dist/channel/telegram/ask-question-keyboard-builder.js.map +1 -0
  22. package/dist/channel/telegram/ask-question-tui-injector.d.ts +14 -0
  23. package/dist/channel/telegram/ask-question-tui-injector.js +53 -0
  24. package/dist/channel/telegram/ask-question-tui-injector.js.map +1 -0
  25. package/dist/channel/telegram/escape-markdown.d.ts +1 -0
  26. package/dist/channel/telegram/escape-markdown.js +4 -0
  27. package/dist/channel/telegram/escape-markdown.js.map +1 -0
  28. package/dist/channel/telegram/prompt-handler.d.ts +0 -1
  29. package/dist/channel/telegram/prompt-handler.js +8 -33
  30. package/dist/channel/telegram/prompt-handler.js.map +1 -1
  31. package/dist/channel/telegram/session-list.js +27 -19
  32. package/dist/channel/telegram/session-list.js.map +1 -1
  33. package/dist/channel/telegram/telegram-channel.d.ts +5 -1
  34. package/dist/channel/telegram/telegram-channel.js +88 -51
  35. package/dist/channel/telegram/telegram-channel.js.map +1 -1
  36. package/dist/channel/telegram/telegram-sender.js +1 -1
  37. package/dist/channel/telegram/telegram-sender.js.map +1 -1
  38. package/dist/commands/update.js +21 -1
  39. package/dist/commands/update.js.map +1 -1
  40. package/dist/i18n/locales/en.js +20 -9
  41. package/dist/i18n/locales/en.js.map +1 -1
  42. package/dist/i18n/locales/vi.js +21 -10
  43. package/dist/i18n/locales/vi.js.map +1 -1
  44. package/dist/i18n/locales/zh.js +20 -9
  45. package/dist/i18n/locales/zh.js.map +1 -1
  46. package/dist/i18n/types.d.ts +18 -7
  47. package/dist/index.js +4 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/server/api-server.js +13 -0
  50. package/dist/server/api-server.js.map +1 -1
  51. package/dist/tmux/session-map.d.ts +2 -1
  52. package/dist/tmux/session-map.js +41 -16
  53. package/dist/tmux/session-map.js.map +1 -1
  54. package/dist/tmux/session-state.d.ts +1 -4
  55. package/dist/tmux/session-state.js +5 -10
  56. package/dist/tmux/session-state.js.map +1 -1
  57. package/dist/tmux/tmux-bridge.d.ts +7 -3
  58. package/dist/tmux/tmux-bridge.js +68 -49
  59. package/dist/tmux/tmux-bridge.js.map +1 -1
  60. package/dist/tmux/tmux-scanner.d.ts +11 -0
  61. package/dist/tmux/tmux-scanner.js +61 -15
  62. package/dist/tmux/tmux-scanner.js.map +1 -1
  63. package/dist/tmux/tmux-session-resolver.d.ts +1 -2
  64. package/dist/tmux/tmux-session-resolver.js +10 -7
  65. package/dist/tmux/tmux-session-resolver.js.map +1 -1
  66. package/dist/utils/constants.d.ts +1 -0
  67. package/dist/utils/constants.js +1 -0
  68. package/dist/utils/constants.js.map +1 -1
  69. package/dist/utils/log.d.ts +1 -0
  70. package/dist/utils/log.js +61 -8
  71. package/dist/utils/log.js.map +1 -1
  72. package/dist/utils/paths.d.ts +1 -0
  73. package/dist/utils/paths.js +1 -0
  74. package/dist/utils/paths.js.map +1 -1
  75. 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,
@@ -36,7 +38,7 @@ export class AgentHandler {
36
38
  ...result,
37
39
  };
38
40
  if (chatSessionId && this.chatResolver) {
39
- this.chatResolver.onStopHook(chatSessionId);
41
+ this.chatResolver.onStopHook(chatSessionId, result.model);
40
42
  }
41
43
  const responseUrl = this.buildResponseUrl(data);
42
44
  this.channel.sendNotification(data, responseUrl).catch((err) => {
@@ -48,21 +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
  }
62
- // Only elicitation_dialog blocks the session (needs user input)
63
- if (event.notificationType === "elicitation_dialog") {
64
- this.chatResolver?.onNotificationBlock?.(sessionId);
65
- }
81
+ logDebug(`[Notif:forward] finalSessionId=${sessionId} tmuxTarget=${event.tmuxTarget ?? "NONE"}`);
66
82
  this.onNotification?.({ ...event, sessionId });
67
83
  }
68
84
  buildResponseUrl(data) {
@@ -77,15 +93,60 @@ export class AgentHandler {
77
93
  });
78
94
  return `${MINI_APP_BASE_URL}/response/?${params.toString()}`;
79
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
+ }
80
139
  parseNotificationEvent(raw) {
81
140
  if (!raw || typeof raw !== "object")
82
141
  return null;
83
142
  const obj = raw;
84
143
  const sessionId = typeof obj.session_id === "string" ? obj.session_id : "";
85
- const notificationType = typeof obj.notification_type === "string" ? obj.notification_type : "";
86
144
  const message = typeof obj.message === "string" ? obj.message : "";
87
- if (!sessionId || !notificationType)
145
+ if (!sessionId || !message)
88
146
  return null;
147
+ const notificationType = typeof obj.notification_type === "string" && obj.notification_type
148
+ ? obj.notification_type
149
+ : "notification";
89
150
  return {
90
151
  sessionId,
91
152
  notificationType,
@@ -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":"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"}
@@ -1,5 +1,4 @@
1
1
  export interface ChatSessionResolver {
2
2
  resolveSessionId(agentSessionId: string, projectName: string, cwd?: string, tmuxTarget?: string): string | undefined;
3
- onStopHook(sessionId: string): void;
4
- onNotificationBlock?(sessionId: string): void;
3
+ onStopHook(sessionId: string, model?: string): void;
5
4
  }
@@ -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
  }