@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.
- package/AGENTS.md +9 -7
- package/BACKLOG.md +1 -18
- package/CHANGELOG.md +15 -0
- package/README.md +7 -11
- package/api/commands.ts +3 -0
- package/dist/api/commands.d.ts +1 -1
- package/dist/lib/activity-verbosity.d.ts +1 -5
- package/dist/lib/activity-verbosity.js +15 -42
- package/dist/lib/activity.d.ts +9 -0
- package/dist/lib/activity.js +39 -10
- package/dist/lib/agent-messages.js +7 -3
- package/dist/lib/bindings.d.ts +43 -5
- package/dist/lib/bindings.js +163 -20
- package/dist/lib/bus-api.d.ts +12 -0
- package/dist/lib/bus-api.js +182 -79
- package/dist/lib/bus-follower.d.ts +111 -31
- package/dist/lib/bus-follower.js +1324 -359
- package/dist/lib/bus-leader.d.ts +41 -91
- package/dist/lib/bus-leader.js +969 -637
- package/dist/lib/bus-transport.js +16 -9
- package/dist/lib/bus.d.ts +215 -18
- package/dist/lib/bus.js +1048 -327
- package/dist/lib/channel-posts.d.ts +5 -0
- package/dist/lib/channel-posts.js +434 -261
- package/dist/lib/command-templates.d.ts +26 -5
- package/dist/lib/command-templates.js +92 -176
- package/dist/lib/commands.d.ts +168 -82
- package/dist/lib/commands.js +1409 -291
- package/dist/lib/config.d.ts +1 -8
- package/dist/lib/config.js +34 -76
- package/dist/lib/delivery.d.ts +2 -2
- package/dist/lib/delivery.js +16 -16
- package/dist/lib/extension.js +639 -171
- package/dist/lib/generative-app-worker.mjs +19 -7
- package/dist/lib/generative-apps.d.ts +0 -5
- package/dist/lib/generative-apps.js +61 -49
- package/dist/lib/inbound.d.ts +5 -0
- package/dist/lib/inbound.js +35 -59
- package/dist/lib/journal.d.ts +33 -3
- package/dist/lib/journal.js +2063 -782
- package/dist/lib/lifecycle.d.ts +2 -6
- package/dist/lib/lifecycle.js +75 -58
- package/dist/lib/locks.d.ts +29 -3
- package/dist/lib/locks.js +289 -108
- package/dist/lib/logging.js +50 -14
- package/dist/lib/media.d.ts +22 -1
- package/dist/lib/media.js +46 -28
- package/dist/lib/menu-model.d.ts +19 -5
- package/dist/lib/menu-model.js +53 -11
- package/dist/lib/menu-queue.d.ts +5 -4
- package/dist/lib/menu-queue.js +45 -63
- package/dist/lib/menu-settings.d.ts +5 -4
- package/dist/lib/menu-settings.js +114 -78
- package/dist/lib/menu-status.d.ts +1 -1
- package/dist/lib/menu-status.js +8 -25
- package/dist/lib/menu-thinking.d.ts +6 -1
- package/dist/lib/menu-thinking.js +14 -21
- package/dist/lib/menu.d.ts +8 -61
- package/dist/lib/menu.js +92 -164
- package/dist/lib/model.d.ts +1 -1
- package/dist/lib/model.js +2 -16
- package/dist/lib/outbound-attachments.d.ts +6 -27
- package/dist/lib/outbound-attachments.js +45 -38
- package/dist/lib/outbound-buttons.js +22 -16
- package/dist/lib/outbound-markup.d.ts +0 -2
- package/dist/lib/outbound-markup.js +51 -64
- package/dist/lib/outbound-voice.js +6 -3
- package/dist/lib/outbound.d.ts +6 -6
- package/dist/lib/outbound.js +65 -51
- package/dist/lib/ownership.js +6 -2
- package/dist/lib/paths.d.ts +5 -0
- package/dist/lib/paths.js +37 -21
- package/dist/lib/pi.d.ts +2 -0
- package/dist/lib/pi.js +8 -1
- package/dist/lib/polling.d.ts +21 -37
- package/dist/lib/polling.js +59 -50
- package/dist/lib/preview.js +39 -19
- package/dist/lib/process-identity.d.ts +24 -0
- package/dist/lib/process-identity.js +133 -0
- package/dist/lib/prompts.js +2 -7
- package/dist/lib/queue.d.ts +14 -16
- package/dist/lib/queue.js +252 -127
- package/dist/lib/recovery.d.ts +2 -83
- package/dist/lib/recovery.js +20 -274
- package/dist/lib/replies.d.ts +16 -24
- package/dist/lib/replies.js +99 -116
- package/dist/lib/routing.d.ts +120 -7
- package/dist/lib/routing.js +4667 -1152
- package/dist/lib/runtime.d.ts +1 -11
- package/dist/lib/sections.d.ts +4 -29
- package/dist/lib/sections.js +7 -20
- package/dist/lib/skills.js +4 -3
- package/dist/lib/status.js +86 -57
- package/dist/lib/sync.d.ts +1 -3
- package/dist/lib/sync.js +67 -43
- package/dist/lib/target.d.ts +4 -0
- package/dist/lib/target.js +18 -0
- package/dist/lib/telegram-api.d.ts +18 -13
- package/dist/lib/telegram-api.js +148 -53
- package/dist/lib/text-groups.js +4 -39
- package/dist/lib/thread-cleanup-manager.d.ts +6 -27
- package/dist/lib/thread-cleanup-manager.js +369 -186
- package/dist/lib/thread-display.d.ts +1 -2
- package/dist/lib/thread-display.js +58 -38
- package/dist/lib/thread-naming.d.ts +28 -8
- package/dist/lib/thread-naming.js +175 -66
- package/dist/lib/thread-reconciler.d.ts +42 -16
- package/dist/lib/thread-reconciler.js +90 -50
- package/dist/lib/threads.d.ts +82 -20
- package/dist/lib/threads.js +2247 -855
- package/dist/lib/time-injection.js +1 -2
- package/dist/lib/turns.js +1 -19
- package/dist/lib/updates.d.ts +169 -80
- package/dist/lib/updates.js +2418 -641
- package/dist/lib/voice.d.ts +7 -22
- package/dist/lib/voice.js +7 -22
- package/dist/lib/wire.js +1 -1
- package/dist/lib/workspace-admission.d.ts +3 -1
- package/dist/lib/workspace-admission.js +425 -211
- package/dist/lib/workspace-identity.js +8 -13
- package/dist/lib/workspace-retirement.d.ts +1 -1
- package/dist/lib/workspace-retirement.js +328 -140
- package/dist/lib/workspace-slots.js +8 -4
- package/dist/package.json +1 -1
- package/docs/architecture.md +31 -29
- package/docs/inbound.md +1 -1
- package/docs/multi-instance-bus.md +15 -3
- package/docs/outbound.md +1 -1
- package/docs/public-api.md +29 -1
- package/docs/ui-style.md +25 -8
- package/lib/activity-verbosity.ts +59 -82
- package/lib/activity.ts +146 -102
- package/lib/agent-messages.ts +12 -5
- package/lib/bindings.ts +389 -82
- package/lib/bus-api.ts +263 -102
- package/lib/bus-follower.ts +2440 -601
- package/lib/bus-leader.ts +2209 -1290
- package/lib/bus-transport.ts +46 -12
- package/lib/bus.ts +1673 -444
- package/lib/channel-posts.ts +848 -327
- package/lib/command-templates.ts +152 -265
- package/lib/commands.ts +2398 -555
- package/lib/config.ts +177 -170
- package/lib/delivery.ts +41 -29
- package/lib/extension.ts +1206 -433
- package/lib/generative-app-worker.mjs +19 -7
- package/lib/generative-apps.ts +324 -211
- package/lib/inbound.ts +95 -97
- package/lib/journal.ts +5311 -1763
- package/lib/keyboard.ts +1 -3
- package/lib/lifecycle.ts +128 -78
- package/lib/locks.ts +677 -203
- package/lib/logging.ts +147 -58
- package/lib/media.ts +82 -43
- package/lib/menu-model.ts +85 -18
- package/lib/menu-queue.ts +88 -129
- package/lib/menu-settings.ts +260 -155
- package/lib/menu-status.ts +20 -60
- package/lib/menu-thinking.ts +41 -56
- package/lib/menu.ts +112 -285
- package/lib/model.ts +8 -22
- package/lib/outbound-attachments.ts +156 -125
- package/lib/outbound-buttons.ts +76 -49
- package/lib/outbound-markup.ts +96 -94
- package/lib/outbound-voice.ts +33 -27
- package/lib/outbound.ts +128 -125
- package/lib/ownership.ts +19 -10
- package/lib/paths.ts +148 -49
- package/lib/pi.ts +35 -15
- package/lib/polling.ts +144 -147
- package/lib/preview.ts +93 -40
- package/lib/process-identity.ts +164 -0
- package/lib/prompts.ts +4 -11
- package/lib/queue.ts +516 -301
- package/lib/recovery.ts +50 -454
- package/lib/rendering.ts +1 -3
- package/lib/replies.ts +248 -209
- package/lib/routing.ts +8509 -2186
- package/lib/runtime.ts +1 -12
- package/lib/sections.ts +24 -89
- package/lib/setup.ts +1 -3
- package/lib/skills.ts +9 -4
- package/lib/status.ts +215 -110
- package/lib/sync.ts +448 -361
- package/lib/target.ts +22 -3
- package/lib/telegram-api.ts +302 -127
- package/lib/text-groups.ts +5 -39
- package/lib/thread-cleanup-manager.ts +833 -331
- package/lib/thread-display.ts +213 -97
- package/lib/thread-naming.ts +232 -87
- package/lib/thread-reconciler.ts +155 -72
- package/lib/threads.ts +5318 -1845
- package/lib/time-injection.ts +1 -4
- package/lib/turns.ts +15 -28
- package/lib/updates.ts +5184 -1612
- package/lib/voice.ts +7 -35
- package/lib/wire.ts +1 -1
- package/lib/workspace-admission.ts +996 -416
- package/lib/workspace-identity.ts +14 -17
- package/lib/workspace-retirement.ts +878 -376
- package/lib/workspace-slots.ts +22 -13
- package/package.json +1 -1
- package/scripts/check-downgrade.mjs +0 -472
- 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;
|
package/dist/lib/updates.d.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
-
|
|
347
|
-
|
|
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
|
|
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
|
-
/**
|
|
589
|
-
|
|
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> {
|