@matthias-hausberger/beige 0.0.1
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.md +8 -0
- package/README.md +183 -0
- package/dist/channels/registry.d.ts +14 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +14 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/telegram.d.ts +92 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +469 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/tui.d.ts +8 -0
- package/dist/channels/tui.d.ts.map +1 -0
- package/dist/channels/tui.js +574 -0
- package/dist/channels/tui.js.map +1 -0
- package/dist/cli.d.ts +23 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +571 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +6 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +103 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.spec.d.ts +2 -0
- package/dist/config/loader.spec.d.ts.map +1 -0
- package/dist/config/loader.spec.js +195 -0
- package/dist/config/loader.spec.js.map +1 -0
- package/dist/config/schema.d.ts +107 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +42 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/schema.spec.d.ts +2 -0
- package/dist/config/schema.spec.d.ts.map +1 -0
- package/dist/config/schema.spec.js +180 -0
- package/dist/config/schema.spec.js.map +1 -0
- package/dist/gateway/agent-manager.d.ts +138 -0
- package/dist/gateway/agent-manager.d.ts.map +1 -0
- package/dist/gateway/agent-manager.js +532 -0
- package/dist/gateway/agent-manager.js.map +1 -0
- package/dist/gateway/api.d.ts +43 -0
- package/dist/gateway/api.d.ts.map +1 -0
- package/dist/gateway/api.js +256 -0
- package/dist/gateway/api.js.map +1 -0
- package/dist/gateway/api.spec.d.ts +2 -0
- package/dist/gateway/api.spec.d.ts.map +1 -0
- package/dist/gateway/api.spec.js +256 -0
- package/dist/gateway/api.spec.js.map +1 -0
- package/dist/gateway/audit.d.ts +38 -0
- package/dist/gateway/audit.d.ts.map +1 -0
- package/dist/gateway/audit.js +82 -0
- package/dist/gateway/audit.js.map +1 -0
- package/dist/gateway/audit.spec.d.ts +2 -0
- package/dist/gateway/audit.spec.d.ts.map +1 -0
- package/dist/gateway/audit.spec.js +212 -0
- package/dist/gateway/audit.spec.js.map +1 -0
- package/dist/gateway/gateway.d.ts +27 -0
- package/dist/gateway/gateway.d.ts.map +1 -0
- package/dist/gateway/gateway.js +158 -0
- package/dist/gateway/gateway.js.map +1 -0
- package/dist/gateway/policy.d.ts +27 -0
- package/dist/gateway/policy.d.ts.map +1 -0
- package/dist/gateway/policy.js +40 -0
- package/dist/gateway/policy.js.map +1 -0
- package/dist/gateway/policy.spec.d.ts +2 -0
- package/dist/gateway/policy.spec.d.ts.map +1 -0
- package/dist/gateway/policy.spec.js +121 -0
- package/dist/gateway/policy.spec.js.map +1 -0
- package/dist/gateway/provider-health.d.ts +83 -0
- package/dist/gateway/provider-health.d.ts.map +1 -0
- package/dist/gateway/provider-health.js +219 -0
- package/dist/gateway/provider-health.js.map +1 -0
- package/dist/gateway/provider-health.spec.d.ts +2 -0
- package/dist/gateway/provider-health.spec.d.ts.map +1 -0
- package/dist/gateway/provider-health.spec.js +278 -0
- package/dist/gateway/provider-health.spec.js.map +1 -0
- package/dist/gateway/session-settings.d.ts +62 -0
- package/dist/gateway/session-settings.d.ts.map +1 -0
- package/dist/gateway/session-settings.js +91 -0
- package/dist/gateway/session-settings.js.map +1 -0
- package/dist/gateway/session-settings.spec.d.ts +2 -0
- package/dist/gateway/session-settings.spec.d.ts.map +1 -0
- package/dist/gateway/session-settings.spec.js +141 -0
- package/dist/gateway/session-settings.spec.js.map +1 -0
- package/dist/gateway/sessions.d.ts +68 -0
- package/dist/gateway/sessions.d.ts.map +1 -0
- package/dist/gateway/sessions.js +177 -0
- package/dist/gateway/sessions.js.map +1 -0
- package/dist/gateway/sessions.spec.d.ts +2 -0
- package/dist/gateway/sessions.spec.d.ts.map +1 -0
- package/dist/gateway/sessions.spec.js +190 -0
- package/dist/gateway/sessions.spec.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +39 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +144 -0
- package/dist/install.js.map +1 -0
- package/dist/sandbox/manager.d.ts +63 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +294 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/skills/index.d.ts +2 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/registry.d.ts +11 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +86 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/registry.spec.d.ts +2 -0
- package/dist/skills/registry.spec.d.ts.map +1 -0
- package/dist/skills/registry.spec.js +220 -0
- package/dist/skills/registry.spec.js.map +1 -0
- package/dist/socket/protocol.d.ts +21 -0
- package/dist/socket/protocol.d.ts.map +1 -0
- package/dist/socket/protocol.js +7 -0
- package/dist/socket/protocol.js.map +1 -0
- package/dist/socket/protocol.spec.d.ts +2 -0
- package/dist/socket/protocol.spec.d.ts.map +1 -0
- package/dist/socket/protocol.spec.js +135 -0
- package/dist/socket/protocol.spec.js.map +1 -0
- package/dist/socket/server.d.ts +21 -0
- package/dist/socket/server.d.ts.map +1 -0
- package/dist/socket/server.js +133 -0
- package/dist/socket/server.js.map +1 -0
- package/dist/socket/server.spec.d.ts +2 -0
- package/dist/socket/server.spec.d.ts.map +1 -0
- package/dist/socket/server.spec.js +333 -0
- package/dist/socket/server.spec.js.map +1 -0
- package/dist/test/fixtures.d.ts +47 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +144 -0
- package/dist/test/fixtures.js.map +1 -0
- package/dist/toolkit/index.d.ts +4 -0
- package/dist/toolkit/index.d.ts.map +1 -0
- package/dist/toolkit/index.js +4 -0
- package/dist/toolkit/index.js.map +1 -0
- package/dist/toolkit/installer.d.ts +26 -0
- package/dist/toolkit/installer.d.ts.map +1 -0
- package/dist/toolkit/installer.js +247 -0
- package/dist/toolkit/installer.js.map +1 -0
- package/dist/toolkit/registry.d.ts +19 -0
- package/dist/toolkit/registry.d.ts.map +1 -0
- package/dist/toolkit/registry.js +119 -0
- package/dist/toolkit/registry.js.map +1 -0
- package/dist/toolkit/registry.spec.d.ts +2 -0
- package/dist/toolkit/registry.spec.d.ts.map +1 -0
- package/dist/toolkit/registry.spec.js +194 -0
- package/dist/toolkit/registry.spec.js.map +1 -0
- package/dist/toolkit/schema.d.ts +61 -0
- package/dist/toolkit/schema.d.ts.map +1 -0
- package/dist/toolkit/schema.js +116 -0
- package/dist/toolkit/schema.js.map +1 -0
- package/dist/toolkit/schema.spec.d.ts +2 -0
- package/dist/toolkit/schema.spec.d.ts.map +1 -0
- package/dist/toolkit/schema.spec.js +202 -0
- package/dist/toolkit/schema.spec.js.map +1 -0
- package/dist/tools/core.d.ts +10 -0
- package/dist/tools/core.d.ts.map +1 -0
- package/dist/tools/core.js +246 -0
- package/dist/tools/core.js.map +1 -0
- package/dist/tools/core.spec.d.ts +2 -0
- package/dist/tools/core.spec.d.ts.map +1 -0
- package/dist/tools/core.spec.js +315 -0
- package/dist/tools/core.spec.js.map +1 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +62 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/registry.spec.d.ts +2 -0
- package/dist/tools/registry.spec.d.ts.map +1 -0
- package/dist/tools/registry.spec.js +228 -0
- package/dist/tools/registry.spec.js.map +1 -0
- package/dist/tools/runner.d.ts +25 -0
- package/dist/tools/runner.d.ts.map +1 -0
- package/dist/tools/runner.js +35 -0
- package/dist/tools/runner.js.map +1 -0
- package/dist/tools/runner.spec.d.ts +2 -0
- package/dist/tools/runner.spec.d.ts.map +1 -0
- package/dist/tools/runner.spec.js +129 -0
- package/dist/tools/runner.spec.js.map +1 -0
- package/dist/types/session.d.ts +8 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +23 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +76 -0
- package/tools/README.md +1 -0
- package/tools/kv/README.md +150 -0
- package/tools/kv/index.ts +149 -0
- package/tools/kv/tool.json +23 -0
- package/tools/message/README.md +53 -0
- package/tools/message/index.ts +183 -0
- package/tools/message/tool.json +11 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { Bot } from "grammy";
|
|
2
|
+
import { BeigeSessionStore } from "../gateway/sessions.js";
|
|
3
|
+
import { resolveSessionSetting } from "../gateway/session-settings.js";
|
|
4
|
+
/**
|
|
5
|
+
* Telegram channel adapter using GrammY.
|
|
6
|
+
*
|
|
7
|
+
* Session model:
|
|
8
|
+
* - Each chat gets a persistent session (survives gateway restarts).
|
|
9
|
+
* - If a chat has threads (forum topics), each thread gets its own session.
|
|
10
|
+
* - /new starts a fresh session in the current chat/thread.
|
|
11
|
+
* - /start shows a welcome message.
|
|
12
|
+
*
|
|
13
|
+
* Channel commands (handled locally, NOT forwarded to the LLM):
|
|
14
|
+
* - /start — welcome message + command overview
|
|
15
|
+
* - /new — start a new conversation session
|
|
16
|
+
* - /status — show session info + current settings
|
|
17
|
+
* - /v on|off — toggle verbose mode for this session (shorthand)
|
|
18
|
+
* - /verbose on|off — toggle verbose mode for this session
|
|
19
|
+
* - /s on|off — toggle streaming mode for this session (shorthand)
|
|
20
|
+
* - /streaming on|off — toggle streaming mode for this session
|
|
21
|
+
*
|
|
22
|
+
* Verbose mode:
|
|
23
|
+
* - When ON, the bot sends a small notification whenever the agent calls a tool.
|
|
24
|
+
* - Default is OFF (configurable via channels.telegram.defaults.verbose in config.json5).
|
|
25
|
+
* - Persisted per-session in ~/.beige/sessions/session-settings.json.
|
|
26
|
+
*
|
|
27
|
+
* Streaming mode:
|
|
28
|
+
* - When ON (default), responses are streamed in real-time (message edits as LLM generates).
|
|
29
|
+
* - When OFF, the full response is sent once the LLM finishes.
|
|
30
|
+
* - Default is ON (configurable via channels.telegram.defaults.streaming in config.json5).
|
|
31
|
+
* - Persisted per-session in ~/.beige/sessions/session-settings.json.
|
|
32
|
+
*
|
|
33
|
+
* Bot command registration:
|
|
34
|
+
* - On startup, the bot deletes all old commands and registers the current set.
|
|
35
|
+
*/
|
|
36
|
+
export class TelegramChannel {
|
|
37
|
+
agentManager;
|
|
38
|
+
sessionStore;
|
|
39
|
+
settingsStore;
|
|
40
|
+
channelRegistry;
|
|
41
|
+
bot;
|
|
42
|
+
config;
|
|
43
|
+
constructor(telegramConfig, agentManager, sessionStore, settingsStore, channelRegistry) {
|
|
44
|
+
this.agentManager = agentManager;
|
|
45
|
+
this.sessionStore = sessionStore;
|
|
46
|
+
this.settingsStore = settingsStore;
|
|
47
|
+
this.channelRegistry = channelRegistry;
|
|
48
|
+
this.config = telegramConfig;
|
|
49
|
+
this.bot = new Bot(telegramConfig.token);
|
|
50
|
+
this.setupHandlers();
|
|
51
|
+
}
|
|
52
|
+
setupHandlers() {
|
|
53
|
+
// ── Auth middleware ──────────────────────────────────────
|
|
54
|
+
this.bot.use(async (ctx, next) => {
|
|
55
|
+
const userId = ctx.from?.id;
|
|
56
|
+
if (!userId || !this.config.allowedUsers.includes(userId)) {
|
|
57
|
+
console.log(`[TELEGRAM] Unauthorized user: ${userId}`);
|
|
58
|
+
await ctx.reply("⛔ Unauthorized.");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
await next();
|
|
62
|
+
});
|
|
63
|
+
// ── /start command ──────────────────────────────────────
|
|
64
|
+
this.bot.command("start", async (ctx) => {
|
|
65
|
+
const sessionKey = this.sessionKeyFromCtx(ctx);
|
|
66
|
+
const verbose = this.resolveVerbose(sessionKey);
|
|
67
|
+
const streaming = this.resolveStreaming(sessionKey);
|
|
68
|
+
await ctx.reply("👋 Hello! I'm your Beige agent. Send me a message and I'll help you out.\n\n" +
|
|
69
|
+
"Commands:\n" +
|
|
70
|
+
"/new — Start a new conversation session\n" +
|
|
71
|
+
"/status — Show current session info and settings\n" +
|
|
72
|
+
"/verbose on|off — Toggle tool-call notifications\n" +
|
|
73
|
+
"/v on|off — Same as /verbose (shorthand)\n" +
|
|
74
|
+
"/streaming on|off — Toggle real-time response streaming\n" +
|
|
75
|
+
"/s on|off — Same as /streaming (shorthand)\n\n" +
|
|
76
|
+
`Current settings:\n` +
|
|
77
|
+
`• Verbose: ${verbose ? "🔊 on" : "🔇 off"}\n` +
|
|
78
|
+
`• Streaming: ${streaming ? "⚡ on" : "📦 off"}`);
|
|
79
|
+
});
|
|
80
|
+
// ── /new command — start fresh session ──────────────────
|
|
81
|
+
this.bot.command("new", async (ctx) => {
|
|
82
|
+
const chatId = ctx.chat.id;
|
|
83
|
+
const threadId = ctx.message?.message_thread_id;
|
|
84
|
+
const sessionKey = BeigeSessionStore.telegramKey(chatId, threadId);
|
|
85
|
+
const agentName = this.resolveAgent(ctx.from.id);
|
|
86
|
+
// Clear session-level overrides on /new so the user starts fresh
|
|
87
|
+
this.settingsStore.clearAll(sessionKey);
|
|
88
|
+
await this.agentManager.newSession(sessionKey, agentName, {
|
|
89
|
+
onToolStart: this.makeToolStartHandler(sessionKey, ctx),
|
|
90
|
+
});
|
|
91
|
+
await ctx.reply("🆕 New session started. Previous conversation is saved.");
|
|
92
|
+
});
|
|
93
|
+
// ── /status command ─────────────────────────────────────
|
|
94
|
+
this.bot.command("status", async (ctx) => {
|
|
95
|
+
const chatId = ctx.chat.id;
|
|
96
|
+
const threadId = ctx.message?.message_thread_id;
|
|
97
|
+
const sessionKey = BeigeSessionStore.telegramKey(chatId, threadId);
|
|
98
|
+
const agentName = this.resolveAgent(ctx.from.id);
|
|
99
|
+
const sessionFile = this.sessionStore.getSessionFile(sessionKey);
|
|
100
|
+
const sessionStatus = sessionFile ? "📂 Continuing existing session" : "🆕 No session yet";
|
|
101
|
+
const verbose = this.resolveVerbose(sessionKey);
|
|
102
|
+
const streaming = this.resolveStreaming(sessionKey);
|
|
103
|
+
const overrides = this.settingsStore.getAll(sessionKey);
|
|
104
|
+
const verboseOverride = overrides.verbose !== undefined;
|
|
105
|
+
const streamingOverride = overrides.streaming !== undefined;
|
|
106
|
+
await ctx.reply(`*Session Status*\n\n` +
|
|
107
|
+
`Agent: \`${agentName}\`\n` +
|
|
108
|
+
`Chat: \`${chatId}${threadId ? ` / Thread: ${threadId}` : ""}\`\n` +
|
|
109
|
+
`${sessionStatus}\n\n` +
|
|
110
|
+
`*Settings*\n` +
|
|
111
|
+
`• Verbose: ${verbose ? "🔊 on" : "🔇 off"}` +
|
|
112
|
+
(verboseOverride ? " _(session override)_" : " _(channel default)_") + "\n" +
|
|
113
|
+
`• Streaming: ${streaming ? "⚡ on" : "📦 off"}` +
|
|
114
|
+
(streamingOverride ? " _(session override)_" : " _(channel default)_"), { parse_mode: "Markdown" });
|
|
115
|
+
});
|
|
116
|
+
// ── /verbose command ─────────────────────────────────────
|
|
117
|
+
this.bot.command("verbose", async (ctx) => {
|
|
118
|
+
await this.handleVerboseCommand(ctx);
|
|
119
|
+
});
|
|
120
|
+
// ── /v command (shorthand for /verbose) ──────────────────
|
|
121
|
+
this.bot.command("v", async (ctx) => {
|
|
122
|
+
await this.handleVerboseCommand(ctx);
|
|
123
|
+
});
|
|
124
|
+
// ── /streaming command ───────────────────────────────────
|
|
125
|
+
this.bot.command("streaming", async (ctx) => {
|
|
126
|
+
await this.handleStreamingCommand(ctx);
|
|
127
|
+
});
|
|
128
|
+
// ── /s command (shorthand for /streaming) ────────────────
|
|
129
|
+
this.bot.command("s", async (ctx) => {
|
|
130
|
+
await this.handleStreamingCommand(ctx);
|
|
131
|
+
});
|
|
132
|
+
// ── Text messages ───────────────────────────────────────
|
|
133
|
+
this.bot.on("message:text", async (ctx) => {
|
|
134
|
+
const text = ctx.message.text;
|
|
135
|
+
const chatId = ctx.chat.id;
|
|
136
|
+
const threadId = ctx.message?.message_thread_id;
|
|
137
|
+
const userId = ctx.from.id;
|
|
138
|
+
const sessionKey = BeigeSessionStore.telegramKey(chatId, threadId);
|
|
139
|
+
const agentName = this.resolveAgent(userId);
|
|
140
|
+
const streaming = this.resolveStreaming(sessionKey);
|
|
141
|
+
console.log(`[TELEGRAM] User ${userId} → agent '${agentName}' ` +
|
|
142
|
+
`(chat:${chatId}${threadId ? `/thread:${threadId}` : ""}): ` +
|
|
143
|
+
`${text.slice(0, 80)}${text.length > 80 ? "..." : ""}`);
|
|
144
|
+
try {
|
|
145
|
+
await ctx.replyWithChatAction("typing");
|
|
146
|
+
// Build onToolStart based on the current verbose setting
|
|
147
|
+
const onToolStart = this.resolveVerbose(sessionKey)
|
|
148
|
+
? this.makeToolStartHandler(sessionKey, ctx)
|
|
149
|
+
: undefined;
|
|
150
|
+
if (streaming) {
|
|
151
|
+
// Streaming mode: update message in real-time
|
|
152
|
+
let currentMessage = "";
|
|
153
|
+
let sentMessage = null;
|
|
154
|
+
let lastUpdateTime = 0;
|
|
155
|
+
const UPDATE_INTERVAL_MS = 1000;
|
|
156
|
+
const response = await this.agentManager.promptStreaming(sessionKey, agentName, text, async (delta) => {
|
|
157
|
+
currentMessage += delta;
|
|
158
|
+
const now = Date.now();
|
|
159
|
+
if (now - lastUpdateTime < UPDATE_INTERVAL_MS)
|
|
160
|
+
return;
|
|
161
|
+
lastUpdateTime = now;
|
|
162
|
+
try {
|
|
163
|
+
if (!sentMessage) {
|
|
164
|
+
sentMessage = await ctx.reply(truncateForTelegram(currentMessage), {
|
|
165
|
+
parse_mode: undefined,
|
|
166
|
+
...(threadId ? { message_thread_id: threadId } : {}),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
await ctx.api.editMessageText(ctx.chat.id, sentMessage.message_id, truncateForTelegram(currentMessage));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Ignore edit errors
|
|
175
|
+
}
|
|
176
|
+
}, { onToolStart });
|
|
177
|
+
// Send final message
|
|
178
|
+
if (sentMessage) {
|
|
179
|
+
try {
|
|
180
|
+
await ctx.api.editMessageText(ctx.chat.id, sentMessage.message_id, truncateForTelegram(response));
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
await sendLongMessage(ctx, response, threadId);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
await sendLongMessage(ctx, response, threadId);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// Non-streaming mode: send full response when complete
|
|
192
|
+
const response = await this.agentManager.prompt(sessionKey, agentName, text, { onToolStart });
|
|
193
|
+
await sendLongMessage(ctx, response, threadId);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
console.error(`[TELEGRAM] Error:`, err);
|
|
198
|
+
await ctx.reply(`❌ Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// ── Verbose mode helpers ────────────────────────────────────────────
|
|
203
|
+
/**
|
|
204
|
+
* Handle /verbose and /v commands.
|
|
205
|
+
* Parses "on"/"off" argument and persists the setting for this session.
|
|
206
|
+
*/
|
|
207
|
+
async handleVerboseCommand(ctx) {
|
|
208
|
+
const chatId = ctx.chat.id;
|
|
209
|
+
const threadId = ctx.message?.message_thread_id;
|
|
210
|
+
const sessionKey = BeigeSessionStore.telegramKey(chatId, threadId);
|
|
211
|
+
// Extract argument: "/verbose on" or "/v off"
|
|
212
|
+
const text = ctx.message?.text ?? "";
|
|
213
|
+
const parts = text.trim().split(/\s+/);
|
|
214
|
+
const arg = parts[1]?.toLowerCase();
|
|
215
|
+
if (!arg || (arg !== "on" && arg !== "off")) {
|
|
216
|
+
const current = this.resolveVerbose(sessionKey);
|
|
217
|
+
await ctx.reply(`Usage: /verbose on|off\n\n` +
|
|
218
|
+
`Current: ${current ? "🔊 on" : "🔇 off"}`);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const enable = arg === "on";
|
|
222
|
+
this.settingsStore.set(sessionKey, "verbose", enable);
|
|
223
|
+
// Update the live session's handler ref — no session restart needed.
|
|
224
|
+
if (enable) {
|
|
225
|
+
this.agentManager.updateToolStartHandler(sessionKey, this.makeToolStartHandlerForKey(sessionKey, ctx));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
this.agentManager.updateToolStartHandler(sessionKey, undefined);
|
|
229
|
+
}
|
|
230
|
+
await ctx.reply(enable
|
|
231
|
+
? "🔊 Verbose mode *on* — you'll see tool calls as they happen."
|
|
232
|
+
: "🔇 Verbose mode *off* — tool calls are hidden.", { parse_mode: "Markdown" });
|
|
233
|
+
console.log(`[TELEGRAM] Verbose mode ${enable ? "ON" : "OFF"} for session ${sessionKey}`);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Resolve the effective verbose setting for a session (layered: default → config → override).
|
|
237
|
+
*/
|
|
238
|
+
resolveVerbose(sessionKey) {
|
|
239
|
+
const sessionOverride = this.settingsStore.get(sessionKey, "verbose");
|
|
240
|
+
const channelDefault = this.config.defaults?.verbose;
|
|
241
|
+
return resolveSessionSetting("verbose", false, channelDefault, sessionOverride);
|
|
242
|
+
}
|
|
243
|
+
// ── Streaming mode helpers ────────────────────────────────────────────
|
|
244
|
+
/**
|
|
245
|
+
* Handle /streaming and /s commands.
|
|
246
|
+
* Parses "on"/"off" argument and persists the setting for this session.
|
|
247
|
+
*/
|
|
248
|
+
async handleStreamingCommand(ctx) {
|
|
249
|
+
const chatId = ctx.chat.id;
|
|
250
|
+
const threadId = ctx.message?.message_thread_id;
|
|
251
|
+
const sessionKey = BeigeSessionStore.telegramKey(chatId, threadId);
|
|
252
|
+
// Extract argument: "/streaming on" or "/s off"
|
|
253
|
+
const text = ctx.message?.text ?? "";
|
|
254
|
+
const parts = text.trim().split(/\s+/);
|
|
255
|
+
const arg = parts[1]?.toLowerCase();
|
|
256
|
+
if (!arg || (arg !== "on" && arg !== "off")) {
|
|
257
|
+
const current = this.resolveStreaming(sessionKey);
|
|
258
|
+
await ctx.reply(`Usage: /streaming on|off\n\n` +
|
|
259
|
+
`Current: ${current ? "⚡ on" : "📦 off"}`);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const enable = arg === "on";
|
|
263
|
+
this.settingsStore.set(sessionKey, "streaming", enable);
|
|
264
|
+
await ctx.reply(enable
|
|
265
|
+
? "⚡ Streaming mode *on* — responses will appear in real-time as the AI generates them."
|
|
266
|
+
: "📦 Streaming mode *off* — full response will be sent once complete.", { parse_mode: "Markdown" });
|
|
267
|
+
console.log(`[TELEGRAM] Streaming mode ${enable ? "ON" : "OFF"} for session ${sessionKey}`);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Resolve the effective streaming setting for a session (layered: default → config → override).
|
|
271
|
+
*/
|
|
272
|
+
resolveStreaming(sessionKey) {
|
|
273
|
+
const sessionOverride = this.settingsStore.get(sessionKey, "streaming");
|
|
274
|
+
const channelDefault = this.config.defaults?.streaming;
|
|
275
|
+
return resolveSessionSetting("streaming", true, channelDefault, sessionOverride);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Create an OnToolStart callback that sends a Telegram notification.
|
|
279
|
+
* Uses a GrammY context for thread-aware replies.
|
|
280
|
+
*/
|
|
281
|
+
makeToolStartHandler(sessionKey, ctx) {
|
|
282
|
+
const chatId = ctx.chat.id;
|
|
283
|
+
const threadId = ctx.message?.message_thread_id;
|
|
284
|
+
return this.buildToolStartHandler(sessionKey, chatId, threadId);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Create an OnToolStart callback using raw chat/thread IDs.
|
|
288
|
+
* Used when toggling verbose on mid-session (no fresh ctx available).
|
|
289
|
+
*/
|
|
290
|
+
makeToolStartHandlerForKey(sessionKey, ctx) {
|
|
291
|
+
const chatId = ctx.chat.id;
|
|
292
|
+
const threadId = ctx.message?.message_thread_id;
|
|
293
|
+
return this.buildToolStartHandler(sessionKey, chatId, threadId);
|
|
294
|
+
}
|
|
295
|
+
buildToolStartHandler(sessionKey, chatId, threadId) {
|
|
296
|
+
return (toolName, params) => {
|
|
297
|
+
const label = formatToolCall(toolName, params);
|
|
298
|
+
console.log(`[TELEGRAM] [verbose] ${sessionKey} tool: ${label}`);
|
|
299
|
+
// Fire-and-forget — we don't await inside a sync callback
|
|
300
|
+
this.bot.api
|
|
301
|
+
.sendMessage(chatId, `🔧 ${label}`, {
|
|
302
|
+
...(threadId ? { message_thread_id: threadId } : {}),
|
|
303
|
+
})
|
|
304
|
+
.catch((err) => {
|
|
305
|
+
console.warn(`[TELEGRAM] Failed to send verbose notification: ${err}`);
|
|
306
|
+
});
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Resolve which agent to use for a given user.
|
|
311
|
+
*/
|
|
312
|
+
resolveAgent(_userId) {
|
|
313
|
+
return this.config.agentMapping.default;
|
|
314
|
+
}
|
|
315
|
+
sessionKeyFromCtx(ctx) {
|
|
316
|
+
const chatId = ctx.chat.id;
|
|
317
|
+
const threadId = ctx.message?.message_thread_id;
|
|
318
|
+
return BeigeSessionStore.telegramKey(chatId, threadId);
|
|
319
|
+
}
|
|
320
|
+
// ── Lifecycle ────────────────────────────────────────────────────────
|
|
321
|
+
supportsMessaging() {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
async sendMessage(chatId, threadId, text, options) {
|
|
325
|
+
const MAX_LENGTH = 4096;
|
|
326
|
+
const chunks = [];
|
|
327
|
+
if (text.length <= MAX_LENGTH) {
|
|
328
|
+
chunks.push(text);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
let current = "";
|
|
332
|
+
for (const line of text.split("\n")) {
|
|
333
|
+
if (current.length + line.length + 1 > MAX_LENGTH) {
|
|
334
|
+
if (current)
|
|
335
|
+
chunks.push(current);
|
|
336
|
+
current = line;
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
current += (current ? "\n" : "") + line;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (current)
|
|
343
|
+
chunks.push(current);
|
|
344
|
+
}
|
|
345
|
+
for (const chunk of chunks) {
|
|
346
|
+
await this.bot.api.sendMessage(chatId, chunk, {
|
|
347
|
+
parse_mode: options?.parseMode === "markdown" ? "MarkdownV2" : options?.parseMode === "html" ? "HTML" : undefined,
|
|
348
|
+
...(threadId ? { message_thread_id: parseInt(threadId, 10) } : {}),
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
async start() {
|
|
353
|
+
console.log("[TELEGRAM] Starting bot...");
|
|
354
|
+
if (this.channelRegistry) {
|
|
355
|
+
this.channelRegistry.register("telegram", this);
|
|
356
|
+
}
|
|
357
|
+
// Register bot commands (delete stale ones first, then set current set)
|
|
358
|
+
await this.registerBotCommands();
|
|
359
|
+
await this.bot.start({
|
|
360
|
+
onStart: (botInfo) => {
|
|
361
|
+
console.log(`[TELEGRAM] Bot started as @${botInfo.username}`);
|
|
362
|
+
},
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
async stop() {
|
|
366
|
+
await this.bot.stop();
|
|
367
|
+
console.log("[TELEGRAM] Bot stopped");
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Register the bot's command list with Telegram.
|
|
371
|
+
* First deletes all existing commands, then sets the current ones.
|
|
372
|
+
* This ensures stale commands from old bot versions are removed.
|
|
373
|
+
*/
|
|
374
|
+
async registerBotCommands() {
|
|
375
|
+
try {
|
|
376
|
+
// Delete all existing commands
|
|
377
|
+
await this.bot.api.deleteMyCommands();
|
|
378
|
+
console.log("[TELEGRAM] Cleared existing bot commands");
|
|
379
|
+
// Register current commands
|
|
380
|
+
await this.bot.api.setMyCommands([
|
|
381
|
+
{ command: "start", description: "Show welcome message and available commands" },
|
|
382
|
+
{ command: "new", description: "Start a new conversation session" },
|
|
383
|
+
{ command: "status", description: "Show current session info and settings" },
|
|
384
|
+
{
|
|
385
|
+
command: "verbose",
|
|
386
|
+
description: "Toggle tool-call notifications: /verbose on|off",
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
command: "v",
|
|
390
|
+
description: "Shorthand for /verbose: /v on|off",
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
command: "streaming",
|
|
394
|
+
description: "Toggle real-time response streaming: /streaming on|off",
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
command: "s",
|
|
398
|
+
description: "Shorthand for /streaming: /s on|off",
|
|
399
|
+
},
|
|
400
|
+
]);
|
|
401
|
+
console.log("[TELEGRAM] Registered bot commands");
|
|
402
|
+
}
|
|
403
|
+
catch (err) {
|
|
404
|
+
// Non-fatal — bot still works without registered commands
|
|
405
|
+
console.warn(`[TELEGRAM] Failed to register commands: ${err}`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// ── Formatting ────────────────────────────────────────────────────────────
|
|
410
|
+
/**
|
|
411
|
+
* Format a tool call into a human-readable one-liner for verbose notifications.
|
|
412
|
+
*/
|
|
413
|
+
function formatToolCall(toolName, params) {
|
|
414
|
+
switch (toolName) {
|
|
415
|
+
case "exec": {
|
|
416
|
+
const cmd = String(params.command ?? "");
|
|
417
|
+
return `exec: ${cmd.length > 80 ? cmd.slice(0, 77) + "…" : cmd}`;
|
|
418
|
+
}
|
|
419
|
+
case "read": {
|
|
420
|
+
const path = String(params.path ?? "");
|
|
421
|
+
return `read: ${path}`;
|
|
422
|
+
}
|
|
423
|
+
case "write": {
|
|
424
|
+
const path = String(params.path ?? "");
|
|
425
|
+
const bytes = params.bytes != null ? ` (${params.bytes} bytes)` : "";
|
|
426
|
+
return `write: ${path}${bytes}`;
|
|
427
|
+
}
|
|
428
|
+
case "patch": {
|
|
429
|
+
const path = String(params.path ?? "");
|
|
430
|
+
return `patch: ${path}`;
|
|
431
|
+
}
|
|
432
|
+
default:
|
|
433
|
+
return `${toolName}: ${JSON.stringify(params).slice(0, 80)}`;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function truncateForTelegram(text) {
|
|
437
|
+
if (text.length <= 4096)
|
|
438
|
+
return text;
|
|
439
|
+
return text.slice(0, 4090) + "\n[…]";
|
|
440
|
+
}
|
|
441
|
+
async function sendLongMessage(ctx, text, threadId) {
|
|
442
|
+
const MAX_LENGTH = 4096;
|
|
443
|
+
if (text.length <= MAX_LENGTH) {
|
|
444
|
+
await ctx.reply(text || "(empty response)", {
|
|
445
|
+
...(threadId ? { message_thread_id: threadId } : {}),
|
|
446
|
+
});
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const chunks = [];
|
|
450
|
+
let current = "";
|
|
451
|
+
for (const line of text.split("\n")) {
|
|
452
|
+
if (current.length + line.length + 1 > MAX_LENGTH) {
|
|
453
|
+
if (current)
|
|
454
|
+
chunks.push(current);
|
|
455
|
+
current = line;
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
current += (current ? "\n" : "") + line;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (current)
|
|
462
|
+
chunks.push(current);
|
|
463
|
+
for (const chunk of chunks) {
|
|
464
|
+
await ctx.reply(chunk, {
|
|
465
|
+
...(threadId ? { message_thread_id: threadId } : {}),
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=telegram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/channels/tui.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,qBAAqB,CAAC;AA6BpE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG/D"}
|