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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +158 -0
  3. package/README.md +158 -0
  4. package/dist/channel/telegram/telegram-channel.d.ts +18 -0
  5. package/dist/channel/telegram/telegram-channel.js +148 -0
  6. package/dist/channel/telegram/telegram-channel.js.map +1 -0
  7. package/dist/channel/telegram/telegram-sender.d.ts +2 -0
  8. package/dist/channel/telegram/telegram-sender.js +72 -0
  9. package/dist/channel/telegram/telegram-sender.js.map +1 -0
  10. package/dist/channel/types.d.ts +20 -0
  11. package/dist/channel/types.js +2 -0
  12. package/dist/channel/types.js.map +1 -0
  13. package/dist/commands/help.d.ts +1 -0
  14. package/dist/commands/help.js +19 -0
  15. package/dist/commands/help.js.map +1 -0
  16. package/dist/commands/setup.d.ts +1 -0
  17. package/dist/commands/setup.js +112 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/commands/uninstall.d.ts +1 -0
  20. package/dist/commands/uninstall.js +43 -0
  21. package/dist/commands/uninstall.js.map +1 -0
  22. package/dist/commands/update.d.ts +1 -0
  23. package/dist/commands/update.js +136 -0
  24. package/dist/commands/update.js.map +1 -0
  25. package/dist/config-manager.d.ts +20 -0
  26. package/dist/config-manager.js +94 -0
  27. package/dist/config-manager.js.map +1 -0
  28. package/dist/hook/hook-handler.d.ts +10 -0
  29. package/dist/hook/hook-handler.js +79 -0
  30. package/dist/hook/hook-handler.js.map +1 -0
  31. package/dist/hook/hook-installer.d.ts +9 -0
  32. package/dist/hook/hook-installer.js +110 -0
  33. package/dist/hook/hook-installer.js.map +1 -0
  34. package/dist/hook/hook-server.d.ts +13 -0
  35. package/dist/hook/hook-server.js +65 -0
  36. package/dist/hook/hook-server.js.map +1 -0
  37. package/dist/hook/response-store.d.ts +8 -0
  38. package/dist/hook/response-store.js +18 -0
  39. package/dist/i18n/index.d.ts +9 -0
  40. package/dist/i18n/index.js +55 -0
  41. package/dist/i18n/index.js.map +1 -0
  42. package/dist/i18n/locales/en.d.ts +2 -0
  43. package/dist/i18n/locales/en.js +127 -0
  44. package/dist/i18n/locales/en.js.map +1 -0
  45. package/dist/i18n/locales/vi.d.ts +2 -0
  46. package/dist/i18n/locales/vi.js +127 -0
  47. package/dist/i18n/locales/vi.js.map +1 -0
  48. package/dist/i18n/locales/zh.d.ts +2 -0
  49. package/dist/i18n/locales/zh.js +127 -0
  50. package/dist/i18n/locales/zh.js.map +1 -0
  51. package/dist/i18n/types.d.ts +126 -0
  52. package/dist/i18n/types.js +2 -0
  53. package/dist/i18n/types.js.map +1 -0
  54. package/dist/index.d.ts +2 -0
  55. package/dist/index.js +87 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/monitor/git-collector.d.ts +2 -0
  58. package/dist/monitor/git-collector.js +88 -0
  59. package/dist/monitor/git-collector.js.map +1 -0
  60. package/dist/monitor/transcript-parser.d.ts +10 -0
  61. package/dist/monitor/transcript-parser.js +77 -0
  62. package/dist/monitor/transcript-parser.js.map +1 -0
  63. package/dist/setup.d.ts +1 -0
  64. package/dist/setup.js +130 -0
  65. package/dist/telegram/bot.d.ts +20 -0
  66. package/dist/telegram/bot.js +130 -0
  67. package/dist/telegram/message-formatter.d.ts +18 -0
  68. package/dist/telegram/message-formatter.js +56 -0
  69. package/dist/telegram/message-sender.d.ts +2 -0
  70. package/dist/telegram/message-sender.js +76 -0
  71. package/dist/utils/constants.d.ts +44 -0
  72. package/dist/utils/constants.js +41 -0
  73. package/dist/utils/constants.js.map +1 -0
  74. package/dist/utils/error-utils.d.ts +1 -0
  75. package/dist/utils/error-utils.js +3 -0
  76. package/dist/utils/install-detection.d.ts +5 -0
  77. package/dist/utils/install-detection.js +42 -0
  78. package/dist/utils/install-detection.js.map +1 -0
  79. package/dist/utils/log.d.ts +2 -0
  80. package/dist/utils/log.js +18 -0
  81. package/dist/utils/log.js.map +1 -0
  82. package/dist/utils/paths.d.ts +15 -0
  83. package/dist/utils/paths.js +38 -0
  84. package/dist/utils/paths.js.map +1 -0
  85. package/dist/utils/response-store.d.ts +29 -0
  86. package/dist/utils/response-store.js +100 -0
  87. package/dist/utils/response-store.js.map +1 -0
  88. package/dist/utils/tunnel.d.ts +7 -0
  89. package/dist/utils/tunnel.js +53 -0
  90. package/dist/utils/tunnel.js.map +1 -0
  91. 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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
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,2 @@
1
+ import TelegramBot from "node-telegram-bot-api";
2
+ export declare function sendTelegramMessage(bot: TelegramBot, chatId: number, text: string, responseUrl?: string): Promise<void>;
@@ -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":"AAAA,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,2BAA2B,GAAG,IAAI,CAAC;AACzC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAgB,EAChB,MAAc,EACd,IAAY,EACZ,WAAoB;IAEpB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,2BAA2B,GAAG,yBAAyB,CAAC,CAAC;IAE1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACxB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,GAAG,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,OAAO,CAAC;QAC9D,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAmC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAEpE,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC;YACnC,MAAM,YAAY,GAAmC,EAAE,CAAC;YACxD,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;gBAC9B,YAAY,CAAC,YAAY,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,YAAY,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACd,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc;IAChD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACxC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,MAAc;IAClD,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,oBAAoB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,oBAAoB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAAC,WAAmB;IACnD,MAAM,UAAU,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC;QAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE;QACrD,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IAC3C,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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>;