@spinabot/brigade 1.1.0 → 1.2.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/convex/channels.d.ts +5 -5
- package/convex/schema.d.ts +2 -2
- package/dist/agents/agent-loop.d.ts.map +1 -1
- package/dist/agents/agent-loop.js +27 -4
- package/dist/agents/agent-loop.js.map +1 -1
- package/dist/agents/channels/approval-callback-codec.d.ts +107 -0
- package/dist/agents/channels/approval-callback-codec.d.ts.map +1 -0
- package/dist/agents/channels/approval-callback-codec.js +173 -0
- package/dist/agents/channels/approval-callback-codec.js.map +1 -0
- package/dist/agents/channels/approval-router.d.ts +77 -20
- package/dist/agents/channels/approval-router.d.ts.map +1 -1
- package/dist/agents/channels/approval-router.js +163 -37
- package/dist/agents/channels/approval-router.js.map +1 -1
- package/dist/agents/channels/backoff.d.ts +55 -0
- package/dist/agents/channels/backoff.d.ts.map +1 -0
- package/dist/agents/channels/backoff.js +47 -0
- package/dist/agents/channels/backoff.js.map +1 -0
- package/dist/agents/channels/channel-secrets.d.ts +45 -0
- package/dist/agents/channels/channel-secrets.d.ts.map +1 -0
- package/dist/agents/channels/channel-secrets.js +69 -0
- package/dist/agents/channels/channel-secrets.js.map +1 -0
- package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
- package/dist/agents/channels/inbound-pipeline.js +67 -3
- package/dist/agents/channels/inbound-pipeline.js.map +1 -1
- package/dist/agents/channels/last-sent-message.d.ts +46 -0
- package/dist/agents/channels/last-sent-message.d.ts.map +1 -0
- package/dist/agents/channels/last-sent-message.js +55 -0
- package/dist/agents/channels/last-sent-message.js.map +1 -0
- package/dist/agents/channels/manager.d.ts +52 -0
- package/dist/agents/channels/manager.d.ts.map +1 -1
- package/dist/agents/channels/manager.js +141 -31
- package/dist/agents/channels/manager.js.map +1 -1
- package/dist/agents/channels/plugin-channel-manager-facade.d.ts +13 -2
- package/dist/agents/channels/plugin-channel-manager-facade.d.ts.map +1 -1
- package/dist/agents/channels/plugin-channel-manager-facade.js +21 -0
- package/dist/agents/channels/plugin-channel-manager-facade.js.map +1 -1
- package/dist/agents/channels/sdk.d.ts +426 -0
- package/dist/agents/channels/sdk.d.ts.map +1 -0
- package/dist/agents/channels/sdk.js +274 -0
- package/dist/agents/channels/sdk.js.map +1 -0
- package/dist/agents/channels/telegram/account-config.d.ts +92 -0
- package/dist/agents/channels/telegram/account-config.d.ts.map +1 -0
- package/dist/agents/channels/telegram/account-config.js +192 -0
- package/dist/agents/channels/telegram/account-config.js.map +1 -0
- package/dist/agents/channels/telegram/adapter.d.ts +79 -0
- package/dist/agents/channels/telegram/adapter.d.ts.map +1 -0
- package/dist/agents/channels/telegram/adapter.js +475 -0
- package/dist/agents/channels/telegram/adapter.js.map +1 -0
- package/dist/agents/channels/telegram/allowed-updates.d.ts +44 -0
- package/dist/agents/channels/telegram/allowed-updates.d.ts.map +1 -0
- package/dist/agents/channels/telegram/allowed-updates.js +52 -0
- package/dist/agents/channels/telegram/allowed-updates.js.map +1 -0
- package/dist/agents/channels/telegram/approval-authorize.d.ts +41 -0
- package/dist/agents/channels/telegram/approval-authorize.d.ts.map +1 -0
- package/dist/agents/channels/telegram/approval-authorize.js +69 -0
- package/dist/agents/channels/telegram/approval-authorize.js.map +1 -0
- package/dist/agents/channels/telegram/approval-native.d.ts +68 -0
- package/dist/agents/channels/telegram/approval-native.d.ts.map +1 -0
- package/dist/agents/channels/telegram/approval-native.js +94 -0
- package/dist/agents/channels/telegram/approval-native.js.map +1 -0
- package/dist/agents/channels/telegram/command-menu.d.ts +35 -0
- package/dist/agents/channels/telegram/command-menu.d.ts.map +1 -0
- package/dist/agents/channels/telegram/command-menu.js +59 -0
- package/dist/agents/channels/telegram/command-menu.js.map +1 -0
- package/dist/agents/channels/telegram/connection.d.ts +359 -0
- package/dist/agents/channels/telegram/connection.d.ts.map +1 -0
- package/dist/agents/channels/telegram/connection.js +865 -0
- package/dist/agents/channels/telegram/connection.js.map +1 -0
- package/dist/agents/channels/telegram/format.d.ts +48 -0
- package/dist/agents/channels/telegram/format.d.ts.map +1 -0
- package/dist/agents/channels/telegram/format.js +256 -0
- package/dist/agents/channels/telegram/format.js.map +1 -0
- package/dist/agents/channels/telegram/inbound-extras.d.ts +73 -0
- package/dist/agents/channels/telegram/inbound-extras.d.ts.map +1 -0
- package/dist/agents/channels/telegram/inbound-extras.js +231 -0
- package/dist/agents/channels/telegram/inbound-extras.js.map +1 -0
- package/dist/agents/channels/telegram/index.d.ts +14 -0
- package/dist/agents/channels/telegram/index.d.ts.map +1 -0
- package/dist/agents/channels/telegram/index.js +14 -0
- package/dist/agents/channels/telegram/index.js.map +1 -0
- package/dist/agents/channels/telegram/media.d.ts +68 -0
- package/dist/agents/channels/telegram/media.d.ts.map +1 -0
- package/dist/agents/channels/telegram/media.js +143 -0
- package/dist/agents/channels/telegram/media.js.map +1 -0
- package/dist/agents/channels/telegram/module.d.ts +15 -0
- package/dist/agents/channels/telegram/module.d.ts.map +1 -0
- package/dist/agents/channels/telegram/module.js +36 -0
- package/dist/agents/channels/telegram/module.js.map +1 -0
- package/dist/agents/channels/telegram/plugin.d.ts +76 -0
- package/dist/agents/channels/telegram/plugin.d.ts.map +1 -0
- package/dist/agents/channels/telegram/plugin.js +314 -0
- package/dist/agents/channels/telegram/plugin.js.map +1 -0
- package/dist/agents/channels/telegram/probe.d.ts +54 -0
- package/dist/agents/channels/telegram/probe.d.ts.map +1 -0
- package/dist/agents/channels/telegram/probe.js +95 -0
- package/dist/agents/channels/telegram/probe.js.map +1 -0
- package/dist/agents/channels/telegram/webhook.d.ts +55 -0
- package/dist/agents/channels/telegram/webhook.d.ts.map +1 -0
- package/dist/agents/channels/telegram/webhook.js +141 -0
- package/dist/agents/channels/telegram/webhook.js.map +1 -0
- package/dist/agents/extensions/modules/index.d.ts.map +1 -1
- package/dist/agents/extensions/modules/index.js +4 -0
- package/dist/agents/extensions/modules/index.js.map +1 -1
- package/dist/agents/extensions/types.d.ts +72 -2
- package/dist/agents/extensions/types.d.ts.map +1 -1
- package/dist/agents/extensions/types.js.map +1 -1
- package/dist/agents/tools/connect-channel-tool.d.ts +86 -0
- package/dist/agents/tools/connect-channel-tool.d.ts.map +1 -0
- package/dist/agents/tools/connect-channel-tool.js +398 -0
- package/dist/agents/tools/connect-channel-tool.js.map +1 -0
- package/dist/agents/tools/message-action-tool.d.ts +67 -0
- package/dist/agents/tools/message-action-tool.d.ts.map +1 -0
- package/dist/agents/tools/message-action-tool.js +216 -0
- package/dist/agents/tools/message-action-tool.js.map +1 -0
- package/dist/agents/tools/registry.d.ts.map +1 -1
- package/dist/agents/tools/registry.js +19 -0
- package/dist/agents/tools/registry.js.map +1 -1
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/channels.d.ts.map +1 -1
- package/dist/cli/commands/channels.js +27 -2
- package/dist/cli/commands/channels.js.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +77 -27
- package/dist/core/server.js.map +1 -1
- package/dist/cron/service/state.d.ts +10 -0
- package/dist/cron/service/state.d.ts.map +1 -1
- package/dist/cron/service/state.js.map +1 -1
- package/dist/cron/service/timer.d.ts.map +1 -1
- package/dist/cron/service/timer.js +43 -14
- package/dist/cron/service/timer.js.map +1 -1
- package/dist/cron/session-reaper.d.ts +27 -0
- package/dist/cron/session-reaper.d.ts.map +1 -1
- package/dist/cron/session-reaper.js +81 -0
- package/dist/cron/session-reaper.js.map +1 -1
- package/dist/system-prompt/assembler.d.ts +14 -0
- package/dist/system-prompt/assembler.d.ts.map +1 -1
- package/dist/system-prompt/assembler.js +36 -14
- package/dist/system-prompt/assembler.js.map +1 -1
- package/package.json +16 -3
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Bot API connection (grammY long-polling).
|
|
3
|
+
*
|
|
4
|
+
* The Brigade analogue of `whatsapp/connection.ts`, distilled from the
|
|
5
|
+
* reference Telegram polling session. grammY + its runner + the throttler transformer are
|
|
6
|
+
* HEAVY and only needed when a Telegram channel actually starts, so they are
|
|
7
|
+
* lazy-imported here (`await import("grammy")` inside `connectTelegram`) — a
|
|
8
|
+
* non-Telegram boot never pays for them. Types are `type`-only so the static
|
|
9
|
+
* import never pulls the runtime in.
|
|
10
|
+
*
|
|
11
|
+
* Lifecycle:
|
|
12
|
+
* - `deleteWebhook({ drop_pending_updates: false })` is called BEFORE polling.
|
|
13
|
+
* If a webhook was ever set on this bot, `getUpdates` returns 409 forever
|
|
14
|
+
* and the bot silently "receives nothing" — clearing it first is the #1 fix.
|
|
15
|
+
* - `getMe` caches the bot's numeric id + @username (the group ACL needs the
|
|
16
|
+
* username to detect @-mentions; without it group messages never reach the
|
|
17
|
+
* agent).
|
|
18
|
+
* - `bot.on("message")` normalizes each update into a `TgInboundMessage` and
|
|
19
|
+
* hands it to `onMessage` with a DEFERRED `resolveMedia` thunk — bytes are
|
|
20
|
+
* downloaded only after the central access gate admits the sender (mirrors
|
|
21
|
+
* WhatsApp).
|
|
22
|
+
* - The grammY runner drives `getUpdates`; `apiThrottler()` rate-limits the
|
|
23
|
+
* outbound API.
|
|
24
|
+
* - Reconnect backoff COPIES WhatsApp's constants (2s → 30s, ×1.8, ±25%).
|
|
25
|
+
* - 401 Unauthorized → sticky `tokenInvalid` (terminal; the only fix is a new
|
|
26
|
+
* token — stop polling).
|
|
27
|
+
* - 409 Conflict (getUpdates) → another poller/webhook is live: clear the
|
|
28
|
+
* webhook and restart ONCE, then fall back to normal backoff.
|
|
29
|
+
* - Updates are de-duplicated by `update_id` (a redelivered update after a
|
|
30
|
+
* restart must not double-run the agent).
|
|
31
|
+
*
|
|
32
|
+
* Scope cut (v1): `callback_query` (inline-button taps) is intentionally NOT
|
|
33
|
+
* subscribed — Brigade's approvals are central TEXT replies handled in
|
|
34
|
+
* `inbound-pipeline.ts`, so `allowed_updates` only needs message updates.
|
|
35
|
+
*/
|
|
36
|
+
import { type InboundMediaAttachment, type InboundReplyContext, type OutboundMedia } from "../sdk.js";
|
|
37
|
+
import type { Message, Update } from "@grammyjs/types";
|
|
38
|
+
/**
|
|
39
|
+
* Jittered exponential backoff for reconnect attempt `attempt` (0-based).
|
|
40
|
+
* Thin wrapper over the neutral `nextBackoffDelay` helper — kept as a named
|
|
41
|
+
* export so `index.ts` and the connection tests have a stable entry point.
|
|
42
|
+
*/
|
|
43
|
+
export declare function telegramBackoffDelay(attempt: number): number;
|
|
44
|
+
/** A normalized inbound Telegram message (text and/or media). */
|
|
45
|
+
export interface TgInboundMessage {
|
|
46
|
+
/** Chat id as a string — the conversation id. */
|
|
47
|
+
conversationId: string;
|
|
48
|
+
/** Telegram `message_id` as a string — surfaces for reply targeting. */
|
|
49
|
+
messageId?: string;
|
|
50
|
+
/** When Telegram stamped the message (epoch ms). */
|
|
51
|
+
messageTimestampMs?: number;
|
|
52
|
+
/** Sender id within the channel — the user's numeric id as a string. */
|
|
53
|
+
from: string;
|
|
54
|
+
/** Sender display name (`First Last` or `@username`), when present. */
|
|
55
|
+
fromName?: string;
|
|
56
|
+
/** Plain message text (caption-aware, text_link-expanded). May be empty for media. */
|
|
57
|
+
text: string;
|
|
58
|
+
/** `direct` (private) or `group` (group/supergroup). */
|
|
59
|
+
chatType: "direct" | "group";
|
|
60
|
+
/** Forum-topic / thread id (`message_thread_id`) as a string, when present. */
|
|
61
|
+
threadId?: string;
|
|
62
|
+
/** Numeric ids of @-mentioned accounts (incl. the bot's own id when addressed). */
|
|
63
|
+
mentions?: string[];
|
|
64
|
+
/** Quoted-reply context, when this message replies to another. */
|
|
65
|
+
replyTo?: InboundReplyContext;
|
|
66
|
+
/**
|
|
67
|
+
* DEFERRED media download. The connection layer does NOT download eagerly —
|
|
68
|
+
* the pipeline invokes this ONLY after the access gate admits the sender, so
|
|
69
|
+
* a blocked stranger's group video is never fetched. Resolves to an empty
|
|
70
|
+
* array for text-only messages.
|
|
71
|
+
*/
|
|
72
|
+
resolveMedia?: () => Promise<InboundMediaAttachment[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Inline-button callback context — present ONLY when this inbound is a
|
|
75
|
+
* `callback_query` (a button press) rather than a typed message. `data` is
|
|
76
|
+
* the opaque payload the pressed button declared at send time (an
|
|
77
|
+
* approval-callback codec string); `callbackId` is the Telegram
|
|
78
|
+
* `callback_query.id` used to `answerCallbackQuery`. Undefined for ordinary
|
|
79
|
+
* messages. The central pipeline routes a present `callbackQuery` to the
|
|
80
|
+
* approval-callback path.
|
|
81
|
+
*/
|
|
82
|
+
callbackQuery?: {
|
|
83
|
+
data: string;
|
|
84
|
+
callbackId: string;
|
|
85
|
+
};
|
|
86
|
+
/** Raw grammY message (for adapters that need more). */
|
|
87
|
+
raw: Message;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The minimal slice of grammY's `Bot` the connection drives. Declared as an
|
|
91
|
+
* interface (rather than importing grammY's concrete `Bot`) so tests can inject
|
|
92
|
+
* a fake bot with zero network — the runtime path builds a real grammY `Bot`
|
|
93
|
+
* and it structurally satisfies this shape.
|
|
94
|
+
*/
|
|
95
|
+
export interface TelegramBotLike {
|
|
96
|
+
api: {
|
|
97
|
+
getMe(): Promise<TelegramBotIdentity>;
|
|
98
|
+
deleteWebhook(opts?: {
|
|
99
|
+
drop_pending_updates?: boolean;
|
|
100
|
+
}): Promise<boolean>;
|
|
101
|
+
/** Register a webhook (webhook transport mode). */
|
|
102
|
+
setWebhook?(url: string, opts?: Record<string, unknown>): Promise<boolean>;
|
|
103
|
+
sendMessage(chatId: string | number, text: string, opts?: Record<string, unknown>): Promise<{
|
|
104
|
+
message_id: number;
|
|
105
|
+
}>;
|
|
106
|
+
sendChatAction(chatId: string | number, action: string, opts?: Record<string, unknown>): Promise<boolean>;
|
|
107
|
+
setMessageReaction?(chatId: string | number, messageId: number, reaction: unknown, opts?: Record<string, unknown>): Promise<boolean>;
|
|
108
|
+
getFile(fileId: string): Promise<{
|
|
109
|
+
file_path?: string;
|
|
110
|
+
file_unique_id?: string;
|
|
111
|
+
file_size?: number;
|
|
112
|
+
}>;
|
|
113
|
+
sendPhoto?(chatId: string | number, photo: unknown, opts?: Record<string, unknown>): Promise<{
|
|
114
|
+
message_id: number;
|
|
115
|
+
}>;
|
|
116
|
+
sendVideo?(chatId: string | number, video: unknown, opts?: Record<string, unknown>): Promise<{
|
|
117
|
+
message_id: number;
|
|
118
|
+
}>;
|
|
119
|
+
sendAudio?(chatId: string | number, audio: unknown, opts?: Record<string, unknown>): Promise<{
|
|
120
|
+
message_id: number;
|
|
121
|
+
}>;
|
|
122
|
+
sendVoice?(chatId: string | number, voice: unknown, opts?: Record<string, unknown>): Promise<{
|
|
123
|
+
message_id: number;
|
|
124
|
+
}>;
|
|
125
|
+
sendDocument?(chatId: string | number, document: unknown, opts?: Record<string, unknown>): Promise<{
|
|
126
|
+
message_id: number;
|
|
127
|
+
}>;
|
|
128
|
+
sendSticker?(chatId: string | number, sticker: unknown, opts?: Record<string, unknown>): Promise<{
|
|
129
|
+
message_id: number;
|
|
130
|
+
}>;
|
|
131
|
+
/** Send a native poll (outbound poll support). */
|
|
132
|
+
sendPoll?(chatId: string | number, question: string, options: string[], opts?: Record<string, unknown>): Promise<{
|
|
133
|
+
message_id: number;
|
|
134
|
+
}>;
|
|
135
|
+
/** Acknowledge an inline-button press (clears the loading spinner client-side). */
|
|
136
|
+
answerCallbackQuery?(callbackQueryId: string, opts?: Record<string, unknown>): Promise<boolean>;
|
|
137
|
+
/** Edit a previously-sent message's text (message_action `edit`). */
|
|
138
|
+
editMessageText?(chatId: string | number, messageId: number, text: string, opts?: Record<string, unknown>): Promise<unknown>;
|
|
139
|
+
/** Delete a message (message_action `delete`). */
|
|
140
|
+
deleteMessage?(chatId: string | number, messageId: number, opts?: Record<string, unknown>): Promise<boolean>;
|
|
141
|
+
/** Pin a chat message (message_action `pin`). */
|
|
142
|
+
pinChatMessage?(chatId: string | number, messageId: number, opts?: Record<string, unknown>): Promise<boolean>;
|
|
143
|
+
/** Unpin a chat message (message_action `unpin`). */
|
|
144
|
+
unpinChatMessage?(chatId: string | number, opts?: Record<string, unknown>): Promise<boolean>;
|
|
145
|
+
/** Rename a forum topic (thread auto-labeling). */
|
|
146
|
+
editForumTopic?(chatId: string | number, messageThreadId: number, opts?: Record<string, unknown>): Promise<boolean>;
|
|
147
|
+
/** Register the bot's `/` command menu (native command surface). */
|
|
148
|
+
setMyCommands?(commands: Array<{
|
|
149
|
+
command: string;
|
|
150
|
+
description: string;
|
|
151
|
+
}>, opts?: Record<string, unknown>): Promise<boolean>;
|
|
152
|
+
config?: {
|
|
153
|
+
use(transformer: unknown): void;
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Subscribe to an update kind. The connection subscribes `"message"` for the
|
|
158
|
+
* inbound text/media path and `"callback_query"` for inline-button presses
|
|
159
|
+
* (interactive approvals). grammY's real `on` is overloaded across every
|
|
160
|
+
* filter; this minimal contract declares only the two Brigade consumes.
|
|
161
|
+
*/
|
|
162
|
+
on(filter: "message", handler: (ctx: {
|
|
163
|
+
update: Update;
|
|
164
|
+
message?: Message;
|
|
165
|
+
}) => unknown): void;
|
|
166
|
+
on(filter: "callback_query", handler: (ctx: {
|
|
167
|
+
update: Update;
|
|
168
|
+
callbackQuery?: TelegramCallbackQuery;
|
|
169
|
+
answerCallbackQuery: (opts?: Record<string, unknown>) => Promise<unknown>;
|
|
170
|
+
}) => unknown): void;
|
|
171
|
+
/** Stop the bot (grammY). */
|
|
172
|
+
stop(): Promise<void> | void;
|
|
173
|
+
}
|
|
174
|
+
/** What `getMe` returns — the bot's identity + group/inline capability flags. */
|
|
175
|
+
export interface TelegramBotIdentity {
|
|
176
|
+
id: number;
|
|
177
|
+
username?: string;
|
|
178
|
+
first_name?: string;
|
|
179
|
+
can_join_groups?: boolean;
|
|
180
|
+
can_read_all_group_messages?: boolean;
|
|
181
|
+
supports_inline_queries?: boolean;
|
|
182
|
+
}
|
|
183
|
+
/** A Telegram `callback_query` update payload (the subset Brigade reads). */
|
|
184
|
+
export interface TelegramCallbackQuery {
|
|
185
|
+
id: string;
|
|
186
|
+
data?: string;
|
|
187
|
+
from?: {
|
|
188
|
+
id?: number;
|
|
189
|
+
username?: string;
|
|
190
|
+
first_name?: string;
|
|
191
|
+
last_name?: string;
|
|
192
|
+
};
|
|
193
|
+
message?: Message;
|
|
194
|
+
}
|
|
195
|
+
/** A grammY-runner-like handle (what `run(bot)` returns). */
|
|
196
|
+
interface RunnerLike {
|
|
197
|
+
isRunning(): boolean;
|
|
198
|
+
stop(): Promise<void> | void;
|
|
199
|
+
task(): Promise<void>;
|
|
200
|
+
}
|
|
201
|
+
export interface ConnectTelegramArgs {
|
|
202
|
+
/** Bot API token. NEVER logged (redacted in any URL). */
|
|
203
|
+
token: string;
|
|
204
|
+
/** Account namespace stamped on inbounds (single-account v1 → "default"). */
|
|
205
|
+
accountId?: string;
|
|
206
|
+
/** Called once `getMe` succeeds and polling starts. */
|
|
207
|
+
onConnected?: () => void;
|
|
208
|
+
/** Called when the token is rejected (401) — terminal, re-token required. */
|
|
209
|
+
onTokenInvalid?: () => void;
|
|
210
|
+
/** Called for every inbound message. */
|
|
211
|
+
onMessage: (msg: TgInboundMessage) => void;
|
|
212
|
+
/**
|
|
213
|
+
* Called for every inbound `callback_query` (inline-button press). The
|
|
214
|
+
* connection has ALREADY acked the press via `answerCallbackQuery` before
|
|
215
|
+
* this fires, so the handler only has to route the normalized inbound
|
|
216
|
+
* (which carries `callbackQuery: { data, callbackId }`). Optional — when
|
|
217
|
+
* omitted, callback updates are still acked + de-duplicated but not routed.
|
|
218
|
+
*/
|
|
219
|
+
onCallbackQuery?: (msg: TgInboundMessage) => void;
|
|
220
|
+
/**
|
|
221
|
+
* The `allowed_updates` list to request from `getUpdates`. Defaults to the
|
|
222
|
+
* minimal `["message", "callback_query"]` set (see `allowed-updates.ts`).
|
|
223
|
+
* Threaded so the adapter/plugin can widen it (e.g. inbound reactions).
|
|
224
|
+
*/
|
|
225
|
+
allowedUpdates?: string[];
|
|
226
|
+
/**
|
|
227
|
+
* Commands to register on connect via `setMyCommands` (the bot's `/` menu).
|
|
228
|
+
* Empty / omitted → no menu sync. Re-applied on each successful (re)connect.
|
|
229
|
+
*/
|
|
230
|
+
commandMenu?: Array<{
|
|
231
|
+
command: string;
|
|
232
|
+
description: string;
|
|
233
|
+
}>;
|
|
234
|
+
/**
|
|
235
|
+
* Transport mode. `"polling"` (default) drives `getUpdates` via the runner;
|
|
236
|
+
* `"webhook"` builds the bot + (optionally) registers a webhook via
|
|
237
|
+
* `setWebhook` but does NOT poll — the gateway HTTP route feeds updates in
|
|
238
|
+
* via {@link TelegramConnection.feedUpdate}. Defaults to polling (local-first).
|
|
239
|
+
*/
|
|
240
|
+
mode?: "polling" | "webhook";
|
|
241
|
+
/**
|
|
242
|
+
* Webhook registration details (webhook mode only). When `url` is set the
|
|
243
|
+
* connection calls `setWebhook(url, { secret_token, allowed_updates })` on
|
|
244
|
+
* connect. Omit `url` to skip registration (the operator registered it out
|
|
245
|
+
* of band) and only wire the inbound `feedUpdate` path.
|
|
246
|
+
*/
|
|
247
|
+
webhook?: {
|
|
248
|
+
url?: string;
|
|
249
|
+
secretToken?: string;
|
|
250
|
+
};
|
|
251
|
+
/** Subsystem logger. */
|
|
252
|
+
log: (msg: string, meta?: Record<string, unknown>) => void;
|
|
253
|
+
/**
|
|
254
|
+
* TEST SEAM: supply the bot + runner instead of building real grammY ones.
|
|
255
|
+
* Production leaves this undefined and grammY is lazy-imported. When present,
|
|
256
|
+
* `botFactory(token)` returns the bot and `runnerFactory(bot)` the runner.
|
|
257
|
+
*/
|
|
258
|
+
botFactory?: (token: string) => TelegramBotLike;
|
|
259
|
+
runnerFactory?: (bot: TelegramBotLike) => RunnerLike;
|
|
260
|
+
/** TEST SEAM: skip the real backoff sleep so reconnect tests run instantly. */
|
|
261
|
+
sleepImpl?: (ms: number) => Promise<void>;
|
|
262
|
+
}
|
|
263
|
+
export interface TelegramConnection {
|
|
264
|
+
/** The bot's numeric id once connected, else null. */
|
|
265
|
+
selfId(): string | null;
|
|
266
|
+
/** The bot's @username (without `@`) once connected, else null. */
|
|
267
|
+
selfUsername(): string | null;
|
|
268
|
+
/** Epoch ms of the most recent successful connect, else null. */
|
|
269
|
+
connectedAt(): number | null;
|
|
270
|
+
/** True once `getMe` has succeeded and polling is live. */
|
|
271
|
+
isConnected(): boolean;
|
|
272
|
+
/** True once a 401 marked the token terminally invalid. */
|
|
273
|
+
isTokenInvalid(): boolean;
|
|
274
|
+
/** Send a single text message. `opts.html` true → `parse_mode: HTML`. */
|
|
275
|
+
sendText(chatId: string, text: string, opts?: TelegramSendTextOpts): Promise<{
|
|
276
|
+
messageId: number;
|
|
277
|
+
}>;
|
|
278
|
+
/**
|
|
279
|
+
* Send a text message carrying an inline keyboard (`reply_markup`). Used by
|
|
280
|
+
* the native approval prompt; `replyMarkup` is an opaque grammY-shaped
|
|
281
|
+
* `InlineKeyboardMarkup`. Text is sent verbatim (no markdown→HTML pass) so the
|
|
282
|
+
* caller controls formatting.
|
|
283
|
+
*/
|
|
284
|
+
sendInteractive(chatId: string, text: string, replyMarkup: unknown, opts?: TelegramSendTextOpts): Promise<{
|
|
285
|
+
messageId: number;
|
|
286
|
+
}>;
|
|
287
|
+
/** Send a media attachment. */
|
|
288
|
+
sendMedia(chatId: string, media: OutboundMedia, opts?: TelegramSendMediaOpts): Promise<void>;
|
|
289
|
+
/** Send a native poll. Returns the poll message's id. */
|
|
290
|
+
sendPoll(chatId: string, poll: TelegramPollSpec, opts?: TelegramSendMediaOpts): Promise<{
|
|
291
|
+
messageId: number;
|
|
292
|
+
}>;
|
|
293
|
+
/** React to a previous message with an emoji (`""` clears). */
|
|
294
|
+
react(chatId: string, messageId: string, emoji: string): Promise<void>;
|
|
295
|
+
/** Edit a previously-sent message's text. `opts.html` true → `parse_mode: HTML`. */
|
|
296
|
+
editMessageText(chatId: string, messageId: string, text: string, opts?: TelegramSendTextOpts): Promise<void>;
|
|
297
|
+
/** Delete a message. */
|
|
298
|
+
deleteMessage(chatId: string, messageId: string): Promise<void>;
|
|
299
|
+
/** Pin a message (silent by default). */
|
|
300
|
+
pinMessage(chatId: string, messageId: string): Promise<void>;
|
|
301
|
+
/** Unpin a message (or the most recent pin when no id is given). */
|
|
302
|
+
unpinMessage(chatId: string, messageId?: string): Promise<void>;
|
|
303
|
+
/** Rename a forum topic (thread auto-labeling). Best-effort. */
|
|
304
|
+
editForumTopic(chatId: string, threadId: string, name: string): Promise<void>;
|
|
305
|
+
/** Ack an inline-button press (`answerCallbackQuery`). Best-effort. */
|
|
306
|
+
answerCallback(callbackId: string, text?: string): Promise<void>;
|
|
307
|
+
/**
|
|
308
|
+
* Feed a raw Telegram `Update` object into the inbound path (webhook mode).
|
|
309
|
+
* Dispatches to the SAME message / callback_query handlers polling uses, so
|
|
310
|
+
* webhook + polling share one normalize + dedupe surface. No-op in polling
|
|
311
|
+
* mode is fine — the gateway route only calls this when webhook is active.
|
|
312
|
+
*/
|
|
313
|
+
feedUpdate(update: Update): void;
|
|
314
|
+
/** The transport mode this connection runs (`"polling"` | `"webhook"`). */
|
|
315
|
+
mode(): "polling" | "webhook";
|
|
316
|
+
/** The bot's identity (`getMe`) — cached after connect, re-fetched on demand. */
|
|
317
|
+
getIdentity(force?: boolean): Promise<TelegramBotIdentity | null>;
|
|
318
|
+
/** Register the bot's `/` command menu. Best-effort. */
|
|
319
|
+
setCommandMenu(commands: Array<{
|
|
320
|
+
command: string;
|
|
321
|
+
description: string;
|
|
322
|
+
}>): Promise<void>;
|
|
323
|
+
/** Signal typing (`composing`) / clear (`paused`). Best-effort. */
|
|
324
|
+
setComposing(chatId: string, state: "composing" | "paused", threadId?: string): Promise<void>;
|
|
325
|
+
/** Read-receipt no-op (Telegram bots can't mark-read). */
|
|
326
|
+
markRead(): Promise<void>;
|
|
327
|
+
/** Stop polling + tear down. */
|
|
328
|
+
close(): Promise<void>;
|
|
329
|
+
}
|
|
330
|
+
/** Outbound poll spec — normalized before reaching `sendPoll`. */
|
|
331
|
+
export interface TelegramPollSpec {
|
|
332
|
+
/** The poll question. */
|
|
333
|
+
question: string;
|
|
334
|
+
/** 2–10 answer options. */
|
|
335
|
+
options: string[];
|
|
336
|
+
/** Anonymous poll (default true, matching Telegram). */
|
|
337
|
+
isAnonymous?: boolean;
|
|
338
|
+
/** Allow multiple answers (default false). */
|
|
339
|
+
allowsMultipleAnswers?: boolean;
|
|
340
|
+
}
|
|
341
|
+
export interface TelegramSendTextOpts {
|
|
342
|
+
/** When true the text is already Telegram HTML and sent with `parse_mode: HTML`. */
|
|
343
|
+
html?: boolean;
|
|
344
|
+
/** Forum-topic thread id. */
|
|
345
|
+
threadId?: string;
|
|
346
|
+
}
|
|
347
|
+
export interface TelegramSendMediaOpts {
|
|
348
|
+
/** Forum-topic thread id. */
|
|
349
|
+
threadId?: string;
|
|
350
|
+
}
|
|
351
|
+
/** 401 Unauthorized → the bot token is wrong / revoked (terminal). */
|
|
352
|
+
export declare function isTelegramUnauthorized(err: unknown): boolean;
|
|
353
|
+
/** 409 Conflict on getUpdates → another poller or a webhook is active. */
|
|
354
|
+
export declare function isTelegramGetUpdatesConflict(err: unknown): boolean;
|
|
355
|
+
/** Strip a bot token out of any string before it reaches a log. */
|
|
356
|
+
export declare function redactTelegramToken(text: string, token: string): string;
|
|
357
|
+
export declare function connectTelegram(args: ConnectTelegramArgs): Promise<TelegramConnection>;
|
|
358
|
+
export {};
|
|
359
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/telegram/connection.ts"],"names":[],"mappings":"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"}
|