@llblab/pi-telegram 0.10.7 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +10 -6
- package/BACKLOG.md +5 -0
- package/CHANGELOG.md +26 -1
- package/README.md +48 -24
- package/docs/README.md +3 -2
- package/docs/architecture.md +3 -3
- package/docs/extension-sections.md +6 -4
- package/docs/inbound-handlers.md +41 -1
- package/docs/outbound-handlers.md +32 -49
- package/docs/voice.md +210 -0
- package/index.ts +77 -1
- package/lib/api.ts +35 -2
- package/lib/commands.ts +18 -0
- package/lib/config.ts +70 -0
- package/lib/extension-sections.ts +39 -20
- package/lib/external-handlers.ts +3 -4
- package/lib/inbound-handlers.ts +197 -0
- package/lib/media.ts +3 -0
- package/lib/menu-settings.ts +134 -8
- package/lib/menu-status.ts +17 -3
- package/lib/menu-thinking.ts +12 -1
- package/lib/menu.ts +10 -1
- package/lib/outbound-handlers.ts +719 -277
- package/lib/preview.ts +9 -0
- package/lib/prompts.ts +2 -1
- package/lib/queue.ts +84 -5
- package/lib/routing.ts +14 -1
- package/lib/turns.ts +84 -20
- package/lib/voice.ts +295 -0
- package/package.json +1 -1
package/lib/menu-status.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface TelegramStatusMenuCallbackDeps {
|
|
|
30
30
|
callbackQueryId: string,
|
|
31
31
|
text?: string,
|
|
32
32
|
) => Promise<void>;
|
|
33
|
+
isVoiceReplyActive?: () => boolean;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
export interface TelegramStatusMenuOpenDeps<
|
|
@@ -131,6 +132,13 @@ export async function handleTelegramStatusMenuCallbackAction(
|
|
|
131
132
|
return true;
|
|
132
133
|
}
|
|
133
134
|
if (!isTelegramStatusMenuCallbackAction(data, "thinking")) return false;
|
|
135
|
+
if (deps.isVoiceReplyActive?.()) {
|
|
136
|
+
await deps.answerCallbackQuery(
|
|
137
|
+
callbackQueryId,
|
|
138
|
+
"Thinking controls are disabled during voice replies.",
|
|
139
|
+
);
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
134
142
|
if (!activeModel?.reasoning) {
|
|
135
143
|
await deps.answerCallbackQuery(
|
|
136
144
|
callbackQueryId,
|
|
@@ -148,6 +156,7 @@ export function buildStatusReplyMarkup(
|
|
|
148
156
|
currentThinkingLevel: ThinkingLevel,
|
|
149
157
|
queueItemCount = 0,
|
|
150
158
|
sectionRegistry?: TelegramSectionRegistry,
|
|
159
|
+
isVoiceReplyActive?: boolean,
|
|
151
160
|
): TelegramReplyMarkup {
|
|
152
161
|
const rows: Array<Array<{ text: string; callback_data: string }>> = [];
|
|
153
162
|
rows.push([
|
|
@@ -159,7 +168,7 @@ export function buildStatusReplyMarkup(
|
|
|
159
168
|
callback_data: "menu:model",
|
|
160
169
|
},
|
|
161
170
|
]);
|
|
162
|
-
if (activeModel?.reasoning) {
|
|
171
|
+
if (activeModel?.reasoning && !isVoiceReplyActive) {
|
|
163
172
|
rows.push([
|
|
164
173
|
{
|
|
165
174
|
text: formatStatusButtonLabel(
|
|
@@ -176,11 +185,10 @@ export function buildStatusReplyMarkup(
|
|
|
176
185
|
callback_data: "menu:queue",
|
|
177
186
|
},
|
|
178
187
|
]);
|
|
179
|
-
// Extension section rows before Settings
|
|
180
188
|
if (sectionRegistry) {
|
|
181
189
|
const sectionRows = getTelegramSectionMainMenuRows(sectionRegistry);
|
|
182
190
|
for (const row of sectionRows) {
|
|
183
|
-
rows.push([
|
|
191
|
+
rows.push([row]);
|
|
184
192
|
}
|
|
185
193
|
}
|
|
186
194
|
rows.push([
|
|
@@ -198,6 +206,7 @@ export function buildTelegramStatusMenuRenderPayload(
|
|
|
198
206
|
currentThinkingLevel: ThinkingLevel,
|
|
199
207
|
queueItemCount = 0,
|
|
200
208
|
sectionRegistry?: TelegramSectionRegistry,
|
|
209
|
+
isVoiceReplyActive?: boolean,
|
|
201
210
|
): TelegramMenuRenderPayload {
|
|
202
211
|
return {
|
|
203
212
|
nextMode: "status",
|
|
@@ -208,6 +217,7 @@ export function buildTelegramStatusMenuRenderPayload(
|
|
|
208
217
|
currentThinkingLevel,
|
|
209
218
|
queueItemCount,
|
|
210
219
|
sectionRegistry,
|
|
220
|
+
isVoiceReplyActive,
|
|
211
221
|
),
|
|
212
222
|
};
|
|
213
223
|
}
|
|
@@ -220,6 +230,7 @@ export async function updateTelegramStatusMessage(
|
|
|
220
230
|
deps: TelegramMenuMessageRuntimeDeps,
|
|
221
231
|
queueItemCount = 0,
|
|
222
232
|
sectionRegistry?: TelegramSectionRegistry,
|
|
233
|
+
isVoiceReplyActive?: boolean,
|
|
223
234
|
): Promise<void> {
|
|
224
235
|
await editTelegramMenuMessage(
|
|
225
236
|
state,
|
|
@@ -229,6 +240,7 @@ export async function updateTelegramStatusMessage(
|
|
|
229
240
|
currentThinkingLevel,
|
|
230
241
|
queueItemCount,
|
|
231
242
|
sectionRegistry,
|
|
243
|
+
isVoiceReplyActive,
|
|
232
244
|
),
|
|
233
245
|
deps,
|
|
234
246
|
);
|
|
@@ -242,6 +254,7 @@ export function sendTelegramStatusMessage(
|
|
|
242
254
|
deps: TelegramMenuMessageRuntimeDeps,
|
|
243
255
|
queueItemCount = 0,
|
|
244
256
|
sectionRegistry?: TelegramSectionRegistry,
|
|
257
|
+
isVoiceReplyActive?: boolean,
|
|
245
258
|
): Promise<number | undefined> {
|
|
246
259
|
return sendTelegramMenuMessage(
|
|
247
260
|
state,
|
|
@@ -251,6 +264,7 @@ export function sendTelegramStatusMessage(
|
|
|
251
264
|
currentThinkingLevel,
|
|
252
265
|
queueItemCount,
|
|
253
266
|
sectionRegistry,
|
|
267
|
+
isVoiceReplyActive,
|
|
254
268
|
),
|
|
255
269
|
deps,
|
|
256
270
|
);
|
package/lib/menu-thinking.ts
CHANGED
|
@@ -25,6 +25,7 @@ export interface TelegramThinkingMenuCallbackDeps {
|
|
|
25
25
|
callbackQueryId: string,
|
|
26
26
|
text?: string,
|
|
27
27
|
) => Promise<void>;
|
|
28
|
+
isVoiceReplyActive?: () => boolean;
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
export interface TelegramThinkingMenuOpenDeps<
|
|
@@ -34,6 +35,7 @@ export interface TelegramThinkingMenuOpenDeps<
|
|
|
34
35
|
getActiveModel: () => TModel | undefined;
|
|
35
36
|
getThinkingLevel: () => ThinkingLevel;
|
|
36
37
|
storeModelMenuState: (state: TelegramModelMenuState<TModel>) => void;
|
|
38
|
+
isVoiceReplyActive?: () => boolean;
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
function parseTelegramThinkingMenuCallbackAction(
|
|
@@ -92,6 +94,13 @@ export async function handleTelegramThinkingMenuCallbackAction(
|
|
|
92
94
|
await deps.answerCallbackQuery(callbackQueryId, "Invalid thinking level.");
|
|
93
95
|
return true;
|
|
94
96
|
}
|
|
97
|
+
if (deps.isVoiceReplyActive?.()) {
|
|
98
|
+
await deps.answerCallbackQuery(
|
|
99
|
+
callbackQueryId,
|
|
100
|
+
"Thinking controls are disabled during voice replies.",
|
|
101
|
+
);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
95
104
|
if (!activeModel?.reasoning) {
|
|
96
105
|
await deps.answerCallbackQuery(
|
|
97
106
|
callbackQueryId,
|
|
@@ -142,6 +151,7 @@ export function buildTelegramThinkingMenuRenderPayload(
|
|
|
142
151
|
export async function openTelegramThinkingMenu<
|
|
143
152
|
TModel extends MenuModel = MenuModel,
|
|
144
153
|
>(deps: TelegramThinkingMenuOpenDeps<TModel>): Promise<void> {
|
|
154
|
+
if (deps.isVoiceReplyActive?.()) return;
|
|
145
155
|
const state = await deps.getModelMenuState();
|
|
146
156
|
const messageId = await sendTelegramMenuMessage(
|
|
147
157
|
state,
|
|
@@ -161,8 +171,9 @@ export async function updateTelegramThinkingMenuMessage(
|
|
|
161
171
|
state: TelegramModelMenuState,
|
|
162
172
|
activeModel: MenuModel | undefined,
|
|
163
173
|
currentThinkingLevel: ThinkingLevel,
|
|
164
|
-
deps: TelegramMenuMessageRuntimeDeps,
|
|
174
|
+
deps: TelegramMenuMessageRuntimeDeps & { isVoiceReplyActive?: () => boolean },
|
|
165
175
|
): Promise<void> {
|
|
176
|
+
if (deps.isVoiceReplyActive?.()) return;
|
|
166
177
|
await editTelegramMenuMessage(
|
|
167
178
|
state,
|
|
168
179
|
buildTelegramThinkingMenuRenderPayload(activeModel, currentThinkingLevel),
|
package/lib/menu.ts
CHANGED
|
@@ -239,6 +239,7 @@ export interface TelegramMenuCallbackRuntimeDeps<
|
|
|
239
239
|
) => Promise<number | undefined>;
|
|
240
240
|
enqueueSectionPrompt?: (prompt: string, ctx: TContext) => Promise<void>;
|
|
241
241
|
deleteMessage?: (chatId: number, messageId: number) => Promise<void>;
|
|
242
|
+
isVoiceReplyActive?: () => boolean;
|
|
242
243
|
}
|
|
243
244
|
|
|
244
245
|
export interface TelegramMenuActionRuntimeDeps<
|
|
@@ -262,6 +263,7 @@ export interface TelegramMenuActionRuntimeDeps<
|
|
|
262
263
|
text: string,
|
|
263
264
|
) => Promise<unknown>;
|
|
264
265
|
sectionRegistry?: TelegramSectionRegistry;
|
|
266
|
+
isVoiceReplyActive?: () => boolean;
|
|
265
267
|
}
|
|
266
268
|
|
|
267
269
|
export interface TelegramMenuActionRuntime<
|
|
@@ -639,6 +641,7 @@ export async function handleTelegramMenuCallbackRuntime<
|
|
|
639
641
|
updateSettingsMenuMessage: () =>
|
|
640
642
|
deps.updateSettingsMenuMessage?.(state, ctx) ?? Promise.resolve(),
|
|
641
643
|
answerCallbackQuery: deps.answerCallbackQuery,
|
|
644
|
+
isVoiceReplyActive: deps.isVoiceReplyActive,
|
|
642
645
|
},
|
|
643
646
|
),
|
|
644
647
|
handleThinkingAction: async (state) =>
|
|
@@ -654,6 +657,7 @@ export async function handleTelegramMenuCallbackRuntime<
|
|
|
654
657
|
getCurrentThinkingLevel: deps.getThinkingLevel,
|
|
655
658
|
updateStatusMessage: () => deps.updateStatusMessage(state, ctx),
|
|
656
659
|
answerCallbackQuery: deps.answerCallbackQuery,
|
|
660
|
+
isVoiceReplyActive: deps.isVoiceReplyActive,
|
|
657
661
|
},
|
|
658
662
|
),
|
|
659
663
|
handleModelAction: async (state) => {
|
|
@@ -708,7 +712,9 @@ export interface TelegramMenuActionRuntimeWithStateBuilderDeps<
|
|
|
708
712
|
>
|
|
709
713
|
extends
|
|
710
714
|
Omit<TelegramMenuActionRuntimeDeps<TContext, TModel>, "getModelMenuState">,
|
|
711
|
-
TelegramModelMenuStateBuilderDeps<TModel, TContext> {
|
|
715
|
+
TelegramModelMenuStateBuilderDeps<TModel, TContext> {
|
|
716
|
+
isVoiceReplyActive?: () => boolean;
|
|
717
|
+
}
|
|
712
718
|
|
|
713
719
|
export function createTelegramMenuActionRuntimeWithStateBuilder<
|
|
714
720
|
TModel extends MenuModel = MenuModel,
|
|
@@ -762,6 +768,7 @@ export function createTelegramMenuActionRuntime<
|
|
|
762
768
|
deps,
|
|
763
769
|
deps.getQueueItemCount?.() ?? 0,
|
|
764
770
|
deps.sectionRegistry,
|
|
771
|
+
deps.isVoiceReplyActive?.(),
|
|
765
772
|
),
|
|
766
773
|
sendStatusMessage: (chatId, replyToMessageId, ctx) =>
|
|
767
774
|
openTelegramStatusMenu({
|
|
@@ -793,6 +800,7 @@ export function createTelegramMenuActionRuntime<
|
|
|
793
800
|
deps,
|
|
794
801
|
queueItemCount,
|
|
795
802
|
deps.sectionRegistry,
|
|
803
|
+
deps.isVoiceReplyActive?.(),
|
|
796
804
|
),
|
|
797
805
|
storeModelMenuState: deps.storeModelMenuState,
|
|
798
806
|
}),
|
|
@@ -829,6 +837,7 @@ export function createTelegramMenuActionRuntime<
|
|
|
829
837
|
storeModelMenuState: deps.storeModelMenuState,
|
|
830
838
|
editInteractiveMessage: deps.editInteractiveMessage,
|
|
831
839
|
sendInteractiveMessage: deps.sendInteractiveMessage,
|
|
840
|
+
isVoiceReplyActive: deps.isVoiceReplyActive,
|
|
832
841
|
}),
|
|
833
842
|
};
|
|
834
843
|
}
|