@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,766 @@
1
+ /**
2
+ * Telegram queue core contracts and pure planning helpers
3
+ * Zones: telegram queue, pi agent lifecycle, scheduling
4
+ * Owns queue item contracts, lane admission, pure queue mutations, and dispatch planning
5
+ */
6
+ export interface QueuedAttachment {
7
+ path: string;
8
+ fileName: string;
9
+ }
10
+ export interface TelegramPromptTextContent {
11
+ type: "text";
12
+ text: string;
13
+ }
14
+ export interface TelegramPromptImageContent {
15
+ type: "image";
16
+ data: string;
17
+ mimeType: string;
18
+ }
19
+ export type TelegramPromptContent = TelegramPromptTextContent | TelegramPromptImageContent;
20
+ export type TelegramQueueItemKind = "prompt" | "control";
21
+ export type TelegramQueueLane = "control" | "priority" | "default";
22
+ export type TelegramQueueReactionDisposition = {
23
+ kind: "default";
24
+ } | {
25
+ kind: "priority";
26
+ emoji: string;
27
+ } | {
28
+ kind: "suppressed";
29
+ emoji: string;
30
+ } | {
31
+ kind: "priority-suppressed";
32
+ priorityEmoji: string;
33
+ suppressionEmoji: string;
34
+ } | {
35
+ kind: "reaction-transition";
36
+ priorityEmoji?: string | null;
37
+ suppressionEmoji?: string | null;
38
+ };
39
+ export interface TelegramQueueAdmissionReceipt {
40
+ queueKind: TelegramQueueItemKind;
41
+ receiptId: string;
42
+ sourceUpdateIds: readonly number[];
43
+ journalBindingKey?: string;
44
+ }
45
+ export type TelegramQueueAdmissionMode = "control-queue" | "priority-queue" | "default-queue";
46
+ export interface TelegramQueueLaneContract {
47
+ lane: TelegramQueueLane;
48
+ admissionMode: TelegramQueueAdmissionMode;
49
+ dispatchRank: number;
50
+ allowedKinds: readonly TelegramQueueItemKind[];
51
+ }
52
+ export declare const TELEGRAM_QUEUE_LANE_CONTRACTS: readonly TelegramQueueLaneContract[];
53
+ export interface TelegramQueueTarget {
54
+ chatId: number;
55
+ threadId?: number;
56
+ }
57
+ export interface TelegramTransportStamp {
58
+ profile: string;
59
+ generation: string;
60
+ }
61
+ export interface TelegramTransportStampRuntime {
62
+ getStamp(): TelegramTransportStamp;
63
+ isActive(stamp: TelegramTransportStamp | undefined): boolean;
64
+ }
65
+ export interface TelegramQueueItemBase {
66
+ kind: TelegramQueueItemKind;
67
+ chatId: number;
68
+ target?: TelegramQueueTarget;
69
+ transportStamp?: TelegramTransportStamp;
70
+ replyToMessageId: number;
71
+ guestQueryId?: string;
72
+ guestInlineMessageId?: string;
73
+ queueOrder: number;
74
+ queueLane: TelegramQueueLane;
75
+ laneOrder: number;
76
+ statusSummary: string;
77
+ admissionReceipts?: TelegramQueueAdmissionReceipt[];
78
+ }
79
+ export interface PendingTelegramTurn extends TelegramQueueItemBase {
80
+ kind: "prompt";
81
+ sourceMessageIds: number[];
82
+ queuedAttachments: QueuedAttachment[];
83
+ content: TelegramPromptContent[];
84
+ historyText: string;
85
+ priorityEmoji?: string;
86
+ reactionSuppressionEmoji?: string;
87
+ /** Turn should preferably be delivered as voice (mirror mode + user sent voice) */
88
+ voiceReplyPreferred?: boolean;
89
+ /** Turn must be delivered as voice (voice mode) */
90
+ voiceReplyRequired?: boolean;
91
+ }
92
+ export interface PendingTelegramControlItem<TContext = unknown> extends TelegramQueueItemBase {
93
+ kind: "control";
94
+ controlType: "status" | "model";
95
+ execute: (ctx: TContext) => Promise<void>;
96
+ }
97
+ export type TelegramQueueItem<TContext = unknown> = PendingTelegramTurn | PendingTelegramControlItem<TContext>;
98
+ export declare const TELEGRAM_QUEUE_HANDOFF_PAYLOAD_MAX_BYTES: number;
99
+ export declare const TELEGRAM_QUEUE_HANDOFF_MAX_RECEIPTS = 256;
100
+ export interface TelegramQueueHandoffBase {
101
+ chatId: number;
102
+ target?: TelegramQueueTarget;
103
+ transportStamp?: TelegramTransportStamp;
104
+ replyToMessageId: number;
105
+ guestQueryId?: string;
106
+ guestInlineMessageId?: string;
107
+ queueOrder: number;
108
+ queueLane: TelegramQueueLane;
109
+ laneOrder: number;
110
+ statusSummary: string;
111
+ admissionReceipts: TelegramQueueAdmissionReceipt[];
112
+ }
113
+ export interface TelegramPromptQueueHandoffPayload extends TelegramQueueHandoffBase {
114
+ kind: "prompt";
115
+ sourceMessageIds: number[];
116
+ queuedAttachments: QueuedAttachment[];
117
+ content: TelegramPromptContent[];
118
+ historyText: string;
119
+ priorityEmoji?: string;
120
+ reactionSuppressionEmoji?: string;
121
+ voiceReplyPreferred?: boolean;
122
+ voiceReplyRequired?: boolean;
123
+ }
124
+ export interface TelegramControlQueueHandoffPayload extends TelegramQueueHandoffBase {
125
+ kind: "control";
126
+ controlType: PendingTelegramControlItem<unknown>["controlType"];
127
+ }
128
+ export type TelegramQueueHandoffPayload = TelegramPromptQueueHandoffPayload | TelegramControlQueueHandoffPayload;
129
+ export interface TelegramQueueHandoff {
130
+ handoffToken: string;
131
+ payload: TelegramQueueHandoffPayload;
132
+ }
133
+ export interface TelegramQueueHandoffStageReceipt {
134
+ status: "staged";
135
+ receiptId: string;
136
+ sourceUpdateIds: readonly number[];
137
+ }
138
+ export interface TelegramQueueHandoffAcceptedOwner {
139
+ instanceId: string;
140
+ processId: number;
141
+ processBirthId: string;
142
+ sessionGeneration: number;
143
+ acquisitionId: string;
144
+ acquiredAtMs: number;
145
+ handoffId?: string;
146
+ }
147
+ export interface TelegramQueueHandoffStageResult extends TelegramQueueHandoffStageReceipt {
148
+ queueOwner: TelegramQueueHandoffAcceptedOwner;
149
+ }
150
+ export interface TelegramQueueHandoffStagingRuntime {
151
+ stage: (payload: TelegramQueueHandoffPayload) => TelegramQueueHandoffStageReceipt;
152
+ accept: (receipt: TelegramQueueAdmissionReceipt) => boolean;
153
+ cancel: (receipt: TelegramQueueAdmissionReceipt) => boolean;
154
+ hasStaged: (receipt: TelegramQueueAdmissionReceipt) => boolean;
155
+ }
156
+ export interface TelegramQueueStore<TContext = unknown> {
157
+ getQueuedItems: () => TelegramQueueItem<TContext>[];
158
+ setQueuedItems: (items: TelegramQueueItem<TContext>[]) => void;
159
+ }
160
+ export interface TelegramQueueStateStore<TContext = unknown> extends TelegramQueueStore<TContext> {
161
+ hasQueuedItems: () => boolean;
162
+ }
163
+ export interface TelegramActiveTurnStore<TTurn extends PendingTelegramTurn = PendingTelegramTurn> {
164
+ get: () => TTurn | undefined;
165
+ has: () => boolean;
166
+ set: (turn: TTurn) => void;
167
+ clear: () => void;
168
+ getChatId: () => number | undefined;
169
+ getTarget: () => TelegramQueueTarget | undefined;
170
+ getReplyToMessageId: () => number | undefined;
171
+ getGuestQueryId: () => string | undefined;
172
+ getSourceMessageIds: () => number[] | undefined;
173
+ }
174
+ export interface TelegramDispatchGuardState {
175
+ compactionInProgress: boolean;
176
+ hasActiveTelegramTurn: boolean;
177
+ hasPendingTelegramDispatch: boolean;
178
+ isIdle: boolean;
179
+ hasPendingMessages: boolean;
180
+ }
181
+ export declare function createTelegramQueueAdmissionReceipt(options: {
182
+ queueKind: TelegramQueueItemKind;
183
+ scope: string;
184
+ sourceUpdateIds: readonly number[];
185
+ }): TelegramQueueAdmissionReceipt | undefined;
186
+ export declare function isTelegramQueueItemDurablyAdmitted<TContext = unknown>(item: TelegramQueueItem<TContext>, isReceiptCommitted: (receipt: TelegramQueueAdmissionReceipt) => boolean): boolean;
187
+ export declare function getTelegramQueueLaneContract(lane: TelegramQueueLane): TelegramQueueLaneContract;
188
+ export declare function getTelegramQueueItemAdmissionMode(item: Pick<TelegramQueueItem, "queueLane">): TelegramQueueAdmissionMode;
189
+ export declare function isTelegramQueueItemAdmissionValid(item: Pick<TelegramQueueItem, "kind" | "queueLane">): boolean;
190
+ export declare function assertTelegramQueueItemAdmissionValid(item: Pick<TelegramQueueItem, "kind" | "queueLane" | "admissionReceipts">): void;
191
+ export declare function isPendingTelegramTurn<TContext = unknown>(item: TelegramQueueItem<TContext>): item is PendingTelegramTurn;
192
+ export declare function createTelegramQueueStore<TContext = unknown>(initialItems?: TelegramQueueItem<TContext>[]): TelegramQueueStateStore<TContext>;
193
+ export declare function createTelegramTransportStampRuntime(deps: {
194
+ getProfileName(): string | undefined;
195
+ getBotToken(): string | undefined;
196
+ }): TelegramTransportStampRuntime;
197
+ export declare function createTelegramTransportStampedQueueStore<TContext>(store: TelegramQueueStateStore<TContext>, getTransportStamp: () => TelegramTransportStamp): TelegramQueueStateStore<TContext>;
198
+ export declare function isTelegramQueueItemSkipped<TContext = unknown>(item: TelegramQueueItem<TContext>): boolean;
199
+ export declare function countExecutableTelegramQueueItems<TContext = unknown>(items: readonly TelegramQueueItem<TContext>[]): number;
200
+ export declare function createTelegramQueueItemCountGetter<TContext = unknown>(store: Pick<TelegramQueueStore<TContext>, "getQueuedItems">): () => number;
201
+ export declare function createTelegramActiveTurnStore<TTurn extends PendingTelegramTurn = PendingTelegramTurn>(): TelegramActiveTurnStore<TTurn>;
202
+ export declare function partitionTelegramQueueItemsForHistory<TContext = unknown>(items: TelegramQueueItem<TContext>[]): {
203
+ historyTurns: PendingTelegramTurn[];
204
+ remainingItems: TelegramQueueItem<TContext>[];
205
+ };
206
+ export declare function planTelegramPromptEnqueue<TContext = unknown>(items: TelegramQueueItem<TContext>[], foldQueuedPromptsIntoHistory: boolean): {
207
+ historyTurns: PendingTelegramTurn[];
208
+ remainingItems: TelegramQueueItem<TContext>[];
209
+ };
210
+ export declare function areTelegramQueueAdmissionReceiptsEqual(left: TelegramQueueAdmissionReceipt, right: TelegramQueueAdmissionReceipt): boolean;
211
+ export declare function appendTelegramQueueItem<TContext = unknown, TItem extends TelegramQueueItem<TContext> = TelegramQueueItem<TContext>>(items: TelegramQueueItem<TContext>[], item: TItem): TelegramQueueItem<TContext>[];
212
+ export declare function createTelegramQueueHandoff<TContext>(input: {
213
+ handoffToken: string;
214
+ item: TelegramQueueItem<TContext>;
215
+ }): TelegramQueueHandoff;
216
+ export declare function createTelegramQueueHandoffPayload<TContext>(item: TelegramQueueItem<TContext>): TelegramQueueHandoffPayload;
217
+ export declare function restoreTelegramQueueHandoffPayload<TContext>(payload: TelegramQueueHandoffPayload, createControlExecution: (payload: TelegramControlQueueHandoffPayload) => PendingTelegramControlItem<TContext>["execute"]): TelegramQueueItem<TContext>;
218
+ export declare function removeTelegramQueueItemByReceipt<TContext>(input: {
219
+ receipt: TelegramQueueAdmissionReceipt;
220
+ store: TelegramQueueStore<TContext>;
221
+ }): boolean;
222
+ export declare function stageTelegramQueueHandoffPayload<TContext>(input: {
223
+ payload: TelegramQueueHandoffPayload;
224
+ store: TelegramQueueStore<TContext>;
225
+ createControlExecution: (payload: TelegramControlQueueHandoffPayload) => PendingTelegramControlItem<TContext>["execute"];
226
+ }): TelegramQueueHandoffStageReceipt;
227
+ export declare function createTelegramQueueHandoffStagingRuntime<TContext>(input: {
228
+ liveStore: TelegramQueueStore<TContext>;
229
+ createControlExecution: (payload: TelegramControlQueueHandoffPayload) => PendingTelegramControlItem<TContext>["execute"];
230
+ }): TelegramQueueHandoffStagingRuntime;
231
+ export declare function appendTelegramPromptTurnOnce<TContext = unknown>(items: TelegramQueueItem<TContext>[], turn: PendingTelegramTurn): {
232
+ items: TelegramQueueItem<TContext>[];
233
+ appended: boolean;
234
+ };
235
+ export declare function compareTelegramQueueItems<TContext = unknown>(left: TelegramQueueItem<TContext>, right: TelegramQueueItem<TContext>): number;
236
+ export interface TelegramQueueMessageScope {
237
+ chatId?: number;
238
+ threadId?: number;
239
+ }
240
+ export declare function removeTelegramQueueItemsByMessageIds<TContext = unknown>(items: TelegramQueueItem<TContext>[], messageIds: number[], scope?: TelegramQueueMessageScope): {
241
+ items: TelegramQueueItem<TContext>[];
242
+ removedItems: TelegramQueueItem<TContext>[];
243
+ removedCount: number;
244
+ };
245
+ export declare function applyTelegramQueuePromptReactionDisposition<TContext = unknown>(items: TelegramQueueItem<TContext>[], messageId: number, disposition: TelegramQueueReactionDisposition, destinationLaneOrder?: number, scope?: TelegramQueueMessageScope): {
246
+ items: TelegramQueueItem<TContext>[];
247
+ changed: boolean;
248
+ };
249
+ export declare function consumeDispatchedTelegramPrompt<TContext = unknown>(items: TelegramQueueItem<TContext>[], hasPendingDispatch: boolean): {
250
+ activeTurn?: PendingTelegramTurn;
251
+ remainingItems: TelegramQueueItem<TContext>[];
252
+ };
253
+ export declare function formatQueuedTelegramItemsStatus<TContext = unknown>(items: TelegramQueueItem<TContext>[]): string;
254
+ export declare function truncateTelegramQueueSummary(text: string, maxWords?: number, maxLength?: number): string;
255
+ export declare function canDispatchTelegramTurnState(state: TelegramDispatchGuardState): boolean;
256
+ export interface TelegramDispatchReadinessDeps<TContext> {
257
+ isCompactionInProgress: () => boolean;
258
+ hasActiveTurn: () => boolean;
259
+ hasDispatchPending: () => boolean;
260
+ isIdle: (ctx: TContext) => boolean;
261
+ hasPendingMessages: (ctx: TContext) => boolean;
262
+ }
263
+ export declare function createTelegramDispatchReadinessChecker<TContext>(deps: TelegramDispatchReadinessDeps<TContext>): (ctx: TContext) => boolean;
264
+ export declare function buildPendingTelegramControlItem<TContext = unknown>(options: {
265
+ chatId: number;
266
+ target?: TelegramQueueTarget;
267
+ replyToMessageId: number;
268
+ controlType: PendingTelegramControlItem<TContext>["controlType"];
269
+ queueOrder: number;
270
+ laneOrder: number;
271
+ statusSummary: string;
272
+ admissionReceipts?: TelegramQueueAdmissionReceipt[];
273
+ execute: PendingTelegramControlItem<TContext>["execute"];
274
+ }): PendingTelegramControlItem<TContext>;
275
+ export interface TelegramControlItemBuilderDeps {
276
+ allocateItemOrder: () => number;
277
+ allocateControlOrder: () => number;
278
+ }
279
+ export declare function createTelegramControlItemBuilder<TContext = unknown>(deps: TelegramControlItemBuilderDeps): (options: {
280
+ chatId: number;
281
+ target?: TelegramQueueTarget;
282
+ replyToMessageId: number;
283
+ controlType: PendingTelegramControlItem<TContext>["controlType"];
284
+ statusSummary: string;
285
+ admissionReceipts?: TelegramQueueAdmissionReceipt[];
286
+ execute: PendingTelegramControlItem<TContext>["execute"];
287
+ }) => PendingTelegramControlItem<TContext>;
288
+ export type TelegramQueueDispatchAction<TContext = unknown> = {
289
+ kind: "none";
290
+ remainingItems: TelegramQueueItem<TContext>[];
291
+ } | {
292
+ kind: "control";
293
+ item: PendingTelegramControlItem<TContext>;
294
+ remainingItems: TelegramQueueItem<TContext>[];
295
+ } | {
296
+ kind: "prompt";
297
+ item: PendingTelegramTurn;
298
+ remainingItems: TelegramQueueItem<TContext>[];
299
+ };
300
+ export declare function planNextTelegramQueueAction<TContext = unknown>(items: TelegramQueueItem<TContext>[], canDispatch: boolean): TelegramQueueDispatchAction<TContext>;
301
+ export declare function shouldDispatchAfterTelegramAgentEnd(options: {
302
+ hasTurn: boolean;
303
+ stopReason?: string;
304
+ foldQueuedPromptsIntoHistory: boolean;
305
+ }): boolean;
306
+ export interface TelegramAgentStartPlan<TContext = unknown> {
307
+ activeTurn?: PendingTelegramTurn;
308
+ remainingItems: TelegramQueueItem<TContext>[];
309
+ shouldResetPendingModelSwitch: boolean;
310
+ shouldResetToolExecutions: boolean;
311
+ shouldClearDispatchPending: boolean;
312
+ shouldClearAbortHistory: boolean;
313
+ }
314
+ export interface TelegramAgentStartRuntimeDeps<TTurn extends PendingTelegramTurn, TContext = unknown> extends TelegramRuntimeEventRecorderPort {
315
+ queuedItems: TelegramQueueItem<TContext>[];
316
+ hasPendingDispatch: boolean;
317
+ hasActiveTurn: boolean;
318
+ resetToolExecutions: () => void;
319
+ resetPendingModelSwitch: () => void;
320
+ setQueuedItems: (items: TelegramQueueItem<TContext>[]) => void;
321
+ clearDispatchPending: () => void;
322
+ setFoldQueuedPromptsIntoHistory: (fold: boolean) => void;
323
+ setActiveTurn: (turn: TTurn) => void;
324
+ onPromptHandedOff?: (turn: TTurn) => void;
325
+ createPreviewState: () => void;
326
+ startTypingLoop: () => void;
327
+ updateStatus: () => void;
328
+ }
329
+ export interface TelegramAgentStartHookRuntimeDeps<TTurn extends PendingTelegramTurn, TContext = unknown> extends TelegramRuntimeEventRecorderPort {
330
+ setAbortHandler: (ctx: TContext) => void;
331
+ getQueuedItems: () => TelegramQueueItem<TContext>[];
332
+ hasPendingDispatch: () => boolean;
333
+ hasActiveTurn: () => boolean;
334
+ resetToolExecutions: () => void;
335
+ resetPendingModelSwitch: () => void;
336
+ setQueuedItems: (items: TelegramQueueItem<TContext>[]) => void;
337
+ clearDispatchPending: () => void;
338
+ setFoldQueuedPromptsIntoHistory: (fold: boolean) => void;
339
+ setActiveTurn: (turn: TTurn) => void;
340
+ onPromptHandedOff?: (turn: TTurn, ctx: TContext) => void;
341
+ createPreviewState: () => void;
342
+ startTypingLoop: (ctx: TContext) => void;
343
+ updateStatus: (ctx: TContext) => void;
344
+ }
345
+ export type TelegramAgentStartHookEvent = unknown;
346
+ export interface TelegramToolExecutionRuntimeDeps {
347
+ hasActiveTurn: () => boolean;
348
+ getActiveToolExecutions: () => number;
349
+ setActiveToolExecutions: (count: number) => void;
350
+ }
351
+ export interface TelegramToolExecutionEndRuntimeDeps extends TelegramToolExecutionRuntimeDeps {
352
+ triggerPendingModelSwitchAbort: () => void;
353
+ }
354
+ export interface TelegramToolExecutionHookRuntimeDeps<TContext> extends TelegramToolExecutionRuntimeDeps {
355
+ triggerPendingModelSwitchAbort: (ctx: TContext) => unknown;
356
+ }
357
+ export type TelegramToolExecutionHookEvent = unknown;
358
+ export declare function buildTelegramAgentStartPlan<TContext = unknown>(options: {
359
+ queuedItems: TelegramQueueItem<TContext>[];
360
+ hasPendingDispatch: boolean;
361
+ hasActiveTurn: boolean;
362
+ }): TelegramAgentStartPlan<TContext>;
363
+ export declare function handleTelegramAgentStartRuntime<TTurn extends PendingTelegramTurn, TContext = unknown>(deps: TelegramAgentStartRuntimeDeps<TTurn, TContext>): void;
364
+ export declare function createTelegramAgentStartHook<TTurn extends PendingTelegramTurn, TContext = unknown>(deps: TelegramAgentStartHookRuntimeDeps<TTurn, TContext>): (_event: TelegramAgentStartHookEvent, ctx: TContext) => Promise<void>;
365
+ export declare function getNextTelegramToolExecutionCount(options: {
366
+ hasActiveTurn: boolean;
367
+ currentCount: number;
368
+ event: "start" | "end";
369
+ }): number;
370
+ export declare function handleTelegramToolExecutionStartRuntime(deps: TelegramToolExecutionRuntimeDeps): void;
371
+ export declare function handleTelegramToolExecutionEndRuntime(deps: TelegramToolExecutionEndRuntimeDeps): void;
372
+ export type TelegramAgentLifecycleHooksRuntimeDeps<TTurn extends PendingTelegramTurn, TContext, TMessage, TReplyMarkup = unknown> = TelegramAgentStartHookRuntimeDeps<TTurn, TContext> & TelegramAgentEndHookRuntimeDeps<TTurn, TContext, TMessage, TReplyMarkup> & TelegramToolExecutionHookRuntimeDeps<TContext>;
373
+ export declare function createTelegramAgentLifecycleHooks<TTurn extends PendingTelegramTurn, TContext, TMessage, TReplyMarkup = unknown>(deps: TelegramAgentLifecycleHooksRuntimeDeps<TTurn, TContext, TMessage, TReplyMarkup>): {
374
+ onToolExecutionStart: () => void;
375
+ onToolExecutionEnd: (_event: TelegramToolExecutionHookEvent, ctx: TContext) => void;
376
+ onAgentStart: (_event: TelegramAgentStartHookEvent, ctx: TContext) => Promise<void>;
377
+ onAgentEnd(event: TelegramAgentEndHookEvent<TMessage>, ctx: TContext): Promise<void>;
378
+ onAgentSettled(_event: unknown, ctx: TContext): Promise<void>;
379
+ clearRetainedAgentEnd(): void;
380
+ };
381
+ export declare function createTelegramToolExecutionHooks<TContext>(deps: TelegramToolExecutionHookRuntimeDeps<TContext>): {
382
+ onToolExecutionStart: () => void;
383
+ onToolExecutionEnd: (_event: TelegramToolExecutionHookEvent, ctx: TContext) => void;
384
+ };
385
+ export interface TelegramAgentEndPlan {
386
+ kind: "no-turn" | "aborted" | "error" | "text" | "attachments-only" | "empty";
387
+ shouldClearPreview: boolean;
388
+ shouldDispatchNext: boolean;
389
+ shouldSendErrorMessage: boolean;
390
+ shouldSendAttachmentNotice: boolean;
391
+ }
392
+ export interface TelegramAgentEndAssistantResult {
393
+ text?: string;
394
+ stopReason?: string;
395
+ errorMessage?: string;
396
+ }
397
+ export interface TelegramAgentEndOutboundVoiceReply {
398
+ text: string;
399
+ lang?: string;
400
+ rate?: string;
401
+ }
402
+ export interface TelegramAgentEndOutboundReplyPlan<TReplyMarkup = unknown> {
403
+ markdown: string;
404
+ replyMarkup?: TReplyMarkup;
405
+ voiceText?: string;
406
+ voiceReplies?: TelegramAgentEndOutboundVoiceReply[];
407
+ lang?: string;
408
+ rate?: string;
409
+ }
410
+ export interface TelegramAgentEndRuntimeDeps<TTurn extends PendingTelegramTurn, TReplyMarkup = unknown> {
411
+ turn: TTurn | undefined;
412
+ assistant: TelegramAgentEndAssistantResult;
413
+ foldQueuedPromptsIntoHistory: boolean;
414
+ resetRuntimeState: () => void;
415
+ isSessionActive?: () => boolean;
416
+ isTurnTransportActive?: (turn: TTurn) => boolean;
417
+ waitForTypingIdle?: () => Promise<void>;
418
+ waitForActivityIdle?: () => Promise<void>;
419
+ updateStatus: () => void;
420
+ dispatchNextQueuedTelegramTurn: () => void;
421
+ scheduleActiveTurnDelivery?: (task: () => Promise<void>) => void;
422
+ preparePreviewDelivery?: (isDeliveryActive: () => boolean) => Pick<TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>, "clearPreview" | "setPreviewPendingText" | "finalizeMarkdownPreview"> | undefined;
423
+ preparePreviewClear?: (chatId: number, options?: {
424
+ target?: TelegramQueueTarget;
425
+ isDeliveryActive?: () => boolean;
426
+ }) => () => Promise<void>;
427
+ clearPreview: (chatId: number, options?: {
428
+ target?: TelegramQueueTarget;
429
+ }) => Promise<void>;
430
+ setPreviewPendingText: (text: string) => void;
431
+ finalizeMarkdownPreview: (chatId: number, markdown: string, replyToMessageId: number, options?: {
432
+ replyMarkup?: TReplyMarkup;
433
+ target?: TelegramQueueTarget;
434
+ }) => Promise<boolean>;
435
+ sendMarkdownReply: (chatId: number, replyToMessageId: number | undefined, markdown: string, options?: {
436
+ replyMarkup?: TReplyMarkup;
437
+ target?: TelegramQueueTarget;
438
+ }) => Promise<unknown>;
439
+ sendTextReply: (chatId: number, replyToMessageId: number, text: string, options?: {
440
+ target?: TelegramQueueTarget;
441
+ parseMode?: "HTML";
442
+ }) => Promise<unknown>;
443
+ sendQueuedAttachments: (turn: TTurn, options?: {
444
+ isDeliveryActive?: () => boolean;
445
+ }) => Promise<void>;
446
+ sendRichAttachmentReply?: (turn: TTurn, markdown: string, options?: {
447
+ replyMarkup?: TReplyMarkup;
448
+ isDeliveryActive?: () => boolean;
449
+ }) => Promise<boolean>;
450
+ answerGuestQuery?: (guestQueryId: string, text?: string, options?: {
451
+ parseMode?: string;
452
+ }) => Promise<void>;
453
+ sendGuestReply?: (guestQueryId: string, markdown: string) => Promise<void>;
454
+ /** Replaces the early guest ACK with the final text. */
455
+ editGuestReply?: (inlineMessageId: string, markdown: string) => Promise<void>;
456
+ /** Cancels the animated guest placeholder before the final edit. */
457
+ stopGuestPlaceholder?: (inlineMessageId: string) => Promise<void>;
458
+ sendGuestAttachment?: (turn: TTurn, attachment: QueuedAttachment, caption?: string) => Promise<void>;
459
+ sendGuestVoiceReply?: (turn: TTurn, plan: TelegramAgentEndOutboundReplyPlan<TReplyMarkup>, caption?: string) => Promise<void>;
460
+ planOutboundReply?: (markdown: string) => TelegramAgentEndOutboundReplyPlan<TReplyMarkup>;
461
+ sendOutboundReplyArtifacts?: (turn: TTurn, plan: TelegramAgentEndOutboundReplyPlan, options?: {
462
+ replyToPrompt?: boolean;
463
+ isDeliveryActive?: () => boolean;
464
+ }) => Promise<void>;
465
+ recordRuntimeEvent?: (category: string, error: unknown, details?: Record<string, unknown>) => void;
466
+ }
467
+ export interface TelegramAgentEndHookRuntimeDeps<TTurn extends PendingTelegramTurn, TContext, TMessage, TReplyMarkup = unknown> {
468
+ getActiveTurn: () => TTurn | undefined;
469
+ loadConfig?: () => Promise<void>;
470
+ extractAssistant: (messages: readonly TMessage[]) => TelegramAgentEndAssistantResult;
471
+ getFoldQueuedPromptsIntoHistory: () => boolean;
472
+ resetRuntimeState: () => void;
473
+ isSessionActive?: (ctx: TContext) => boolean;
474
+ isTurnTransportActive?: (turn: TTurn) => boolean;
475
+ waitForTypingIdle?: () => Promise<void>;
476
+ waitForActivityIdle?: () => Promise<void>;
477
+ updateStatus: (ctx: TContext) => void;
478
+ dispatchNextQueuedTelegramTurn: (ctx: TContext) => void;
479
+ requestDeferredDispatchNextQueuedTelegramTurn: (dispatch: (ctx: TContext) => void) => void;
480
+ scheduleActiveTurnDelivery?: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["scheduleActiveTurnDelivery"];
481
+ reserveActiveTurnDelivery?: () => {
482
+ schedule: (task: () => Promise<void>) => void;
483
+ cancel: () => void;
484
+ };
485
+ preparePreviewDelivery?: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["preparePreviewDelivery"];
486
+ preparePreviewClear?: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["preparePreviewClear"];
487
+ clearPreview: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["clearPreview"];
488
+ setPreviewPendingText: (text: string) => void;
489
+ finalizeMarkdownPreview: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["finalizeMarkdownPreview"];
490
+ sendMarkdownReply: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["sendMarkdownReply"];
491
+ sendTextReply: TelegramAgentEndRuntimeDeps<TTurn>["sendTextReply"];
492
+ sendQueuedAttachments: TelegramAgentEndRuntimeDeps<TTurn>["sendQueuedAttachments"];
493
+ sendRichAttachmentReply?: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["sendRichAttachmentReply"];
494
+ answerGuestQuery?: TelegramAgentEndRuntimeDeps<TTurn>["answerGuestQuery"];
495
+ sendGuestReply?: TelegramAgentEndRuntimeDeps<TTurn>["sendGuestReply"];
496
+ editGuestReply?: TelegramAgentEndRuntimeDeps<TTurn>["editGuestReply"];
497
+ stopGuestPlaceholder?: TelegramAgentEndRuntimeDeps<TTurn>["stopGuestPlaceholder"];
498
+ sendGuestAttachment?: TelegramAgentEndRuntimeDeps<TTurn>["sendGuestAttachment"];
499
+ sendGuestVoiceReply?: TelegramAgentEndRuntimeDeps<TTurn>["sendGuestVoiceReply"];
500
+ planOutboundReply?: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>["planOutboundReply"];
501
+ sendOutboundReplyArtifacts?: TelegramAgentEndRuntimeDeps<TTurn>["sendOutboundReplyArtifacts"];
502
+ recordRuntimeEvent?: TelegramAgentEndRuntimeDeps<TTurn>["recordRuntimeEvent"];
503
+ }
504
+ export interface TelegramAgentEndHookEvent<TMessage> {
505
+ messages: readonly TMessage[];
506
+ }
507
+ export declare function buildTelegramAgentEndPlan(options: {
508
+ hasTurn: boolean;
509
+ stopReason?: string;
510
+ hasFinalText: boolean;
511
+ hasQueuedAttachments: boolean;
512
+ foldQueuedPromptsIntoHistory: boolean;
513
+ }): TelegramAgentEndPlan;
514
+ export declare function createTelegramAgentEndHook<TTurn extends PendingTelegramTurn, TContext, TMessage, TReplyMarkup = unknown>(deps: TelegramAgentEndHookRuntimeDeps<TTurn, TContext, TMessage, TReplyMarkup>): (event: TelegramAgentEndHookEvent<TMessage>, ctx: TContext, assistantOverride?: TelegramAgentEndAssistantResult) => Promise<void>;
515
+ export declare function handleTelegramAgentEndRuntime<TTurn extends PendingTelegramTurn, TReplyMarkup = unknown>(deps: TelegramAgentEndRuntimeDeps<TTurn, TReplyMarkup>): Promise<void>;
516
+ export interface TelegramSessionStartState<TModel = unknown> {
517
+ currentTelegramModel: TModel | undefined;
518
+ activeTelegramToolExecutions: number;
519
+ pendingTelegramModelSwitch: undefined;
520
+ nextQueuedTelegramItemOrder: number;
521
+ nextQueuedTelegramControlOrder: number;
522
+ telegramTurnDispatchPending: boolean;
523
+ compactionInProgress: boolean;
524
+ }
525
+ export interface TelegramSessionShutdownState<TQueueItem> {
526
+ queuedTelegramItems: TQueueItem[];
527
+ nextQueuedTelegramItemOrder: number;
528
+ nextQueuedTelegramControlOrder: number;
529
+ currentTelegramModel: undefined;
530
+ activeTelegramToolExecutions: number;
531
+ pendingTelegramModelSwitch: undefined;
532
+ telegramTurnDispatchPending: boolean;
533
+ compactionInProgress: boolean;
534
+ foldQueuedPromptsIntoHistory: boolean;
535
+ }
536
+ export interface TelegramSessionRuntimeCounterState {
537
+ nextQueuedTelegramItemOrder?: number;
538
+ nextQueuedTelegramControlOrder?: number;
539
+ }
540
+ export interface TelegramSessionRuntimeFlagState {
541
+ activeTelegramToolExecutions?: number;
542
+ telegramTurnDispatchPending?: boolean;
543
+ compactionInProgress?: boolean;
544
+ foldQueuedPromptsIntoHistory?: boolean;
545
+ }
546
+ export interface TelegramSessionStateApplierDeps<TQueueItem, TModel> {
547
+ setQueuedItems: (items: TQueueItem[]) => void;
548
+ setCurrentModel: (model: TModel | undefined) => void;
549
+ setPendingModelSwitch: (selection: undefined) => void;
550
+ syncCounters: (state: TelegramSessionRuntimeCounterState) => void;
551
+ syncFlags: (state: TelegramSessionRuntimeFlagState) => void;
552
+ }
553
+ export interface TelegramSessionStateApplier<TQueueItem, TModel> {
554
+ applyStartState: (state: TelegramSessionStartState<TModel>) => void;
555
+ applyShutdownState: (state: TelegramSessionShutdownState<TQueueItem>) => void;
556
+ }
557
+ export interface TelegramSessionStartRuntimeDeps<TContext, TModel = unknown> {
558
+ ctx: TContext;
559
+ currentModel: TModel | undefined;
560
+ loadConfig: () => Promise<void>;
561
+ isSessionActive?: () => boolean;
562
+ applyState: (state: TelegramSessionStartState<TModel>) => void;
563
+ bindDeferredDispatchContext?: (ctx: TContext) => void;
564
+ prepareTempDir: () => Promise<unknown>;
565
+ updateStatus: () => void;
566
+ }
567
+ export interface TelegramSessionShutdownRuntimeDeps<TQueueItem> {
568
+ isSessionActive?: () => boolean;
569
+ unbindDeferredDispatchContext?: () => void;
570
+ discardQueuedItems?: () => void;
571
+ applyState: (state: TelegramSessionShutdownState<TQueueItem>) => void;
572
+ clearPendingMediaGroups: () => void;
573
+ clearModelMenuState: () => void;
574
+ getActiveTurnChatId: () => number | undefined;
575
+ getActiveTurnTarget?: () => TelegramQueueTarget | undefined;
576
+ clearPreview: (chatId: number, options?: {
577
+ target?: TelegramQueueTarget;
578
+ }) => Promise<void>;
579
+ previewShutdownTimeoutMs?: number;
580
+ clearActiveTurn: () => void;
581
+ clearAbort: () => void;
582
+ stopPolling: () => Promise<void>;
583
+ }
584
+ export interface TelegramSessionLifecycleHookRuntimeDeps<TContext, TQueueItem, TModel = unknown> extends TelegramRuntimeEventRecorderPort {
585
+ getCurrentModel: (ctx: TContext) => TModel | undefined;
586
+ loadConfig: () => Promise<void>;
587
+ applySessionStartState: (state: TelegramSessionStartState<TModel>) => void;
588
+ bindDeferredDispatchContext?: (ctx: TContext) => void;
589
+ prepareTempDir: () => Promise<unknown>;
590
+ updateStatus: (ctx: TContext) => void;
591
+ isSessionActive?: (ctx: TContext) => boolean;
592
+ unbindDeferredDispatchContext?: () => void;
593
+ discardQueuedItems?: (ctx: TContext) => void;
594
+ applySessionShutdownState: (state: TelegramSessionShutdownState<TQueueItem>) => void;
595
+ clearPendingMediaGroups: () => void;
596
+ clearModelMenuState: () => void;
597
+ getActiveTurnChatId: () => number | undefined;
598
+ getActiveTurnTarget?: () => TelegramQueueTarget | undefined;
599
+ clearPreview: (chatId: number, options?: {
600
+ target?: TelegramQueueTarget;
601
+ }) => Promise<void>;
602
+ previewShutdownTimeoutMs?: number;
603
+ clearActiveTurn: () => void;
604
+ clearAbort: () => void;
605
+ stopPolling: () => Promise<void>;
606
+ }
607
+ export type TelegramSessionLifecycleHookEvent = unknown;
608
+ export declare function createTelegramSessionStateApplier<TQueueItem, TModel>(deps: TelegramSessionStateApplierDeps<TQueueItem, TModel>): TelegramSessionStateApplier<TQueueItem, TModel>;
609
+ export interface TelegramQueueMutationRuntimeDeps<TContext> extends TelegramQueueStore<TContext>, TelegramRuntimeEventRecorderPort {
610
+ ctx: TContext;
611
+ allocateLaneOrder?: () => number;
612
+ onItemsDiscarded?: (items: readonly TelegramQueueItem<TContext>[], ctx: TContext) => void;
613
+ updateStatus: (ctx: TContext) => void;
614
+ }
615
+ export interface TelegramQueueMutationControllerDeps<TContext> extends TelegramQueueStore<TContext>, TelegramRuntimeEventRecorderPort {
616
+ allocateLaneOrder?: () => number;
617
+ onItemsDiscarded?: (items: readonly TelegramQueueItem<TContext>[], ctx: TContext) => void;
618
+ updateStatus: (ctx: TContext) => void;
619
+ }
620
+ export interface TelegramQueueMutationController<TContext> {
621
+ append: (item: TelegramQueueItem<TContext>, ctx: TContext) => void;
622
+ reorder: (ctx: TContext) => void;
623
+ clear: (ctx: TContext) => number;
624
+ removeByMessageIds: (messageIds: number[], ctx: TContext, scope?: TelegramQueueMessageScope) => number;
625
+ applyReactionByMessageId: (messageId: number, disposition: TelegramQueueReactionDisposition, ctx: TContext, scope?: TelegramQueueMessageScope) => boolean;
626
+ }
627
+ export interface TelegramControlQueueControllerDeps<TContext> {
628
+ appendControlItem: (item: PendingTelegramControlItem<TContext>, ctx: TContext) => void;
629
+ dispatchNextQueuedTelegramTurn: (ctx: TContext) => void;
630
+ }
631
+ export interface TelegramControlQueueController<TContext> {
632
+ enqueue: (item: PendingTelegramControlItem<TContext>, ctx: TContext, onQueued?: (item: PendingTelegramControlItem<TContext>) => void) => void;
633
+ }
634
+ export type TelegramPreparedPromptTurn = (historyTurns: PendingTelegramTurn[]) => PendingTelegramTurn;
635
+ export interface TelegramPromptEnqueueRuntimeDeps<TMessage, TContext = unknown> extends TelegramQueueStore<TContext> {
636
+ hasPendingDispatch: () => boolean;
637
+ getFoldQueuedPromptsIntoHistory: () => boolean;
638
+ setFoldQueuedPromptsIntoHistory: (fold: boolean) => void;
639
+ prepareTurn: (messages: TMessage[]) => Promise<TelegramPreparedPromptTurn>;
640
+ updateStatus: () => void;
641
+ dispatchNextQueuedTelegramTurn: () => void;
642
+ assertExecutionCurrent?: () => void;
643
+ onQueued?: (turn: PendingTelegramTurn) => void;
644
+ }
645
+ export interface TelegramPromptEnqueueControllerDeps<TMessage, TContext = unknown> extends TelegramQueueStore<TContext> {
646
+ hasPendingDispatch: () => boolean;
647
+ getFoldQueuedPromptsIntoHistory: () => boolean;
648
+ setFoldQueuedPromptsIntoHistory: (fold: boolean) => void;
649
+ prepareTurn: (messages: TMessage[], ctx: TContext) => Promise<TelegramPreparedPromptTurn>;
650
+ updateStatus: (ctx: TContext) => void;
651
+ dispatchNextQueuedTelegramTurn: (ctx: TContext) => void;
652
+ assertExecutionCurrent?: (messages: TMessage[]) => void;
653
+ }
654
+ export interface TelegramPromptEnqueueController<TMessage, TContext = unknown> {
655
+ enqueue: (messages: TMessage[], ctx: TContext, onQueued?: (turn: PendingTelegramTurn) => void) => Promise<PendingTelegramTurn>;
656
+ }
657
+ export declare function buildTelegramSessionStartState<TModel = unknown>(currentModel: TModel | undefined): TelegramSessionStartState<TModel>;
658
+ export declare function buildTelegramSessionShutdownState<TQueueItem>(): TelegramSessionShutdownState<TQueueItem>;
659
+ export declare function startTelegramSessionRuntime<TContext, TModel = unknown>(deps: TelegramSessionStartRuntimeDeps<TContext, TModel>): Promise<void>;
660
+ export declare function shutdownTelegramSessionRuntime<TQueueItem>(deps: TelegramSessionShutdownRuntimeDeps<TQueueItem>): Promise<void>;
661
+ export type TelegramSessionLifecycleRuntimeDeps<TContext, TQueueItem, TModel = unknown> = Omit<TelegramSessionLifecycleHookRuntimeDeps<TContext, TQueueItem, TModel>, "applySessionStartState" | "applySessionShutdownState"> & TelegramSessionStateApplierDeps<TQueueItem, TModel>;
662
+ export declare function createTelegramSessionLifecycleRuntime<TContext, TQueueItem, TModel = unknown>(deps: TelegramSessionLifecycleRuntimeDeps<TContext, TQueueItem, TModel>): {
663
+ onSessionStart: (_event: TelegramSessionLifecycleHookEvent, ctx: TContext) => Promise<void>;
664
+ onSessionShutdown: (_event?: TelegramSessionLifecycleHookEvent, ctx?: TContext | undefined) => Promise<void>;
665
+ };
666
+ export declare function createTelegramSessionLifecycleHooks<TContext, TQueueItem, TModel = unknown>(deps: TelegramSessionLifecycleHookRuntimeDeps<TContext, TQueueItem, TModel>): {
667
+ onSessionStart: (_event: TelegramSessionLifecycleHookEvent, ctx: TContext) => Promise<void>;
668
+ onSessionShutdown: (_event?: TelegramSessionLifecycleHookEvent, ctx?: TContext) => Promise<void>;
669
+ };
670
+ export declare function createTelegramQueueMutationController<TContext>(deps: TelegramQueueMutationControllerDeps<TContext>): TelegramQueueMutationController<TContext>;
671
+ export declare function reorderTelegramQueueItemsRuntime<TContext>(deps: TelegramQueueMutationRuntimeDeps<TContext>): void;
672
+ export declare function clearTelegramQueueItemsRuntime<TContext>(deps: TelegramQueueMutationRuntimeDeps<TContext>): number;
673
+ export declare function removeTelegramQueueItemsByMessageIdsRuntime<TContext>(messageIds: number[], deps: TelegramQueueMutationRuntimeDeps<TContext>, scope?: TelegramQueueMessageScope): number;
674
+ export declare function applyTelegramQueuePromptReactionDispositionRuntime<TContext>(messageId: number, disposition: TelegramQueueReactionDisposition, deps: TelegramQueueMutationRuntimeDeps<TContext>, scope?: TelegramQueueMessageScope): boolean;
675
+ export declare function enqueueTelegramPromptTurnRuntime<TMessage, TContext = unknown>(messages: TMessage[], deps: TelegramPromptEnqueueRuntimeDeps<TMessage, TContext>): Promise<PendingTelegramTurn>;
676
+ export declare function createTelegramPromptEnqueueController<TMessage, TContext = unknown>(deps: TelegramPromptEnqueueControllerDeps<TMessage, TContext>): TelegramPromptEnqueueController<TMessage, TContext>;
677
+ export declare function createTelegramControlQueueController<TContext>(deps: TelegramControlQueueControllerDeps<TContext>): TelegramControlQueueController<TContext>;
678
+ export interface TelegramRuntimeEventRecorderPort {
679
+ recordRuntimeEvent?: (category: string, error: unknown, details?: Record<string, unknown>) => void;
680
+ }
681
+ export interface TelegramControlRuntimeDeps<TContext> extends TelegramRuntimeEventRecorderPort {
682
+ ctx: TContext;
683
+ sendTextReply: (chatId: number, replyToMessageId: number, text: string, options?: {
684
+ target?: TelegramQueueTarget;
685
+ }) => Promise<number | undefined>;
686
+ onSettled: (item: PendingTelegramControlItem<TContext>) => void;
687
+ }
688
+ export declare function executeTelegramControlItemRuntime<TContext>(item: PendingTelegramControlItem<TContext>, deps: TelegramControlRuntimeDeps<TContext>): Promise<void>;
689
+ export interface TelegramDeferredQueueDispatchRuntimeDeps extends TelegramRuntimeEventRecorderPort {
690
+ delayMs?: number;
691
+ setTimer?: (callback: () => void, ms: number) => ReturnType<typeof setTimeout>;
692
+ clearTimer?: (timer: ReturnType<typeof setTimeout>) => void;
693
+ }
694
+ export interface TelegramDeferredQueueDispatchRuntime<TContext = unknown> {
695
+ bind: (ctx: TContext) => void;
696
+ unbind: () => void;
697
+ isBound: () => boolean;
698
+ getGeneration: () => number;
699
+ isGenerationActive: (generation: number) => boolean;
700
+ request: (dispatchNextQueuedTelegramTurn: (ctx: TContext) => void) => void;
701
+ }
702
+ /**
703
+ * Production debounce for deferred queue dispatch; the factory defaults to this
704
+ * so the entrypoint wires ports instead of policy constants.
705
+ */
706
+ export declare const TELEGRAM_DEFERRED_DISPATCH_DELAY_MS = 50;
707
+ export declare function createTelegramDeferredQueueDispatchRuntime<TContext = unknown>(deps?: TelegramDeferredQueueDispatchRuntimeDeps): TelegramDeferredQueueDispatchRuntime<TContext>;
708
+ export interface TelegramQueueDispatchWatchdogRuntime<TContext = unknown> {
709
+ start: (ctx: TContext) => void;
710
+ stop: () => void;
711
+ poke: () => void;
712
+ }
713
+ export interface TelegramQueueDispatchWatchdogRuntimeDeps<TContext = unknown> extends TelegramRuntimeEventRecorderPort {
714
+ hasQueuedItems: () => boolean;
715
+ dispatchNextQueuedTelegramTurn: (ctx: TContext) => void;
716
+ intervalMs?: number;
717
+ setInterval?: (callback: () => void, ms: number) => ReturnType<typeof setInterval>;
718
+ clearInterval?: (timer: ReturnType<typeof setInterval>) => void;
719
+ }
720
+ export declare function createTelegramQueueDispatchWatchdogRuntime<TContext = unknown>(deps: TelegramQueueDispatchWatchdogRuntimeDeps<TContext>): TelegramQueueDispatchWatchdogRuntime<TContext>;
721
+ export interface TelegramPromptDeliveryOptions {
722
+ deliverAs: "followUp";
723
+ }
724
+ export interface TelegramDispatchRuntimeDeps<TContext = unknown> {
725
+ executeControlItem: (item: Extract<TelegramQueueDispatchAction<TContext>, {
726
+ kind: "control";
727
+ }>["item"]) => void;
728
+ onPromptDispatchStart: (chatId: number) => void;
729
+ commitPromptDispatch?: (item: Extract<TelegramQueueDispatchAction<TContext>, {
730
+ kind: "prompt";
731
+ }>["item"]) => boolean;
732
+ sendUserMessage: (content: Extract<TelegramQueueDispatchAction, {
733
+ kind: "prompt";
734
+ }>["item"]["content"], options?: TelegramPromptDeliveryOptions) => void;
735
+ onPromptDispatchFailure: (message: string) => void;
736
+ onIdle: () => void;
737
+ }
738
+ export interface TelegramQueueDispatchControllerDeps<TContext = unknown> extends TelegramRuntimeEventRecorderPort {
739
+ getQueuedItems: () => TelegramQueueItem<TContext>[];
740
+ setQueuedItems: (items: TelegramQueueItem<TContext>[]) => void;
741
+ canDispatch: (ctx: TContext) => boolean;
742
+ hasDispatchContext?: () => boolean;
743
+ getDispatchGeneration?: () => number;
744
+ isDispatchGenerationActive?: (generation: number) => boolean;
745
+ updateStatus: (ctx: TContext, error?: string) => void;
746
+ sendTextReply: TelegramControlRuntimeDeps<TContext>["sendTextReply"];
747
+ onPromptDispatchStart: (ctx: TContext, chatId: number) => void;
748
+ commitPromptDispatch?: (item: Extract<TelegramQueueDispatchAction<TContext>, {
749
+ kind: "prompt";
750
+ }>["item"], ctx: TContext) => boolean;
751
+ sendUserMessage: TelegramDispatchRuntimeDeps<TContext>["sendUserMessage"];
752
+ onPromptDispatchFailure: (ctx: TContext, message: string) => void;
753
+ isQueueItemTransportActive?: (item: TelegramQueueItem<TContext>) => boolean;
754
+ hasPendingInboundQueueMutationForItem?: (item: TelegramQueueItem<TContext>) => boolean;
755
+ isQueueItemAdmissionReady?: (item: TelegramQueueItem<TContext>) => boolean;
756
+ onControlSettled?: (item: PendingTelegramControlItem<TContext>, ctx: TContext) => void;
757
+ onPromptSkipped?: (item: PendingTelegramTurn, ctx: TContext) => boolean;
758
+ }
759
+ export interface TelegramQueueDispatchController<TContext = unknown> {
760
+ dispatchNext: (ctx: TContext) => void;
761
+ requestNextDispatchAnnouncement: () => void;
762
+ }
763
+ export declare function executeTelegramQueueDispatchPlan<TContext = unknown>(plan: TelegramQueueDispatchAction<TContext>, deps: TelegramDispatchRuntimeDeps<TContext>): void;
764
+ export type TelegramQueueDispatchRuntimeDeps<TContext = unknown> = Omit<TelegramQueueDispatchControllerDeps<TContext>, "canDispatch"> & TelegramDispatchReadinessDeps<TContext>;
765
+ export declare function createTelegramQueueDispatchRuntime<TContext = unknown>(deps: TelegramQueueDispatchRuntimeDeps<TContext>): TelegramQueueDispatchController<TContext>;
766
+ export declare function createTelegramQueueDispatchController<TContext = unknown>(deps: TelegramQueueDispatchControllerDeps<TContext>): TelegramQueueDispatchController<TContext>;