@llblab/pi-telegram 0.46.0 → 0.47.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/BACKLOG.md +0 -1
- package/CHANGELOG.md +8 -0
- package/README.md +2 -2
- package/dist/api/activity.d.ts +6 -0
- package/dist/api/activity.js +6 -0
- package/dist/api/commands.d.ts +6 -0
- package/dist/api/commands.js +6 -0
- package/dist/api/delivery.d.ts +6 -0
- package/dist/api/delivery.js +6 -0
- package/dist/api/inbound.d.ts +6 -0
- package/dist/api/inbound.js +6 -0
- package/dist/api/keyboard.d.ts +6 -0
- package/dist/api/keyboard.js +6 -0
- package/dist/api/outbound.d.ts +6 -0
- package/dist/api/outbound.js +6 -0
- package/dist/api/sections.d.ts +7 -0
- package/dist/api/sections.js +6 -0
- package/dist/api/status.d.ts +6 -0
- package/dist/api/status.js +6 -0
- package/dist/api/updates.d.ts +6 -0
- package/dist/api/updates.js +6 -0
- package/dist/api/voice.d.ts +6 -0
- package/dist/api/voice.js +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/lib/activity-verbosity.d.ts +52 -0
- package/dist/lib/activity-verbosity.js +596 -0
- package/dist/lib/activity.d.ts +220 -0
- package/dist/lib/activity.js +574 -0
- package/dist/lib/agent-messages.d.ts +28 -0
- package/dist/lib/agent-messages.js +86 -0
- package/dist/lib/bindings.d.ts +250 -0
- package/dist/lib/bindings.js +936 -0
- package/dist/lib/bus-api.d.ts +18 -0
- package/dist/lib/bus-api.js +254 -0
- package/dist/lib/bus-follower.d.ts +464 -0
- package/dist/lib/bus-follower.js +1686 -0
- package/dist/lib/bus-leader.d.ts +292 -0
- package/dist/lib/bus-leader.js +2242 -0
- package/dist/lib/bus-transport.d.ts +64 -0
- package/dist/lib/bus-transport.js +140 -0
- package/dist/lib/bus.d.ts +518 -0
- package/dist/lib/bus.js +2055 -0
- package/dist/lib/channel-posts.d.ts +170 -0
- package/dist/lib/channel-posts.js +611 -0
- package/dist/lib/command-templates.d.ts +70 -0
- package/dist/lib/command-templates.js +744 -0
- package/dist/lib/commands.d.ts +541 -0
- package/dist/lib/commands.js +1155 -0
- package/dist/lib/config.d.ts +252 -0
- package/dist/lib/config.js +889 -0
- package/dist/lib/delivery.d.ts +163 -0
- package/dist/lib/delivery.js +542 -0
- package/dist/lib/extension.d.ts +7 -0
- package/dist/lib/extension.js +1608 -0
- package/dist/lib/generative-app-worker.mjs +104 -0
- package/dist/lib/generative-apps.d.ts +212 -0
- package/dist/lib/generative-apps.js +1006 -0
- package/dist/lib/inbound.d.ts +91 -0
- package/dist/lib/inbound.js +502 -0
- package/dist/lib/journal.d.ts +665 -0
- package/dist/lib/journal.js +3701 -0
- package/dist/lib/keyboard.d.ts +23 -0
- package/dist/lib/keyboard.js +37 -0
- package/dist/lib/lifecycle.d.ts +157 -0
- package/dist/lib/lifecycle.js +395 -0
- package/dist/lib/locks.d.ts +164 -0
- package/dist/lib/locks.js +1208 -0
- package/dist/lib/logging.d.ts +50 -0
- package/dist/lib/logging.js +274 -0
- package/dist/lib/media.d.ts +181 -0
- package/dist/lib/media.js +602 -0
- package/dist/lib/menu-model.d.ts +217 -0
- package/dist/lib/menu-model.js +663 -0
- package/dist/lib/menu-queue.d.ts +37 -0
- package/dist/lib/menu-queue.js +408 -0
- package/dist/lib/menu-settings.d.ts +116 -0
- package/dist/lib/menu-settings.js +595 -0
- package/dist/lib/menu-status.d.ts +32 -0
- package/dist/lib/menu-status.js +112 -0
- package/dist/lib/menu-thinking.d.ts +29 -0
- package/dist/lib/menu-thinking.js +82 -0
- package/dist/lib/menu.d.ts +171 -0
- package/dist/lib/menu.js +323 -0
- package/dist/lib/model.d.ts +127 -0
- package/dist/lib/model.js +409 -0
- package/dist/lib/outbound-attachments.d.ts +241 -0
- package/dist/lib/outbound-attachments.js +639 -0
- package/dist/lib/outbound-buttons.d.ts +69 -0
- package/dist/lib/outbound-buttons.js +248 -0
- package/dist/lib/outbound-markup.d.ts +42 -0
- package/dist/lib/outbound-markup.js +678 -0
- package/dist/lib/outbound-voice.d.ts +55 -0
- package/dist/lib/outbound-voice.js +152 -0
- package/dist/lib/outbound.d.ts +185 -0
- package/dist/lib/outbound.js +516 -0
- package/dist/lib/ownership.d.ts +77 -0
- package/dist/lib/ownership.js +174 -0
- package/dist/lib/paths.d.ts +40 -0
- package/dist/lib/paths.js +94 -0
- package/dist/lib/pi.d.ts +72 -0
- package/dist/lib/pi.js +121 -0
- package/dist/lib/polling.d.ts +351 -0
- package/dist/lib/polling.js +1196 -0
- package/dist/lib/preview.d.ts +192 -0
- package/dist/lib/preview.js +614 -0
- package/dist/lib/prompt-templates.d.ts +24 -0
- package/dist/lib/prompt-templates.js +118 -0
- package/dist/lib/prompts.d.ts +57 -0
- package/dist/lib/prompts.js +167 -0
- package/dist/lib/queue.d.ts +766 -0
- package/dist/lib/queue.js +1965 -0
- package/dist/lib/recovery.d.ts +86 -0
- package/dist/lib/recovery.js +285 -0
- package/dist/lib/rendering.d.ts +20 -0
- package/dist/lib/rendering.js +983 -0
- package/dist/lib/replies.d.ts +214 -0
- package/dist/lib/replies.js +737 -0
- package/dist/lib/routing.d.ts +207 -0
- package/dist/lib/routing.js +2282 -0
- package/dist/lib/runtime.d.ts +172 -0
- package/dist/lib/runtime.js +402 -0
- package/dist/lib/sections.d.ts +165 -0
- package/dist/lib/sections.js +327 -0
- package/dist/lib/setup.d.ts +82 -0
- package/dist/lib/setup.js +150 -0
- package/dist/lib/skills.d.ts +8 -0
- package/dist/lib/skills.js +12 -0
- package/dist/lib/status.d.ts +442 -0
- package/dist/lib/status.js +1006 -0
- package/dist/lib/sync.d.ts +179 -0
- package/dist/lib/sync.js +782 -0
- package/dist/lib/target.d.ts +20 -0
- package/dist/lib/target.js +27 -0
- package/dist/lib/telegram-api.d.ts +541 -0
- package/dist/lib/telegram-api.js +1159 -0
- package/dist/lib/text-groups.d.ts +89 -0
- package/dist/lib/text-groups.js +317 -0
- package/dist/lib/thread-cleanup-manager.d.ts +288 -0
- package/dist/lib/thread-cleanup-manager.js +560 -0
- package/dist/lib/thread-display.d.ts +46 -0
- package/dist/lib/thread-display.js +257 -0
- package/dist/lib/thread-naming.d.ts +46 -0
- package/dist/lib/thread-naming.js +78 -0
- package/dist/lib/thread-reconciler.d.ts +239 -0
- package/dist/lib/thread-reconciler.js +644 -0
- package/dist/lib/threads.d.ts +621 -0
- package/dist/lib/threads.js +3679 -0
- package/dist/lib/time-injection.d.ts +15 -0
- package/dist/lib/time-injection.js +56 -0
- package/dist/lib/turns.d.ts +109 -0
- package/dist/lib/turns.js +500 -0
- package/dist/lib/updates.d.ts +1290 -0
- package/dist/lib/updates.js +3634 -0
- package/dist/lib/voice.d.ts +117 -0
- package/dist/lib/voice.js +174 -0
- package/dist/lib/workspace-admission.d.ts +264 -0
- package/dist/lib/workspace-admission.js +1136 -0
- package/dist/lib/workspace-retirement.d.ts +219 -0
- package/dist/lib/workspace-retirement.js +587 -0
- package/dist/lib/workspace-slots.d.ts +30 -0
- package/dist/lib/workspace-slots.js +54 -0
- package/dist/package.json +126 -0
- package/dist/pi-telegram/index.js +1 -0
- package/dist/skills/generated-control-surface/SKILL.md +107 -0
- package/dist/skills/generated-control-surface/references/capability-adapters.md +27 -0
- package/dist/skills/generated-control-surface/references/layout-and-state.md +37 -0
- package/dist/skills/generative-apps/SKILL.md +115 -0
- package/dist/skills/show-me/SKILL.md +166 -0
- package/dist/skills/show-me/references/telegram-surfaces.md +43 -0
- package/dist/skills/telegram-bridge/SKILL.md +129 -0
- package/dist/skills/telegram-bridge/references/configuration.md +15 -0
- package/dist/skills/telegram-bridge/references/delivery-and-threads.md +27 -0
- package/dist/skills/telegram-bridge/references/diagnosis.md +18 -0
- package/docs/architecture.md +1 -1
- package/docs/compact-matrix-literal.md +10 -3
- package/docs/generative-apps.md +15 -13
- package/docs/multi-instance-bus.md +4 -2
- package/docs/outbound.md +1 -1
- package/docs/public-api.md +2 -2
- package/lib/bindings.ts +89 -6
- package/lib/bus-follower.ts +7 -3
- package/lib/bus-leader.ts +44 -19
- package/lib/bus.ts +4 -1
- package/lib/commands.ts +2 -2
- package/lib/config.ts +14 -7
- package/lib/delivery.ts +38 -6
- package/lib/extension.ts +19 -0
- package/lib/generative-apps.ts +379 -13
- package/lib/menu-settings.ts +21 -5
- package/lib/outbound-markup.ts +16 -7
- package/lib/telegram-api.ts +12 -1
- package/lib/thread-display.ts +96 -18
- package/package.json +56 -13
- package/scripts/build-dist.mjs +44 -0
- package/scripts/measure-bus.mjs +8 -1
- package/scripts/measure-workspace.mjs +8 -1
- package/skills/generative-apps/SKILL.md +1 -1
- package/skills/telegram-bridge/SKILL.md +1 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram transport destination value helpers
|
|
3
|
+
* Zones: Bot API transport, routing, replies/previews, ownership, multi-instance bus
|
|
4
|
+
* Owns the minimal `{ chatId, threadId? }` address shape shared by classic private chats
|
|
5
|
+
* and Telegram UI threads mapped through Bot API `message_thread_id`.
|
|
6
|
+
*/
|
|
7
|
+
export interface TelegramTarget {
|
|
8
|
+
chatId: number;
|
|
9
|
+
threadId?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createTelegramPrivateTarget(chatId: number): TelegramTarget;
|
|
12
|
+
export declare function createTelegramThreadTarget(chatId: number, threadId: number): TelegramTarget;
|
|
13
|
+
export declare function getTelegramTargetKey(target: TelegramTarget): string;
|
|
14
|
+
export declare function isTelegramThreadTarget(target: TelegramTarget): target is TelegramTarget & {
|
|
15
|
+
threadId: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function areTelegramTargetsEqual(left: TelegramTarget, right: TelegramTarget): boolean;
|
|
18
|
+
export declare function getTelegramTargetThreadParams(target: TelegramTarget): {
|
|
19
|
+
message_thread_id?: number;
|
|
20
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram transport destination value helpers
|
|
3
|
+
* Zones: Bot API transport, routing, replies/previews, ownership, multi-instance bus
|
|
4
|
+
* Owns the minimal `{ chatId, threadId? }` address shape shared by classic private chats
|
|
5
|
+
* and Telegram UI threads mapped through Bot API `message_thread_id`.
|
|
6
|
+
*/
|
|
7
|
+
const PRIVATE_TARGET_THREAD_KEY = "private";
|
|
8
|
+
export function createTelegramPrivateTarget(chatId) {
|
|
9
|
+
return { chatId };
|
|
10
|
+
}
|
|
11
|
+
export function createTelegramThreadTarget(chatId, threadId) {
|
|
12
|
+
return { chatId, threadId };
|
|
13
|
+
}
|
|
14
|
+
export function getTelegramTargetKey(target) {
|
|
15
|
+
return `${target.chatId}:${target.threadId ?? PRIVATE_TARGET_THREAD_KEY}`;
|
|
16
|
+
}
|
|
17
|
+
export function isTelegramThreadTarget(target) {
|
|
18
|
+
return Number.isInteger(target.threadId);
|
|
19
|
+
}
|
|
20
|
+
export function areTelegramTargetsEqual(left, right) {
|
|
21
|
+
return left.chatId === right.chatId && left.threadId === right.threadId;
|
|
22
|
+
}
|
|
23
|
+
export function getTelegramTargetThreadParams(target) {
|
|
24
|
+
return isTelegramThreadTarget(target)
|
|
25
|
+
? { message_thread_id: target.threadId }
|
|
26
|
+
: {};
|
|
27
|
+
}
|
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram API transport helpers
|
|
3
|
+
* Zones: telegram transport, filesystem, runtime diagnostics
|
|
4
|
+
*
|
|
5
|
+
* Wraps bot API calls, file uploads/downloads (including voice messages),
|
|
6
|
+
* multipart sending, runtime transport binding, and Telegram temp-file lifecycle.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TELEGRAM_API_BASE = "https://api.telegram.org";
|
|
9
|
+
export declare const TELEGRAM_FILE_MAX_BYTES: number;
|
|
10
|
+
export declare function getTelegramInboundFileByteLimitFromEnv(env: NodeJS.ProcessEnv, names: string[], defaultValue?: number): number;
|
|
11
|
+
export type TelegramNetworkFamilyPolicy = "auto" | "ipv4" | "ipv6" | "ipv4-fallback";
|
|
12
|
+
type TelegramNetworkFamily = 4 | 6;
|
|
13
|
+
export interface TelegramUser {
|
|
14
|
+
id: number;
|
|
15
|
+
is_bot: boolean;
|
|
16
|
+
first_name: string;
|
|
17
|
+
username?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface TelegramChat {
|
|
20
|
+
id: number;
|
|
21
|
+
type: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TelegramPhotoSize {
|
|
24
|
+
file_id: string;
|
|
25
|
+
file_size?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface TelegramDocument {
|
|
28
|
+
file_id: string;
|
|
29
|
+
file_name?: string;
|
|
30
|
+
mime_type?: string;
|
|
31
|
+
file_size?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface TelegramVideo {
|
|
34
|
+
file_id: string;
|
|
35
|
+
file_name?: string;
|
|
36
|
+
mime_type?: string;
|
|
37
|
+
file_size?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface TelegramAudio {
|
|
40
|
+
file_id: string;
|
|
41
|
+
file_name?: string;
|
|
42
|
+
mime_type?: string;
|
|
43
|
+
file_size?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface TelegramVoice {
|
|
46
|
+
file_id: string;
|
|
47
|
+
mime_type?: string;
|
|
48
|
+
file_size?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface TelegramAnimation {
|
|
51
|
+
file_id: string;
|
|
52
|
+
file_name?: string;
|
|
53
|
+
mime_type?: string;
|
|
54
|
+
file_size?: number;
|
|
55
|
+
}
|
|
56
|
+
export interface TelegramSticker {
|
|
57
|
+
file_id: string;
|
|
58
|
+
emoji?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface TelegramRichMessage {
|
|
61
|
+
blocks?: unknown[];
|
|
62
|
+
is_rtl?: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface TelegramMessage {
|
|
65
|
+
message_id: number;
|
|
66
|
+
chat: TelegramChat;
|
|
67
|
+
from?: TelegramUser;
|
|
68
|
+
text?: string;
|
|
69
|
+
caption?: string;
|
|
70
|
+
rich_message?: TelegramRichMessage;
|
|
71
|
+
media_group_id?: string;
|
|
72
|
+
photo?: TelegramPhotoSize[];
|
|
73
|
+
document?: TelegramDocument;
|
|
74
|
+
video?: TelegramVideo;
|
|
75
|
+
audio?: TelegramAudio;
|
|
76
|
+
voice?: TelegramVoice;
|
|
77
|
+
animation?: TelegramAnimation;
|
|
78
|
+
sticker?: TelegramSticker;
|
|
79
|
+
}
|
|
80
|
+
export interface TelegramCallbackQuery {
|
|
81
|
+
id: string;
|
|
82
|
+
from: TelegramUser;
|
|
83
|
+
message?: TelegramMessage;
|
|
84
|
+
data?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface TelegramReactionTypeEmoji {
|
|
87
|
+
type: "emoji";
|
|
88
|
+
emoji: string;
|
|
89
|
+
}
|
|
90
|
+
export interface TelegramReactionTypeCustomEmoji {
|
|
91
|
+
type: "custom_emoji";
|
|
92
|
+
custom_emoji_id: string;
|
|
93
|
+
}
|
|
94
|
+
export interface TelegramReactionTypePaid {
|
|
95
|
+
type: "paid";
|
|
96
|
+
}
|
|
97
|
+
export type TelegramReactionType = TelegramReactionTypeEmoji | TelegramReactionTypeCustomEmoji | TelegramReactionTypePaid;
|
|
98
|
+
export interface TelegramMessageReactionUpdated {
|
|
99
|
+
chat: TelegramChat;
|
|
100
|
+
message_id: number;
|
|
101
|
+
user?: TelegramUser;
|
|
102
|
+
actor_chat?: TelegramChat;
|
|
103
|
+
old_reaction: TelegramReactionType[];
|
|
104
|
+
new_reaction: TelegramReactionType[];
|
|
105
|
+
date: number;
|
|
106
|
+
}
|
|
107
|
+
export interface TelegramGuestMessage {
|
|
108
|
+
message_id: number;
|
|
109
|
+
from?: TelegramUser;
|
|
110
|
+
chat: TelegramChat;
|
|
111
|
+
date: number;
|
|
112
|
+
text?: string;
|
|
113
|
+
caption?: string;
|
|
114
|
+
rich_message?: TelegramRichMessage;
|
|
115
|
+
guest_query_id: string;
|
|
116
|
+
guest_bot_caller_user?: TelegramUser;
|
|
117
|
+
guest_bot_caller_chat?: TelegramChat;
|
|
118
|
+
reply_to_message?: TelegramMessage;
|
|
119
|
+
}
|
|
120
|
+
export interface TelegramUpdate {
|
|
121
|
+
update_id: number;
|
|
122
|
+
message?: TelegramMessage;
|
|
123
|
+
edited_message?: TelegramMessage;
|
|
124
|
+
callback_query?: TelegramCallbackQuery;
|
|
125
|
+
message_reaction?: TelegramMessageReactionUpdated;
|
|
126
|
+
guest_message?: TelegramGuestMessage;
|
|
127
|
+
deleted_business_messages?: {
|
|
128
|
+
message_ids?: unknown;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export interface TelegramSentMessage {
|
|
132
|
+
message_id: number;
|
|
133
|
+
}
|
|
134
|
+
export interface TelegramSentGuestMessage {
|
|
135
|
+
inline_message_id?: string;
|
|
136
|
+
}
|
|
137
|
+
export interface TelegramReplyParameters {
|
|
138
|
+
message_id: number;
|
|
139
|
+
allow_sending_without_reply?: boolean;
|
|
140
|
+
chat_id?: number;
|
|
141
|
+
message_thread_id?: number;
|
|
142
|
+
}
|
|
143
|
+
export interface TelegramLinkPreviewOptions {
|
|
144
|
+
is_disabled?: boolean;
|
|
145
|
+
}
|
|
146
|
+
export type TelegramSendMessageBody = Record<string, unknown> & {
|
|
147
|
+
chat_id: number;
|
|
148
|
+
text: string;
|
|
149
|
+
parse_mode?: "HTML";
|
|
150
|
+
link_preview_options?: TelegramLinkPreviewOptions;
|
|
151
|
+
reply_markup?: unknown;
|
|
152
|
+
reply_parameters?: TelegramReplyParameters;
|
|
153
|
+
};
|
|
154
|
+
export interface TelegramInputMediaPhoto extends Record<string, unknown> {
|
|
155
|
+
type: "photo";
|
|
156
|
+
media: string;
|
|
157
|
+
has_spoiler?: boolean;
|
|
158
|
+
}
|
|
159
|
+
export interface TelegramInputMediaVideo extends Record<string, unknown> {
|
|
160
|
+
type: "video";
|
|
161
|
+
media: string;
|
|
162
|
+
thumbnail?: string;
|
|
163
|
+
width?: number;
|
|
164
|
+
height?: number;
|
|
165
|
+
duration?: number;
|
|
166
|
+
supports_streaming?: boolean;
|
|
167
|
+
has_spoiler?: boolean;
|
|
168
|
+
}
|
|
169
|
+
export interface TelegramInputMediaAnimation extends Record<string, unknown> {
|
|
170
|
+
type: "animation";
|
|
171
|
+
media: string;
|
|
172
|
+
thumbnail?: string;
|
|
173
|
+
width?: number;
|
|
174
|
+
height?: number;
|
|
175
|
+
duration?: number;
|
|
176
|
+
has_spoiler?: boolean;
|
|
177
|
+
}
|
|
178
|
+
export interface TelegramInputMediaAudio extends Record<string, unknown> {
|
|
179
|
+
type: "audio";
|
|
180
|
+
media: string;
|
|
181
|
+
thumbnail?: string;
|
|
182
|
+
duration?: number;
|
|
183
|
+
performer?: string;
|
|
184
|
+
title?: string;
|
|
185
|
+
}
|
|
186
|
+
export interface TelegramInputMediaVoiceNote extends Record<string, unknown> {
|
|
187
|
+
type: "voice_note";
|
|
188
|
+
media: string;
|
|
189
|
+
caption?: string;
|
|
190
|
+
parse_mode?: string;
|
|
191
|
+
caption_entities?: unknown[];
|
|
192
|
+
duration?: number;
|
|
193
|
+
}
|
|
194
|
+
export type TelegramInputRichMessageMediaValue = TelegramInputMediaAnimation | TelegramInputMediaAudio | TelegramInputMediaPhoto | TelegramInputMediaVideo | TelegramInputMediaVoiceNote;
|
|
195
|
+
export interface TelegramInputRichMessageMedia {
|
|
196
|
+
id: string;
|
|
197
|
+
media: TelegramInputRichMessageMediaValue;
|
|
198
|
+
}
|
|
199
|
+
type TelegramInputRichMessageCommon = {
|
|
200
|
+
is_rtl?: boolean;
|
|
201
|
+
skip_entity_detection?: boolean;
|
|
202
|
+
};
|
|
203
|
+
export type TelegramRichText = string | TelegramRichText[] | {
|
|
204
|
+
type: "bold" | "code";
|
|
205
|
+
text: TelegramRichText;
|
|
206
|
+
};
|
|
207
|
+
export type TelegramInputRichBlock = {
|
|
208
|
+
type: "heading";
|
|
209
|
+
text: TelegramRichText;
|
|
210
|
+
size?: 1 | 2 | 3;
|
|
211
|
+
} | {
|
|
212
|
+
type: "pre";
|
|
213
|
+
text: TelegramRichText;
|
|
214
|
+
language?: string;
|
|
215
|
+
} | {
|
|
216
|
+
type: "details";
|
|
217
|
+
summary: TelegramRichText;
|
|
218
|
+
blocks: TelegramInputRichBlock[];
|
|
219
|
+
is_open?: true;
|
|
220
|
+
};
|
|
221
|
+
export type TelegramInputRichDraftBlock = TelegramInputRichBlock | {
|
|
222
|
+
type: "thinking";
|
|
223
|
+
text: TelegramRichText;
|
|
224
|
+
};
|
|
225
|
+
export type TelegramInputRichMessage = TelegramInputRichMessageCommon & ({
|
|
226
|
+
markdown: string;
|
|
227
|
+
html?: never;
|
|
228
|
+
blocks?: never;
|
|
229
|
+
media?: TelegramInputRichMessageMedia[];
|
|
230
|
+
} | {
|
|
231
|
+
html: string;
|
|
232
|
+
markdown?: never;
|
|
233
|
+
blocks?: never;
|
|
234
|
+
media?: TelegramInputRichMessageMedia[];
|
|
235
|
+
} | {
|
|
236
|
+
blocks: TelegramInputRichBlock[];
|
|
237
|
+
markdown?: never;
|
|
238
|
+
html?: never;
|
|
239
|
+
media?: never;
|
|
240
|
+
});
|
|
241
|
+
export type TelegramSendRichMessageBody = Record<string, unknown> & {
|
|
242
|
+
chat_id: number;
|
|
243
|
+
rich_message: TelegramInputRichMessage;
|
|
244
|
+
reply_markup?: unknown;
|
|
245
|
+
reply_parameters?: TelegramReplyParameters;
|
|
246
|
+
};
|
|
247
|
+
export type TelegramEditMessageTextBody = Record<string, unknown> & {
|
|
248
|
+
chat_id: number;
|
|
249
|
+
message_id: number;
|
|
250
|
+
text?: string;
|
|
251
|
+
rich_message?: TelegramInputRichMessage;
|
|
252
|
+
parse_mode?: "HTML";
|
|
253
|
+
link_preview_options?: TelegramLinkPreviewOptions;
|
|
254
|
+
reply_markup?: unknown;
|
|
255
|
+
};
|
|
256
|
+
export type TelegramSendMessageDraftBody = Record<string, unknown> & {
|
|
257
|
+
chat_id: number;
|
|
258
|
+
draft_id: number;
|
|
259
|
+
text?: string;
|
|
260
|
+
parse_mode?: string;
|
|
261
|
+
entities?: unknown[];
|
|
262
|
+
message_thread_id?: number;
|
|
263
|
+
};
|
|
264
|
+
export type TelegramSendRichMessageDraftBody = Record<string, unknown> & {
|
|
265
|
+
chat_id: number;
|
|
266
|
+
draft_id: number;
|
|
267
|
+
rich_message: TelegramInputRichMessage | (TelegramInputRichMessageCommon & {
|
|
268
|
+
blocks: TelegramInputRichDraftBlock[];
|
|
269
|
+
markdown?: never;
|
|
270
|
+
html?: never;
|
|
271
|
+
media?: never;
|
|
272
|
+
});
|
|
273
|
+
message_thread_id?: number;
|
|
274
|
+
};
|
|
275
|
+
interface TelegramApiResponse<T> {
|
|
276
|
+
ok: boolean;
|
|
277
|
+
result?: T;
|
|
278
|
+
description?: string;
|
|
279
|
+
error_code?: number;
|
|
280
|
+
parameters?: {
|
|
281
|
+
retry_after?: number;
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
export interface TelegramApiRetryWait {
|
|
285
|
+
method: string;
|
|
286
|
+
delayMs: number;
|
|
287
|
+
attempt: number;
|
|
288
|
+
retryAfterSeconds?: number;
|
|
289
|
+
}
|
|
290
|
+
export interface TelegramApiCallOptions {
|
|
291
|
+
signal?: AbortSignal;
|
|
292
|
+
maxAttempts?: number;
|
|
293
|
+
retryRateLimit?: boolean;
|
|
294
|
+
retrySafety?: "safe" | "non-idempotent";
|
|
295
|
+
retryBaseDelayMs?: number;
|
|
296
|
+
sleep?: (ms: number) => Promise<void>;
|
|
297
|
+
/** Observability hook fired before a 429 retry wait, never for 5xx waits. */
|
|
298
|
+
onRetryWait?: (wait: TelegramApiRetryWait) => void;
|
|
299
|
+
}
|
|
300
|
+
export interface TelegramFileDownloadOptions {
|
|
301
|
+
signal?: AbortSignal;
|
|
302
|
+
maxFileSizeBytes?: number;
|
|
303
|
+
}
|
|
304
|
+
export type TelegramGuestCachedMediaResult = {
|
|
305
|
+
type: "document";
|
|
306
|
+
id: string;
|
|
307
|
+
title: string;
|
|
308
|
+
document_file_id: string;
|
|
309
|
+
caption?: string;
|
|
310
|
+
parse_mode?: string;
|
|
311
|
+
} | {
|
|
312
|
+
type: "photo";
|
|
313
|
+
id: string;
|
|
314
|
+
photo_file_id: string;
|
|
315
|
+
caption?: string;
|
|
316
|
+
parse_mode?: string;
|
|
317
|
+
} | {
|
|
318
|
+
type: "audio";
|
|
319
|
+
id: string;
|
|
320
|
+
audio_file_id: string;
|
|
321
|
+
caption?: string;
|
|
322
|
+
parse_mode?: string;
|
|
323
|
+
} | {
|
|
324
|
+
type: "voice";
|
|
325
|
+
id: string;
|
|
326
|
+
voice_file_id: string;
|
|
327
|
+
title: string;
|
|
328
|
+
caption?: string;
|
|
329
|
+
parse_mode?: string;
|
|
330
|
+
};
|
|
331
|
+
export interface TelegramAnswerGuestQueryOptions {
|
|
332
|
+
parseMode?: string;
|
|
333
|
+
richMessage?: TelegramInputRichMessage;
|
|
334
|
+
result?: TelegramGuestCachedMediaResult;
|
|
335
|
+
}
|
|
336
|
+
export interface TelegramEditGuestInlineMessageContent {
|
|
337
|
+
text?: string;
|
|
338
|
+
richMessage?: TelegramInputRichMessage;
|
|
339
|
+
parseMode?: "HTML";
|
|
340
|
+
}
|
|
341
|
+
export interface TelegramAnswerCallbackQueryOptions {
|
|
342
|
+
recordRuntimeEvent?: (kind: "api", error: unknown, details?: Record<string, unknown>) => void;
|
|
343
|
+
}
|
|
344
|
+
export interface TelegramApiClient {
|
|
345
|
+
call: <TResponse>(method: string, body: Record<string, unknown>, options?: TelegramApiCallOptions) => Promise<TResponse>;
|
|
346
|
+
callMultipart: <TResponse>(method: string, fields: Record<string, string>, fileField: string, filePath: string, fileName: string, options?: TelegramApiCallOptions) => Promise<TResponse>;
|
|
347
|
+
downloadFile: (fileId: string, suggestedName: string, tempDir: string, options?: TelegramFileDownloadOptions) => Promise<string>;
|
|
348
|
+
answerCallbackQuery: (callbackQueryId: string, text?: string) => Promise<void>;
|
|
349
|
+
answerGuestQuery?: (guestQueryId: string, text?: string, options?: TelegramAnswerGuestQueryOptions) => Promise<void>;
|
|
350
|
+
}
|
|
351
|
+
export interface TelegramApiTargetActivityRuntime {
|
|
352
|
+
begin: (method: string, body: Record<string, unknown>) => () => void;
|
|
353
|
+
hasPendingTarget: (target: {
|
|
354
|
+
chatId: number;
|
|
355
|
+
threadId?: number;
|
|
356
|
+
}) => boolean;
|
|
357
|
+
listPendingTargets: () => {
|
|
358
|
+
chatId: number;
|
|
359
|
+
threadId: number;
|
|
360
|
+
}[];
|
|
361
|
+
listPendingChats: () => number[];
|
|
362
|
+
}
|
|
363
|
+
export declare function createTelegramApiTargetActivityRuntime(): TelegramApiTargetActivityRuntime;
|
|
364
|
+
export declare function createTelegramApiTargetTrackingClient(client: TelegramApiClient, activity: TelegramApiTargetActivityRuntime): TelegramApiClient;
|
|
365
|
+
export type TelegramApiWorkspaceAdmissionScopeLike = {
|
|
366
|
+
kind: "target";
|
|
367
|
+
target: {
|
|
368
|
+
chatId: number;
|
|
369
|
+
threadId: number;
|
|
370
|
+
};
|
|
371
|
+
} | {
|
|
372
|
+
kind: "chat";
|
|
373
|
+
chatId: number;
|
|
374
|
+
} | {
|
|
375
|
+
kind: "profile";
|
|
376
|
+
};
|
|
377
|
+
export interface TelegramApiWorkspaceAdmissionLeaseLike {
|
|
378
|
+
operationId: string;
|
|
379
|
+
operationKind: string;
|
|
380
|
+
profileKey: string;
|
|
381
|
+
scope: TelegramApiWorkspaceAdmissionScopeLike;
|
|
382
|
+
owner: {
|
|
383
|
+
processId: number;
|
|
384
|
+
processBirthId: string;
|
|
385
|
+
};
|
|
386
|
+
acquiredAtMs: number;
|
|
387
|
+
}
|
|
388
|
+
export interface TelegramApiWorkspaceAdmissionPort {
|
|
389
|
+
acquireAdmission: (input: {
|
|
390
|
+
operationId: string;
|
|
391
|
+
operationKind: string;
|
|
392
|
+
scope: TelegramApiWorkspaceAdmissionScopeLike;
|
|
393
|
+
}) => {
|
|
394
|
+
kind: "acquired";
|
|
395
|
+
lease: TelegramApiWorkspaceAdmissionLeaseLike;
|
|
396
|
+
resumed: boolean;
|
|
397
|
+
} | {
|
|
398
|
+
kind: "blocked";
|
|
399
|
+
reason: "retirement-fenced";
|
|
400
|
+
};
|
|
401
|
+
releaseAdmission: (expected: TelegramApiWorkspaceAdmissionLeaseLike) => boolean;
|
|
402
|
+
}
|
|
403
|
+
export declare class TelegramApiWorkspaceAdmissionError extends Error {
|
|
404
|
+
readonly code: "blocked" | "unavailable" | "release-lost" | "duplicate-operation";
|
|
405
|
+
constructor(code: TelegramApiWorkspaceAdmissionError["code"], message: string);
|
|
406
|
+
}
|
|
407
|
+
export declare function getTelegramApiWorkspaceAdmissionScope(body: Record<string, unknown>): TelegramApiWorkspaceAdmissionScopeLike | undefined;
|
|
408
|
+
export declare function createTelegramApiWorkspaceAdmissionClient(client: TelegramApiClient, admission: TelegramApiWorkspaceAdmissionPort | (() => TelegramApiWorkspaceAdmissionPort | undefined), options?: {
|
|
409
|
+
onReleaseError?: (error: unknown, method: string) => void;
|
|
410
|
+
createOperationId?: () => string;
|
|
411
|
+
}): TelegramApiClient;
|
|
412
|
+
export interface TelegramBridgeApiRuntimeDeps {
|
|
413
|
+
captureRequestErrorHandler?: (body: Record<string, unknown>) => ((error: unknown) => Promise<void>) | undefined;
|
|
414
|
+
client: TelegramApiClient;
|
|
415
|
+
tempDir: string;
|
|
416
|
+
maxFileSizeBytes: number;
|
|
417
|
+
tempFileMaxAgeMs: number;
|
|
418
|
+
recordRuntimeEvent: (kind: "api" | "multipart" | "download", error: unknown, details?: Record<string, unknown>) => void;
|
|
419
|
+
now?: () => number;
|
|
420
|
+
chatActionMinIntervalMs?: number;
|
|
421
|
+
chatActionMaxGates?: number;
|
|
422
|
+
}
|
|
423
|
+
export interface TelegramBridgeApiRuntime {
|
|
424
|
+
call: <TResponse>(method: string, body: Record<string, unknown>, options?: TelegramApiCallOptions) => Promise<TResponse>;
|
|
425
|
+
callMultipart: <TResponse>(method: string, fields: Record<string, string>, fileField: string, filePath: string, fileName: string, options?: TelegramApiCallOptions) => Promise<TResponse>;
|
|
426
|
+
downloadFile: (fileId: string, suggestedName: string) => Promise<string>;
|
|
427
|
+
deleteWebhook: (signal?: AbortSignal) => Promise<boolean>;
|
|
428
|
+
getUpdates: (body: Record<string, unknown>, signal?: AbortSignal) => Promise<TelegramUpdate[]>;
|
|
429
|
+
setMyCommands: (commands: readonly {
|
|
430
|
+
command: string;
|
|
431
|
+
description: string;
|
|
432
|
+
}[]) => Promise<boolean>;
|
|
433
|
+
sendChatAction: (chatId: number, action: string, options?: {
|
|
434
|
+
message_thread_id?: number;
|
|
435
|
+
}) => Promise<boolean>;
|
|
436
|
+
sendTypingAction: (chatId: number, options?: {
|
|
437
|
+
message_thread_id?: number;
|
|
438
|
+
}) => Promise<unknown>;
|
|
439
|
+
sendRecordVoiceAction: (chatId: number, options?: {
|
|
440
|
+
message_thread_id?: number;
|
|
441
|
+
}) => Promise<unknown>;
|
|
442
|
+
sendMessageDraft: (chatId: number, draftId: number, text?: string, options?: {
|
|
443
|
+
parse_mode?: string;
|
|
444
|
+
entities?: unknown[];
|
|
445
|
+
message_thread_id?: number;
|
|
446
|
+
}) => Promise<boolean>;
|
|
447
|
+
sendMessage: (body: TelegramSendMessageBody) => Promise<TelegramSentMessage>;
|
|
448
|
+
sendRichMessage: (body: TelegramSendRichMessageBody) => Promise<TelegramSentMessage>;
|
|
449
|
+
sendRichMessageDraft: (body: TelegramSendRichMessageDraftBody) => Promise<boolean>;
|
|
450
|
+
editMessageText: (body: TelegramEditMessageTextBody) => Promise<"edited" | "unchanged">;
|
|
451
|
+
editMessageReplyMarkup: (chatId: number, messageId: number, replyMarkup: unknown) => Promise<void>;
|
|
452
|
+
answerCallbackQuery: (callbackQueryId: string, text?: string) => Promise<void>;
|
|
453
|
+
answerGuestQuery: (guestQueryId: string, text?: string, options?: TelegramAnswerGuestQueryOptions) => Promise<void>;
|
|
454
|
+
/**
|
|
455
|
+
* Temporary Guest Mode ACK experiment: answers the guest query and returns
|
|
456
|
+
* the sent inline message id so the final answer can edit that early reply.
|
|
457
|
+
* Requires direct transport ownership; Telegram does not document editing
|
|
458
|
+
* guest answers, so this exists only to falsify that behavior live.
|
|
459
|
+
*/
|
|
460
|
+
answerGuestQueryForInlineMessage: (guestQueryId: string, text?: string, options?: TelegramAnswerGuestQueryOptions) => Promise<string | undefined>;
|
|
461
|
+
editGuestInlineMessage: (inlineMessageId: string, content: TelegramEditGuestInlineMessageContent) => Promise<void>;
|
|
462
|
+
deleteMessage: (chatId: number, messageId: number) => Promise<void>;
|
|
463
|
+
prepareTempDir: () => Promise<number>;
|
|
464
|
+
}
|
|
465
|
+
export declare class TelegramApiCommitUnknownError extends Error {
|
|
466
|
+
readonly kind: "commit-unknown";
|
|
467
|
+
readonly method: string;
|
|
468
|
+
readonly cause: unknown;
|
|
469
|
+
constructor(method: string, cause: unknown);
|
|
470
|
+
}
|
|
471
|
+
export declare function isTelegramApiCommitUnknownError(error: unknown): error is TelegramApiCommitUnknownError;
|
|
472
|
+
export declare class TelegramApiStaleTargetError extends Error {
|
|
473
|
+
readonly requestTarget: {
|
|
474
|
+
chatId: number;
|
|
475
|
+
threadId: number;
|
|
476
|
+
};
|
|
477
|
+
constructor(message: string, requestTarget: {
|
|
478
|
+
chatId: number;
|
|
479
|
+
threadId: number;
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
export declare function getTelegramApiErrorRequestTarget(error: unknown): {
|
|
483
|
+
chatId: number;
|
|
484
|
+
threadId: number;
|
|
485
|
+
} | undefined;
|
|
486
|
+
export declare function isTelegramStaleTargetHttpError(error: unknown): boolean;
|
|
487
|
+
export declare function isTelegramMessageNotModifiedError(error: unknown): boolean;
|
|
488
|
+
export declare function isTelegramApiMethodRetrySafe(method: string): boolean;
|
|
489
|
+
export declare function isRetryableTelegramApiError(error: unknown): boolean;
|
|
490
|
+
export declare function getTelegramApiRetryAfterMs(error: unknown): number | undefined;
|
|
491
|
+
export declare function isTelegramMessageUnavailableError(error: unknown): boolean;
|
|
492
|
+
declare function telegramHttpsFetch(input: string | URL | Request, init: RequestInit, family: TelegramNetworkFamily): Promise<Response>;
|
|
493
|
+
export declare function setTelegramApiHttpsFetchForTesting(fetchImpl: typeof telegramHttpsFetch | undefined): () => void;
|
|
494
|
+
export declare function cleanupTelegramTempFiles(tempDir: string, maxAgeMs: number, now?: number): Promise<number>;
|
|
495
|
+
export declare function prepareTelegramTempDir(tempDir: string, maxAgeMs: number): Promise<number>;
|
|
496
|
+
export declare function callTelegram<TResponse>(botToken: string | undefined, method: string, body: Record<string, unknown>, options?: TelegramApiCallOptions): Promise<TResponse>;
|
|
497
|
+
export type TelegramBotIdentityResponse = Pick<TelegramApiResponse<TelegramUser>, "ok" | "result" | "description">;
|
|
498
|
+
export declare function fetchTelegramBotIdentity(botToken: string, fetchImpl?: typeof fetch): Promise<TelegramBotIdentityResponse>;
|
|
499
|
+
/**
|
|
500
|
+
* Low-level helper to send a multipart/form-data request to the Telegram Bot API.
|
|
501
|
+
* This is the core implementation used for uploading voice messages, photos,
|
|
502
|
+
* documents, animations, etc. It handles FormData construction, retry logic
|
|
503
|
+
* (via callTelegramWithRetry), and error recording under the "multipart" category.
|
|
504
|
+
*/
|
|
505
|
+
export declare function callTelegramMultipart<TResponse>(botToken: string | undefined, method: string, fields: Record<string, string>, fileField: string, filePath: string, fileName: string, options?: TelegramApiCallOptions): Promise<TResponse>;
|
|
506
|
+
export declare function downloadTelegramFile(botToken: string | undefined, fileId: string, suggestedName: string, tempDir: string, options?: TelegramFileDownloadOptions): Promise<string>;
|
|
507
|
+
export declare function answerTelegramCallbackQuery(botToken: string | undefined, callbackQueryId: string, text?: string, options?: TelegramAnswerCallbackQueryOptions): Promise<void>;
|
|
508
|
+
export declare function deleteTelegramMessage(botToken: string | undefined, chatId: number, messageId: number): Promise<void>;
|
|
509
|
+
export declare function createTelegramChatActionSender<TAction extends string>(sendChatAction: (chatId: number, action: TAction, options?: {
|
|
510
|
+
message_thread_id?: number;
|
|
511
|
+
}) => Promise<unknown>, action: TAction): (chatId: number, options?: {
|
|
512
|
+
message_thread_id?: number;
|
|
513
|
+
}) => Promise<unknown>;
|
|
514
|
+
export declare function createTelegramNativeMarkdownDraftSender(deps: {
|
|
515
|
+
sendMessageDraft: TelegramBridgeApiRuntime["sendMessageDraft"];
|
|
516
|
+
sendRichMessageDraft: TelegramBridgeApiRuntime["sendRichMessageDraft"];
|
|
517
|
+
}): TelegramBridgeApiRuntime["sendMessageDraft"];
|
|
518
|
+
export declare function createTelegramAssistantDraftSender(deps: {
|
|
519
|
+
getAssistantRenderingMode: () => "rich" | "html";
|
|
520
|
+
renderMarkdownToHtmlDraft: (markdown: string) => string;
|
|
521
|
+
sendMessageDraft: TelegramBridgeApiRuntime["sendMessageDraft"];
|
|
522
|
+
sendRichMessageDraft: TelegramBridgeApiRuntime["sendRichMessageDraft"];
|
|
523
|
+
}): TelegramBridgeApiRuntime["sendMessageDraft"];
|
|
524
|
+
export declare function buildTelegramAnswerGuestQueryBody(guestQueryId: string, text?: string, options?: TelegramAnswerGuestQueryOptions): Record<string, unknown>;
|
|
525
|
+
export declare function createDefaultTelegramBridgeApiRuntime(deps: {
|
|
526
|
+
getBotToken: () => string | undefined;
|
|
527
|
+
recordRuntimeEvent: TelegramBridgeApiRuntimeDeps["recordRuntimeEvent"];
|
|
528
|
+
captureRequestErrorHandler?: TelegramBridgeApiRuntimeDeps["captureRequestErrorHandler"];
|
|
529
|
+
targetActivity?: TelegramApiTargetActivityRuntime;
|
|
530
|
+
workspaceAdmission?: TelegramApiWorkspaceAdmissionPort | (() => TelegramApiWorkspaceAdmissionPort | undefined);
|
|
531
|
+
}): TelegramBridgeApiRuntime;
|
|
532
|
+
export declare function createTelegramBridgeApiRuntime(deps: TelegramBridgeApiRuntimeDeps): TelegramBridgeApiRuntime;
|
|
533
|
+
/**
|
|
534
|
+
* Creates a low-level Telegram Bot API client.
|
|
535
|
+
* This is the main entry point for all direct Bot API communication
|
|
536
|
+
* (both JSON calls and multipart uploads for files/voice).
|
|
537
|
+
*/
|
|
538
|
+
export declare function createTelegramApiClient(getBotToken: () => string | undefined, options?: TelegramAnswerCallbackQueryOptions & {
|
|
539
|
+
now?: () => number;
|
|
540
|
+
}): TelegramApiClient;
|
|
541
|
+
export {};
|