@llblab/pi-telegram 0.52.2 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -7
- package/BACKLOG.md +1 -18
- package/CHANGELOG.md +11 -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 +61 -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 +249 -126
- 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 +125 -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 +511 -300
- 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
package/lib/delivery.ts
CHANGED
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
type TelegramInlineKeyboardMarkup,
|
|
11
11
|
} from "./keyboard.ts";
|
|
12
12
|
import {
|
|
13
|
-
withTelegramReplyParameters,
|
|
14
13
|
renderTelegramMessage,
|
|
14
|
+
withTelegramReplyParameters,
|
|
15
15
|
} from "./replies.ts";
|
|
16
16
|
import {
|
|
17
17
|
areTelegramTargetsEqual as areDeliveryTargetsEqual,
|
|
@@ -92,6 +92,7 @@ export type TelegramDeliveryChatAction =
|
|
|
92
92
|
/** @internal */
|
|
93
93
|
export interface TelegramDeliveryRuntime {
|
|
94
94
|
readonly generation: string;
|
|
95
|
+
hasPendingTarget?: (target: TelegramDeliveryTarget) => boolean;
|
|
95
96
|
shutdown: () => void;
|
|
96
97
|
sendView: (
|
|
97
98
|
view: TelegramDeliveryView,
|
|
@@ -186,6 +187,7 @@ export function createTelegramDeliveryLifecycleHooks(
|
|
|
186
187
|
): {
|
|
187
188
|
onSessionStart: () => Promise<void>;
|
|
188
189
|
onSessionShutdown: () => Promise<void>;
|
|
190
|
+
hasPendingTarget: (target: TelegramDeliveryTarget) => boolean | undefined;
|
|
189
191
|
} {
|
|
190
192
|
let runtime: TelegramDeliveryRuntime | undefined;
|
|
191
193
|
let unbind: ReturnType<typeof bindTelegramDeliveryRuntime> | undefined;
|
|
@@ -196,6 +198,7 @@ export function createTelegramDeliveryLifecycleHooks(
|
|
|
196
198
|
runtime = undefined;
|
|
197
199
|
};
|
|
198
200
|
return {
|
|
201
|
+
hasPendingTarget: (target) => runtime?.hasPendingTarget?.(target),
|
|
199
202
|
onSessionStart: async () => {
|
|
200
203
|
stopCurrentRuntime();
|
|
201
204
|
runtime = createRuntime();
|
|
@@ -207,7 +210,9 @@ export function createTelegramDeliveryLifecycleHooks(
|
|
|
207
210
|
};
|
|
208
211
|
}
|
|
209
212
|
|
|
210
|
-
export function createTelegramDeliveryGenerationSeed(
|
|
213
|
+
export function createTelegramDeliveryGenerationSeed(
|
|
214
|
+
instanceId: string,
|
|
215
|
+
): string {
|
|
211
216
|
return `${instanceId}:${Date.now()}`;
|
|
212
217
|
}
|
|
213
218
|
|
|
@@ -264,16 +269,25 @@ function failure<T>(
|
|
|
264
269
|
}
|
|
265
270
|
|
|
266
271
|
function classifyTelegramDeliveryTransportError(error: unknown): {
|
|
267
|
-
reason: Extract<
|
|
268
|
-
|
|
269
|
-
|
|
272
|
+
reason: Extract<
|
|
273
|
+
TelegramDeliveryFailureReason,
|
|
274
|
+
| "commit-unknown"
|
|
275
|
+
| "message-unavailable"
|
|
276
|
+
| "rate-limited"
|
|
277
|
+
| "transport-retryable"
|
|
278
|
+
| "transport-failed"
|
|
279
|
+
>;
|
|
270
280
|
retryAfterMs?: number;
|
|
271
281
|
} {
|
|
272
|
-
if (isTelegramApiCommitUnknownError(error))
|
|
273
|
-
|
|
282
|
+
if (isTelegramApiCommitUnknownError(error))
|
|
283
|
+
return { reason: "commit-unknown" };
|
|
284
|
+
if (isTelegramMessageUnavailableError(error))
|
|
285
|
+
return { reason: "message-unavailable" };
|
|
274
286
|
const retryAfterMs = getTelegramApiRetryAfterMs(error);
|
|
275
|
-
if (retryAfterMs !== undefined)
|
|
276
|
-
|
|
287
|
+
if (retryAfterMs !== undefined)
|
|
288
|
+
return { reason: "rate-limited", retryAfterMs };
|
|
289
|
+
if (isRetryableTelegramApiError(error))
|
|
290
|
+
return { reason: "transport-retryable" };
|
|
277
291
|
return { reason: "transport-failed" };
|
|
278
292
|
}
|
|
279
293
|
|
|
@@ -415,7 +429,7 @@ function resolveTelegramDeliveryTarget(
|
|
|
415
429
|
|
|
416
430
|
function createTelegramDeliveryTargetQueue() {
|
|
417
431
|
const queues = new Map<string, Promise<void>>();
|
|
418
|
-
|
|
432
|
+
async function run<T>(
|
|
419
433
|
target: TelegramDeliveryTarget,
|
|
420
434
|
operation: () => Promise<T>,
|
|
421
435
|
): Promise<T> {
|
|
@@ -432,6 +446,11 @@ function createTelegramDeliveryTargetQueue() {
|
|
|
432
446
|
} finally {
|
|
433
447
|
if (queues.get(key) === settled) queues.delete(key);
|
|
434
448
|
}
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
run,
|
|
452
|
+
hasPendingTarget: (target: TelegramDeliveryTarget) =>
|
|
453
|
+
queues.has(targetKey(target)),
|
|
435
454
|
};
|
|
436
455
|
}
|
|
437
456
|
|
|
@@ -463,7 +482,8 @@ export function createTelegramDeliveryRuntime(
|
|
|
463
482
|
TelegramDeliveryHandle,
|
|
464
483
|
{ target: TelegramDeliveryTarget; messageIds: readonly number[] }
|
|
465
484
|
>();
|
|
466
|
-
const
|
|
485
|
+
const targetQueue = createTelegramDeliveryTargetQueue();
|
|
486
|
+
const runForTarget = targetQueue.run;
|
|
467
487
|
const render = (
|
|
468
488
|
view: TelegramDeliveryView,
|
|
469
489
|
): TelegramDeliveryResult<readonly TelegramDeliveryRenderedChunk[]> => {
|
|
@@ -549,6 +569,7 @@ export function createTelegramDeliveryRuntime(
|
|
|
549
569
|
};
|
|
550
570
|
return {
|
|
551
571
|
generation: deps.generation,
|
|
572
|
+
hasPendingTarget: targetQueue.hasPendingTarget,
|
|
552
573
|
shutdown() {
|
|
553
574
|
active = false;
|
|
554
575
|
},
|
|
@@ -743,15 +764,21 @@ export function createTelegramBridgeDeliveryRuntime(
|
|
|
743
764
|
async sendChunk(target, chunk, options) {
|
|
744
765
|
assertTransportActive();
|
|
745
766
|
const sent = await withTelegramReplyParameters(
|
|
746
|
-
target.chatId,
|
|
767
|
+
target.chatId,
|
|
768
|
+
options.replyToMessageId,
|
|
769
|
+
target,
|
|
747
770
|
(replyParameters) => {
|
|
748
771
|
const body = {
|
|
749
772
|
chat_id: target.chatId,
|
|
750
773
|
text: chunk.text,
|
|
751
|
-
...(chunk.parseMode === "html"
|
|
774
|
+
...(chunk.parseMode === "html"
|
|
775
|
+
? { parse_mode: "HTML" as const }
|
|
776
|
+
: {}),
|
|
752
777
|
...getTelegramTargetThreadParams(target),
|
|
753
778
|
...(replyParameters ? { reply_parameters: replyParameters } : {}),
|
|
754
|
-
...(options.replyMarkup
|
|
779
|
+
...(options.replyMarkup
|
|
780
|
+
? { reply_markup: options.replyMarkup }
|
|
781
|
+
: {}),
|
|
755
782
|
};
|
|
756
783
|
return deps.api.sendMessage(
|
|
757
784
|
target.threadId === undefined
|
|
@@ -872,21 +899,6 @@ export async function sendTelegramView(
|
|
|
872
899
|
return runDeliveryOperation((runtime) => runtime.sendView(view, options));
|
|
873
900
|
}
|
|
874
901
|
|
|
875
|
-
/** @internal Edit an exact Telegram message through the currently bound runtime generation. */
|
|
876
|
-
export async function editTelegramTargetView(
|
|
877
|
-
target: TelegramDeliveryTarget,
|
|
878
|
-
messageId: number,
|
|
879
|
-
view: TelegramDeliveryView,
|
|
880
|
-
): Promise<TelegramDeliveryResult<TelegramDeliveryHandle>> {
|
|
881
|
-
const invalid = validateView<TelegramDeliveryHandle>(view);
|
|
882
|
-
if (invalid) return invalid;
|
|
883
|
-
return runDeliveryOperation((runtime) => runtime.editView({
|
|
884
|
-
target: { ...target },
|
|
885
|
-
messageIds: [messageId],
|
|
886
|
-
generation: runtime.generation,
|
|
887
|
-
}, view));
|
|
888
|
-
}
|
|
889
|
-
|
|
890
902
|
export async function editTelegramView(
|
|
891
903
|
handle: TelegramDeliveryHandle,
|
|
892
904
|
view: TelegramDeliveryView,
|