@songsid/agend 2.1.2-beta.48 → 2.1.2-beta.49

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.
@@ -0,0 +1,34 @@
1
+ import type { ChannelAdapter } from "./channel/types.js";
2
+ export interface RestartProgressTarget {
3
+ adapter: ChannelAdapter;
4
+ chatId: string;
5
+ threadId?: string;
6
+ }
7
+ type ProgressLogger = {
8
+ warn(data: unknown, message: string): void;
9
+ };
10
+ /** One General-topic message that is edited throughout a fleet startup. */
11
+ export declare class RestartProgress {
12
+ readonly total: number;
13
+ private readonly startedAt;
14
+ private readonly logger;
15
+ readonly enabled: boolean;
16
+ private ready;
17
+ private target;
18
+ private messageId;
19
+ private lastReportedReady;
20
+ private updateTimer;
21
+ private editChain;
22
+ private finished;
23
+ constructor(total: number, startedAt: number, logger: ProgressLogger);
24
+ /** May be called before the channel adapter is ready; progress is retained. */
25
+ markReady(): void;
26
+ /** Post the one progress message once General and its adapter are available. */
27
+ start(target: RestartProgressTarget | null): Promise<boolean>;
28
+ /** Edit the original message to its terminal state. Returns true if it existed. */
29
+ finish(): Promise<boolean>;
30
+ get readyCount(): number;
31
+ private queueProgressEdit;
32
+ private enqueueEdit;
33
+ }
34
+ export {};
@@ -0,0 +1,87 @@
1
+ function formatElapsed(ms) {
2
+ const seconds = Math.max(0, Math.floor(ms / 1000));
3
+ const minutes = Math.floor(seconds / 60);
4
+ const remainder = seconds % 60;
5
+ return minutes > 0 ? `${minutes}m ${remainder}s` : `${seconds}s`;
6
+ }
7
+ /** One General-topic message that is edited throughout a fleet startup. */
8
+ export class RestartProgress {
9
+ total;
10
+ startedAt;
11
+ logger;
12
+ enabled;
13
+ ready = 0;
14
+ target = null;
15
+ messageId = null;
16
+ lastReportedReady = 0;
17
+ updateTimer = null;
18
+ editChain = Promise.resolve();
19
+ finished = false;
20
+ constructor(total, startedAt, logger) {
21
+ this.total = total;
22
+ this.startedAt = startedAt;
23
+ this.logger = logger;
24
+ this.enabled = total > 5;
25
+ }
26
+ /** May be called before the channel adapter is ready; progress is retained. */
27
+ markReady() {
28
+ if (!this.enabled || this.finished)
29
+ return;
30
+ this.ready = Math.min(this.total, this.ready + 1);
31
+ if (this.messageId && this.ready - this.lastReportedReady >= 5) {
32
+ this.queueProgressEdit();
33
+ }
34
+ }
35
+ /** Post the one progress message once General and its adapter are available. */
36
+ async start(target) {
37
+ if (!this.enabled || !target || this.messageId || this.finished)
38
+ return false;
39
+ this.target = target;
40
+ try {
41
+ const sent = await target.adapter.sendText(target.chatId, `🔄 Fleet restarting — ${this.total} instances starting...`, { threadId: target.threadId });
42
+ this.messageId = sent.messageId;
43
+ if (this.ready >= 5)
44
+ this.queueProgressEdit();
45
+ this.updateTimer = setInterval(() => this.queueProgressEdit(), 30_000);
46
+ this.updateTimer.unref?.();
47
+ return true;
48
+ }
49
+ catch (err) {
50
+ this.logger.warn({ err }, "Failed to post fleet restart progress");
51
+ this.target = null;
52
+ return false;
53
+ }
54
+ }
55
+ /** Edit the original message to its terminal state. Returns true if it existed. */
56
+ async finish() {
57
+ if (!this.enabled)
58
+ return false;
59
+ this.finished = true;
60
+ if (this.updateTimer) {
61
+ clearInterval(this.updateTimer);
62
+ this.updateTimer = null;
63
+ }
64
+ if (!this.target || !this.messageId)
65
+ return false;
66
+ this.enqueueEdit(`✅ Fleet ready — ${this.ready}/${this.total} instances started (${formatElapsed(Date.now() - this.startedAt)})`);
67
+ await this.editChain;
68
+ return true;
69
+ }
70
+ get readyCount() { return this.ready; }
71
+ queueProgressEdit() {
72
+ if (this.finished || !this.target || !this.messageId)
73
+ return;
74
+ this.lastReportedReady = this.ready;
75
+ this.enqueueEdit(`🔄 Fleet restarting — ${this.ready}/${this.total} ready...`);
76
+ }
77
+ enqueueEdit(text) {
78
+ const target = this.target;
79
+ const messageId = this.messageId;
80
+ if (!target || !messageId)
81
+ return;
82
+ this.editChain = this.editChain
83
+ .then(() => target.adapter.editMessage(target.chatId, messageId, text, target.threadId))
84
+ .catch(err => this.logger.warn({ err }, "Failed to edit fleet restart progress"));
85
+ }
86
+ }
87
+ //# sourceMappingURL=restart-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart-progress.js","sourceRoot":"","sources":["../src/restart-progress.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "2.1.2-beta.48",
3
+ "version": "2.1.2-beta.49",
4
4
  "description": "Multi-agent fleet daemon — run any coding CLI (Claude, Gemini, Codex, OpenCode) from Telegram",
5
5
  "type": "module",
6
6
  "bin": {