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.
- package/README.en.md +5 -5
- package/README.md +6 -6
- package/README.zh.md +197 -0
- package/dist/agent/agent-handler.d.ts +19 -0
- package/dist/agent/agent-handler.js +69 -8
- package/dist/agent/agent-handler.js.map +1 -1
- package/dist/agent/chat-session-resolver.d.ts +1 -2
- package/dist/agent/claude-code/claude-code-installer.d.ts +2 -0
- package/dist/agent/claude-code/claude-code-installer.js +120 -22
- package/dist/agent/claude-code/claude-code-installer.js.map +1 -1
- package/dist/agent/cursor/cursor-installer.d.ts +4 -0
- package/dist/agent/cursor/cursor-installer.js +44 -9
- package/dist/agent/cursor/cursor-installer.js.map +1 -1
- package/dist/agent/cursor/cursor-provider.js +1 -1
- package/dist/agent/cursor/cursor-provider.js.map +1 -1
- package/dist/channel/telegram/ask-question-handler.d.ts +30 -0
- package/dist/channel/telegram/ask-question-handler.js +305 -0
- package/dist/channel/telegram/ask-question-handler.js.map +1 -0
- package/dist/channel/telegram/ask-question-keyboard-builder.d.ts +4 -0
- package/dist/channel/telegram/ask-question-keyboard-builder.js +26 -0
- package/dist/channel/telegram/ask-question-keyboard-builder.js.map +1 -0
- package/dist/channel/telegram/ask-question-tui-injector.d.ts +14 -0
- package/dist/channel/telegram/ask-question-tui-injector.js +53 -0
- package/dist/channel/telegram/ask-question-tui-injector.js.map +1 -0
- package/dist/channel/telegram/escape-markdown.d.ts +1 -0
- package/dist/channel/telegram/escape-markdown.js +4 -0
- package/dist/channel/telegram/escape-markdown.js.map +1 -0
- package/dist/channel/telegram/prompt-handler.d.ts +0 -1
- package/dist/channel/telegram/prompt-handler.js +8 -33
- package/dist/channel/telegram/prompt-handler.js.map +1 -1
- package/dist/channel/telegram/session-list.js +27 -19
- package/dist/channel/telegram/session-list.js.map +1 -1
- package/dist/channel/telegram/telegram-channel.d.ts +5 -1
- package/dist/channel/telegram/telegram-channel.js +88 -51
- package/dist/channel/telegram/telegram-channel.js.map +1 -1
- package/dist/channel/telegram/telegram-sender.js +1 -1
- package/dist/channel/telegram/telegram-sender.js.map +1 -1
- package/dist/commands/update.js +21 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/i18n/locales/en.js +20 -9
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/vi.js +21 -10
- package/dist/i18n/locales/vi.js.map +1 -1
- package/dist/i18n/locales/zh.js +20 -9
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/types.d.ts +18 -7
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/server/api-server.js +13 -0
- package/dist/server/api-server.js.map +1 -1
- package/dist/tmux/session-map.d.ts +2 -1
- package/dist/tmux/session-map.js +41 -16
- package/dist/tmux/session-map.js.map +1 -1
- package/dist/tmux/session-state.d.ts +1 -4
- package/dist/tmux/session-state.js +5 -10
- package/dist/tmux/session-state.js.map +1 -1
- package/dist/tmux/tmux-bridge.d.ts +7 -3
- package/dist/tmux/tmux-bridge.js +68 -49
- package/dist/tmux/tmux-bridge.js.map +1 -1
- package/dist/tmux/tmux-scanner.d.ts +11 -0
- package/dist/tmux/tmux-scanner.js +61 -15
- package/dist/tmux/tmux-scanner.js.map +1 -1
- package/dist/tmux/tmux-session-resolver.d.ts +1 -2
- package/dist/tmux/tmux-session-resolver.js +10 -7
- package/dist/tmux/tmux-session-resolver.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/log.d.ts +1 -0
- package/dist/utils/log.js +61 -8
- package/dist/utils/log.js.map +1 -1
- package/dist/utils/paths.d.ts +1 -0
- package/dist/utils/paths.js +1 -0
- package/dist/utils/paths.js.map +1 -1
- 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
|
-
|
|
|
28
|
-
|
|
29
|
-
|
|
|
30
|
-
|
|
|
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
|
-
##
|
|
25
|
+
## Hỗ trợ Agent
|
|
26
26
|
|
|
27
|
-
|
|
|
28
|
-
|
|
29
|
-
|
|
|
30
|
-
|
|
|
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
|
-
|
|
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 || !
|
|
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":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
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
|
}
|