ccpa-telegram 1.0.3 → 1.0.5
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.md +76 -12
- package/dist/bot/handlers/index.d.ts +1 -0
- package/dist/bot/handlers/index.d.ts.map +1 -1
- package/dist/bot/handlers/index.js +1 -0
- package/dist/bot/handlers/index.js.map +1 -1
- package/dist/bot/handlers/voice.d.ts +6 -0
- package/dist/bot/handlers/voice.d.ts.map +1 -0
- package/dist/bot/handlers/voice.js +140 -0
- package/dist/bot/handlers/voice.js.map +1 -0
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +3 -1
- package/dist/bot.js.map +1 -1
- package/dist/claude/executor.d.ts.map +1 -1
- package/dist/claude/executor.js +27 -10
- package/dist/claude/executor.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -1
- package/dist/transcription/whisper.d.ts +10 -0
- package/dist/transcription/whisper.d.ts.map +1 -0
- package/dist/transcription/whisper.js +61 -0
- package/dist/transcription/whisper.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@ A Telegram bot that provides access to Claude Code as a personal assistant. Run
|
|
|
6
6
|
|
|
7
7
|
- Chat with Claude Code via Telegram
|
|
8
8
|
- Send images and documents for analysis
|
|
9
|
+
- **Voice message support** with local Whisper transcription
|
|
9
10
|
- Persistent conversation sessions per user
|
|
10
11
|
- Configurable Claude settings per project
|
|
11
12
|
- Multi-user support with access control
|
|
@@ -28,6 +29,7 @@ For complete documentation on Claude Code configuration, see the [Claude Code do
|
|
|
28
29
|
- Node.js 18+
|
|
29
30
|
- [Claude Code CLI](https://github.com/anthropics/claude-code) installed and authenticated.
|
|
30
31
|
- A Telegram bot token (from [@BotFather](https://t.me/BotFather)). See [Creating a Telegram Bot](#creating-a-telegram-bot) for instructions.
|
|
32
|
+
- **ffmpeg** (required for voice messages) - install with `brew install ffmpeg` on macOS
|
|
31
33
|
|
|
32
34
|
## Quick Start
|
|
33
35
|
|
|
@@ -69,29 +71,37 @@ Create a `ccpa.config.json` file in your project directory:
|
|
|
69
71
|
},
|
|
70
72
|
"logging": {
|
|
71
73
|
"level": "info"
|
|
74
|
+
},
|
|
75
|
+
"transcription": {
|
|
76
|
+
"model": "base.en",
|
|
77
|
+
"showTranscription": true
|
|
72
78
|
}
|
|
73
79
|
}
|
|
74
80
|
```
|
|
75
81
|
|
|
76
82
|
### Configuration Options
|
|
77
83
|
|
|
78
|
-
| Option
|
|
79
|
-
|
|
|
80
|
-
| `telegram.botToken`
|
|
81
|
-
| `access.allowedUserIds`
|
|
82
|
-
| `claude.command`
|
|
83
|
-
| `logging.level`
|
|
84
|
+
| Option | Description | Default |
|
|
85
|
+
| ------------------------------- | -------------------------------------------------------------- | ---------- |
|
|
86
|
+
| `telegram.botToken` | Telegram bot token from BotFather | Required |
|
|
87
|
+
| `access.allowedUserIds` | Array of Telegram user IDs allowed to use the bot | `[]` |
|
|
88
|
+
| `claude.command` | Claude CLI command | `"claude"` |
|
|
89
|
+
| `logging.level` | Log level: debug, info, warn, error | `"info"` |
|
|
90
|
+
| `transcription.model` | Whisper model (see [Voice Messages](#voice-messages)) | `"base.en"`|
|
|
91
|
+
| `transcription.showTranscription` | Show transcribed text before Claude response | `true` |
|
|
84
92
|
|
|
85
93
|
### Environment Variables
|
|
86
94
|
|
|
87
95
|
Environment variables override config file values:
|
|
88
96
|
|
|
89
|
-
| Variable | Description
|
|
90
|
-
| -------------------- |
|
|
91
|
-
| `TELEGRAM_BOT_TOKEN` | Telegram bot token
|
|
92
|
-
| `ALLOWED_USER_IDS` | Comma-separated user IDs
|
|
93
|
-
| `CLAUDE_COMMAND` | Claude CLI command
|
|
94
|
-
| `LOG_LEVEL` | Logging level
|
|
97
|
+
| Variable | Description |
|
|
98
|
+
| -------------------- | ------------------------------------ |
|
|
99
|
+
| `TELEGRAM_BOT_TOKEN` | Telegram bot token |
|
|
100
|
+
| `ALLOWED_USER_IDS` | Comma-separated user IDs |
|
|
101
|
+
| `CLAUDE_COMMAND` | Claude CLI command |
|
|
102
|
+
| `LOG_LEVEL` | Logging level |
|
|
103
|
+
| `WHISPER_MODEL` | Whisper model for voice transcription |
|
|
104
|
+
| `SHOW_TRANSCRIPTION` | Show transcription (true/false) |
|
|
95
105
|
|
|
96
106
|
## Directory Structure
|
|
97
107
|
|
|
@@ -152,6 +162,60 @@ To find your Telegram user ID:
|
|
|
152
162
|
2. It will reply with your user ID
|
|
153
163
|
3. Add this ID to `allowedUserIds` in your config
|
|
154
164
|
|
|
165
|
+
## Voice Messages
|
|
166
|
+
|
|
167
|
+
Voice messages are transcribed locally using [Whisper](https://github.com/openai/whisper) via the `nodejs-whisper` package. No audio data is sent to external services.
|
|
168
|
+
|
|
169
|
+
### Prerequisites for Voice Messages
|
|
170
|
+
|
|
171
|
+
Voice transcription requires additional setup:
|
|
172
|
+
|
|
173
|
+
1. **ffmpeg** - For audio conversion
|
|
174
|
+
```bash
|
|
175
|
+
# macOS
|
|
176
|
+
brew install ffmpeg
|
|
177
|
+
|
|
178
|
+
# Ubuntu/Debian
|
|
179
|
+
sudo apt install ffmpeg
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
2. **CMake** - For building the Whisper executable
|
|
183
|
+
```bash
|
|
184
|
+
# macOS
|
|
185
|
+
brew install cmake
|
|
186
|
+
|
|
187
|
+
# Ubuntu/Debian
|
|
188
|
+
sudo apt install cmake
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
3. **Download and build Whisper** - Run this once after installation:
|
|
192
|
+
```bash
|
|
193
|
+
npx nodejs-whisper download
|
|
194
|
+
```
|
|
195
|
+
This downloads the Whisper model and compiles the `whisper-cli` executable. The build process takes a few minutes.
|
|
196
|
+
|
|
197
|
+
### Whisper Models
|
|
198
|
+
|
|
199
|
+
| Model | Size | Speed | Quality |
|
|
200
|
+
| ---------------- | ------- | -------- | ------------------------------ |
|
|
201
|
+
| `tiny` | ~75 MB | Fastest | Basic quality |
|
|
202
|
+
| `tiny.en` | ~75 MB | Fastest | English-only, slightly better |
|
|
203
|
+
| `base` | ~142 MB | Fast | Good for clear speech |
|
|
204
|
+
| `base.en` | ~142 MB | Fast | English-only (default) |
|
|
205
|
+
| `small` | ~466 MB | Medium | Good multilingual |
|
|
206
|
+
| `small.en` | ~466 MB | Medium | English-only |
|
|
207
|
+
| `medium` | ~1.5 GB | Slower | Very good multilingual |
|
|
208
|
+
| `medium.en` | ~1.5 GB | Slower | English-only |
|
|
209
|
+
| `large-v1` | ~2.9 GB | Slowest | Best quality (v1) |
|
|
210
|
+
| `large` | ~2.9 GB | Slowest | Best quality (v2) |
|
|
211
|
+
| `large-v3-turbo` | ~1.5 GB | Fast | Near-large quality, faster |
|
|
212
|
+
|
|
213
|
+
**First run**: The selected model will be downloaded automatically. Subsequent runs use the cached model.
|
|
214
|
+
|
|
215
|
+
### Supported Languages
|
|
216
|
+
|
|
217
|
+
Whisper supports 50+ languages including English, German, Spanish, French, and many more. Use models without `.en` suffix for multilingual support.
|
|
218
|
+
|
|
155
219
|
## Security Notice
|
|
156
220
|
|
|
157
221
|
**Important**: Conversations with this bot are not end-to-end encrypted. Messages pass through Telegram's servers and are processed by the Claude API. Do not share sensitive information such as:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bot/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bot/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bot/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bot/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../../src/bot/handlers/voice.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAqCtC;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsJ9D"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { executeClaudeQuery } from "../../claude/executor.js";
|
|
6
|
+
import { parseClaudeOutput } from "../../claude/parser.js";
|
|
7
|
+
import { getConfig } from "../../config.js";
|
|
8
|
+
import { getLogger } from "../../logger.js";
|
|
9
|
+
import { sendChunkedResponse } from "../../telegram/chunker.js";
|
|
10
|
+
import { transcribeAudio } from "../../transcription/whisper.js";
|
|
11
|
+
import { ensureUserSetup, getSessionId, getUploadsPath, saveSessionId, } from "../../user/setup.js";
|
|
12
|
+
const execAsync = promisify(exec);
|
|
13
|
+
/**
|
|
14
|
+
* Convert OGA/OGG (Opus) to WAV for Whisper compatibility
|
|
15
|
+
*/
|
|
16
|
+
async function convertToWav(inputPath, outputPath) {
|
|
17
|
+
const logger = getLogger();
|
|
18
|
+
try {
|
|
19
|
+
await execAsync(`ffmpeg -i "${inputPath}" -ar 16000 -ac 1 -y "${outputPath}"`);
|
|
20
|
+
logger.debug({ inputPath, outputPath }, "Audio converted to WAV");
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
logger.error({ error }, "ffmpeg conversion failed");
|
|
24
|
+
throw new Error("Failed to convert audio. Ensure ffmpeg is installed: brew install ffmpeg");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Handle voice messages - transcribe and route to Claude
|
|
29
|
+
*/
|
|
30
|
+
export async function voiceHandler(ctx) {
|
|
31
|
+
const config = getConfig();
|
|
32
|
+
const logger = getLogger();
|
|
33
|
+
const userId = ctx.from?.id;
|
|
34
|
+
const voice = ctx.message?.voice;
|
|
35
|
+
if (!userId || !voice) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
logger.debug({ userId, duration: voice.duration, fileSize: voice.file_size }, "Voice message received");
|
|
39
|
+
const userDir = resolve(join(config.dataDir, String(userId)));
|
|
40
|
+
try {
|
|
41
|
+
await ensureUserSetup(userDir);
|
|
42
|
+
// Download voice file from Telegram
|
|
43
|
+
const file = await ctx.api.getFile(voice.file_id);
|
|
44
|
+
const filePath = file.file_path;
|
|
45
|
+
if (!filePath) {
|
|
46
|
+
await ctx.reply("Could not download the voice message.");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const fileUrl = `https://api.telegram.org/file/bot${config.telegram.botToken}/${filePath}`;
|
|
50
|
+
const response = await fetch(fileUrl);
|
|
51
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
52
|
+
// Save original OGA file
|
|
53
|
+
const timestamp = Date.now();
|
|
54
|
+
const uploadsDir = getUploadsPath(userDir);
|
|
55
|
+
const ogaPath = join(uploadsDir, `voice_${timestamp}.oga`);
|
|
56
|
+
const wavPath = join(uploadsDir, `voice_${timestamp}.wav`);
|
|
57
|
+
await writeFile(ogaPath, buffer);
|
|
58
|
+
logger.debug({ path: ogaPath }, "Voice file saved");
|
|
59
|
+
// Send transcribing status
|
|
60
|
+
const statusMsg = await ctx.reply("_Transcribing voice message..._", {
|
|
61
|
+
parse_mode: "Markdown",
|
|
62
|
+
});
|
|
63
|
+
// Convert to WAV (Whisper requires WAV/MP3 input)
|
|
64
|
+
await convertToWav(ogaPath, wavPath);
|
|
65
|
+
// Transcribe with local Whisper
|
|
66
|
+
const transcription = await transcribeAudio(wavPath);
|
|
67
|
+
if (!transcription.text) {
|
|
68
|
+
await ctx.api.deleteMessage(ctx.chat.id, statusMsg.message_id);
|
|
69
|
+
await ctx.reply("Could not transcribe the voice message. Please try again.");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Optionally show transcription to user
|
|
73
|
+
if (config.transcription?.showTranscription) {
|
|
74
|
+
try {
|
|
75
|
+
await ctx.api.editMessageText(ctx.chat.id, statusMsg.message_id, `_Transcribed: "${transcription.text}"_\n\n_Processing with Claude..._`, { parse_mode: "Markdown" });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Ignore edit errors
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
try {
|
|
83
|
+
await ctx.api.editMessageText(ctx.chat.id, statusMsg.message_id, "_Processing..._", { parse_mode: "Markdown" });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Ignore edit errors
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Clean up temporary files
|
|
90
|
+
try {
|
|
91
|
+
await unlink(ogaPath);
|
|
92
|
+
await unlink(wavPath);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Ignore cleanup errors
|
|
96
|
+
}
|
|
97
|
+
// Send transcribed text to Claude
|
|
98
|
+
const sessionId = await getSessionId(userDir);
|
|
99
|
+
let lastProgressUpdate = Date.now();
|
|
100
|
+
let lastProgressText = "Processing...";
|
|
101
|
+
const onProgress = async (message) => {
|
|
102
|
+
const now = Date.now();
|
|
103
|
+
if (now - lastProgressUpdate > 2000 && message !== lastProgressText) {
|
|
104
|
+
lastProgressUpdate = now;
|
|
105
|
+
lastProgressText = message;
|
|
106
|
+
try {
|
|
107
|
+
await ctx.api.editMessageText(ctx.chat.id, statusMsg.message_id, `_${message}_`, { parse_mode: "Markdown" });
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Ignore edit errors
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
logger.debug({ transcription: transcription.text }, "Executing Claude query");
|
|
115
|
+
const result = await executeClaudeQuery({
|
|
116
|
+
prompt: transcription.text,
|
|
117
|
+
userDir,
|
|
118
|
+
sessionId,
|
|
119
|
+
onProgress,
|
|
120
|
+
});
|
|
121
|
+
// Delete status message
|
|
122
|
+
try {
|
|
123
|
+
await ctx.api.deleteMessage(ctx.chat.id, statusMsg.message_id);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Ignore delete errors
|
|
127
|
+
}
|
|
128
|
+
const parsed = parseClaudeOutput(result);
|
|
129
|
+
if (parsed.sessionId) {
|
|
130
|
+
await saveSessionId(userDir, parsed.sessionId);
|
|
131
|
+
}
|
|
132
|
+
await sendChunkedResponse(ctx, parsed.text);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
logger.error({ error }, "Voice handler error");
|
|
136
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
137
|
+
await ctx.reply(`An error occurred processing the voice message: ${errorMessage}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../../src/bot/handlers/voice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,SAAiB,EACjB,UAAkB;IAElB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,SAAS,CACb,cAAc,SAAS,yBAAyB,UAAU,GAAG,CAC9D,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,wBAAwB,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,0BAA0B,CAAC,CAAC;QACpD,MAAM,IAAI,KAAK,CACb,0EAA0E,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY;IAC7C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IAEjC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,EAC/D,wBAAwB,CACzB,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAE/B,oCAAoC;QACpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAEhC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,oCAAoC,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAC3F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzD,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,SAAS,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,SAAS,MAAM,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEjC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAEpD,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE;YACnE,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QAEH,kDAAkD;QAClD,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAErC,gCAAgC;QAChC,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YAChE,MAAM,GAAG,CAAC,KAAK,CACb,2DAA2D,CAC5D,CAAC;YACF,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,CAC3B,GAAG,CAAC,IAAK,CAAC,EAAE,EACZ,SAAS,CAAC,UAAU,EACpB,kBAAkB,aAAa,CAAC,IAAI,mCAAmC,EACvE,EAAE,UAAU,EAAE,UAAU,EAAE,CAC3B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,CAC3B,GAAG,CAAC,IAAK,CAAC,EAAE,EACZ,SAAS,CAAC,UAAU,EACpB,iBAAiB,EACjB,EAAE,UAAU,EAAE,UAAU,EAAE,CAC3B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QAED,kCAAkC;QAClC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,gBAAgB,GAAG,eAAe,CAAC;QAEvC,MAAM,UAAU,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,kBAAkB,GAAG,IAAI,IAAI,OAAO,KAAK,gBAAgB,EAAE,CAAC;gBACpE,kBAAkB,GAAG,GAAG,CAAC;gBACzB,gBAAgB,GAAG,OAAO,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,CAC3B,GAAG,CAAC,IAAK,CAAC,EAAE,EACZ,SAAS,CAAC,UAAU,EACpB,IAAI,OAAO,GAAG,EACd,EAAE,UAAU,EAAE,UAAU,EAAE,CAC3B,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,qBAAqB;gBACvB,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,KAAK,CACV,EAAE,aAAa,EAAE,aAAa,CAAC,IAAI,EAAE,EACrC,wBAAwB,CACzB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,MAAM,EAAE,aAAa,CAAC,IAAI;YAC1B,OAAO;YACP,SAAS;YACT,UAAU;SACX,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAC/C,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC3D,MAAM,GAAG,CAAC,KAAK,CACb,mDAAmD,YAAY,EAAE,CAClE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/bot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAoCA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAmE9C"}
|
package/dist/bot.js
CHANGED
|
@@ -3,7 +3,7 @@ import { Bot } from "grammy";
|
|
|
3
3
|
import { clearHandler } from "./bot/commands/clear.js";
|
|
4
4
|
import { helpHandler } from "./bot/commands/help.js";
|
|
5
5
|
import { startHandler } from "./bot/commands/start.js";
|
|
6
|
-
import { documentHandler, photoHandler, textHandler, } from "./bot/handlers/index.js";
|
|
6
|
+
import { documentHandler, photoHandler, textHandler, voiceHandler, } from "./bot/handlers/index.js";
|
|
7
7
|
import { authMiddleware } from "./bot/middleware/auth.js";
|
|
8
8
|
import { rateLimitMiddleware } from "./bot/middleware/rateLimit.js";
|
|
9
9
|
import { getConfig, getWorkingDirectory } from "./config.js";
|
|
@@ -49,6 +49,8 @@ export async function startBot() {
|
|
|
49
49
|
bot.on("message:photo", photoHandler);
|
|
50
50
|
// Document handler (PDFs, etc.)
|
|
51
51
|
bot.on("message:document", documentHandler);
|
|
52
|
+
// Voice message handler
|
|
53
|
+
bot.on("message:voice", voiceHandler);
|
|
52
54
|
// Error handler
|
|
53
55
|
bot.catch((err) => {
|
|
54
56
|
logger.error({ error: err.error, ctx: err.ctx?.update }, "Bot error");
|
package/dist/bot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,WAAW,
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/claude/executor.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/claude/executor.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA2LxB"}
|
package/dist/claude/executor.js
CHANGED
|
@@ -27,13 +27,12 @@ export async function executeClaudeQuery(options) {
|
|
|
27
27
|
env: process.env,
|
|
28
28
|
stdio: ["ignore", "pipe", "pipe"],
|
|
29
29
|
});
|
|
30
|
-
let fullOutput = "";
|
|
31
30
|
let stderrOutput = "";
|
|
32
31
|
let lastResult = null;
|
|
33
32
|
let currentSessionId;
|
|
33
|
+
let lastAssistantText = ""; // Track last text response for fallback
|
|
34
34
|
proc.stdout.on("data", (data) => {
|
|
35
35
|
const chunk = data.toString();
|
|
36
|
-
fullOutput += chunk;
|
|
37
36
|
// Parse streaming JSON lines
|
|
38
37
|
const lines = chunk.split("\n").filter((line) => line.trim());
|
|
39
38
|
for (const line of lines) {
|
|
@@ -45,11 +44,14 @@ export async function executeClaudeQuery(options) {
|
|
|
45
44
|
event.session_id) {
|
|
46
45
|
currentSessionId = event.session_id;
|
|
47
46
|
}
|
|
48
|
-
//
|
|
49
|
-
if (event.type === "assistant" &&
|
|
50
|
-
event.message?.content &&
|
|
51
|
-
onProgress) {
|
|
47
|
+
// Extract text from assistant messages and send progress updates
|
|
48
|
+
if (event.type === "assistant" && event.message?.content) {
|
|
52
49
|
for (const block of event.message.content) {
|
|
50
|
+
// Capture text content for fallback
|
|
51
|
+
if (block.type === "text" && block.text) {
|
|
52
|
+
lastAssistantText = block.text;
|
|
53
|
+
}
|
|
54
|
+
// Send progress updates for tool usage
|
|
53
55
|
if (block.type === "tool_use") {
|
|
54
56
|
const toolName = block.name || "unknown";
|
|
55
57
|
let progressMsg = `Using ${toolName}...`;
|
|
@@ -79,7 +81,21 @@ export async function executeClaudeQuery(options) {
|
|
|
79
81
|
else if (toolName === "WebFetch" && block.input?.url) {
|
|
80
82
|
progressMsg = `Fetching: ${block.input.url}`;
|
|
81
83
|
}
|
|
82
|
-
|
|
84
|
+
logger.info({ tool: toolName, input: block.input }, progressMsg);
|
|
85
|
+
if (onProgress) {
|
|
86
|
+
onProgress(progressMsg);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Log tool results
|
|
92
|
+
if (event.type === "user" && event.message?.content) {
|
|
93
|
+
for (const block of event.message.content) {
|
|
94
|
+
if (block.type === "tool_result") {
|
|
95
|
+
const result = typeof block.content === "string"
|
|
96
|
+
? block.content.slice(0, 500)
|
|
97
|
+
: JSON.stringify(block.content).slice(0, 500);
|
|
98
|
+
logger.info({ toolUseId: block.tool_use_id, isError: block.is_error }, `Tool result: ${result}${result.length >= 500 ? "..." : ""}`);
|
|
83
99
|
}
|
|
84
100
|
}
|
|
85
101
|
}
|
|
@@ -124,18 +140,19 @@ export async function executeClaudeQuery(options) {
|
|
|
124
140
|
resolve(lastResult);
|
|
125
141
|
}
|
|
126
142
|
else if (code === 0) {
|
|
143
|
+
// No result event but process succeeded - use last assistant text
|
|
127
144
|
resolve({
|
|
128
145
|
success: true,
|
|
129
|
-
output:
|
|
146
|
+
output: lastAssistantText || "No response received",
|
|
130
147
|
sessionId: currentSessionId,
|
|
131
148
|
});
|
|
132
149
|
}
|
|
133
150
|
else {
|
|
134
151
|
const errorMsg = stderrOutput.trim() || `Claude exited with code ${code}`;
|
|
135
|
-
logger.error({ code, stderr: stderrOutput,
|
|
152
|
+
logger.error({ code, stderr: stderrOutput, lastText: lastAssistantText }, "Claude process failed");
|
|
136
153
|
resolve({
|
|
137
154
|
success: false,
|
|
138
|
-
output:
|
|
155
|
+
output: lastAssistantText,
|
|
139
156
|
error: errorMsg,
|
|
140
157
|
});
|
|
141
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/claude/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAgBzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,IAAI,GAAa;QACrB,IAAI;QACJ,MAAM;QACN,iBAAiB;QACjB,aAAa;QACb,WAAW;KACZ,CAAC;IAEF,kDAAkD;IAClD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;IACjD,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;IAE3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE;YACtC,GAAG;YACH,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/claude/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -30,6 +30,22 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
30
30
|
claude: z.ZodObject<{
|
|
31
31
|
command: z.ZodDefault<z.ZodString>;
|
|
32
32
|
}, z.core.$strip>;
|
|
33
|
+
transcription: z.ZodOptional<z.ZodObject<{
|
|
34
|
+
model: z.ZodDefault<z.ZodEnum<{
|
|
35
|
+
tiny: "tiny";
|
|
36
|
+
"tiny.en": "tiny.en";
|
|
37
|
+
base: "base";
|
|
38
|
+
"base.en": "base.en";
|
|
39
|
+
small: "small";
|
|
40
|
+
"small.en": "small.en";
|
|
41
|
+
medium: "medium";
|
|
42
|
+
"medium.en": "medium.en";
|
|
43
|
+
"large-v1": "large-v1";
|
|
44
|
+
large: "large";
|
|
45
|
+
"large-v3-turbo": "large-v3-turbo";
|
|
46
|
+
}>>;
|
|
47
|
+
showTranscription: z.ZodDefault<z.ZodBoolean>;
|
|
48
|
+
}, z.core.$strip>>;
|
|
33
49
|
}, z.core.$strip>;
|
|
34
50
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
35
51
|
export declare function loadConfig(): Config;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAY5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAY5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAgBD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBhB,CAAC;AA+CH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AA6ClD,wBAAgB,UAAU,IAAI,MAAM,CA0DnC;AAKD,wBAAgB,SAAS,IAAI,MAAM,CAKlC"}
|
package/dist/config.js
CHANGED
|
@@ -25,6 +25,19 @@ export function initConfig(cwd) {
|
|
|
25
25
|
export function getWorkingDirectory() {
|
|
26
26
|
return workingDirectory;
|
|
27
27
|
}
|
|
28
|
+
const TranscriptionModelSchema = z.enum([
|
|
29
|
+
"tiny",
|
|
30
|
+
"tiny.en",
|
|
31
|
+
"base",
|
|
32
|
+
"base.en",
|
|
33
|
+
"small",
|
|
34
|
+
"small.en",
|
|
35
|
+
"medium",
|
|
36
|
+
"medium.en",
|
|
37
|
+
"large-v1",
|
|
38
|
+
"large",
|
|
39
|
+
"large-v3-turbo",
|
|
40
|
+
]);
|
|
28
41
|
const ConfigSchema = z.object({
|
|
29
42
|
telegram: z.object({
|
|
30
43
|
botToken: z.string().min(1, "telegram.botToken is required"),
|
|
@@ -43,6 +56,12 @@ const ConfigSchema = z.object({
|
|
|
43
56
|
claude: z.object({
|
|
44
57
|
command: z.string().default("claude"),
|
|
45
58
|
}),
|
|
59
|
+
transcription: z
|
|
60
|
+
.object({
|
|
61
|
+
model: TranscriptionModelSchema.default("base.en"),
|
|
62
|
+
showTranscription: z.boolean().default(true),
|
|
63
|
+
})
|
|
64
|
+
.optional(),
|
|
46
65
|
});
|
|
47
66
|
// Schema for the config file (all fields optional)
|
|
48
67
|
const ConfigFileSchema = z
|
|
@@ -79,6 +98,13 @@ const ConfigFileSchema = z
|
|
|
79
98
|
})
|
|
80
99
|
.partial()
|
|
81
100
|
.optional(),
|
|
101
|
+
transcription: z
|
|
102
|
+
.object({
|
|
103
|
+
model: TranscriptionModelSchema.default("base.en"),
|
|
104
|
+
showTranscription: z.boolean(),
|
|
105
|
+
})
|
|
106
|
+
.partial()
|
|
107
|
+
.optional(),
|
|
82
108
|
})
|
|
83
109
|
.partial();
|
|
84
110
|
function parseAllowedUserIds(value) {
|
|
@@ -145,6 +171,14 @@ export function loadConfig() {
|
|
|
145
171
|
claude: {
|
|
146
172
|
command: process.env.CLAUDE_COMMAND || fileConfig.claude?.command || "claude",
|
|
147
173
|
},
|
|
174
|
+
transcription: {
|
|
175
|
+
model: process.env.WHISPER_MODEL ||
|
|
176
|
+
fileConfig.transcription?.model ||
|
|
177
|
+
"base.en",
|
|
178
|
+
showTranscription: process.env.SHOW_TRANSCRIPTION === "false"
|
|
179
|
+
? false
|
|
180
|
+
: (fileConfig.transcription?.showTranscription ?? true),
|
|
181
|
+
},
|
|
148
182
|
};
|
|
149
183
|
const result = ConfigSchema.safeParse(rawConfig);
|
|
150
184
|
if (!result.success) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,iCAAiC;AACjC,IAAI,gBAAgB,GAAW,OAAO,CAAC,GAAG,EAAE,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEhC,gEAAgE;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,4EAA4E;IAE5E,wCAAwC;IACxC,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;KAC7D,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACpC,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;KAC/C,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KAClE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;KACtC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface TranscriptionResult {
|
|
2
|
+
text: string;
|
|
3
|
+
language?: string;
|
|
4
|
+
duration?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Transcribe audio file using local Whisper model
|
|
8
|
+
*/
|
|
9
|
+
export declare function transcribeAudio(audioPath: string): Promise<TranscriptionResult>;
|
|
10
|
+
//# sourceMappingURL=whisper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.d.ts","sourceRoot":"","sources":["../../src/transcription/whisper.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAkD9B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { getConfig } from "../config.js";
|
|
3
|
+
import { getLogger } from "../logger.js";
|
|
4
|
+
// Dynamic import for optional dependency
|
|
5
|
+
let whisperModule = null;
|
|
6
|
+
async function getWhisper() {
|
|
7
|
+
if (!whisperModule) {
|
|
8
|
+
try {
|
|
9
|
+
whisperModule = await import("nodejs-whisper");
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
throw new Error("nodejs-whisper is not installed. Run: pnpm add nodejs-whisper");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return whisperModule;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Transcribe audio file using local Whisper model
|
|
19
|
+
*/
|
|
20
|
+
export async function transcribeAudio(audioPath) {
|
|
21
|
+
const logger = getLogger();
|
|
22
|
+
const config = getConfig();
|
|
23
|
+
if (!existsSync(audioPath)) {
|
|
24
|
+
throw new Error(`Audio file not found: ${audioPath}`);
|
|
25
|
+
}
|
|
26
|
+
const whisper = await getWhisper();
|
|
27
|
+
const modelName = config.transcription?.model || "base.en";
|
|
28
|
+
logger.debug({ audioPath, model: modelName }, "Starting transcription");
|
|
29
|
+
const startTime = Date.now();
|
|
30
|
+
try {
|
|
31
|
+
const transcript = await whisper.nodewhisper(audioPath, {
|
|
32
|
+
modelName,
|
|
33
|
+
autoDownloadModelName: modelName,
|
|
34
|
+
removeWavFileAfterTranscription: false,
|
|
35
|
+
withCuda: false,
|
|
36
|
+
whisperOptions: {
|
|
37
|
+
outputInText: true,
|
|
38
|
+
language: "auto",
|
|
39
|
+
},
|
|
40
|
+
logger: {
|
|
41
|
+
debug: (message) => logger.debug(message),
|
|
42
|
+
error: (message) => logger.error(message),
|
|
43
|
+
log: (message) => logger.info(message),
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
const duration = (Date.now() - startTime) / 1000;
|
|
47
|
+
const text = Array.isArray(transcript)
|
|
48
|
+
? transcript.map((t) => t.speech).join(" ")
|
|
49
|
+
: String(transcript);
|
|
50
|
+
logger.debug({ duration: `${duration.toFixed(2)}s`, textLength: text.length }, "Transcription complete");
|
|
51
|
+
return {
|
|
52
|
+
text: text.trim(),
|
|
53
|
+
duration,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logger.error({ error, audioPath }, "Transcription failed");
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=whisper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.js","sourceRoot":"","sources":["../../src/transcription/whisper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,yCAAyC;AACzC,IAAI,aAAa,GAA2C,IAAI,CAAC;AAEjE,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAQD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB;IAEjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,KAAK,IAAI,SAAS,CAAC;IAE3D,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,wBAAwB,CAAC,CAAC;IAExE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE;YACtD,SAAS;YACT,qBAAqB,EAAE,SAAS;YAChC,+BAA+B,EAAE,KAAK;YACtC,QAAQ,EAAE,KAAK;YACf,cAAc,EAAE;gBACd,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,MAAM;aACjB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBACjD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBACjD,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;aAC/C;SACF,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YACpC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC3C,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEvB,MAAM,CAAC,KAAK,CACV,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,EAChE,wBAAwB,CACzB,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ccpa-telegram",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"dotenv": "^17.2.3",
|
|
29
29
|
"grammy": "^1.39.2",
|
|
30
|
+
"nodejs-whisper": "^0.2.9",
|
|
30
31
|
"pino": "^10.2.0",
|
|
31
32
|
"zod": "^4.3.5"
|
|
32
33
|
},
|