@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.
Files changed (139) hide show
  1. package/convex/channels.d.ts +5 -5
  2. package/convex/schema.d.ts +2 -2
  3. package/dist/agents/agent-loop.d.ts.map +1 -1
  4. package/dist/agents/agent-loop.js +27 -4
  5. package/dist/agents/agent-loop.js.map +1 -1
  6. package/dist/agents/channels/approval-callback-codec.d.ts +107 -0
  7. package/dist/agents/channels/approval-callback-codec.d.ts.map +1 -0
  8. package/dist/agents/channels/approval-callback-codec.js +173 -0
  9. package/dist/agents/channels/approval-callback-codec.js.map +1 -0
  10. package/dist/agents/channels/approval-router.d.ts +77 -20
  11. package/dist/agents/channels/approval-router.d.ts.map +1 -1
  12. package/dist/agents/channels/approval-router.js +163 -37
  13. package/dist/agents/channels/approval-router.js.map +1 -1
  14. package/dist/agents/channels/backoff.d.ts +55 -0
  15. package/dist/agents/channels/backoff.d.ts.map +1 -0
  16. package/dist/agents/channels/backoff.js +47 -0
  17. package/dist/agents/channels/backoff.js.map +1 -0
  18. package/dist/agents/channels/channel-secrets.d.ts +45 -0
  19. package/dist/agents/channels/channel-secrets.d.ts.map +1 -0
  20. package/dist/agents/channels/channel-secrets.js +69 -0
  21. package/dist/agents/channels/channel-secrets.js.map +1 -0
  22. package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
  23. package/dist/agents/channels/inbound-pipeline.js +67 -3
  24. package/dist/agents/channels/inbound-pipeline.js.map +1 -1
  25. package/dist/agents/channels/last-sent-message.d.ts +46 -0
  26. package/dist/agents/channels/last-sent-message.d.ts.map +1 -0
  27. package/dist/agents/channels/last-sent-message.js +55 -0
  28. package/dist/agents/channels/last-sent-message.js.map +1 -0
  29. package/dist/agents/channels/manager.d.ts +52 -0
  30. package/dist/agents/channels/manager.d.ts.map +1 -1
  31. package/dist/agents/channels/manager.js +141 -31
  32. package/dist/agents/channels/manager.js.map +1 -1
  33. package/dist/agents/channels/plugin-channel-manager-facade.d.ts +13 -2
  34. package/dist/agents/channels/plugin-channel-manager-facade.d.ts.map +1 -1
  35. package/dist/agents/channels/plugin-channel-manager-facade.js +21 -0
  36. package/dist/agents/channels/plugin-channel-manager-facade.js.map +1 -1
  37. package/dist/agents/channels/sdk.d.ts +426 -0
  38. package/dist/agents/channels/sdk.d.ts.map +1 -0
  39. package/dist/agents/channels/sdk.js +274 -0
  40. package/dist/agents/channels/sdk.js.map +1 -0
  41. package/dist/agents/channels/telegram/account-config.d.ts +92 -0
  42. package/dist/agents/channels/telegram/account-config.d.ts.map +1 -0
  43. package/dist/agents/channels/telegram/account-config.js +192 -0
  44. package/dist/agents/channels/telegram/account-config.js.map +1 -0
  45. package/dist/agents/channels/telegram/adapter.d.ts +79 -0
  46. package/dist/agents/channels/telegram/adapter.d.ts.map +1 -0
  47. package/dist/agents/channels/telegram/adapter.js +475 -0
  48. package/dist/agents/channels/telegram/adapter.js.map +1 -0
  49. package/dist/agents/channels/telegram/allowed-updates.d.ts +44 -0
  50. package/dist/agents/channels/telegram/allowed-updates.d.ts.map +1 -0
  51. package/dist/agents/channels/telegram/allowed-updates.js +52 -0
  52. package/dist/agents/channels/telegram/allowed-updates.js.map +1 -0
  53. package/dist/agents/channels/telegram/approval-authorize.d.ts +41 -0
  54. package/dist/agents/channels/telegram/approval-authorize.d.ts.map +1 -0
  55. package/dist/agents/channels/telegram/approval-authorize.js +69 -0
  56. package/dist/agents/channels/telegram/approval-authorize.js.map +1 -0
  57. package/dist/agents/channels/telegram/approval-native.d.ts +68 -0
  58. package/dist/agents/channels/telegram/approval-native.d.ts.map +1 -0
  59. package/dist/agents/channels/telegram/approval-native.js +94 -0
  60. package/dist/agents/channels/telegram/approval-native.js.map +1 -0
  61. package/dist/agents/channels/telegram/command-menu.d.ts +35 -0
  62. package/dist/agents/channels/telegram/command-menu.d.ts.map +1 -0
  63. package/dist/agents/channels/telegram/command-menu.js +59 -0
  64. package/dist/agents/channels/telegram/command-menu.js.map +1 -0
  65. package/dist/agents/channels/telegram/connection.d.ts +359 -0
  66. package/dist/agents/channels/telegram/connection.d.ts.map +1 -0
  67. package/dist/agents/channels/telegram/connection.js +865 -0
  68. package/dist/agents/channels/telegram/connection.js.map +1 -0
  69. package/dist/agents/channels/telegram/format.d.ts +48 -0
  70. package/dist/agents/channels/telegram/format.d.ts.map +1 -0
  71. package/dist/agents/channels/telegram/format.js +256 -0
  72. package/dist/agents/channels/telegram/format.js.map +1 -0
  73. package/dist/agents/channels/telegram/inbound-extras.d.ts +73 -0
  74. package/dist/agents/channels/telegram/inbound-extras.d.ts.map +1 -0
  75. package/dist/agents/channels/telegram/inbound-extras.js +231 -0
  76. package/dist/agents/channels/telegram/inbound-extras.js.map +1 -0
  77. package/dist/agents/channels/telegram/index.d.ts +14 -0
  78. package/dist/agents/channels/telegram/index.d.ts.map +1 -0
  79. package/dist/agents/channels/telegram/index.js +14 -0
  80. package/dist/agents/channels/telegram/index.js.map +1 -0
  81. package/dist/agents/channels/telegram/media.d.ts +68 -0
  82. package/dist/agents/channels/telegram/media.d.ts.map +1 -0
  83. package/dist/agents/channels/telegram/media.js +143 -0
  84. package/dist/agents/channels/telegram/media.js.map +1 -0
  85. package/dist/agents/channels/telegram/module.d.ts +15 -0
  86. package/dist/agents/channels/telegram/module.d.ts.map +1 -0
  87. package/dist/agents/channels/telegram/module.js +36 -0
  88. package/dist/agents/channels/telegram/module.js.map +1 -0
  89. package/dist/agents/channels/telegram/plugin.d.ts +76 -0
  90. package/dist/agents/channels/telegram/plugin.d.ts.map +1 -0
  91. package/dist/agents/channels/telegram/plugin.js +314 -0
  92. package/dist/agents/channels/telegram/plugin.js.map +1 -0
  93. package/dist/agents/channels/telegram/probe.d.ts +54 -0
  94. package/dist/agents/channels/telegram/probe.d.ts.map +1 -0
  95. package/dist/agents/channels/telegram/probe.js +95 -0
  96. package/dist/agents/channels/telegram/probe.js.map +1 -0
  97. package/dist/agents/channels/telegram/webhook.d.ts +55 -0
  98. package/dist/agents/channels/telegram/webhook.d.ts.map +1 -0
  99. package/dist/agents/channels/telegram/webhook.js +141 -0
  100. package/dist/agents/channels/telegram/webhook.js.map +1 -0
  101. package/dist/agents/extensions/modules/index.d.ts.map +1 -1
  102. package/dist/agents/extensions/modules/index.js +4 -0
  103. package/dist/agents/extensions/modules/index.js.map +1 -1
  104. package/dist/agents/extensions/types.d.ts +72 -2
  105. package/dist/agents/extensions/types.d.ts.map +1 -1
  106. package/dist/agents/extensions/types.js.map +1 -1
  107. package/dist/agents/tools/connect-channel-tool.d.ts +86 -0
  108. package/dist/agents/tools/connect-channel-tool.d.ts.map +1 -0
  109. package/dist/agents/tools/connect-channel-tool.js +398 -0
  110. package/dist/agents/tools/connect-channel-tool.js.map +1 -0
  111. package/dist/agents/tools/message-action-tool.d.ts +67 -0
  112. package/dist/agents/tools/message-action-tool.d.ts.map +1 -0
  113. package/dist/agents/tools/message-action-tool.js +216 -0
  114. package/dist/agents/tools/message-action-tool.js.map +1 -0
  115. package/dist/agents/tools/registry.d.ts.map +1 -1
  116. package/dist/agents/tools/registry.js +19 -0
  117. package/dist/agents/tools/registry.js.map +1 -1
  118. package/dist/buildstamp.json +1 -1
  119. package/dist/cli/commands/channels.d.ts.map +1 -1
  120. package/dist/cli/commands/channels.js +27 -2
  121. package/dist/cli/commands/channels.js.map +1 -1
  122. package/dist/core/server.d.ts.map +1 -1
  123. package/dist/core/server.js +77 -27
  124. package/dist/core/server.js.map +1 -1
  125. package/dist/cron/service/state.d.ts +10 -0
  126. package/dist/cron/service/state.d.ts.map +1 -1
  127. package/dist/cron/service/state.js.map +1 -1
  128. package/dist/cron/service/timer.d.ts.map +1 -1
  129. package/dist/cron/service/timer.js +43 -14
  130. package/dist/cron/service/timer.js.map +1 -1
  131. package/dist/cron/session-reaper.d.ts +27 -0
  132. package/dist/cron/session-reaper.d.ts.map +1 -1
  133. package/dist/cron/session-reaper.js +81 -0
  134. package/dist/cron/session-reaper.js.map +1 -1
  135. package/dist/system-prompt/assembler.d.ts +14 -0
  136. package/dist/system-prompt/assembler.d.ts.map +1 -1
  137. package/dist/system-prompt/assembler.js +36 -14
  138. package/dist/system-prompt/assembler.js.map +1 -1
  139. 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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"}