ccpoke 1.3.0
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/LICENSE +21 -0
- package/README.en.md +158 -0
- package/README.md +158 -0
- package/dist/channel/telegram/telegram-channel.d.ts +18 -0
- package/dist/channel/telegram/telegram-channel.js +148 -0
- package/dist/channel/telegram/telegram-channel.js.map +1 -0
- package/dist/channel/telegram/telegram-sender.d.ts +2 -0
- package/dist/channel/telegram/telegram-sender.js +72 -0
- package/dist/channel/telegram/telegram-sender.js.map +1 -0
- package/dist/channel/types.d.ts +20 -0
- package/dist/channel/types.js +2 -0
- package/dist/channel/types.js.map +1 -0
- package/dist/commands/help.d.ts +1 -0
- package/dist/commands/help.js +19 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +112 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.js +43 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.js +136 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config-manager.d.ts +20 -0
- package/dist/config-manager.js +94 -0
- package/dist/config-manager.js.map +1 -0
- package/dist/hook/hook-handler.d.ts +10 -0
- package/dist/hook/hook-handler.js +79 -0
- package/dist/hook/hook-handler.js.map +1 -0
- package/dist/hook/hook-installer.d.ts +9 -0
- package/dist/hook/hook-installer.js +110 -0
- package/dist/hook/hook-installer.js.map +1 -0
- package/dist/hook/hook-server.d.ts +13 -0
- package/dist/hook/hook-server.js +65 -0
- package/dist/hook/hook-server.js.map +1 -0
- package/dist/hook/response-store.d.ts +8 -0
- package/dist/hook/response-store.js +18 -0
- package/dist/i18n/index.d.ts +9 -0
- package/dist/i18n/index.js +55 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/locales/en.d.ts +2 -0
- package/dist/i18n/locales/en.js +127 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/vi.d.ts +2 -0
- package/dist/i18n/locales/vi.js +127 -0
- package/dist/i18n/locales/vi.js.map +1 -0
- package/dist/i18n/locales/zh.d.ts +2 -0
- package/dist/i18n/locales/zh.js +127 -0
- package/dist/i18n/locales/zh.js.map +1 -0
- package/dist/i18n/types.d.ts +126 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/dist/monitor/git-collector.d.ts +2 -0
- package/dist/monitor/git-collector.js +88 -0
- package/dist/monitor/git-collector.js.map +1 -0
- package/dist/monitor/transcript-parser.d.ts +10 -0
- package/dist/monitor/transcript-parser.js +77 -0
- package/dist/monitor/transcript-parser.js.map +1 -0
- package/dist/setup.d.ts +1 -0
- package/dist/setup.js +130 -0
- package/dist/telegram/bot.d.ts +20 -0
- package/dist/telegram/bot.js +130 -0
- package/dist/telegram/message-formatter.d.ts +18 -0
- package/dist/telegram/message-formatter.js +56 -0
- package/dist/telegram/message-sender.d.ts +2 -0
- package/dist/telegram/message-sender.js +76 -0
- package/dist/utils/constants.d.ts +44 -0
- package/dist/utils/constants.js +41 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/error-utils.d.ts +1 -0
- package/dist/utils/error-utils.js +3 -0
- package/dist/utils/install-detection.d.ts +5 -0
- package/dist/utils/install-detection.js +42 -0
- package/dist/utils/install-detection.js.map +1 -0
- package/dist/utils/log.d.ts +2 -0
- package/dist/utils/log.js +18 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/paths.d.ts +15 -0
- package/dist/utils/paths.js +38 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/response-store.d.ts +29 -0
- package/dist/utils/response-store.js +100 -0
- package/dist/utils/response-store.js.map +1 -0
- package/dist/utils/tunnel.d.ts +7 -0
- package/dist/utils/tunnel.js +53 -0
- package/dist/utils/tunnel.js.map +1 -0
- package/package.json +88 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Claude Code Bot Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.en.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# 🤖 ccpoke — Claude Code ↔ Telegram Notification Bot
|
|
2
|
+
|
|
3
|
+
[Tiếng Việt](./README.md)
|
|
4
|
+
|
|
5
|
+
> Get Telegram notifications when Claude Code completes a response — with git diff, processing time, and result summary.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Problem
|
|
10
|
+
|
|
11
|
+
You're using Claude Code on your computer. You step away with your phone but have no idea if Claude Code is done yet or what files it changed.
|
|
12
|
+
|
|
13
|
+
**ccpoke** is a lightweight bridge between Claude Code and Telegram — when Claude Code finishes, you get a notification right on your phone.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Claude Code completes response
|
|
17
|
+
↓
|
|
18
|
+
Stop Hook triggers
|
|
19
|
+
↓
|
|
20
|
+
ccpoke receives event
|
|
21
|
+
↓
|
|
22
|
+
Telegram notification 📱
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Features
|
|
26
|
+
|
|
27
|
+
- 🔔 **Auto notification** — Claude Code finishes → Telegram notifies you instantly
|
|
28
|
+
- 📂 **Git diff included** — see changed files without opening your computer
|
|
29
|
+
- ⏱ **Processing time** — know how long Claude Code took
|
|
30
|
+
- 📝 **Response summary** — quick glance at what Claude Code replied
|
|
31
|
+
- 🔐 **User whitelist** — only authorized users can use the bot
|
|
32
|
+
- 📄 **Auto-split messages** — long responses are automatically paginated `[1/N]`
|
|
33
|
+
|
|
34
|
+
## Requirements
|
|
35
|
+
|
|
36
|
+
- **Node.js** ≥ 18
|
|
37
|
+
- **pnpm** (or npm/yarn)
|
|
38
|
+
- **Telegram Bot Token** — create from [@BotFather](https://t.me/BotFather)
|
|
39
|
+
- **Telegram User ID** — get from [@userinfobot](https://t.me/userinfobot)
|
|
40
|
+
|
|
41
|
+
## Getting Started
|
|
42
|
+
|
|
43
|
+
### Option 1: Global install (recommended)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pnpm add -g ccpoke
|
|
47
|
+
ccpoke setup
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Option 2: npx (no install needed)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npx ccpoke setup
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Option 3: Clone repo (for development)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
git clone https://github.com/palooza-kaida/ccpoke.git
|
|
60
|
+
cd ccpoke
|
|
61
|
+
pnpm install
|
|
62
|
+
pnpm setup
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The setup wizard will guide you step by step:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
┌ 🤖 ccpoke setup
|
|
69
|
+
│
|
|
70
|
+
◇ Telegram Bot Token
|
|
71
|
+
│ your-bot-token
|
|
72
|
+
│
|
|
73
|
+
◇ Your Telegram User ID
|
|
74
|
+
│ your-user-id
|
|
75
|
+
│
|
|
76
|
+
◆ Config saved
|
|
77
|
+
◆ Hook installed → ~/.claude/settings.json
|
|
78
|
+
◆ Chat ID registered
|
|
79
|
+
│
|
|
80
|
+
└ 🎉 Setup complete!
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
<details>
|
|
84
|
+
<summary>Manual setup (without wizard)</summary>
|
|
85
|
+
|
|
86
|
+
Create `~/.ccpoke/config.json`:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"telegram_bot_token": "123456:ABC-xxx",
|
|
91
|
+
"user_id": 123456789,
|
|
92
|
+
"hook_port": 9377
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Then run `ccpoke setup` to install the hook and register your chat ID.
|
|
97
|
+
|
|
98
|
+
</details>
|
|
99
|
+
|
|
100
|
+
## Usage
|
|
101
|
+
|
|
102
|
+
### Start the bot
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Global install
|
|
106
|
+
ccpoke
|
|
107
|
+
|
|
108
|
+
# Or npx
|
|
109
|
+
npx ccpoke
|
|
110
|
+
|
|
111
|
+
# Or local dev
|
|
112
|
+
pnpm dev
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Once running, use Claude Code as usual → notifications will arrive on Telegram.
|
|
116
|
+
|
|
117
|
+
### Telegram Commands
|
|
118
|
+
|
|
119
|
+
| Command | Description |
|
|
120
|
+
|-----------|-----------------------------------------------------|
|
|
121
|
+
| `/start` | Re-register chat (auto during setup, rarely needed) |
|
|
122
|
+
| `/ping` | Check if bot is alive |
|
|
123
|
+
| `/status` | View bot status |
|
|
124
|
+
|
|
125
|
+
### Sample Notification
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
🤖 Claude Code Response
|
|
129
|
+
📂 my-project | ⏱ 45s
|
|
130
|
+
|
|
131
|
+
Fixed authentication bug in login.go. Main changes:
|
|
132
|
+
- Fix missing error check at line 42
|
|
133
|
+
- Add input validation...
|
|
134
|
+
|
|
135
|
+
📂 Changes:
|
|
136
|
+
✏️ src/login.go
|
|
137
|
+
➕ src/validator.go
|
|
138
|
+
❌ src/old_auth.go
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Uninstall
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
ccpoke uninstall
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
┌ 🗑️ Uninstalling ccpoke
|
|
149
|
+
│
|
|
150
|
+
◆ Hook removed from ~/.claude/settings.json
|
|
151
|
+
◆ Removed ~/.ccpoke/ (config, state, hooks)
|
|
152
|
+
│
|
|
153
|
+
└ ccpoke uninstalled
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
MIT
|
package/README.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# 🤖 ccpoke — Claude Code ↔ Telegram Notification Bot
|
|
2
|
+
|
|
3
|
+
[English](./README.en.md)
|
|
4
|
+
|
|
5
|
+
> Nhận thông báo Telegram khi Claude Code hoàn thành response — kèm git diff, thời gian xử lý, và tóm tắt kết quả.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Vấn đề giải quyết
|
|
10
|
+
|
|
11
|
+
Bạn đang dùng Claude Code trên máy tính. Ra ngoài cầm điện thoại nhưng không biết Claude Code đã xong chưa, thay đổi file nào.
|
|
12
|
+
|
|
13
|
+
**ccpoke** là cầu nối nhẹ giữa Claude Code và Telegram — khi Claude Code xong việc, bạn nhận notification ngay trên điện thoại.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Claude Code xong response
|
|
17
|
+
↓
|
|
18
|
+
Stop Hook trigger
|
|
19
|
+
↓
|
|
20
|
+
ccpoke nhận event
|
|
21
|
+
↓
|
|
22
|
+
Telegram notification 📱
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Tính năng
|
|
26
|
+
|
|
27
|
+
- 🔔 **Notification tự động** — Claude Code xong → Telegram nhận tin ngay
|
|
28
|
+
- 📂 **Git diff kèm theo** — biết file nào thay đổi mà không cần mở máy tính
|
|
29
|
+
- ⏱ **Thời gian xử lý** — biết Claude Code chạy bao lâu
|
|
30
|
+
- 📝 **Tóm tắt response** — xem nhanh Claude Code trả lời gì
|
|
31
|
+
- 🔐 **Whitelist user** — chỉ user được phép mới dùng được bot
|
|
32
|
+
- 📄 **Auto-split message** — response dài tự động chia page `[1/N]`
|
|
33
|
+
|
|
34
|
+
## Yêu cầu
|
|
35
|
+
|
|
36
|
+
- **Node.js** ≥ 18
|
|
37
|
+
- **pnpm** (hoặc npm/yarn)
|
|
38
|
+
- **Telegram Bot Token** — tạo từ [@BotFather](https://t.me/BotFather)
|
|
39
|
+
- **Telegram User ID** — lấy từ [@userinfobot](https://t.me/userinfobot)
|
|
40
|
+
|
|
41
|
+
## Bắt đầu
|
|
42
|
+
|
|
43
|
+
### Cách 1: Global install (khuyến nghị)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pnpm add -g ccpoke
|
|
47
|
+
ccpoke setup
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Cách 2: npx (không cần cài)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npx ccpoke setup
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Cách 3: Clone repo (cho development)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
git clone https://github.com/palooza-kaida/ccpoke.git
|
|
60
|
+
cd ccpoke
|
|
61
|
+
pnpm install
|
|
62
|
+
pnpm setup
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Setup wizard sẽ hướng dẫn từng bước:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
┌ 🤖 ccpoke setup
|
|
69
|
+
│
|
|
70
|
+
◇ Telegram Bot Token
|
|
71
|
+
│ your-bot-token
|
|
72
|
+
│
|
|
73
|
+
◇ Your Telegram User ID
|
|
74
|
+
│ your-user-id
|
|
75
|
+
│
|
|
76
|
+
◆ Config saved
|
|
77
|
+
◆ Hook installed → ~/.claude/settings.json
|
|
78
|
+
◆ Chat ID registered
|
|
79
|
+
│
|
|
80
|
+
└ 🎉 Setup complete!
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
<details>
|
|
84
|
+
<summary>Thiết lập thủ công (không dùng wizard)</summary>
|
|
85
|
+
|
|
86
|
+
Tạo file `~/.ccpoke/config.json`:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"telegram_bot_token": "123456:ABC-xxx",
|
|
91
|
+
"user_id": 123456789,
|
|
92
|
+
"hook_port": 9377
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Sau đó chạy `ccpoke setup` để cài hook và đăng ký chat ID.
|
|
97
|
+
|
|
98
|
+
</details>
|
|
99
|
+
|
|
100
|
+
## Sử dụng
|
|
101
|
+
|
|
102
|
+
### Khởi động bot
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Global install
|
|
106
|
+
ccpoke
|
|
107
|
+
|
|
108
|
+
# Hoặc npx
|
|
109
|
+
npx ccpoke
|
|
110
|
+
|
|
111
|
+
# Hoặc local dev
|
|
112
|
+
pnpm dev
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Bot chạy xong → dùng Claude Code bình thường → notification tự đến Telegram.
|
|
116
|
+
|
|
117
|
+
### Telegram Commands
|
|
118
|
+
|
|
119
|
+
| Command | Chức năng |
|
|
120
|
+
|-----------|---------------------------------------------------|
|
|
121
|
+
| `/start` | Đăng ký lại chat (tự động khi setup, ít khi cần) |
|
|
122
|
+
| `/ping` | Kiểm tra bot còn sống không |
|
|
123
|
+
| `/status` | Xem trạng thái bot |
|
|
124
|
+
|
|
125
|
+
### Notification mẫu
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
🤖 Claude Code Response
|
|
129
|
+
📂 my-project | ⏱ 45s
|
|
130
|
+
|
|
131
|
+
Đã sửa bug authentication trong login.go. Thay đổi chính:
|
|
132
|
+
- Fix missing error check ở dòng 42
|
|
133
|
+
- Thêm input validation...
|
|
134
|
+
|
|
135
|
+
📂 Changes:
|
|
136
|
+
✏️ src/login.go
|
|
137
|
+
➕ src/validator.go
|
|
138
|
+
❌ src/old_auth.go
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Gỡ cài đặt
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
ccpoke uninstall
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
┌ 🗑️ Uninstalling ccpoke
|
|
149
|
+
│
|
|
150
|
+
◆ Hook removed from ~/.claude/settings.json
|
|
151
|
+
◆ Removed ~/.ccpoke/ (config, state, hooks)
|
|
152
|
+
│
|
|
153
|
+
└ ccpoke uninstalled
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
MIT
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Config } from "../../config-manager.js";
|
|
2
|
+
import type { NotificationChannel, NotificationData } from "../types.js";
|
|
3
|
+
export declare class TelegramChannel implements NotificationChannel {
|
|
4
|
+
private bot;
|
|
5
|
+
private cfg;
|
|
6
|
+
private chatId;
|
|
7
|
+
private isDisconnected;
|
|
8
|
+
private tunnelUrl;
|
|
9
|
+
constructor(cfg: Config, tunnelUrl?: string | null);
|
|
10
|
+
initialize(): Promise<void>;
|
|
11
|
+
shutdown(): Promise<void>;
|
|
12
|
+
sendNotification(data: NotificationData, responseUrl?: string): Promise<void>;
|
|
13
|
+
private formatNotification;
|
|
14
|
+
private registerCommands;
|
|
15
|
+
private registerMenuButton;
|
|
16
|
+
private registerHandlers;
|
|
17
|
+
private registerPollingErrorHandler;
|
|
18
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import TelegramBot from "node-telegram-bot-api";
|
|
2
|
+
import { ConfigManager } from "../../config-manager.js";
|
|
3
|
+
import { sendTelegramMessage } from "./telegram-sender.js";
|
|
4
|
+
import { MINI_APP_BASE_URL } from "../../utils/constants.js";
|
|
5
|
+
import { t, getTranslations } from "../../i18n/index.js";
|
|
6
|
+
import { log, logError } from "../../utils/log.js";
|
|
7
|
+
export class TelegramChannel {
|
|
8
|
+
bot;
|
|
9
|
+
cfg;
|
|
10
|
+
chatId = null;
|
|
11
|
+
isDisconnected = false;
|
|
12
|
+
tunnelUrl;
|
|
13
|
+
constructor(cfg, tunnelUrl) {
|
|
14
|
+
this.cfg = cfg;
|
|
15
|
+
this.tunnelUrl = tunnelUrl ?? null;
|
|
16
|
+
this.bot = new TelegramBot(cfg.telegram_bot_token, { polling: false });
|
|
17
|
+
this.chatId = ConfigManager.loadChatState().chat_id;
|
|
18
|
+
this.registerHandlers();
|
|
19
|
+
this.registerPollingErrorHandler();
|
|
20
|
+
}
|
|
21
|
+
async initialize() {
|
|
22
|
+
this.bot.startPolling();
|
|
23
|
+
await this.registerCommands();
|
|
24
|
+
await this.registerMenuButton();
|
|
25
|
+
log(t("bot.telegramStarted"));
|
|
26
|
+
}
|
|
27
|
+
async shutdown() {
|
|
28
|
+
this.bot.stopPolling();
|
|
29
|
+
}
|
|
30
|
+
async sendNotification(data, responseUrl) {
|
|
31
|
+
if (!this.chatId) {
|
|
32
|
+
log(t("bot.noChatId"));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const text = this.formatNotification(data);
|
|
36
|
+
try {
|
|
37
|
+
await sendTelegramMessage(this.bot, this.chatId, text, responseUrl);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
logError(t("bot.notificationFailed"), err);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
formatNotification(data) {
|
|
44
|
+
const parts = [];
|
|
45
|
+
let header = `<b>${escapeHtml(data.projectName)}</b>`;
|
|
46
|
+
if (data.durationMs > 0) {
|
|
47
|
+
header += ` — ${escapeHtml(formatDuration(data.durationMs))}`;
|
|
48
|
+
}
|
|
49
|
+
parts.push(header);
|
|
50
|
+
if (data.inputTokens > 0 || data.outputTokens > 0) {
|
|
51
|
+
parts.push(`${t("notification.tokens")}: ${formatTokenCount(data.inputTokens)} → ${formatTokenCount(data.outputTokens)}`);
|
|
52
|
+
}
|
|
53
|
+
if (data.cacheReadTokens > 0 || data.cacheCreationTokens > 0) {
|
|
54
|
+
const cacheParts = [];
|
|
55
|
+
if (data.cacheReadTokens > 0)
|
|
56
|
+
cacheParts.push(`${formatTokenCount(data.cacheReadTokens)} ${t("notification.cacheRead")}`);
|
|
57
|
+
if (data.cacheCreationTokens > 0)
|
|
58
|
+
cacheParts.push(`${formatTokenCount(data.cacheCreationTokens)} ${t("notification.cacheWrite")}`);
|
|
59
|
+
parts.push(`${t("notification.cache")}: ${cacheParts.join(", ")}`);
|
|
60
|
+
}
|
|
61
|
+
return parts.join("\n");
|
|
62
|
+
}
|
|
63
|
+
async registerCommands() {
|
|
64
|
+
const translations = getTranslations();
|
|
65
|
+
const commands = [
|
|
66
|
+
{ command: "start", description: translations.bot.commands.start },
|
|
67
|
+
];
|
|
68
|
+
try {
|
|
69
|
+
await this.bot.setMyCommands(commands);
|
|
70
|
+
log(t("bot.commandsRegistered"));
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
logError(t("bot.commandsRegisterFailed"), err);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async registerMenuButton() {
|
|
77
|
+
const url = this.tunnelUrl ? `${this.tunnelUrl}/` : `${MINI_APP_BASE_URL}/`;
|
|
78
|
+
try {
|
|
79
|
+
await this.bot.setChatMenuButton({
|
|
80
|
+
menu_button: JSON.stringify({
|
|
81
|
+
type: "web_app",
|
|
82
|
+
text: t("bot.open"),
|
|
83
|
+
web_app: { url },
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
log(t("bot.menuButtonRegistered"));
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
logError(t("bot.menuButtonFailed"), err);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
registerHandlers() {
|
|
93
|
+
this.bot.on("message", (msg) => {
|
|
94
|
+
if (!ConfigManager.isOwner(this.cfg, msg.from?.id ?? 0)) {
|
|
95
|
+
log(t("bot.unauthorizedUser", {
|
|
96
|
+
userId: msg.from?.id ?? 0,
|
|
97
|
+
username: msg.from?.username ?? "",
|
|
98
|
+
}));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const text = msg.text ?? "";
|
|
102
|
+
if (text === "/start") {
|
|
103
|
+
if (this.chatId === msg.chat.id) {
|
|
104
|
+
this.bot.sendMessage(msg.chat.id, t("bot.alreadyConnected"));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this.chatId = msg.chat.id;
|
|
108
|
+
ConfigManager.saveChatState({ chat_id: this.chatId });
|
|
109
|
+
log(t("bot.registeredChatId", { chatId: msg.chat.id }));
|
|
110
|
+
this.bot.sendMessage(msg.chat.id, t("bot.ready"), { parse_mode: "MarkdownV2" });
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
registerPollingErrorHandler() {
|
|
116
|
+
this.bot.on("polling_error", () => {
|
|
117
|
+
if (!this.isDisconnected) {
|
|
118
|
+
this.isDisconnected = true;
|
|
119
|
+
log(t("bot.connectionLost"));
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
this.bot.on("polling", () => {
|
|
123
|
+
if (this.isDisconnected) {
|
|
124
|
+
this.isDisconnected = false;
|
|
125
|
+
log(t("bot.connectionRestored"));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function escapeHtml(text) {
|
|
131
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
132
|
+
}
|
|
133
|
+
function formatDuration(ms) {
|
|
134
|
+
const totalSeconds = Math.floor(ms / 1000);
|
|
135
|
+
if (totalSeconds < 60)
|
|
136
|
+
return `${totalSeconds}s`;
|
|
137
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
138
|
+
const seconds = totalSeconds % 60;
|
|
139
|
+
return `${minutes}m${seconds}s`;
|
|
140
|
+
}
|
|
141
|
+
function formatTokenCount(tokens) {
|
|
142
|
+
if (tokens >= 1_000_000)
|
|
143
|
+
return `${(tokens / 1_000_000).toFixed(1)}M`;
|
|
144
|
+
if (tokens >= 1_000)
|
|
145
|
+
return `${(tokens / 1_000).toFixed(1)}k`;
|
|
146
|
+
return `${tokens}`;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=telegram-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-channel.js","sourceRoot":"","sources":["../../../src/channel/telegram/telegram-channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import TelegramBot from "node-telegram-bot-api";
|
|
2
|
+
import { t } from "../../i18n/index.js";
|
|
3
|
+
import { logError } from "../../utils/log.js";
|
|
4
|
+
import { SPLIT_LOOKBACK_RANGE } from "../../utils/constants.js";
|
|
5
|
+
const TELEGRAM_MAX_MESSAGE_LENGTH = 4096;
|
|
6
|
+
const PAGINATION_FOOTER_RESERVE = 30;
|
|
7
|
+
export async function sendTelegramMessage(bot, chatId, text, responseUrl) {
|
|
8
|
+
const pages = splitMessage(text, TELEGRAM_MAX_MESSAGE_LENGTH - PAGINATION_FOOTER_RESERVE);
|
|
9
|
+
for (let i = 0; i < pages.length; i++) {
|
|
10
|
+
let content = pages[i];
|
|
11
|
+
if (pages.length > 1) {
|
|
12
|
+
content = `${content}\n\n<i>[${i + 1}/${pages.length}]</i>`;
|
|
13
|
+
}
|
|
14
|
+
const isLastPage = i === pages.length - 1;
|
|
15
|
+
const opts = { parse_mode: "HTML" };
|
|
16
|
+
if (isLastPage && responseUrl) {
|
|
17
|
+
opts.reply_markup = buildResponseReplyMarkup(responseUrl);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
await bot.sendMessage(chatId, content, opts);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
logError(t("bot.sendFailed"), err);
|
|
24
|
+
const fallbackOpts = {};
|
|
25
|
+
if (isLastPage && responseUrl) {
|
|
26
|
+
fallbackOpts.reply_markup = buildResponseReplyMarkup(responseUrl);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
await bot.sendMessage(chatId, pages[i], fallbackOpts);
|
|
30
|
+
}
|
|
31
|
+
catch (err2) {
|
|
32
|
+
logError(t("bot.sendFallbackFailed"), err2);
|
|
33
|
+
await bot.sendMessage(chatId, pages[i]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function splitMessage(text, maxLen) {
|
|
39
|
+
if (text.length <= maxLen)
|
|
40
|
+
return [text];
|
|
41
|
+
const pages = [];
|
|
42
|
+
let remaining = text;
|
|
43
|
+
while (remaining.length > 0) {
|
|
44
|
+
if (remaining.length <= maxLen) {
|
|
45
|
+
pages.push(remaining);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
const splitAt = findSplitPoint(remaining, maxLen);
|
|
49
|
+
pages.push(remaining.slice(0, splitAt));
|
|
50
|
+
remaining = remaining.slice(splitAt);
|
|
51
|
+
}
|
|
52
|
+
return pages;
|
|
53
|
+
}
|
|
54
|
+
function findSplitPoint(text, maxLen) {
|
|
55
|
+
for (let i = maxLen; i > maxLen - SPLIT_LOOKBACK_RANGE && i > 0; i--) {
|
|
56
|
+
if (text[i] === "\n" && text[i - 1] !== "\\")
|
|
57
|
+
return i + 1;
|
|
58
|
+
}
|
|
59
|
+
for (let i = maxLen; i > maxLen - SPLIT_LOOKBACK_RANGE && i > 0; i--) {
|
|
60
|
+
if (text[i] === " " && text[i - 1] !== "\\")
|
|
61
|
+
return i + 1;
|
|
62
|
+
}
|
|
63
|
+
return maxLen;
|
|
64
|
+
}
|
|
65
|
+
function buildResponseReplyMarkup(responseUrl) {
|
|
66
|
+
const buttonText = t("bot.viewDetails");
|
|
67
|
+
const button = responseUrl.startsWith("https://")
|
|
68
|
+
? { text: buttonText, web_app: { url: responseUrl } }
|
|
69
|
+
: { text: buttonText, url: responseUrl };
|
|
70
|
+
return { inline_keyboard: [[button]] };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=telegram-sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-sender.js","sourceRoot":"","sources":["../../../src/channel/telegram/telegram-sender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { GitChangeStatus } from "../utils/constants.js";
|
|
2
|
+
export interface NotificationChannel {
|
|
3
|
+
initialize(): Promise<void>;
|
|
4
|
+
shutdown(): Promise<void>;
|
|
5
|
+
sendNotification(data: NotificationData, responseUrl?: string): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface NotificationData {
|
|
8
|
+
projectName: string;
|
|
9
|
+
responseSummary: string;
|
|
10
|
+
durationMs: number;
|
|
11
|
+
gitChanges: GitChange[];
|
|
12
|
+
inputTokens: number;
|
|
13
|
+
outputTokens: number;
|
|
14
|
+
cacheCreationTokens: number;
|
|
15
|
+
cacheReadTokens: number;
|
|
16
|
+
}
|
|
17
|
+
export interface GitChange {
|
|
18
|
+
file: string;
|
|
19
|
+
status: GitChangeStatus;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channel/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runHelp(): void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { detectCliPrefix } from "../utils/install-detection.js";
|
|
3
|
+
import { t } from "../i18n/index.js";
|
|
4
|
+
export function runHelp() {
|
|
5
|
+
const prefix = detectCliPrefix();
|
|
6
|
+
p.intro(t("help.intro"));
|
|
7
|
+
p.log.message([
|
|
8
|
+
t("help.usage", { prefix }),
|
|
9
|
+
"",
|
|
10
|
+
t("help.commands"),
|
|
11
|
+
t("help.cmdNone"),
|
|
12
|
+
t("help.cmdSetup"),
|
|
13
|
+
t("help.cmdUpdate"),
|
|
14
|
+
t("help.cmdUninstall"),
|
|
15
|
+
t("help.cmdHelp"),
|
|
16
|
+
].join("\n"));
|
|
17
|
+
p.outro(t("help.docs"));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,MAAM,UAAU,OAAO;IACrB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAEzB,CAAC,CAAC,GAAG,CAAC,OAAO,CACX;QACE,CAAC,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;QAC3B,EAAE;QACF,CAAC,CAAC,eAAe,CAAC;QAClB,CAAC,CAAC,cAAc,CAAC;QACjB,CAAC,CAAC,eAAe,CAAC;QAClB,CAAC,CAAC,gBAAgB,CAAC;QACnB,CAAC,CAAC,mBAAmB,CAAC;QACtB,CAAC,CAAC,cAAc,CAAC;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runSetup(): Promise<void>;
|