@llblab/pi-telegram 0.52.2 → 0.53.1

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 +9 -7
  2. package/BACKLOG.md +1 -18
  3. package/CHANGELOG.md +15 -0
  4. package/README.md +7 -11
  5. package/api/commands.ts +3 -0
  6. package/dist/api/commands.d.ts +1 -1
  7. package/dist/lib/activity-verbosity.d.ts +1 -5
  8. package/dist/lib/activity-verbosity.js +15 -42
  9. package/dist/lib/activity.d.ts +9 -0
  10. package/dist/lib/activity.js +39 -10
  11. package/dist/lib/agent-messages.js +7 -3
  12. package/dist/lib/bindings.d.ts +43 -5
  13. package/dist/lib/bindings.js +163 -20
  14. package/dist/lib/bus-api.d.ts +12 -0
  15. package/dist/lib/bus-api.js +182 -79
  16. package/dist/lib/bus-follower.d.ts +111 -31
  17. package/dist/lib/bus-follower.js +1324 -359
  18. package/dist/lib/bus-leader.d.ts +41 -91
  19. package/dist/lib/bus-leader.js +969 -637
  20. package/dist/lib/bus-transport.js +16 -9
  21. package/dist/lib/bus.d.ts +215 -18
  22. package/dist/lib/bus.js +1048 -327
  23. package/dist/lib/channel-posts.d.ts +5 -0
  24. package/dist/lib/channel-posts.js +434 -261
  25. package/dist/lib/command-templates.d.ts +26 -5
  26. package/dist/lib/command-templates.js +92 -176
  27. package/dist/lib/commands.d.ts +168 -82
  28. package/dist/lib/commands.js +1409 -291
  29. package/dist/lib/config.d.ts +1 -8
  30. package/dist/lib/config.js +34 -76
  31. package/dist/lib/delivery.d.ts +2 -2
  32. package/dist/lib/delivery.js +16 -16
  33. package/dist/lib/extension.js +639 -171
  34. package/dist/lib/generative-app-worker.mjs +19 -7
  35. package/dist/lib/generative-apps.d.ts +0 -5
  36. package/dist/lib/generative-apps.js +61 -49
  37. package/dist/lib/inbound.d.ts +5 -0
  38. package/dist/lib/inbound.js +35 -59
  39. package/dist/lib/journal.d.ts +33 -3
  40. package/dist/lib/journal.js +2063 -782
  41. package/dist/lib/lifecycle.d.ts +2 -6
  42. package/dist/lib/lifecycle.js +75 -58
  43. package/dist/lib/locks.d.ts +29 -3
  44. package/dist/lib/locks.js +289 -108
  45. package/dist/lib/logging.js +50 -14
  46. package/dist/lib/media.d.ts +22 -1
  47. package/dist/lib/media.js +46 -28
  48. package/dist/lib/menu-model.d.ts +19 -5
  49. package/dist/lib/menu-model.js +53 -11
  50. package/dist/lib/menu-queue.d.ts +5 -4
  51. package/dist/lib/menu-queue.js +45 -63
  52. package/dist/lib/menu-settings.d.ts +5 -4
  53. package/dist/lib/menu-settings.js +114 -78
  54. package/dist/lib/menu-status.d.ts +1 -1
  55. package/dist/lib/menu-status.js +8 -25
  56. package/dist/lib/menu-thinking.d.ts +6 -1
  57. package/dist/lib/menu-thinking.js +14 -21
  58. package/dist/lib/menu.d.ts +8 -61
  59. package/dist/lib/menu.js +92 -164
  60. package/dist/lib/model.d.ts +1 -1
  61. package/dist/lib/model.js +2 -16
  62. package/dist/lib/outbound-attachments.d.ts +6 -27
  63. package/dist/lib/outbound-attachments.js +45 -38
  64. package/dist/lib/outbound-buttons.js +22 -16
  65. package/dist/lib/outbound-markup.d.ts +0 -2
  66. package/dist/lib/outbound-markup.js +51 -64
  67. package/dist/lib/outbound-voice.js +6 -3
  68. package/dist/lib/outbound.d.ts +6 -6
  69. package/dist/lib/outbound.js +65 -51
  70. package/dist/lib/ownership.js +6 -2
  71. package/dist/lib/paths.d.ts +5 -0
  72. package/dist/lib/paths.js +37 -21
  73. package/dist/lib/pi.d.ts +2 -0
  74. package/dist/lib/pi.js +8 -1
  75. package/dist/lib/polling.d.ts +21 -37
  76. package/dist/lib/polling.js +59 -50
  77. package/dist/lib/preview.js +39 -19
  78. package/dist/lib/process-identity.d.ts +24 -0
  79. package/dist/lib/process-identity.js +133 -0
  80. package/dist/lib/prompts.js +2 -7
  81. package/dist/lib/queue.d.ts +14 -16
  82. package/dist/lib/queue.js +252 -127
  83. package/dist/lib/recovery.d.ts +2 -83
  84. package/dist/lib/recovery.js +20 -274
  85. package/dist/lib/replies.d.ts +16 -24
  86. package/dist/lib/replies.js +99 -116
  87. package/dist/lib/routing.d.ts +120 -7
  88. package/dist/lib/routing.js +4667 -1152
  89. package/dist/lib/runtime.d.ts +1 -11
  90. package/dist/lib/sections.d.ts +4 -29
  91. package/dist/lib/sections.js +7 -20
  92. package/dist/lib/skills.js +4 -3
  93. package/dist/lib/status.js +86 -57
  94. package/dist/lib/sync.d.ts +1 -3
  95. package/dist/lib/sync.js +67 -43
  96. package/dist/lib/target.d.ts +4 -0
  97. package/dist/lib/target.js +18 -0
  98. package/dist/lib/telegram-api.d.ts +18 -13
  99. package/dist/lib/telegram-api.js +148 -53
  100. package/dist/lib/text-groups.js +4 -39
  101. package/dist/lib/thread-cleanup-manager.d.ts +6 -27
  102. package/dist/lib/thread-cleanup-manager.js +369 -186
  103. package/dist/lib/thread-display.d.ts +1 -2
  104. package/dist/lib/thread-display.js +58 -38
  105. package/dist/lib/thread-naming.d.ts +28 -8
  106. package/dist/lib/thread-naming.js +175 -66
  107. package/dist/lib/thread-reconciler.d.ts +42 -16
  108. package/dist/lib/thread-reconciler.js +90 -50
  109. package/dist/lib/threads.d.ts +82 -20
  110. package/dist/lib/threads.js +2247 -855
  111. package/dist/lib/time-injection.js +1 -2
  112. package/dist/lib/turns.js +1 -19
  113. package/dist/lib/updates.d.ts +169 -80
  114. package/dist/lib/updates.js +2418 -641
  115. package/dist/lib/voice.d.ts +7 -22
  116. package/dist/lib/voice.js +7 -22
  117. package/dist/lib/wire.js +1 -1
  118. package/dist/lib/workspace-admission.d.ts +3 -1
  119. package/dist/lib/workspace-admission.js +425 -211
  120. package/dist/lib/workspace-identity.js +8 -13
  121. package/dist/lib/workspace-retirement.d.ts +1 -1
  122. package/dist/lib/workspace-retirement.js +328 -140
  123. package/dist/lib/workspace-slots.js +8 -4
  124. package/dist/package.json +1 -1
  125. package/docs/architecture.md +31 -29
  126. package/docs/inbound.md +1 -1
  127. package/docs/multi-instance-bus.md +15 -3
  128. package/docs/outbound.md +1 -1
  129. package/docs/public-api.md +29 -1
  130. package/docs/ui-style.md +25 -8
  131. package/lib/activity-verbosity.ts +59 -82
  132. package/lib/activity.ts +146 -102
  133. package/lib/agent-messages.ts +12 -5
  134. package/lib/bindings.ts +389 -82
  135. package/lib/bus-api.ts +263 -102
  136. package/lib/bus-follower.ts +2440 -601
  137. package/lib/bus-leader.ts +2209 -1290
  138. package/lib/bus-transport.ts +46 -12
  139. package/lib/bus.ts +1673 -444
  140. package/lib/channel-posts.ts +848 -327
  141. package/lib/command-templates.ts +152 -265
  142. package/lib/commands.ts +2398 -555
  143. package/lib/config.ts +177 -170
  144. package/lib/delivery.ts +41 -29
  145. package/lib/extension.ts +1206 -433
  146. package/lib/generative-app-worker.mjs +19 -7
  147. package/lib/generative-apps.ts +324 -211
  148. package/lib/inbound.ts +95 -97
  149. package/lib/journal.ts +5311 -1763
  150. package/lib/keyboard.ts +1 -3
  151. package/lib/lifecycle.ts +128 -78
  152. package/lib/locks.ts +677 -203
  153. package/lib/logging.ts +147 -58
  154. package/lib/media.ts +82 -43
  155. package/lib/menu-model.ts +85 -18
  156. package/lib/menu-queue.ts +88 -129
  157. package/lib/menu-settings.ts +260 -155
  158. package/lib/menu-status.ts +20 -60
  159. package/lib/menu-thinking.ts +41 -56
  160. package/lib/menu.ts +112 -285
  161. package/lib/model.ts +8 -22
  162. package/lib/outbound-attachments.ts +156 -125
  163. package/lib/outbound-buttons.ts +76 -49
  164. package/lib/outbound-markup.ts +96 -94
  165. package/lib/outbound-voice.ts +33 -27
  166. package/lib/outbound.ts +128 -125
  167. package/lib/ownership.ts +19 -10
  168. package/lib/paths.ts +148 -49
  169. package/lib/pi.ts +35 -15
  170. package/lib/polling.ts +144 -147
  171. package/lib/preview.ts +93 -40
  172. package/lib/process-identity.ts +164 -0
  173. package/lib/prompts.ts +4 -11
  174. package/lib/queue.ts +516 -301
  175. package/lib/recovery.ts +50 -454
  176. package/lib/rendering.ts +1 -3
  177. package/lib/replies.ts +248 -209
  178. package/lib/routing.ts +8509 -2186
  179. package/lib/runtime.ts +1 -12
  180. package/lib/sections.ts +24 -89
  181. package/lib/setup.ts +1 -3
  182. package/lib/skills.ts +9 -4
  183. package/lib/status.ts +215 -110
  184. package/lib/sync.ts +448 -361
  185. package/lib/target.ts +22 -3
  186. package/lib/telegram-api.ts +302 -127
  187. package/lib/text-groups.ts +5 -39
  188. package/lib/thread-cleanup-manager.ts +833 -331
  189. package/lib/thread-display.ts +213 -97
  190. package/lib/thread-naming.ts +232 -87
  191. package/lib/thread-reconciler.ts +155 -72
  192. package/lib/threads.ts +5318 -1845
  193. package/lib/time-injection.ts +1 -4
  194. package/lib/turns.ts +15 -28
  195. package/lib/updates.ts +5184 -1612
  196. package/lib/voice.ts +7 -35
  197. package/lib/wire.ts +1 -1
  198. package/lib/workspace-admission.ts +996 -416
  199. package/lib/workspace-identity.ts +14 -17
  200. package/lib/workspace-retirement.ts +878 -376
  201. package/lib/workspace-slots.ts +22 -13
  202. package/package.json +1 -1
  203. package/scripts/check-downgrade.mjs +0 -472
  204. package/scripts/measure-workspace.mjs +0 -108
@@ -45,8 +45,7 @@ export function createTimeInjectionRuntime(deps) {
45
45
  return line;
46
46
  const previous = lastInjectedAt.get(chatId);
47
47
  const nowMs = now.getTime();
48
- if (previous !== undefined &&
49
- nowMs - previous < config.interval) {
48
+ if (previous !== undefined && nowMs - previous < config.interval) {
50
49
  return null;
51
50
  }
52
51
  lastInjectedAt.set(chatId, nowMs);
package/dist/lib/turns.js CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { readFile } from "node:fs/promises";
7
7
  import { basename, dirname, join } from "node:path";
8
- import { buildTelegramReplyContextBlock, collectTelegramFileInfos, collectTelegramMessageIds, downloadTelegramMessageFiles, extractTelegramForwardContextText, extractTelegramMessagesPromptText, extractTelegramMessagesText, extractTelegramMessageText, formatTelegramHistoryText, guessMediaType, } from "./media.js";
8
+ import { appendTelegramAttachmentSection, appendTelegramListSection, buildTelegramReplyContextBlock, collectTelegramFileInfos, collectTelegramMessageIds, downloadTelegramMessageFiles, extractTelegramForwardContextText, extractTelegramMessagesPromptText, extractTelegramMessagesText, extractTelegramMessageText, formatTelegramHistoryText, guessMediaType, } from "./media.js";
9
9
  import { createTelegramQueueAdmissionReceipt, truncateTelegramQueueSummary, } from "./queue.js";
10
10
  import { computeVoicePromptContribution, computeVoiceTurnFlags, getTelegramVoiceReplyMode, } from "./voice.js";
11
11
  export const TELEGRAM_PREFIX = "[telegram]";
@@ -49,24 +49,6 @@ export function formatTelegramTurnStatusSummary(rawText, files, handlerOutputs =
49
49
  return `📎 ${files.length} attachments`;
50
50
  return "(empty message)";
51
51
  }
52
- function appendTelegramListSection(text, title, items) {
53
- if (items.length === 0)
54
- return text;
55
- const prefix = text.length > 0 ? `${text}\n\n` : "";
56
- return `${prefix}[${title}]\n${items.map((item) => `- ${item}`).join("\n")}`;
57
- }
58
- function appendTelegramAttachmentSection(text, files) {
59
- if (files.length === 0)
60
- return text;
61
- const dirs = [...new Set(files.map((file) => dirname(file.path)))];
62
- const sameDir = dirs.length === 1;
63
- const header = sameDir ? `[attachments] ${dirs[0]}` : "[attachments]";
64
- const items = sameDir
65
- ? files.map((file) => `/${basename(file.path)}`)
66
- : files.map((file) => file.path);
67
- const prefix = text.length > 0 ? `${text}\n\n` : "";
68
- return `${prefix}${header}\n${items.map((item) => `- ${item}`).join("\n")}`;
69
- }
70
52
  function appendTelegramSourceContext(text, sourceContext) {
71
53
  if (!sourceContext)
72
54
  return text;
@@ -3,12 +3,13 @@
3
3
  * Zones: telegram inbound, authorization, routing plans
4
4
  * Owns update extraction, authorization, execution planning, generation-fenced journal draining, and the public update-handler registry
5
5
  */
6
- import { type TelegramTarget } from "./target.ts";
7
- import type { TelegramBusEnvelope, TelegramBusFollowerView, TelegramBusForwardOwnership, TelegramBusForeignUpdateSettlement, TelegramProcessLiveness } from "./bus.ts";
8
- import type { TelegramMessageOwnershipStore } from "./ownership.ts";
9
- import { TELEGRAM_UPDATE_JOURNAL_VERSION, TELEGRAM_UPDATE_JOURNAL_EXCLUSION_VERSION, TELEGRAM_UPDATE_JOURNAL_CUSTODY_VERSION, type TelegramUpdateJournalEntryDigest, type TelegramUpdateJournalSourceCompletion, type TelegramUpdateJournalQueuedCompletion, type TelegramUpdateJournalQueuedReceiptEvidence, type TelegramInputJournalReceipt, type TelegramInputJournalSourceReference, type TelegramInputJournalStore, type TelegramJournaledUpdate, type TelegramUpdateJournalDeadQueueOwnerRecoveryResult, type TelegramUpdateJournalAppendResult, type TelegramUpdateJournalInputClaim, type TelegramUpdateJournalOperatorDispositionInput, type TelegramUpdateJournalOperatorDispositionResult, type TelegramUpdateJournalPendingAbandonmentInput, type TelegramUpdateJournalPendingAbandonmentResult, type TelegramUpdateJournalPendingRetentionEvidence, type TelegramUpdateJournalEntry, type TelegramUpdateJournalRoutingInput, type TelegramRoutingInputJournal, type TelegramRoutingInputExpiryResult, type TelegramUpdateJournalQueueDiscardResult, type TelegramUpdateJournalQueueHandoffAcceptResult, type TelegramUpdateJournalQueueHandoffCancelResult, type TelegramUpdateJournalQueueHandoffInput, type TelegramUpdateJournalQueueHandoffOfferResult, type TelegramUpdateJournalQueueOwner, type TelegramUpdateJournalQueueOwnerIdentity } from "./journal.ts";
10
- import { type PendingTelegramControlItem, type TelegramControlQueueHandoffPayload, type TelegramQueueAdmissionReceipt, type TelegramQueueHandoffPayload, type TelegramQueueHandoffStageResult, type TelegramQueueReactionDisposition, type TelegramQueueHandoffStagingRuntime, type TelegramQueueItem } from "./queue.ts";
6
+ import type { TelegramBusEnvelope, TelegramBusFollowerView, TelegramBusForeignUpdateSettlement, TelegramBusFollowerQueueHandoffOffer, TelegramBusForwardOwnership, TelegramBusLeaderQueueHandoffOffer } from "./bus.ts";
11
7
  import { type TelegramAuthorizationState, type TelegramUserPairingRuntimeDeps } from "./config.ts";
8
+ import { TELEGRAM_UPDATE_JOURNAL_CUSTODY_VERSION, TELEGRAM_UPDATE_JOURNAL_EXCLUSION_VERSION, TELEGRAM_UPDATE_JOURNAL_VERSION, type TelegramInputJournalReceipt, type TelegramInputJournalSourceReference, type TelegramInputJournalStore, type TelegramJournaledUpdate, type TelegramRoutingInputExpiryResult, type TelegramRoutingInputJournal, type TelegramUpdateJournalAppendResult, type TelegramUpdateJournalDeadQueueOwnerRecoveryResult, type TelegramUpdateJournalEntry, type TelegramUpdateJournalEntryDigest, type TelegramUpdateJournalInputClaim, type TelegramUpdateJournalOperatorDispositionInput, type TelegramUpdateJournalOperatorDispositionResult, type TelegramUpdateJournalPendingAbandonmentInput, type TelegramUpdateJournalPendingAbandonmentResult, type TelegramUpdateJournalPendingRetentionEvidence, type TelegramUpdateJournalQueueDiscardResult, type TelegramUpdateJournalQueueHandoffAcceptResult, type TelegramUpdateJournalQueueHandoffCancelResult, type TelegramUpdateJournalQueueHandoffInput, type TelegramUpdateJournalQueueHandoffOfferResult, type TelegramUpdateJournalQueueOwner, type TelegramUpdateJournalQueueOwnerIdentity, type TelegramUpdateJournalQueuedCompletion, type TelegramUpdateJournalQueuedReceiptEvidence, type TelegramUpdateJournalRoutingChooser, type TelegramUpdateJournalRoutingInput, type TelegramUpdateJournalSourceCompletion } from "./journal.ts";
9
+ import type { TelegramMessageOwnershipStore } from "./ownership.ts";
10
+ import type { TelegramProcessLiveness } from "./process-identity.ts";
11
+ import { type PendingTelegramControlItem, type TelegramControlQueueHandoffPayload, type TelegramQueueAdmissionReceipt, type TelegramQueueHandoffPayload, type TelegramQueueHandoffStageResult, type TelegramQueueHandoffStagingRuntime, type TelegramQueueItem, type TelegramQueueReactionDisposition } from "./queue.ts";
12
+ import { type TelegramTarget } from "./target.ts";
12
13
  export interface TelegramReactionTypeEmoji {
13
14
  type: "emoji";
14
15
  emoji: string;
@@ -68,7 +69,6 @@ export interface TelegramUpdateDeletion {
68
69
  }
69
70
  export declare function normalizeTelegramReactionEmoji(emoji: string): string;
70
71
  export declare function collectTelegramReactionEmojis(reactions: TelegramReactionType[]): Set<string>;
71
- export declare function extractDeletedTelegramMessageIds(update: TelegramUpdateDeletion): number[];
72
72
  export interface TelegramUser {
73
73
  id: number;
74
74
  is_bot: boolean;
@@ -207,13 +207,31 @@ export interface TelegramDeferredSourceEvidence extends TelegramUpdateJournalEnt
207
207
  /** Supplied only after caller-owned acceptance publication; requires a durable removal ACK. */
208
208
  completionSha256?: string;
209
209
  }
210
+ /** Fresh source-owner projection; the payload is copied from the retained journal, never a routed carrier. */
211
+ export interface TelegramDeferredSourceSnapshot {
212
+ source: TelegramDeferredSourceEvidence;
213
+ update: TelegramJournaledUpdate;
214
+ }
215
+ /** Warm exact-removal ACK plus its issuing worker lifetime; never persisted or sent over IPC. */
216
+ interface TelegramDeferredSourceCompletion {
217
+ source: TelegramDeferredSourceEvidence;
218
+ isCurrent(): boolean;
219
+ }
210
220
  interface TelegramUpdateAdmissionBinding {
211
221
  sourceUpdateId: number;
212
222
  report: (outcome: TelegramUpdateAdmissionOutcome) => void;
213
223
  abandon?: (authority: TelegramDeferredUpdateAbandonmentAuthority) => TelegramUpdateJournalPendingAbandonmentResult | undefined;
214
- armRoutingInput?: (operatorUserId: number, sourceUpdateIds: readonly number[]) => TelegramUpdateJournalRoutingInput | undefined;
224
+ armRoutingInput?: (operatorUserId: number, sourceUpdateIds: readonly number[], chooser?: TelegramUpdateJournalRoutingChooser) => TelegramUpdateJournalRoutingInput | undefined;
225
+ /** The source's saved routing clock, including where its chooser was published. */
226
+ getRoutingInput?: () => TelegramUpdateJournalRoutingInput | undefined;
215
227
  acquireRouting?: (select?: boolean, sourceUpdateIds?: readonly number[]) => () => void;
216
228
  inspectSource?: () => TelegramDeferredSourceEvidence | undefined;
229
+ inspectSourceSnapshot?: () => TelegramDeferredSourceSnapshot | undefined;
230
+ inspectCompletion?: () => TelegramDeferredSourceEvidence | undefined;
231
+ isSourceUnsettled?: () => boolean;
232
+ prepareLiveInput?: (sourceUpdateIds: readonly number[], isCurrent: () => boolean) => TelegramLiveDeferredInputPreparation | undefined;
233
+ prepareQueueAdmission?: () => TelegramDeferredQueueAdmissionPreparation | undefined;
234
+ prepareSourceCompletion?: () => Pick<TelegramDeferredSourceCompletionPreparation, "source" | "isCurrent"> | undefined;
217
235
  supportsAbandonment?: (journalBindingKey: string) => boolean;
218
236
  inspectAbandoning?: (request: TelegramDeferredAbandonmentRecoveryRequest) => TelegramDeferredAbandonmentRecoveryPage | undefined;
219
237
  inspectHistorical?: (request: TelegramDeferredAbandonmentRecoveryRequest) => TelegramDeferredAbandonmentRecoveryPage | undefined;
@@ -223,10 +241,11 @@ interface TelegramUpdateAdmissionBinding {
223
241
  export type TelegramQueueAdmissionReceiptLike = TelegramQueueAdmissionReceipt;
224
242
  export declare function bindTelegramUpdateAdmissionSource<TUpdate extends TelegramUpdateFlow & {
225
243
  update_id: number;
226
- }>(update: TUpdate, report: TelegramUpdateAdmissionBinding["report"], controls?: Pick<TelegramUpdateAdmissionBinding, "abandon" | "armRoutingInput" | "acquireRouting" | "inspectSource" | "supportsAbandonment" | "inspectAbandoning" | "inspectHistorical" | "isHistorical" | "isHistoricalReviewHeld">): TUpdate;
244
+ }>(update: TUpdate, report: TelegramUpdateAdmissionBinding["report"], controls?: Pick<TelegramUpdateAdmissionBinding, "abandon" | "armRoutingInput" | "getRoutingInput" | "acquireRouting" | "inspectSource" | "inspectSourceSnapshot" | "inspectCompletion" | "isSourceUnsettled" | "prepareLiveInput" | "prepareQueueAdmission" | "prepareSourceCompletion" | "supportsAbandonment" | "inspectAbandoning" | "inspectHistorical" | "isHistorical" | "isHistoricalReviewHeld">): TUpdate;
227
245
  /**
228
246
  * Conservative read-only census: any retained entry naming this Thread, in any nested Telegram object or state,
229
- * is unresolved custody. It cannot see updates still in transit before journal append.
247
+ * is unresolved custody, except a lone button tap, which carries no input (the in-flight Cancel itself).
248
+ * It cannot see updates still in transit before journal append.
230
249
  */
231
250
  export declare function collectTelegramJournalThreadUpdateIds(entries: readonly {
232
251
  updateId: number;
@@ -238,6 +257,12 @@ export declare function collectTelegramJournalThreadUpdateIds(entries: readonly
238
257
  export declare function collectTelegramAdmissionSourceUpdateIds(values: readonly unknown[]): number[];
239
258
  /** Observe the original journal entry, never the mutable routed carrier, through current worker authority. */
240
259
  export declare function inspectTelegramDeferredSource(value: unknown): TelegramDeferredSourceEvidence | undefined;
260
+ /** Read an exact current original for peer preparation without another payload authority. */
261
+ export declare function inspectTelegramDeferredSourceSnapshot(value: unknown): TelegramDeferredSourceSnapshot | undefined;
262
+ /** Exact warm removal ACK only; reporting, source absence and a replaced worker cannot supply it. */
263
+ export declare function inspectTelegramDeferredSourceCompletion(value: unknown): TelegramDeferredSourceEvidence | undefined;
264
+ /** Reuse only live bound deferred originals; raw IDs or cold/adopted input cannot mint this carrier. */
265
+ export declare function prepareTelegramLiveDeferredInput(values: readonly unknown[], isCurrent: () => boolean): TelegramLiveDeferredInputPreparation | undefined;
241
266
  /** A route-owned pre-disposition acceptance publisher; wraps only this carrier, never the shared worker binding. */
242
267
  export declare function bindTelegramUpdateCompletionAcceptance<TValue>(value: TValue, publish: () => TelegramDeferredSourceEvidence): TValue;
243
268
  /** Report source completion; true means reported, not a durable settlement acknowledgement. */
@@ -255,9 +280,15 @@ export declare function isTelegramHistoricalInput(value: unknown, matchesOrigina
255
280
  /** Routing's last-boundary hold when ownership changed after early classification. */
256
281
  export declare function reportTelegramHistoricalRoutingReview(value: unknown): boolean;
257
282
  /** Arm only a positively published chooser; the journal owns the immutable hour deadline. */
258
- export declare function armTelegramRoutingInputs(values: readonly unknown[], operatorUserId: number): TelegramUpdateJournalRoutingInput | undefined;
283
+ export declare function armTelegramRoutingInputs(values: readonly unknown[], operatorUserId: number, chooser?: TelegramUpdateJournalRoutingChooser): TelegramUpdateJournalRoutingInput | undefined;
284
+ /** A routed carrier's saved routing clock; a revived chooser reuses its recorded message. */
285
+ export declare function getTelegramUpdateRoutingInput(value: unknown): TelegramUpdateJournalRoutingInput | undefined;
259
286
  /** Reserve source execution; an actual choice must also freeze its durable TTL before any effect. */
260
287
  export declare function acquireTelegramUpdateRouting(value: unknown, select?: boolean, sourceUpdateIds?: readonly number[]): () => void;
288
+ /** Capture existing warm completion authority; only explicit reporting may dispose this exact original. */
289
+ export declare function prepareTelegramDeferredSourceCompletion(value: unknown): TelegramDeferredSourceCompletionPreparation | undefined;
290
+ /** Read-only warm owner availability; no source freeze, admission, report or receipt reconstruction. */
291
+ export declare function prepareTelegramDeferredQueueAdmission(value: unknown): TelegramDeferredQueueAdmissionPreparation | undefined;
261
292
  export declare function reportTelegramQueueAdmission(values: readonly unknown[], receipts: readonly TelegramQueueAdmissionReceiptLike[]): boolean;
262
293
  export type TelegramUpdateFlowAction<TReactionUpdate extends TelegramMessageReactionUpdated = TelegramMessageReactionUpdated, TCallbackQuery extends TelegramCallbackQuery = TelegramCallbackQuery, TMessage extends TelegramUpdateMessage = TelegramUpdateMessage, TGuestMessage extends TelegramGuestMessage = TelegramGuestMessage> = {
263
294
  kind: "ignore";
@@ -343,18 +374,13 @@ interface TelegramUnauthorizedReplyOptions {
343
374
  threadId?: number;
344
375
  };
345
376
  }
346
- export interface TelegramUpdateRuntimeDeps<TContext = unknown, TReactionUpdate extends TelegramMessageReactionUpdated = TelegramMessageReactionUpdated, TCallbackQuery extends TelegramCallbackQuery = TelegramCallbackQuery, TMessage extends TelegramUpdateMessage = TelegramUpdateMessage> {
347
- ctx: TContext;
348
- execution?: TelegramUpdateExecutionFence;
377
+ /** Ownership lookups and authorized-update handlers shared by the per-update runtime and its controller. */
378
+ export interface TelegramUpdateHandlerPorts<TContext, TCallbackQuery extends TelegramCallbackQuery, TMessage extends TelegramUpdateMessage> {
349
379
  getCurrentInstanceId?: () => string | undefined;
350
380
  getMessageOwnership?: TelegramMessageOwnershipLookup;
351
381
  getTargetOwnership?: TelegramTargetOwnershipLookup;
352
382
  recordMessageOwnership?: TelegramMessageOwnershipRecorder;
353
- foreignOwnedUpdateForwarder?: TelegramForeignOwnedUpdateForwarder<TContext, TReactionUpdate, TCallbackQuery, TMessage>;
354
383
  removePendingMediaGroupMessages: (messageIds: number[]) => void;
355
- removeQueuedTelegramTurnsByMessageIds: (messageIds: number[], ctx: TContext) => number;
356
- handleAuthorizedTelegramReactionUpdate: (reactionUpdate: TReactionUpdate, ctx: TContext) => Promise<void>;
357
- handleTelegramTopicLifecycleUpdate?: (lifecycle: TelegramTopicLifecycleUpdate<TMessage>, ctx: TContext) => Promise<void> | void;
358
384
  pairTelegramUserIfNeeded: (userId: number, ctx: TContext, assertExecutionCurrent?: () => void) => Promise<boolean>;
359
385
  answerCallbackQuery: (callbackQueryId: string, text?: string) => Promise<void>;
360
386
  answerGuestQuery: (guestQueryId: string, text?: string, options?: Pick<TelegramUnauthorizedReplyOptions, "parseMode">) => Promise<void>;
@@ -365,19 +391,22 @@ export interface TelegramUpdateRuntimeDeps<TContext = unknown, TReactionUpdate e
365
391
  handleAuthorizedTelegramGuestMessage?: (guestMessage: TelegramGuestMessage & {
366
392
  from: TelegramUser;
367
393
  }, ctx: TContext) => Promise<void>;
394
+ handleTelegramTopicLifecycleUpdate?: (lifecycle: TelegramTopicLifecycleUpdate<TMessage>, ctx: TContext) => Promise<void> | void;
368
395
  /** Called when the owner writes in an unbound thread no live instance owns. */
369
396
  handleUnboundTelegramTopicMessage?: (message: TMessage & {
370
397
  from: TelegramUser;
371
398
  }, ctx: TContext) => Promise<void>;
372
399
  }
373
- export interface TelegramUpdateRuntimeControllerDeps<TContext = unknown, TCallbackQuery extends TelegramCallbackQuery = TelegramCallbackQuery, TMessage extends TelegramUpdateMessage = TelegramUpdateMessage> {
400
+ export interface TelegramUpdateRuntimeDeps<TContext = unknown, TReactionUpdate extends TelegramMessageReactionUpdated = TelegramMessageReactionUpdated, TCallbackQuery extends TelegramCallbackQuery = TelegramCallbackQuery, TMessage extends TelegramUpdateMessage = TelegramUpdateMessage> extends TelegramUpdateHandlerPorts<TContext, TCallbackQuery, TMessage> {
401
+ ctx: TContext;
402
+ execution?: TelegramUpdateExecutionFence;
403
+ foreignOwnedUpdateForwarder?: TelegramForeignOwnedUpdateForwarder<TContext, TReactionUpdate, TCallbackQuery, TMessage>;
404
+ removeQueuedTelegramTurnsByMessageIds: (messageIds: number[], ctx: TContext) => number;
405
+ handleAuthorizedTelegramReactionUpdate: (reactionUpdate: TReactionUpdate, ctx: TContext) => Promise<void>;
406
+ }
407
+ export interface TelegramUpdateRuntimeControllerDeps<TContext = unknown, TCallbackQuery extends TelegramCallbackQuery = TelegramCallbackQuery, TMessage extends TelegramUpdateMessage = TelegramUpdateMessage> extends TelegramUpdateHandlerPorts<TContext, TCallbackQuery, TMessage> {
374
408
  getAllowedUserId: () => number | undefined;
375
- getCurrentInstanceId?: () => string | undefined;
376
- getMessageOwnership?: TelegramMessageOwnershipLookup;
377
- getTargetOwnership?: TelegramTargetOwnershipLookup;
378
- recordMessageOwnership?: TelegramMessageOwnershipRecorder;
379
409
  foreignOwnedUpdateForwarder?: TelegramForeignOwnedUpdateForwarder<TContext, TelegramMessageReactionUpdated, TCallbackQuery, TMessage>;
380
- removePendingMediaGroupMessages: (messageIds: number[]) => void;
381
410
  flushPendingMediaGroupMessage?: (messageId: number) => Promise<boolean>;
382
411
  flushPendingTextGroupMessage?: (messageId: number) => Promise<boolean>;
383
412
  removeQueuedTelegramTurnsByMessageIds: (messageIds: number[], ctx: TContext, scope?: {
@@ -388,21 +417,6 @@ export interface TelegramUpdateRuntimeControllerDeps<TContext = unknown, TCallba
388
417
  chatId?: number;
389
418
  threadId?: number;
390
419
  }) => boolean;
391
- pairTelegramUserIfNeeded: (userId: number, ctx: TContext, assertExecutionCurrent?: () => void) => Promise<boolean>;
392
- answerCallbackQuery: (callbackQueryId: string, text?: string) => Promise<void>;
393
- answerGuestQuery: (guestQueryId: string, text?: string, options?: Pick<TelegramUnauthorizedReplyOptions, "parseMode">) => Promise<void>;
394
- handleAuthorizedTelegramCallbackQuery: (query: TCallbackQuery, ctx: TContext) => Promise<void>;
395
- sendTextReply: (chatId: number, replyToMessageId: number, text: string, options?: TelegramUnauthorizedReplyOptions) => Promise<number | undefined>;
396
- handleAuthorizedTelegramMessage: (message: TMessage, ctx: TContext) => Promise<void>;
397
- handleAuthorizedTelegramEditedMessage: (message: TMessage, ctx: TContext) => unknown;
398
- handleAuthorizedTelegramGuestMessage?: (guestMessage: TelegramGuestMessage & {
399
- from: TelegramUser;
400
- }, ctx: TContext) => Promise<void>;
401
- handleTelegramTopicLifecycleUpdate?: (lifecycle: TelegramTopicLifecycleUpdate<TMessage>, ctx: TContext) => Promise<void> | void;
402
- /** Called when the owner writes in an unbound thread no live instance owns. */
403
- handleUnboundTelegramTopicMessage?: (message: TMessage & {
404
- from: TelegramUser;
405
- }, ctx: TContext) => Promise<void>;
406
420
  }
407
421
  export interface TelegramUpdateRuntimeController<TContext = unknown, TUpdate extends TelegramUpdateFlow = TelegramUpdateFlow> {
408
422
  handleAuthorizedReactionUpdate: (reactionUpdate: NonNullable<TUpdate["message_reaction"]>, ctx: TContext) => Promise<void>;
@@ -448,6 +462,8 @@ export interface TelegramUpdateWorkerStateSnapshot {
448
462
  abandoningClaimCount?: number;
449
463
  /** Historical sources held before routing, not evidence of prior non-delivery. */
450
464
  historicalClaimCount?: number;
465
+ /** Fresh recipient inputs reserved before append; not executable prompt-queue work. */
466
+ preparedInputCount?: number;
451
467
  queuedClaimCount: number;
452
468
  foreignQueuedCount: number;
453
469
  foreignQueuedOwner?: TelegramUpdateJournalQueueOwner;
@@ -560,7 +576,7 @@ export interface TelegramUpdateWorkerJournalPort {
560
576
  removedUpdateIds: readonly number[];
561
577
  };
562
578
  /** No ID-only fallback is allowed for a guarded completion report. */
563
- removeCompletedExact?: (updateIds: readonly number[], expectedSources: readonly TelegramUpdateJournalEntryDigest[], completions?: readonly TelegramUpdateJournalSourceCompletion[]) => {
579
+ removeCompletedExact?: (updateIds: readonly number[], expectedSources: readonly TelegramUpdateJournalEntryDigest[], completions?: readonly TelegramUpdateJournalSourceCompletion[], isCurrent?: () => boolean) => {
564
580
  removedUpdateIds: readonly number[];
565
581
  sourceCompletions?: readonly TelegramUpdateJournalSourceCompletion[];
566
582
  };
@@ -581,12 +597,20 @@ export interface TelegramUpdateExecutionFailureClassification {
581
597
  export interface TelegramUpdateWorkerRuntimeDeps<TContext> {
582
598
  journal: TelegramUpdateWorkerJournalPort;
583
599
  executeUpdate: (update: TelegramJournaledUpdate, ctx: TContext, signal: AbortSignal) => Promise<TelegramUpdateAdmissionOutcome> | TelegramUpdateAdmissionOutcome;
600
+ /** Native source-only binding, installed by the admission-worker assembly rather than ordinary dispatch. */
601
+ admitPreparedLiveInput?: (update: TelegramJournaledUpdate, ctx: TContext, signal: AbortSignal) => Promise<{
602
+ outcome: TelegramUpdateAdmissionOutcome;
603
+ carrier: unknown;
604
+ }>;
584
605
  executeCustodiedUpdate?: (update: TelegramJournaledUpdate, ctx: TContext, signal: AbortSignal) => Promise<TelegramCustodiedExecutionResult>;
585
606
  hasAuthority: (ctx: TContext) => boolean;
586
607
  getJournalBindingKey?: () => string | undefined;
587
608
  getRecipientBindingKey?: () => string | undefined;
588
- /** True selects legacy historical review/spending; retain protects unsupported originals without disposition authority. */
589
- shouldReviewHistoricalInput?: (entry: TelegramUpdateJournalEntry, ctx: TContext, signal: AbortSignal) => boolean | "retain" | Promise<boolean | "retain">;
609
+ /**
610
+ * True selects legacy historical review/spending; retain protects unsupported originals without disposition
611
+ * authority; revive re-admits a still-waiting chooser source as this generation's live input.
612
+ */
613
+ shouldReviewHistoricalInput?: (entry: TelegramUpdateJournalEntry, ctx: TContext, signal: AbortSignal) => TelegramHistoricalReviewVerdict | Promise<TelegramHistoricalReviewVerdict>;
590
614
  /** New-world restart: spend unclocked classified routing input without delivery, copy or completion. Chooser clocks wait for expiry; interrupted private abandonment keeps exact recovery. */
591
615
  spendHistoricalInput?: boolean;
592
616
  /** Holds protected live or retry sources before execution; never cancels or disposes them. */
@@ -615,19 +639,92 @@ export interface TelegramUpdateWorkerRuntimeDeps<TContext> {
615
639
  recordRuntimeEvent?: (category: string, error: unknown, details?: Record<string, unknown>) => void;
616
640
  }
617
641
  export type TelegramQueueReceiptCompletionReason = "prompt-handoff" | "control-settlement" | "discard";
642
+ /** Read-only singleton hold projection; only the exact warm post-release admission carrier may supply completion. */
643
+ export interface TelegramLiveSourceCompletionReadiness {
644
+ readonly snapshot: TelegramDeferredSourceSnapshot;
645
+ /** Captured issuing owner/ports only; not a source disposition or canonical-release grant. */
646
+ isCurrent(): boolean;
647
+ bindCarrier(value: unknown): TelegramDeferredSourceCompletionPreparation | undefined;
648
+ }
649
+ /** Process-local gate for fresh recipient input; never durable replay/custody or a binding grant. */
650
+ export interface TelegramLiveInputPreparation {
651
+ readonly sourceUpdateIds: readonly number[];
652
+ /** Authority-only observation: no nested journal transaction under a Workspace snapshot. */
653
+ isCurrent(): boolean;
654
+ /** Same captured worker/source lifetime, including a finished warm preparation. */
655
+ isOwnerCurrent(): boolean;
656
+ confirmSaved(): boolean;
657
+ /** Read/copy completion-owner availability after save, without claiming/admitting/dispatching the held input. */
658
+ prepareSourceCompletion?(): TelegramLiveSourceCompletionReadiness | undefined;
659
+ /** Captures one same-source status continuation without activating future recipient authority. */
660
+ prepareStatusConsumption?(input: TelegramLiveStatusConsumption): boolean;
661
+ /** Native owner availability before recipient append; not admission or future target activation. */
662
+ canPrepareStatusConsumption?(): boolean;
663
+ release(canRelease: () => boolean): boolean;
664
+ /** Ends a failed pre-append attempt only when no selected input was saved. */
665
+ cancelEmpty(): boolean;
666
+ /** One fenced removal of this never-dispatched recipient copy; unknown issuance cannot be retried. */
667
+ discardSaved(canDiscard: () => boolean): "discarded" | "protected" | "unknown";
668
+ }
669
+ /** Routing owns continuation or positively released peer transfer; preparation never appends or reexecutes originals. */
670
+ export interface TelegramLiveDeferredInputPreparation extends Pick<TelegramLiveInputPreparation, "sourceUpdateIds" | "isCurrent" | "isOwnerCurrent" | "confirmSaved"> {
671
+ beginRelease(canRelease: () => boolean): boolean;
672
+ /** One exact donor-group removal after routing confirms peer release; unknown issuance never retries. */
673
+ settleTransferred(canSettle: () => boolean): "settled" | "protected" | "unknown";
674
+ cancel(): boolean;
675
+ }
676
+ export interface TelegramDeferredSourceCompletionPreparation {
677
+ readonly source: TelegramDeferredSourceEvidence;
678
+ /** Issuer lifetime remains observable after reporting/removal; never a settled/source-absence inference. */
679
+ isCurrent(): boolean;
680
+ /** One exact report after required command semantics; true is report acceptance, not a removal ACK. */
681
+ reportCompleted(): boolean;
682
+ /** Existing warm worker ACK only, read-only and without journal I/O or another report/removal. */
683
+ inspectCompletion(): TelegramDeferredSourceEvidence | undefined;
684
+ }
685
+ export interface TelegramDeferredQueueAdmissionPreparation {
686
+ /** Worker/session/journal/acquiring-owner lifetime, independent of the source's later queued report. */
687
+ isCurrent(): boolean;
688
+ /** Only the existing warm committed receipt owner can certify the same original; absence never permits replay. */
689
+ inspectReceipt(receipt: TelegramQueueAdmissionReceiptLike): {
690
+ source: TelegramDeferredSourceEvidence;
691
+ receipt: TelegramUpdateJournalQueuedCompletion;
692
+ } | undefined;
693
+ /** Read-only original/queued-owner CAS scope for the existing pre-publication boundary; never readiness or disposal. */
694
+ prepareCompletionScope(receipt: TelegramQueueAdmissionReceiptLike, queueOwner: TelegramUpdateJournalQueueOwner, completionSha256: string): TelegramQueueSourceCompletion | undefined;
695
+ /** Exact previously observed receipt object's native whole-removal ACK; never admission, absence or another disposal. */
696
+ inspectCompletion(receipt: TelegramQueueAdmissionReceiptLike): TelegramDeferredSourceEvidence | undefined;
697
+ }
618
698
  export interface TelegramUpdateWorkerRuntime<TContext> {
619
699
  start: (ctx: TContext) => void;
700
+ /** Reserve absent IDs before recipient append; existing leader deferred sources use their original carrier. */
701
+ prepareLiveInput?: (ctx: TContext, sourceUpdateIds: readonly number[], isCurrent?: () => boolean) => TelegramLiveInputPreparation | undefined;
702
+ prepareDeferredLiveInput?: (input: {
703
+ updateId: number;
704
+ sourceUpdateIds: readonly number[];
705
+ signal: AbortSignal;
706
+ isCurrent(): boolean;
707
+ }) => TelegramLiveDeferredInputPreparation | undefined;
708
+ prepareDeferredQueueAdmission?: (input: {
709
+ updateId: number;
710
+ signal: AbortSignal;
711
+ }) => TelegramDeferredQueueAdmissionPreparation | undefined;
712
+ prepareDeferredSourceCompletion?: (input: {
713
+ updateId: number;
714
+ signal: AbortSignal;
715
+ }) => Pick<TelegramDeferredSourceCompletionPreparation, "source" | "isCurrent"> | undefined;
620
716
  signal: () => void;
621
717
  settleDeferred: (input: {
622
718
  updateId: number;
623
719
  outcome: TelegramUpdateAdmissionOutcome;
624
720
  signal: AbortSignal;
625
- }) => void;
721
+ }) => void | TelegramDeferredSourceCompletion | Promise<void | TelegramDeferredSourceCompletion>;
626
722
  armRoutingInput?: (input: {
627
723
  updateId: number;
628
724
  signal: AbortSignal;
629
725
  operatorUserId: number;
630
726
  sourceUpdateIds: readonly number[];
727
+ chooser?: TelegramUpdateJournalRoutingChooser;
631
728
  }) => TelegramUpdateJournalRoutingInput | undefined;
632
729
  selectRoutingInput?: (input: {
633
730
  updateId: number;
@@ -639,6 +736,10 @@ export interface TelegramUpdateWorkerRuntime<TContext> {
639
736
  updateId: number;
640
737
  signal: AbortSignal;
641
738
  }) => boolean;
739
+ getRoutingInput?: (input: {
740
+ updateId: number;
741
+ signal: AbortSignal;
742
+ }) => TelegramUpdateJournalRoutingInput | undefined;
642
743
  supportsDeferredAbandonment?: (input: {
643
744
  updateId: number;
644
745
  signal: AbortSignal;
@@ -654,6 +755,10 @@ export interface TelegramUpdateWorkerRuntime<TContext> {
654
755
  updateId: number;
655
756
  signal: AbortSignal;
656
757
  }) => TelegramDeferredSourceEvidence | undefined;
758
+ inspectDeferredSourceSnapshot?: (input: {
759
+ updateId: number;
760
+ signal: AbortSignal;
761
+ }) => TelegramDeferredSourceSnapshot | undefined;
657
762
  isHistoricalSource?: (input: {
658
763
  updateId: number;
659
764
  signal: AbortSignal;
@@ -683,6 +788,15 @@ export interface TelegramUpdateWorkerRuntime<TContext> {
683
788
  waitForDrain: () => Promise<void>;
684
789
  getState: () => TelegramUpdateWorkerStateSnapshot;
685
790
  }
791
+ export interface TelegramLiveStatusConsumption {
792
+ readonly source: TelegramDeferredSourceEvidence;
793
+ assertCurrent(): void;
794
+ bindCarrier(value: unknown): boolean;
795
+ execute(): Promise<boolean>;
796
+ }
797
+ export type TelegramHistoricalReviewVerdict = boolean | "retain" | "revive";
798
+ /** A saved chooser clock that proves an untouched, unexpired choice whose chooser message can be revived. */
799
+ export declare function isRevivableTelegramRoutingInput(entry: Pick<TelegramUpdateJournalEntry, "state" | "routingInput">, nowMs: number): boolean;
686
800
  export declare function createTelegramUpdateWorkerRuntime<TContext>(deps: TelegramUpdateWorkerRuntimeDeps<TContext>): TelegramUpdateWorkerRuntime<TContext>;
687
801
  /**
688
802
  * Verdict returned by a public Telegram update handler.
@@ -728,14 +842,6 @@ export interface TelegramUpdateHandlerRegistry {
728
842
  * {@link registerTelegramUpdateHandler} instead.
729
843
  */
730
844
  export declare function getTelegramUpdateHandlerRegistry(): TelegramUpdateHandlerRegistry;
731
- export interface TelegramUpdateHandlerWrapDeps<TUpdate, TContext> {
732
- defaultHandle: (update: TUpdate, ctx: TContext) => Promise<void>;
733
- registry?: TelegramUpdateHandlerRegistry;
734
- }
735
- /**
736
- * Wrap a default polling `handleUpdate` with the public update handler registry.
737
- */
738
- export declare function createTelegramUpdateHandle<TUpdate, TContext>(deps: TelegramUpdateHandlerWrapDeps<TUpdate, TContext>): (update: TUpdate, ctx: TContext) => Promise<void>;
739
845
  export interface TelegramUpdateAdmissionHandleDeps<TUpdate extends TelegramUpdateFlow & {
740
846
  update_id: number;
741
847
  }, TContext> {
@@ -745,16 +851,21 @@ export interface TelegramUpdateAdmissionHandleDeps<TUpdate extends TelegramUpdat
745
851
  updateId: number;
746
852
  ctx: TContext;
747
853
  signal: AbortSignal;
748
- }) => void | Promise<void>;
854
+ }) => void | TelegramDeferredSourceCompletion | Promise<void | TelegramDeferredSourceCompletion>;
749
855
  onLateOutcomeError?: (error: unknown, updateId: number) => void;
750
856
  abandonDeferred?: TelegramUpdateWorkerRuntime<TContext>["abandonDeferred"];
751
857
  armRoutingInput?: TelegramUpdateWorkerRuntime<TContext>["armRoutingInput"];
752
858
  selectRoutingInput?: TelegramUpdateWorkerRuntime<TContext>["selectRoutingInput"];
753
859
  isRoutingInputCurrent?: TelegramUpdateWorkerRuntime<TContext>["isRoutingInputCurrent"];
860
+ getRoutingInput?: TelegramUpdateWorkerRuntime<TContext>["getRoutingInput"];
754
861
  supportsDeferredAbandonment?: TelegramUpdateWorkerRuntime<TContext>["supportsDeferredAbandonment"];
755
862
  inspectAbandoning?: TelegramUpdateWorkerRuntime<TContext>["inspectAbandoning"];
756
863
  inspectHistorical?: TelegramUpdateWorkerRuntime<TContext>["inspectHistorical"];
757
864
  inspectDeferredSource?: TelegramUpdateWorkerRuntime<TContext>["inspectDeferredSource"];
865
+ inspectDeferredSourceSnapshot?: TelegramUpdateWorkerRuntime<TContext>["inspectDeferredSourceSnapshot"];
866
+ prepareDeferredLiveInput?: TelegramUpdateWorkerRuntime<TContext>["prepareDeferredLiveInput"];
867
+ prepareDeferredQueueAdmission?: TelegramUpdateWorkerRuntime<TContext>["prepareDeferredQueueAdmission"];
868
+ prepareDeferredSourceCompletion?: TelegramUpdateWorkerRuntime<TContext>["prepareDeferredSourceCompletion"];
758
869
  isHistoricalSource?: TelegramUpdateWorkerRuntime<TContext>["isHistoricalSource"];
759
870
  }
760
871
  export type TelegramCustodiedExecutionResult = {
@@ -1142,7 +1253,7 @@ export declare function executeTelegramCustodiedInput(input: {
1142
1253
  export declare function createTelegramUpdateAdmissionHandle<TUpdate extends TelegramUpdateFlow & {
1143
1254
  update_id: number;
1144
1255
  }, TContext>(deps: TelegramUpdateAdmissionHandleDeps<TUpdate, TContext>): (update: TUpdate, ctx: TContext, signal: AbortSignal) => Promise<TelegramUpdateAdmissionOutcome>;
1145
- export declare function createTelegramCustodiedUpdateAdmissionHandle<TUpdate extends TelegramJournaledUpdate & TelegramUpdateFlow, TContext>(deps: Omit<TelegramUpdateAdmissionHandleDeps<TUpdate, TContext>, "onLateOutcome" | "onLateOutcomeError" | "abandonDeferred" | "armRoutingInput" | "selectRoutingInput" | "isRoutingInputCurrent" | "supportsDeferredAbandonment" | "inspectAbandoning" | "inspectHistorical" | "inspectDeferredSource" | "isHistoricalSource"> & {
1256
+ export declare function createTelegramCustodiedUpdateAdmissionHandle<TUpdate extends TelegramJournaledUpdate & TelegramUpdateFlow, TContext>(deps: Omit<TelegramUpdateAdmissionHandleDeps<TUpdate, TContext>, "onLateOutcome" | "onLateOutcomeError" | "abandonDeferred" | "armRoutingInput" | "getRoutingInput" | "selectRoutingInput" | "isRoutingInputCurrent" | "supportsDeferredAbandonment" | "inspectAbandoning" | "inspectHistorical" | "inspectDeferredSource" | "inspectDeferredSourceSnapshot" | "prepareDeferredLiveInput" | "prepareDeferredQueueAdmission" | "prepareDeferredSourceCompletion" | "isHistoricalSource"> & {
1146
1257
  journal: TelegramCustodyExecutionJournal;
1147
1258
  recipientBindingKey: string;
1148
1259
  onLateOutcomeError(error: unknown, updateId: number): void;
@@ -1257,21 +1368,7 @@ export interface TelegramQueueHandoffReconcilerDeps<TContext> {
1257
1368
  handoffToken: string;
1258
1369
  payload: TelegramQueueHandoffPayload;
1259
1370
  }) => Promise<TelegramQueueHandoffStageResult>;
1260
- routeThroughLeader: (input: {
1261
- requestId: string;
1262
- auth?: string;
1263
- recipientInstanceId: string;
1264
- recipientRegistrationGeneration: string;
1265
- donorInstanceId: string;
1266
- donorProcessId: number;
1267
- donorProcessBirthId: string;
1268
- donorSessionGeneration: number;
1269
- donorAcquisitionId: string;
1270
- donorAcquiredAtMs: number;
1271
- handoffToken: string;
1272
- payload: TelegramQueueHandoffPayload;
1273
- sentAtMs: number;
1274
- }) => Promise<TelegramBusEnvelope>;
1371
+ routeThroughLeader: (input: TelegramBusLeaderQueueHandoffOffer) => Promise<TelegramBusEnvelope>;
1275
1372
  removeDonorItem: (receipt: TelegramQueueAdmissionReceipt, ctx: TContext) => boolean;
1276
1373
  recordFailure?: (error: unknown, details: Record<string, unknown>) => void;
1277
1374
  }
@@ -1281,9 +1378,9 @@ export interface TelegramQueueHandoffReconciliationRuntimeAssemblyDeps<TContext>
1281
1378
  isBusEnabled: () => boolean;
1282
1379
  canHandoffWithLeader?: () => boolean;
1283
1380
  listFollowers: () => readonly TelegramBusFollowerView[];
1284
- createRecipientJournalResolver: (profileKey: string, sessionId: string) => (() => {
1381
+ createRecipientJournalResolver: (profileKey: string, sessionId: string) => () => {
1285
1382
  recoveryKey: string;
1286
- } | undefined);
1383
+ } | undefined;
1287
1384
  queueStore: {
1288
1385
  getQueuedItems: () => TelegramQueueItem<TContext>[];
1289
1386
  setQueuedItems: (items: TelegramQueueItem<TContext>[]) => void;
@@ -1293,17 +1390,7 @@ export interface TelegramQueueHandoffReconciliationRuntimeAssemblyDeps<TContext>
1293
1390
  createRequestId: () => string;
1294
1391
  donorInstanceId: string;
1295
1392
  authSecret?: string;
1296
- stageThroughFollower: (input: {
1297
- recipientInstanceId: string;
1298
- recipientRegistrationGeneration: string;
1299
- donorProcessId: number;
1300
- donorProcessBirthId: string;
1301
- donorSessionGeneration: number;
1302
- donorAcquisitionId: string;
1303
- donorAcquiredAtMs: number;
1304
- handoffToken: string;
1305
- payload: TelegramQueueHandoffPayload;
1306
- }) => Promise<TelegramQueueHandoffStageResult>;
1393
+ stageThroughFollower: (input: TelegramBusFollowerQueueHandoffOffer) => Promise<TelegramQueueHandoffStageResult>;
1307
1394
  routeThroughLeader: TelegramQueueHandoffReconcilerDeps<TContext>["routeThroughLeader"];
1308
1395
  recordRuntimeEvent?: (category: string, error: unknown, details?: Record<string, unknown>) => void;
1309
1396
  }
@@ -1361,6 +1448,8 @@ export interface TelegramUpdateAdmissionLifecycleRuntime<TContext> extends Teleg
1361
1448
  getForeignQueueOwnerLiveness: () => TelegramProcessLiveness | undefined;
1362
1449
  hasPendingQueueMutationForItem: (item: TelegramQueueMutationDependencyItem) => boolean;
1363
1450
  signal: () => void;
1451
+ /** Fresh recipient input only; the leader's existing deferred original keeps its original carrier. */
1452
+ prepareLiveInput?: TelegramUpdateWorkerRuntime<TContext>["prepareLiveInput"];
1364
1453
  getState: () => TelegramUpdateWorkerStateSnapshot | undefined;
1365
1454
  }
1366
1455
  export interface TelegramUpdateWorkerOwnerRuntime<TContext> {