@llblab/pi-telegram 0.46.0 → 0.48.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 (204) hide show
  1. package/AGENTS.md +4 -2
  2. package/BACKLOG.md +0 -6
  3. package/CHANGELOG.md +14 -0
  4. package/README.md +5 -2
  5. package/dist/api/activity.d.ts +6 -0
  6. package/dist/api/activity.js +6 -0
  7. package/dist/api/commands.d.ts +6 -0
  8. package/dist/api/commands.js +6 -0
  9. package/dist/api/delivery.d.ts +6 -0
  10. package/dist/api/delivery.js +6 -0
  11. package/dist/api/inbound.d.ts +6 -0
  12. package/dist/api/inbound.js +6 -0
  13. package/dist/api/keyboard.d.ts +6 -0
  14. package/dist/api/keyboard.js +6 -0
  15. package/dist/api/outbound.d.ts +6 -0
  16. package/dist/api/outbound.js +6 -0
  17. package/dist/api/sections.d.ts +7 -0
  18. package/dist/api/sections.js +6 -0
  19. package/dist/api/status.d.ts +6 -0
  20. package/dist/api/status.js +6 -0
  21. package/dist/api/updates.d.ts +6 -0
  22. package/dist/api/updates.js +6 -0
  23. package/dist/api/voice.d.ts +6 -0
  24. package/dist/api/voice.js +6 -0
  25. package/dist/index.d.ts +6 -0
  26. package/dist/index.js +6 -0
  27. package/dist/lib/activity-verbosity.d.ts +52 -0
  28. package/dist/lib/activity-verbosity.js +596 -0
  29. package/dist/lib/activity.d.ts +220 -0
  30. package/dist/lib/activity.js +574 -0
  31. package/dist/lib/agent-messages.d.ts +28 -0
  32. package/dist/lib/agent-messages.js +86 -0
  33. package/dist/lib/bindings.d.ts +250 -0
  34. package/dist/lib/bindings.js +936 -0
  35. package/dist/lib/bus-api.d.ts +18 -0
  36. package/dist/lib/bus-api.js +254 -0
  37. package/dist/lib/bus-follower.d.ts +464 -0
  38. package/dist/lib/bus-follower.js +1686 -0
  39. package/dist/lib/bus-leader.d.ts +292 -0
  40. package/dist/lib/bus-leader.js +2242 -0
  41. package/dist/lib/bus-transport.d.ts +64 -0
  42. package/dist/lib/bus-transport.js +140 -0
  43. package/dist/lib/bus.d.ts +518 -0
  44. package/dist/lib/bus.js +2055 -0
  45. package/dist/lib/channel-posts.d.ts +170 -0
  46. package/dist/lib/channel-posts.js +611 -0
  47. package/dist/lib/command-templates.d.ts +70 -0
  48. package/dist/lib/command-templates.js +744 -0
  49. package/dist/lib/commands.d.ts +541 -0
  50. package/dist/lib/commands.js +1155 -0
  51. package/dist/lib/config.d.ts +252 -0
  52. package/dist/lib/config.js +889 -0
  53. package/dist/lib/delivery.d.ts +163 -0
  54. package/dist/lib/delivery.js +542 -0
  55. package/dist/lib/extension.d.ts +7 -0
  56. package/dist/lib/extension.js +1604 -0
  57. package/dist/lib/generative-app-worker.mjs +104 -0
  58. package/dist/lib/generative-apps.d.ts +212 -0
  59. package/dist/lib/generative-apps.js +1006 -0
  60. package/dist/lib/inbound.d.ts +91 -0
  61. package/dist/lib/inbound.js +502 -0
  62. package/dist/lib/journal.d.ts +665 -0
  63. package/dist/lib/journal.js +3701 -0
  64. package/dist/lib/keyboard.d.ts +23 -0
  65. package/dist/lib/keyboard.js +37 -0
  66. package/dist/lib/lifecycle.d.ts +157 -0
  67. package/dist/lib/lifecycle.js +395 -0
  68. package/dist/lib/locks.d.ts +164 -0
  69. package/dist/lib/locks.js +1208 -0
  70. package/dist/lib/logging.d.ts +50 -0
  71. package/dist/lib/logging.js +274 -0
  72. package/dist/lib/media.d.ts +181 -0
  73. package/dist/lib/media.js +602 -0
  74. package/dist/lib/menu-model.d.ts +217 -0
  75. package/dist/lib/menu-model.js +663 -0
  76. package/dist/lib/menu-queue.d.ts +37 -0
  77. package/dist/lib/menu-queue.js +408 -0
  78. package/dist/lib/menu-settings.d.ts +115 -0
  79. package/dist/lib/menu-settings.js +595 -0
  80. package/dist/lib/menu-status.d.ts +32 -0
  81. package/dist/lib/menu-status.js +112 -0
  82. package/dist/lib/menu-thinking.d.ts +29 -0
  83. package/dist/lib/menu-thinking.js +82 -0
  84. package/dist/lib/menu.d.ts +171 -0
  85. package/dist/lib/menu.js +323 -0
  86. package/dist/lib/model.d.ts +127 -0
  87. package/dist/lib/model.js +409 -0
  88. package/dist/lib/outbound-attachments.d.ts +241 -0
  89. package/dist/lib/outbound-attachments.js +639 -0
  90. package/dist/lib/outbound-buttons.d.ts +69 -0
  91. package/dist/lib/outbound-buttons.js +248 -0
  92. package/dist/lib/outbound-markup.d.ts +42 -0
  93. package/dist/lib/outbound-markup.js +678 -0
  94. package/dist/lib/outbound-voice.d.ts +55 -0
  95. package/dist/lib/outbound-voice.js +152 -0
  96. package/dist/lib/outbound.d.ts +185 -0
  97. package/dist/lib/outbound.js +516 -0
  98. package/dist/lib/ownership.d.ts +77 -0
  99. package/dist/lib/ownership.js +174 -0
  100. package/dist/lib/paths.d.ts +40 -0
  101. package/dist/lib/paths.js +94 -0
  102. package/dist/lib/pi.d.ts +72 -0
  103. package/dist/lib/pi.js +121 -0
  104. package/dist/lib/polling.d.ts +351 -0
  105. package/dist/lib/polling.js +1196 -0
  106. package/dist/lib/preview.d.ts +192 -0
  107. package/dist/lib/preview.js +614 -0
  108. package/dist/lib/prompt-templates.d.ts +24 -0
  109. package/dist/lib/prompt-templates.js +118 -0
  110. package/dist/lib/prompts.d.ts +57 -0
  111. package/dist/lib/prompts.js +167 -0
  112. package/dist/lib/queue.d.ts +766 -0
  113. package/dist/lib/queue.js +1965 -0
  114. package/dist/lib/recovery.d.ts +86 -0
  115. package/dist/lib/recovery.js +285 -0
  116. package/dist/lib/rendering.d.ts +20 -0
  117. package/dist/lib/rendering.js +983 -0
  118. package/dist/lib/replies.d.ts +214 -0
  119. package/dist/lib/replies.js +737 -0
  120. package/dist/lib/routing.d.ts +207 -0
  121. package/dist/lib/routing.js +2282 -0
  122. package/dist/lib/runtime.d.ts +172 -0
  123. package/dist/lib/runtime.js +402 -0
  124. package/dist/lib/sections.d.ts +165 -0
  125. package/dist/lib/sections.js +327 -0
  126. package/dist/lib/setup.d.ts +82 -0
  127. package/dist/lib/setup.js +150 -0
  128. package/dist/lib/skills.d.ts +8 -0
  129. package/dist/lib/skills.js +12 -0
  130. package/dist/lib/status.d.ts +442 -0
  131. package/dist/lib/status.js +1008 -0
  132. package/dist/lib/sync.d.ts +179 -0
  133. package/dist/lib/sync.js +782 -0
  134. package/dist/lib/target.d.ts +20 -0
  135. package/dist/lib/target.js +27 -0
  136. package/dist/lib/telegram-api.d.ts +541 -0
  137. package/dist/lib/telegram-api.js +1159 -0
  138. package/dist/lib/text-groups.d.ts +89 -0
  139. package/dist/lib/text-groups.js +317 -0
  140. package/dist/lib/thread-cleanup-manager.d.ts +288 -0
  141. package/dist/lib/thread-cleanup-manager.js +560 -0
  142. package/dist/lib/thread-display.d.ts +46 -0
  143. package/dist/lib/thread-display.js +257 -0
  144. package/dist/lib/thread-naming.d.ts +46 -0
  145. package/dist/lib/thread-naming.js +78 -0
  146. package/dist/lib/thread-reconciler.d.ts +239 -0
  147. package/dist/lib/thread-reconciler.js +644 -0
  148. package/dist/lib/threads.d.ts +621 -0
  149. package/dist/lib/threads.js +3679 -0
  150. package/dist/lib/time-injection.d.ts +15 -0
  151. package/dist/lib/time-injection.js +56 -0
  152. package/dist/lib/turns.d.ts +109 -0
  153. package/dist/lib/turns.js +500 -0
  154. package/dist/lib/updates.d.ts +1290 -0
  155. package/dist/lib/updates.js +3634 -0
  156. package/dist/lib/voice.d.ts +117 -0
  157. package/dist/lib/voice.js +174 -0
  158. package/dist/lib/workspace-admission.d.ts +264 -0
  159. package/dist/lib/workspace-admission.js +1136 -0
  160. package/dist/lib/workspace-retirement.d.ts +219 -0
  161. package/dist/lib/workspace-retirement.js +587 -0
  162. package/dist/lib/workspace-slots.d.ts +30 -0
  163. package/dist/lib/workspace-slots.js +54 -0
  164. package/dist/package.json +126 -0
  165. package/dist/pi-telegram/index.js +1 -0
  166. package/dist/skills/generated-control-surface/SKILL.md +107 -0
  167. package/dist/skills/generated-control-surface/references/capability-adapters.md +27 -0
  168. package/dist/skills/generated-control-surface/references/layout-and-state.md +37 -0
  169. package/dist/skills/generative-apps/SKILL.md +115 -0
  170. package/dist/skills/show-me/SKILL.md +166 -0
  171. package/dist/skills/show-me/references/telegram-surfaces.md +43 -0
  172. package/dist/skills/telegram-bridge/SKILL.md +129 -0
  173. package/dist/skills/telegram-bridge/references/configuration.md +15 -0
  174. package/dist/skills/telegram-bridge/references/delivery-and-threads.md +27 -0
  175. package/dist/skills/telegram-bridge/references/diagnosis.md +18 -0
  176. package/docs/README.md +2 -0
  177. package/docs/architecture.md +1 -1
  178. package/docs/compact-matrix-literal.md +10 -3
  179. package/docs/generative-apps.md +15 -13
  180. package/docs/multi-instance-bus.md +6 -4
  181. package/docs/outbound.md +1 -1
  182. package/docs/public-api.md +3 -3
  183. package/lib/bindings.ts +89 -6
  184. package/lib/bus-follower.ts +7 -3
  185. package/lib/bus-leader.ts +44 -19
  186. package/lib/bus.ts +4 -1
  187. package/lib/commands.ts +2 -2
  188. package/lib/config.ts +14 -7
  189. package/lib/delivery.ts +38 -6
  190. package/lib/extension.ts +7 -0
  191. package/lib/generative-apps.ts +379 -13
  192. package/lib/menu-settings.ts +20 -6
  193. package/lib/outbound-markup.ts +16 -7
  194. package/lib/status.ts +15 -12
  195. package/lib/telegram-api.ts +12 -1
  196. package/lib/thread-display.ts +96 -18
  197. package/package.json +56 -13
  198. package/scripts/build-dist.mjs +44 -0
  199. package/scripts/measure-bus.mjs +8 -1
  200. package/scripts/measure-workspace.mjs +8 -1
  201. package/skills/generative-apps/SKILL.md +1 -1
  202. package/skills/show-me/SKILL.md +1 -1
  203. package/skills/show-me/references/telegram-surfaces.md +1 -1
  204. package/skills/telegram-bridge/SKILL.md +1 -1
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Telegram reply delivery helpers
3
+ * Zones: telegram outbound, native rich markdown, UI/compat rendering transport
4
+ * Owns native assistant replies, rendered UI delivery, guest placeholder rotation, reply transport wiring, and plain text replies
5
+ */
6
+ import { type TelegramTarget } from "./target.ts";
7
+ import type { TelegramInputRichMessage, TelegramReplyParameters, TelegramSendRichMessageBody, TelegramSentMessage } from "./telegram-api.ts";
8
+ import { renderTelegramMessage, type TelegramRenderedChunk, type TelegramRenderMode } from "./rendering.ts";
9
+ export { renderTelegramMessage, type TelegramRenderedChunk, type TelegramRenderMode, };
10
+ export declare function renderTelegramMarkdownToHtmlDraft(markdown: string): string;
11
+ export declare const TELEGRAM_RICH_MESSAGE_MAX_CHARS = 32768;
12
+ export declare const TELEGRAM_RICH_MESSAGE_MAX_BLOCKS = 500;
13
+ /** Non-persistent reply deduplication for a single agent turn.
14
+ * First reply to a prompt gets `reply_parameters.message_id`;
15
+ * subsequent replies in the same turn skip it to avoid stacking
16
+ * duplicate reply headers in the chat viewport. */
17
+ export interface ReplyDedupRuntime {
18
+ /** Returns true if this is the first reply for the given prompt
19
+ * message id in the current turn. Side-effect: marks it replied. */
20
+ shouldReply(promptMessageId: number): boolean;
21
+ /** Reset the tracker when a new prompt enters the queue. */
22
+ reset(): void;
23
+ }
24
+ export declare function createReplyDedupRuntime(): ReplyDedupRuntime;
25
+ export declare function resetTransportReplyDedup(): void;
26
+ export declare function buildTelegramReplyParameters(chatId: number, messageId: number | undefined, target?: TelegramTarget): TelegramReplyParameters | undefined;
27
+ export declare function withTelegramReplyParameters<T>(chatId: number, messageId: number | undefined, target: TelegramTarget | undefined, send: (parameters: TelegramReplyParameters | undefined) => Promise<T>): Promise<T>;
28
+ export declare function isAssistantAgentMessage(message: unknown): boolean;
29
+ export declare function getAgentMessageText(message: unknown): string;
30
+ export declare function extractLatestAssistantMessageText(messages: readonly unknown[]): {
31
+ text?: string;
32
+ stopReason?: string;
33
+ errorMessage?: string;
34
+ };
35
+ /**
36
+ * Extract the run's answer without trusting an empty final assistant message.
37
+ * A low-level run may end with a completed assistant message whose content was
38
+ * suppressed (a companion extension preserving an earlier draft, for example
39
+ * State Flow's fallback final:true patch turn). In that case the run's answer
40
+ * is the latest earlier completed assistant message that carries text;
41
+ * tool-use prefaces, errors, and aborts stay excluded.
42
+ */
43
+ export declare function extractRunAssistantMessage(messages: readonly unknown[]): {
44
+ text?: string;
45
+ stopReason?: string;
46
+ errorMessage?: string;
47
+ };
48
+ export interface TelegramReplyOwnershipRecorder {
49
+ record: (input: {
50
+ chatId: number;
51
+ messageId: number;
52
+ target?: TelegramTarget;
53
+ }) => void;
54
+ }
55
+ export interface TelegramReplyDeliveryDeps<TReplyMarkup> {
56
+ recordOwnership?: TelegramReplyOwnershipRecorder["record"];
57
+ sendMessage: (body: {
58
+ chat_id: number;
59
+ text: string;
60
+ parse_mode?: "HTML";
61
+ reply_markup?: TReplyMarkup;
62
+ reply_parameters?: TelegramReplyParameters;
63
+ reply_to_message_id?: number;
64
+ message_thread_id?: number;
65
+ }) => Promise<TelegramSentMessage>;
66
+ editMessage: (body: {
67
+ chat_id: number;
68
+ message_id: number;
69
+ text?: string;
70
+ rich_message?: TelegramInputRichMessage;
71
+ parse_mode?: "HTML";
72
+ reply_markup?: TReplyMarkup;
73
+ message_thread_id?: number;
74
+ }) => Promise<unknown>;
75
+ }
76
+ export interface TelegramReplyTargetOptions {
77
+ target?: TelegramTarget;
78
+ replyToMessageId?: number;
79
+ }
80
+ export interface TelegramReplyTransport<TReplyMarkup> {
81
+ sendRenderedChunks: (chatId: number, chunks: TelegramRenderedChunk[], options?: TelegramReplyTargetOptions & {
82
+ replyMarkup?: TReplyMarkup;
83
+ }) => Promise<number | undefined>;
84
+ editRenderedMessage: (chatId: number, messageId: number, chunks: TelegramRenderedChunk[], options?: TelegramReplyTargetOptions & {
85
+ replyMarkup?: TReplyMarkup;
86
+ }) => Promise<number | undefined>;
87
+ }
88
+ export declare function buildTelegramReplyTransport<TReplyMarkup>(deps: TelegramReplyDeliveryDeps<TReplyMarkup>): TelegramReplyTransport<TReplyMarkup>;
89
+ export declare function sendTelegramRenderedChunks<TReplyMarkup>(chatId: number, chunks: TelegramRenderedChunk[], deps: TelegramReplyDeliveryDeps<TReplyMarkup>, options?: TelegramReplyTargetOptions & {
90
+ replyMarkup?: TReplyMarkup;
91
+ }): Promise<number | undefined>;
92
+ export declare function editTelegramRenderedMessage<TReplyMarkup>(chatId: number, messageId: number, chunks: TelegramRenderedChunk[], deps: TelegramReplyDeliveryDeps<TReplyMarkup>, options?: TelegramReplyTargetOptions & {
93
+ replyMarkup?: TReplyMarkup;
94
+ }): Promise<number | undefined>;
95
+ export interface TelegramTextReplyOptions extends TelegramReplyTargetOptions {
96
+ parseMode?: "HTML";
97
+ }
98
+ export interface TelegramReplyRuntimeDeps<TReplyMarkup = unknown> {
99
+ renderTelegramMessage: (text: string, options?: {
100
+ mode?: TelegramRenderMode;
101
+ }) => TelegramRenderedChunk[];
102
+ sendRenderedChunks: (chunks: TelegramRenderedChunk[], options?: {
103
+ replyMarkup?: TReplyMarkup;
104
+ } & TelegramReplyTargetOptions) => Promise<number | undefined>;
105
+ }
106
+ export declare function sendTelegramPlainReply(text: string, deps: TelegramReplyRuntimeDeps, options?: TelegramTextReplyOptions): Promise<number | undefined>;
107
+ export declare function normalizeTelegramNativeMarkdown(markdown: string): string;
108
+ export declare function splitTelegramNativeMarkdown(markdown: string): string[];
109
+ export declare function sendTelegramNativeMarkdownReply<TReplyMarkup = unknown>(chatId: number, replyToMessageId: number | undefined, markdown: string, deps: {
110
+ recordOwnership?: TelegramReplyOwnershipRecorder["record"];
111
+ sendRichMessage: (body: TelegramSendRichMessageBody) => Promise<TelegramSentMessage>;
112
+ }, options?: TelegramReplyTargetOptions & {
113
+ replyMarkup?: TReplyMarkup;
114
+ }): Promise<number | undefined>;
115
+ export declare function sendTelegramNativeRichMessage(chatId: number, richMessage: TelegramInputRichMessage, deps: {
116
+ recordOwnership?: TelegramReplyOwnershipRecorder["record"];
117
+ sendRichMessage: (body: TelegramSendRichMessageBody) => Promise<TelegramSentMessage>;
118
+ }, options?: TelegramReplyTargetOptions): Promise<number>;
119
+ export type TelegramAssistantRenderingMode = "rich" | "html";
120
+ export interface TelegramRenderedMessageRuntimeDeps<TReplyMarkup> {
121
+ renderTelegramMessage: (text: string, options?: {
122
+ mode?: TelegramRenderMode;
123
+ }) => TelegramRenderedChunk[];
124
+ replyTransport: TelegramReplyTransport<TReplyMarkup>;
125
+ recordOwnership?: TelegramReplyOwnershipRecorder["record"];
126
+ getAssistantRenderingMode?: () => TelegramAssistantRenderingMode;
127
+ sendRichMessage: (body: TelegramSendRichMessageBody) => Promise<TelegramSentMessage>;
128
+ }
129
+ export interface TelegramRenderedMessageRuntime<TReplyMarkup> {
130
+ sendTextReply: (chatId: number, replyToMessageId: number | undefined, text: string, options?: TelegramTextReplyOptions) => Promise<number | undefined>;
131
+ sendMarkdownReply: (chatId: number, replyToMessageId: number | undefined, markdown: string, options?: TelegramReplyTargetOptions & {
132
+ replyMarkup?: TReplyMarkup;
133
+ }) => Promise<number | undefined>;
134
+ editInteractiveMessage: (chatId: number, messageId: number, text: string, mode: TelegramRenderMode, replyMarkup: TReplyMarkup) => Promise<void>;
135
+ sendInteractiveMessage: (chatId: number, text: string, mode: TelegramRenderMode, replyMarkup: TReplyMarkup, options?: TelegramReplyTargetOptions) => Promise<number | undefined>;
136
+ sendSectionRichMessage: (chatId: number, message: TelegramInputRichMessage, options?: TelegramReplyTargetOptions) => Promise<number>;
137
+ }
138
+ export interface TelegramRenderedMessageDeliveryRuntime<TReplyMarkup> extends TelegramRenderedMessageRuntime<TReplyMarkup> {
139
+ replyTransport: TelegramReplyTransport<TReplyMarkup>;
140
+ }
141
+ export interface TelegramRenderedMessageDeliveryRuntimeDeps<TReplyMarkup> extends TelegramReplyDeliveryDeps<TReplyMarkup> {
142
+ renderTelegramMessage?: (text: string, options?: {
143
+ mode?: TelegramRenderMode;
144
+ }) => TelegramRenderedChunk[];
145
+ getAssistantRenderingMode?: () => TelegramAssistantRenderingMode;
146
+ sendRichMessage: (body: TelegramSendRichMessageBody) => Promise<TelegramSentMessage>;
147
+ }
148
+ export declare function createTelegramRenderedMessageDeliveryRuntime<TReplyMarkup>(deps: TelegramRenderedMessageDeliveryRuntimeDeps<TReplyMarkup>): TelegramRenderedMessageDeliveryRuntime<TReplyMarkup>;
149
+ export declare function createTelegramRenderedMessageRuntime<TReplyMarkup>(deps: TelegramRenderedMessageRuntimeDeps<TReplyMarkup>): TelegramRenderedMessageRuntime<TReplyMarkup>;
150
+ /** Wrap a sendTextReply with reply dedup so only the first message
151
+ * in a turn carries reply metadata. */
152
+ export declare function dedupSendTextReply(dedup: ReplyDedupRuntime, inner: (chatId: number, replyToMessageId: number | undefined, text: string, options?: TelegramTextReplyOptions) => Promise<number | undefined>): (chatId: number, replyToMessageId: number, text: string, options?: TelegramTextReplyOptions) => Promise<number | undefined>;
153
+ /**
154
+ * Guest reply sender: answers guest queries with native Rich Markdown content.
155
+ * Guest queries use InlineQueryResult input_message_content rather than chat
156
+ * sendRichMessage, so this stays as a dedicated guest transport adapter.
157
+ */
158
+ export declare function createGuestMarkdownReplySender(deps: {
159
+ answerGuestQuery: (guestQueryId: string, text?: string, options?: {
160
+ parseMode?: string;
161
+ richMessage?: TelegramInputRichMessage;
162
+ }) => Promise<void>;
163
+ }): (guestQueryId: string, markdown: string) => Promise<void>;
164
+ /**
165
+ * Guest reply editor: replaces the early Guest Mode placeholder ACK with
166
+ * native Rich Markdown content addressed by `inline_message_id` instead of a
167
+ * chat/message pair.
168
+ */
169
+ export declare function createGuestMarkdownReplyEditor(deps: {
170
+ editGuestInlineMessage: (inlineMessageId: string, content: {
171
+ richMessage?: TelegramInputRichMessage;
172
+ text?: string;
173
+ }) => Promise<void>;
174
+ }): (inlineMessageId: string, markdown: string) => Promise<void>;
175
+ /**
176
+ * Guest Mode placeholder rotation: the early ACK is the first placeholder
177
+ * frame and the runtime steps the remaining frames once per interval, moving
178
+ * the globe every second while the trailing dots grow once every two seconds.
179
+ *
180
+ * Rotation completes whole six-frame cycles and only stops once at least
181
+ * `TELEGRAM_GUEST_PLACEHOLDER_MIN_MS` has elapsed, so a pending answer holds
182
+ * the finished cycle's last frame (`🌏 Working on it...`) instead of whatever
183
+ * step a hard time cap happens to cut. The `TELEGRAM_GUEST_PLACEHOLDER_MAX_MS`
184
+ * safety bound keeps the edit stream clear of the first flood-control
185
+ * rejections measured in live guest runs (+26.5 s at ~53 edits, +27.8 s at
186
+ * ~28 edits): rotation caps at 23 edits and never starts a frame after 26 s.
187
+ */
188
+ export declare const TELEGRAM_GUEST_PLACEHOLDER_FRAME_MS = 1000;
189
+ export declare const TELEGRAM_GUEST_PLACEHOLDER_MIN_MS = 20000;
190
+ export declare const TELEGRAM_GUEST_PLACEHOLDER_MAX_MS = 26000;
191
+ export declare const TELEGRAM_GUEST_PLACEHOLDER_FRAMES: readonly ["<b>🌎 Working on it.</b>", "<b>🌍 Working on it.</b>", "<b>🌏 Working on it..</b>", "<b>🌎 Working on it..</b>", "<b>🌍 Working on it...</b>", "<b>🌏 Working on it...</b>"];
192
+ export declare function buildTelegramGuestPlaceholderFrame(step: number): string;
193
+ export interface TelegramGuestPlaceholderRuntimeDeps {
194
+ editGuestInlineMessage: (inlineMessageId: string, content: {
195
+ text: string;
196
+ parseMode: "HTML";
197
+ }) => Promise<void>;
198
+ recordRuntimeEvent?: (category: string, error: unknown, details?: Record<string, unknown>) => void;
199
+ intervalMs?: number;
200
+ minMs?: number;
201
+ maxMs?: number;
202
+ now?: () => number;
203
+ setTimer?: (callback: () => void, ms: number) => ReturnType<typeof setTimeout>;
204
+ clearTimer?: (timer: ReturnType<typeof setTimeout>) => void;
205
+ }
206
+ export interface TelegramGuestPlaceholderRuntime {
207
+ /** Starts the frame loop on an answered guest inline message. */
208
+ start: (inlineMessageId: string) => void;
209
+ /** Cancels the loop and waits for any in-flight frame edit before returning. */
210
+ stop: (inlineMessageId: string) => Promise<void>;
211
+ /** Cancels every loop without waiting for in-flight edits (session shutdown). */
212
+ stopAll: () => void;
213
+ }
214
+ export declare function createTelegramGuestPlaceholderRuntime(deps: TelegramGuestPlaceholderRuntimeDeps): TelegramGuestPlaceholderRuntime;