@keyou007/agent-bot 0.1.16-alpha.1 → 0.1.16-alpha.2
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/CHANGELOG.md +4 -0
- package/dist/feishu/CardRenderer.js +17 -6
- package/dist/feishu/CardRenderer.js.map +1 -1
- package/dist/proxy/ProxySessionController.js +10 -7
- package/dist/proxy/ProxySessionController.js.map +1 -1
- package/dist/supervision/SafeRestartNotifier.js +43 -3
- package/dist/supervision/SafeRestartNotifier.js.map +1 -1
- package/dist/supervision/SafeRestartScheduler.js +8 -8
- package/dist/supervision/SafeRestartScheduler.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/src/feishu/CardRenderer.ts +19 -7
- package/src/proxy/ProxySessionController.ts +23 -7
- package/src/supervision/SafeRestartNotifier.ts +52 -3
- package/src/supervision/SafeRestartScheduler.ts +8 -8
|
@@ -11,6 +11,7 @@ export class SafeRestartNotifier {
|
|
|
11
11
|
notificationTargets = new Map();
|
|
12
12
|
activeScheduleId;
|
|
13
13
|
terminalScheduleId;
|
|
14
|
+
lastStatus;
|
|
14
15
|
pendingInitialStatus;
|
|
15
16
|
initialCardTimer;
|
|
16
17
|
queue = Promise.resolve();
|
|
@@ -33,12 +34,22 @@ export class SafeRestartNotifier {
|
|
|
33
34
|
this.terminalScheduleId = Math.max(this.terminalScheduleId ?? 0, status.scheduleId);
|
|
34
35
|
}
|
|
35
36
|
if (this.activeScheduleId !== status.scheduleId) {
|
|
37
|
+
const previousStatus = this.lastStatus ?? this.pendingInitialStatus;
|
|
38
|
+
const previousMessageIds = [...this.messageIds];
|
|
39
|
+
const previousTargets = new Map(this.notificationTargets);
|
|
40
|
+
if (previousStatus
|
|
41
|
+
&& previousStatus.phase !== "cancelled"
|
|
42
|
+
&& previousStatus.phase !== "restarting"
|
|
43
|
+
&& previousMessageIds.length > 0) {
|
|
44
|
+
this.enqueueSupersededCards(previousStatus, previousMessageIds, previousTargets);
|
|
45
|
+
}
|
|
36
46
|
this.activeScheduleId = status.scheduleId;
|
|
37
47
|
this.messageIds.clear();
|
|
38
48
|
this.cardHashes.clear();
|
|
39
49
|
this.notificationTargets.clear();
|
|
40
50
|
this.clearInitialCardTimer();
|
|
41
51
|
this.pendingInitialStatus = status;
|
|
52
|
+
this.lastStatus = status;
|
|
42
53
|
this.collectNotificationTargets(status);
|
|
43
54
|
const delayMs = status.phase === "cancelled"
|
|
44
55
|
? 0
|
|
@@ -53,6 +64,7 @@ export class SafeRestartNotifier {
|
|
|
53
64
|
}, delayMs);
|
|
54
65
|
return Promise.resolve();
|
|
55
66
|
}
|
|
67
|
+
this.lastStatus = status;
|
|
56
68
|
this.collectNotificationTargets(status);
|
|
57
69
|
if (this.pendingInitialStatus) {
|
|
58
70
|
this.pendingInitialStatus = status;
|
|
@@ -139,9 +151,14 @@ export class SafeRestartNotifier {
|
|
|
139
151
|
else {
|
|
140
152
|
created = await this.outbound.sendInteractiveCard(contextKey, card);
|
|
141
153
|
}
|
|
142
|
-
if (created
|
|
143
|
-
this.
|
|
144
|
-
|
|
154
|
+
if (created) {
|
|
155
|
+
if (this.activeScheduleId === status.scheduleId) {
|
|
156
|
+
this.messageIds.set(contextKey, created);
|
|
157
|
+
this.cardHashes.set(contextKey, cardHash);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
await this.stopCard(created, status, reason ?? status.reason);
|
|
161
|
+
}
|
|
145
162
|
}
|
|
146
163
|
}
|
|
147
164
|
catch (error) {
|
|
@@ -149,6 +166,29 @@ export class SafeRestartNotifier {
|
|
|
149
166
|
}
|
|
150
167
|
}));
|
|
151
168
|
}
|
|
169
|
+
enqueueSupersededCards(status, messageIds, targets) {
|
|
170
|
+
const queued = this.queue.catch(() => undefined).then(async () => {
|
|
171
|
+
await Promise.all(messageIds.map(async ([contextKey, messageId]) => {
|
|
172
|
+
const reason = targets.get(contextKey)?.reason ?? status.reason;
|
|
173
|
+
await this.stopCard(messageId, status, reason);
|
|
174
|
+
}));
|
|
175
|
+
});
|
|
176
|
+
this.queue = queued;
|
|
177
|
+
}
|
|
178
|
+
async stopCard(messageId, status, reason) {
|
|
179
|
+
try {
|
|
180
|
+
await this.outbound.updateInteractiveCard(messageId, this.renderer.renderSafeRestartStatus({
|
|
181
|
+
scheduleId: status.scheduleId,
|
|
182
|
+
reason,
|
|
183
|
+
phase: "superseded",
|
|
184
|
+
pendingFinalDeliveries: status.activity.pendingFinalDeliveries,
|
|
185
|
+
waitingTasks: [],
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
this.logger.warn({ error, messageId, scheduleId: status.scheduleId }, "Failed to stop a superseded safe restart status card.");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
152
192
|
collectNotificationTargets(status) {
|
|
153
193
|
for (const target of status.notificationTargets ?? []) {
|
|
154
194
|
const contextKey = target.contextKey.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafeRestartNotifier.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartNotifier.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK7D,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAM5C,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"SafeRestartNotifier.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartNotifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,9 @@ export class SafeRestartScheduler {
|
|
|
20
20
|
schedule(reason, notificationTarget) {
|
|
21
21
|
const newlyScheduled = !this.reason;
|
|
22
22
|
if (newlyScheduled) {
|
|
23
|
-
this.scheduleId += 1;
|
|
24
23
|
this.notificationTargets = [];
|
|
25
24
|
}
|
|
25
|
+
this.scheduleId += 1;
|
|
26
26
|
this.addNotificationTarget(notificationTarget, reason);
|
|
27
27
|
this.reason = reason;
|
|
28
28
|
this.idleSince = undefined;
|
|
@@ -70,12 +70,13 @@ export class SafeRestartScheduler {
|
|
|
70
70
|
const reason = this.reason;
|
|
71
71
|
if (!reason)
|
|
72
72
|
return;
|
|
73
|
+
const scheduleId = this.scheduleId;
|
|
73
74
|
const state = this.options.readActivity();
|
|
74
75
|
if (state.runningSessions > 0 || state.pendingFinalDeliveries > 0) {
|
|
75
76
|
this.idleSince = undefined;
|
|
76
77
|
this.idleInboundAt = undefined;
|
|
77
78
|
await this.emitStatus({
|
|
78
|
-
scheduleId
|
|
79
|
+
scheduleId,
|
|
79
80
|
reason,
|
|
80
81
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
81
82
|
phase: state.runningSessions > 0 ? "waiting_tasks" : "waiting_delivery",
|
|
@@ -89,7 +90,7 @@ export class SafeRestartScheduler {
|
|
|
89
90
|
this.idleSince = Date.now();
|
|
90
91
|
this.idleInboundAt = latestInboundAt;
|
|
91
92
|
await this.emitStatus({
|
|
92
|
-
scheduleId
|
|
93
|
+
scheduleId,
|
|
93
94
|
reason,
|
|
94
95
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
95
96
|
phase: "countdown",
|
|
@@ -101,7 +102,7 @@ export class SafeRestartScheduler {
|
|
|
101
102
|
const remainingMs = Math.max(0, quietPeriodMs - (Date.now() - this.idleSince));
|
|
102
103
|
if (remainingMs > 0) {
|
|
103
104
|
await this.emitStatus({
|
|
104
|
-
scheduleId
|
|
105
|
+
scheduleId,
|
|
105
106
|
reason,
|
|
106
107
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
107
108
|
phase: "countdown",
|
|
@@ -118,7 +119,7 @@ export class SafeRestartScheduler {
|
|
|
118
119
|
this.idleInboundAt = undefined;
|
|
119
120
|
if (confirmed.runningSessions > 0 || confirmed.pendingFinalDeliveries > 0) {
|
|
120
121
|
await this.emitStatus({
|
|
121
|
-
scheduleId
|
|
122
|
+
scheduleId,
|
|
122
123
|
reason,
|
|
123
124
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
124
125
|
phase: confirmed.runningSessions > 0 ? "waiting_tasks" : "waiting_delivery",
|
|
@@ -127,7 +128,7 @@ export class SafeRestartScheduler {
|
|
|
127
128
|
}
|
|
128
129
|
else {
|
|
129
130
|
await this.emitStatus({
|
|
130
|
-
scheduleId
|
|
131
|
+
scheduleId,
|
|
131
132
|
reason,
|
|
132
133
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
133
134
|
phase: "countdown",
|
|
@@ -137,7 +138,6 @@ export class SafeRestartScheduler {
|
|
|
137
138
|
}
|
|
138
139
|
return;
|
|
139
140
|
}
|
|
140
|
-
const scheduleId = this.scheduleId;
|
|
141
141
|
const notificationTargets = this.notificationTargetsSnapshot();
|
|
142
142
|
this.clear();
|
|
143
143
|
await this.emitStatus({
|
|
@@ -187,7 +187,7 @@ export class SafeRestartScheduler {
|
|
|
187
187
|
this.notificationTargets[existingIndex] = {
|
|
188
188
|
...existing,
|
|
189
189
|
reason: target.reason,
|
|
190
|
-
...(
|
|
190
|
+
...(target.replyMessageId
|
|
191
191
|
? { replyMessageId: target.replyMessageId }
|
|
192
192
|
: {}),
|
|
193
193
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafeRestartScheduler.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartScheduler.ts"],"names":[],"mappings":"AAqCA,MAAM,OAAO,oBAAoB;IAUF,OAAO;IAT5B,KAAK,CAAkB;IACvB,OAAO,CAAiB;IACxB,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,CAAU;IAChB,mBAAmB,GAAgC,EAAE,CAAC;IACtD,SAAS,CAAU;IACnB,aAAa,CAAU;IACvB,UAAU,GAAG,CAAC,CAAC;IAEvB,YAA6B,OAAoC;uBAApC,OAAO;IAAgC,CAAC;IAErE,IAAI,SAAS;QACX,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,MAAc,EAAE,kBAA8C;QACrE,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"SafeRestartScheduler.js","sourceRoot":"","sources":["../../src/supervision/SafeRestartScheduler.ts"],"names":[],"mappings":"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"}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keyou007/agent-bot",
|
|
3
|
-
"version": "0.1.16-alpha.
|
|
3
|
+
"version": "0.1.16-alpha.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@keyou007/agent-bot",
|
|
9
|
-
"version": "0.1.16-alpha.
|
|
9
|
+
"version": "0.1.16-alpha.2",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@agentclientprotocol/sdk": "1.2.1",
|
package/package.json
CHANGED
|
@@ -58,7 +58,7 @@ export interface InitializationWelcomeView {
|
|
|
58
58
|
export interface SafeRestartStatusView {
|
|
59
59
|
scheduleId: number;
|
|
60
60
|
reason: string;
|
|
61
|
-
phase: "waiting_tasks" | "waiting_delivery" | "countdown" | "restarting" | "cancelled";
|
|
61
|
+
phase: "waiting_tasks" | "waiting_delivery" | "countdown" | "restarting" | "cancelled" | "superseded";
|
|
62
62
|
remainingMs?: number;
|
|
63
63
|
pendingFinalDeliveries: number;
|
|
64
64
|
waitingTasks: Array<{
|
|
@@ -70,6 +70,7 @@ export interface SafeRestartStatusView {
|
|
|
70
70
|
export interface PromptQueueCardView {
|
|
71
71
|
sessionId: string;
|
|
72
72
|
contextKey: string;
|
|
73
|
+
phase?: "active" | "superseded";
|
|
73
74
|
prompts: Array<{
|
|
74
75
|
id: string;
|
|
75
76
|
text: string;
|
|
@@ -665,7 +666,8 @@ export class CardRenderer {
|
|
|
665
666
|
}
|
|
666
667
|
|
|
667
668
|
renderPromptQueue(view: PromptQueueCardView): Record<string, unknown> {
|
|
668
|
-
const
|
|
669
|
+
const superseded = view.phase === "superseded";
|
|
670
|
+
const elements: Record<string, unknown>[] = view.prompts.length === 0
|
|
669
671
|
? [markdown("队列为空")]
|
|
670
672
|
: view.prompts.map((prompt, index) => ({
|
|
671
673
|
tag: "column_set",
|
|
@@ -688,7 +690,7 @@ export class CardRenderer {
|
|
|
688
690
|
tag: "column",
|
|
689
691
|
width: "auto",
|
|
690
692
|
vertical_align: "center",
|
|
691
|
-
elements: [{
|
|
693
|
+
elements: superseded ? [] : [{
|
|
692
694
|
tag: "button",
|
|
693
695
|
text: { tag: "plain_text", content: "Cancel" },
|
|
694
696
|
type: "default",
|
|
@@ -706,6 +708,9 @@ export class CardRenderer {
|
|
|
706
708
|
},
|
|
707
709
|
],
|
|
708
710
|
}));
|
|
711
|
+
if (superseded) {
|
|
712
|
+
elements.push({ tag: "hr" }, markdown("此卡片已由新的排队卡片替代。"));
|
|
713
|
+
}
|
|
709
714
|
return {
|
|
710
715
|
schema: "2.0",
|
|
711
716
|
config: {
|
|
@@ -714,7 +719,10 @@ export class CardRenderer {
|
|
|
714
719
|
},
|
|
715
720
|
header: {
|
|
716
721
|
template: "grey",
|
|
717
|
-
title: {
|
|
722
|
+
title: {
|
|
723
|
+
tag: "plain_text",
|
|
724
|
+
content: superseded ? "排队 Prompt · 已停止" : `排队 Prompt · ${view.prompts.length}`,
|
|
725
|
+
},
|
|
718
726
|
padding: "8px 12px 8px 12px",
|
|
719
727
|
},
|
|
720
728
|
body: {
|
|
@@ -733,6 +741,8 @@ export class CardRenderer {
|
|
|
733
741
|
? "0s"
|
|
734
742
|
: view.phase === "cancelled"
|
|
735
743
|
? "已取消"
|
|
744
|
+
: view.phase === "superseded"
|
|
745
|
+
? "已停止"
|
|
736
746
|
: "等待阻塞项清空后开始";
|
|
737
747
|
const status = view.phase === "waiting_tasks"
|
|
738
748
|
? "🟠 等待任务完成"
|
|
@@ -742,7 +752,9 @@ export class CardRenderer {
|
|
|
742
752
|
? "🟡 空闲确认中"
|
|
743
753
|
: view.phase === "restarting"
|
|
744
754
|
? "🔄 正在重启"
|
|
745
|
-
:
|
|
755
|
+
: view.phase === "cancelled"
|
|
756
|
+
? "⚪ 已取消"
|
|
757
|
+
: "⚪ 已停止";
|
|
746
758
|
const lines = [
|
|
747
759
|
`**状态**:${status}`,
|
|
748
760
|
`**重启原因**:${inlineCode(view.reason)}`,
|
|
@@ -761,7 +773,7 @@ export class CardRenderer {
|
|
|
761
773
|
} else {
|
|
762
774
|
elements.push({ tag: "hr" }, markdown("**当前等待的任务**:无"));
|
|
763
775
|
}
|
|
764
|
-
if (view.phase !== "restarting" && view.phase !== "cancelled") {
|
|
776
|
+
if (view.phase !== "restarting" && view.phase !== "cancelled" && view.phase !== "superseded") {
|
|
765
777
|
elements.push(
|
|
766
778
|
{ tag: "hr" },
|
|
767
779
|
taskActionRow([{
|
|
@@ -775,7 +787,7 @@ export class CardRenderer {
|
|
|
775
787
|
}
|
|
776
788
|
const template = view.phase === "restarting"
|
|
777
789
|
? "blue"
|
|
778
|
-
: view.phase === "cancelled"
|
|
790
|
+
: view.phase === "cancelled" || view.phase === "superseded"
|
|
779
791
|
? "grey"
|
|
780
792
|
: "orange";
|
|
781
793
|
return sectionCard("Agent Bot 安全重启", elements, template);
|
|
@@ -2503,17 +2503,28 @@ export class ProxySessionController {
|
|
|
2503
2503
|
|
|
2504
2504
|
private async presentPromptQueueCard(localSessionId: string, contextKey: string): Promise<void> {
|
|
2505
2505
|
await this.serializePromptQueueCardWrite(localSessionId, async () => {
|
|
2506
|
-
const
|
|
2507
|
-
const existing =
|
|
2506
|
+
const cards = this.queuedPromptCards.get(localSessionId);
|
|
2507
|
+
const existing = cards?.get(contextKey);
|
|
2508
2508
|
if (existing) {
|
|
2509
2509
|
try {
|
|
2510
|
-
await this.outbound.updateInteractiveCard(
|
|
2511
|
-
|
|
2510
|
+
await this.outbound.updateInteractiveCard(
|
|
2511
|
+
contextKey,
|
|
2512
|
+
existing,
|
|
2513
|
+
this.renderPromptQueueCard(localSessionId, contextKey, "superseded"),
|
|
2514
|
+
);
|
|
2512
2515
|
} catch (error) {
|
|
2513
|
-
this.logger.warn(
|
|
2516
|
+
this.logger.warn(
|
|
2517
|
+
{ error, localSessionId, contextKey, messageId: existing },
|
|
2518
|
+
"Failed to stop the previous prompt queue card; sending a replacement.",
|
|
2519
|
+
);
|
|
2514
2520
|
}
|
|
2521
|
+
cards?.delete(contextKey);
|
|
2522
|
+
if (cards?.size === 0) this.queuedPromptCards.delete(localSessionId);
|
|
2515
2523
|
}
|
|
2516
|
-
const messageId = await this.outbound.sendInteractiveCard(
|
|
2524
|
+
const messageId = await this.outbound.sendInteractiveCard(
|
|
2525
|
+
contextKey,
|
|
2526
|
+
this.renderPromptQueueCard(localSessionId, contextKey),
|
|
2527
|
+
);
|
|
2517
2528
|
if (messageId) this.rememberPromptQueueCard(localSessionId, contextKey, messageId);
|
|
2518
2529
|
});
|
|
2519
2530
|
}
|
|
@@ -2536,10 +2547,15 @@ export class ProxySessionController {
|
|
|
2536
2547
|
});
|
|
2537
2548
|
}
|
|
2538
2549
|
|
|
2539
|
-
private renderPromptQueueCard(
|
|
2550
|
+
private renderPromptQueueCard(
|
|
2551
|
+
localSessionId: string,
|
|
2552
|
+
contextKey: string,
|
|
2553
|
+
phase: "active" | "superseded" = "active",
|
|
2554
|
+
): Record<string, unknown> {
|
|
2540
2555
|
return this.cardRenderer.renderPromptQueue({
|
|
2541
2556
|
sessionId: localSessionId,
|
|
2542
2557
|
contextKey,
|
|
2558
|
+
phase,
|
|
2543
2559
|
prompts: this.store.listQueuedPrompts(localSessionId).map((prompt) => ({
|
|
2544
2560
|
id: prompt.promptId,
|
|
2545
2561
|
text: prompt.displayPrompt ?? prompt.text,
|
|
@@ -17,6 +17,7 @@ export class SafeRestartNotifier {
|
|
|
17
17
|
private readonly notificationTargets = new Map<string, RestartNotificationTarget>();
|
|
18
18
|
private activeScheduleId?: number;
|
|
19
19
|
private terminalScheduleId?: number;
|
|
20
|
+
private lastStatus?: SafeRestartStatus;
|
|
20
21
|
private pendingInitialStatus?: SafeRestartStatus;
|
|
21
22
|
private initialCardTimer?: NodeJS.Timeout;
|
|
22
23
|
private queue = Promise.resolve();
|
|
@@ -40,12 +41,24 @@ export class SafeRestartNotifier {
|
|
|
40
41
|
this.terminalScheduleId = Math.max(this.terminalScheduleId ?? 0, status.scheduleId);
|
|
41
42
|
}
|
|
42
43
|
if (this.activeScheduleId !== status.scheduleId) {
|
|
44
|
+
const previousStatus = this.lastStatus ?? this.pendingInitialStatus;
|
|
45
|
+
const previousMessageIds = [...this.messageIds];
|
|
46
|
+
const previousTargets = new Map(this.notificationTargets);
|
|
47
|
+
if (
|
|
48
|
+
previousStatus
|
|
49
|
+
&& previousStatus.phase !== "cancelled"
|
|
50
|
+
&& previousStatus.phase !== "restarting"
|
|
51
|
+
&& previousMessageIds.length > 0
|
|
52
|
+
) {
|
|
53
|
+
this.enqueueSupersededCards(previousStatus, previousMessageIds, previousTargets);
|
|
54
|
+
}
|
|
43
55
|
this.activeScheduleId = status.scheduleId;
|
|
44
56
|
this.messageIds.clear();
|
|
45
57
|
this.cardHashes.clear();
|
|
46
58
|
this.notificationTargets.clear();
|
|
47
59
|
this.clearInitialCardTimer();
|
|
48
60
|
this.pendingInitialStatus = status;
|
|
61
|
+
this.lastStatus = status;
|
|
49
62
|
this.collectNotificationTargets(status);
|
|
50
63
|
const delayMs = status.phase === "cancelled"
|
|
51
64
|
? 0
|
|
@@ -59,6 +72,7 @@ export class SafeRestartNotifier {
|
|
|
59
72
|
}, delayMs);
|
|
60
73
|
return Promise.resolve();
|
|
61
74
|
}
|
|
75
|
+
this.lastStatus = status;
|
|
62
76
|
this.collectNotificationTargets(status);
|
|
63
77
|
if (this.pendingInitialStatus) {
|
|
64
78
|
this.pendingInitialStatus = status;
|
|
@@ -149,9 +163,13 @@ export class SafeRestartNotifier {
|
|
|
149
163
|
} else {
|
|
150
164
|
created = await this.outbound.sendInteractiveCard(contextKey, card);
|
|
151
165
|
}
|
|
152
|
-
if (created
|
|
153
|
-
this.
|
|
154
|
-
|
|
166
|
+
if (created) {
|
|
167
|
+
if (this.activeScheduleId === status.scheduleId) {
|
|
168
|
+
this.messageIds.set(contextKey, created);
|
|
169
|
+
this.cardHashes.set(contextKey, cardHash);
|
|
170
|
+
} else {
|
|
171
|
+
await this.stopCard(created, status, reason ?? status.reason);
|
|
172
|
+
}
|
|
155
173
|
}
|
|
156
174
|
} catch (error) {
|
|
157
175
|
this.logger.warn({ error, contextKey }, "Failed to send safe restart status card.");
|
|
@@ -159,6 +177,37 @@ export class SafeRestartNotifier {
|
|
|
159
177
|
}));
|
|
160
178
|
}
|
|
161
179
|
|
|
180
|
+
private enqueueSupersededCards(
|
|
181
|
+
status: SafeRestartStatus,
|
|
182
|
+
messageIds: Array<[string, string]>,
|
|
183
|
+
targets: Map<string, RestartNotificationTarget>,
|
|
184
|
+
): void {
|
|
185
|
+
const queued = this.queue.catch(() => undefined).then(async () => {
|
|
186
|
+
await Promise.all(messageIds.map(async ([contextKey, messageId]) => {
|
|
187
|
+
const reason = targets.get(contextKey)?.reason ?? status.reason;
|
|
188
|
+
await this.stopCard(messageId, status, reason);
|
|
189
|
+
}));
|
|
190
|
+
});
|
|
191
|
+
this.queue = queued;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private async stopCard(messageId: string, status: SafeRestartStatus, reason: string): Promise<void> {
|
|
195
|
+
try {
|
|
196
|
+
await this.outbound.updateInteractiveCard(messageId, this.renderer.renderSafeRestartStatus({
|
|
197
|
+
scheduleId: status.scheduleId,
|
|
198
|
+
reason,
|
|
199
|
+
phase: "superseded",
|
|
200
|
+
pendingFinalDeliveries: status.activity.pendingFinalDeliveries,
|
|
201
|
+
waitingTasks: [],
|
|
202
|
+
}));
|
|
203
|
+
} catch (error) {
|
|
204
|
+
this.logger.warn(
|
|
205
|
+
{ error, messageId, scheduleId: status.scheduleId },
|
|
206
|
+
"Failed to stop a superseded safe restart status card.",
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
162
211
|
private collectNotificationTargets(status: SafeRestartStatus): void {
|
|
163
212
|
for (const target of status.notificationTargets ?? []) {
|
|
164
213
|
const contextKey = target.contextKey.trim();
|
|
@@ -58,9 +58,9 @@ export class SafeRestartScheduler {
|
|
|
58
58
|
schedule(reason: string, notificationTarget?: RestartNotificationTarget): boolean {
|
|
59
59
|
const newlyScheduled = !this.reason;
|
|
60
60
|
if (newlyScheduled) {
|
|
61
|
-
this.scheduleId += 1;
|
|
62
61
|
this.notificationTargets = [];
|
|
63
62
|
}
|
|
63
|
+
this.scheduleId += 1;
|
|
64
64
|
this.addNotificationTarget(notificationTarget, reason);
|
|
65
65
|
this.reason = reason;
|
|
66
66
|
this.idleSince = undefined;
|
|
@@ -109,12 +109,13 @@ export class SafeRestartScheduler {
|
|
|
109
109
|
private async poll(): Promise<void> {
|
|
110
110
|
const reason = this.reason;
|
|
111
111
|
if (!reason) return;
|
|
112
|
+
const scheduleId = this.scheduleId;
|
|
112
113
|
const state = this.options.readActivity();
|
|
113
114
|
if (state.runningSessions > 0 || state.pendingFinalDeliveries > 0) {
|
|
114
115
|
this.idleSince = undefined;
|
|
115
116
|
this.idleInboundAt = undefined;
|
|
116
117
|
await this.emitStatus({
|
|
117
|
-
scheduleId
|
|
118
|
+
scheduleId,
|
|
118
119
|
reason,
|
|
119
120
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
120
121
|
phase: state.runningSessions > 0 ? "waiting_tasks" : "waiting_delivery",
|
|
@@ -128,7 +129,7 @@ export class SafeRestartScheduler {
|
|
|
128
129
|
this.idleSince = Date.now();
|
|
129
130
|
this.idleInboundAt = latestInboundAt;
|
|
130
131
|
await this.emitStatus({
|
|
131
|
-
scheduleId
|
|
132
|
+
scheduleId,
|
|
132
133
|
reason,
|
|
133
134
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
134
135
|
phase: "countdown",
|
|
@@ -140,7 +141,7 @@ export class SafeRestartScheduler {
|
|
|
140
141
|
const remainingMs = Math.max(0, quietPeriodMs - (Date.now() - this.idleSince));
|
|
141
142
|
if (remainingMs > 0) {
|
|
142
143
|
await this.emitStatus({
|
|
143
|
-
scheduleId
|
|
144
|
+
scheduleId,
|
|
144
145
|
reason,
|
|
145
146
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
146
147
|
phase: "countdown",
|
|
@@ -159,7 +160,7 @@ export class SafeRestartScheduler {
|
|
|
159
160
|
this.idleInboundAt = undefined;
|
|
160
161
|
if (confirmed.runningSessions > 0 || confirmed.pendingFinalDeliveries > 0) {
|
|
161
162
|
await this.emitStatus({
|
|
162
|
-
scheduleId
|
|
163
|
+
scheduleId,
|
|
163
164
|
reason,
|
|
164
165
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
165
166
|
phase: confirmed.runningSessions > 0 ? "waiting_tasks" : "waiting_delivery",
|
|
@@ -167,7 +168,7 @@ export class SafeRestartScheduler {
|
|
|
167
168
|
});
|
|
168
169
|
} else {
|
|
169
170
|
await this.emitStatus({
|
|
170
|
-
scheduleId
|
|
171
|
+
scheduleId,
|
|
171
172
|
reason,
|
|
172
173
|
notificationTargets: this.notificationTargetsSnapshot(),
|
|
173
174
|
phase: "countdown",
|
|
@@ -177,7 +178,6 @@ export class SafeRestartScheduler {
|
|
|
177
178
|
}
|
|
178
179
|
return;
|
|
179
180
|
}
|
|
180
|
-
const scheduleId = this.scheduleId;
|
|
181
181
|
const notificationTargets = this.notificationTargetsSnapshot();
|
|
182
182
|
this.clear();
|
|
183
183
|
await this.emitStatus({
|
|
@@ -230,7 +230,7 @@ export class SafeRestartScheduler {
|
|
|
230
230
|
this.notificationTargets[existingIndex] = {
|
|
231
231
|
...existing,
|
|
232
232
|
reason: target.reason,
|
|
233
|
-
...(
|
|
233
|
+
...(target.replyMessageId
|
|
234
234
|
? { replyMessageId: target.replyMessageId }
|
|
235
235
|
: {}),
|
|
236
236
|
};
|