refine long-running task notices

This commit is contained in:
zenord
2026-08-17 16:35:23 +08:00
parent 680a449cd8
commit 947f19e3cd
4 changed files with 44 additions and 56 deletions
+23 -19
View File
@@ -148,7 +148,7 @@ test("completion and timer callbacks are safe in both orders at 15 seconds", asy
runtime.turns[0].resolve("done");
await turn;
assert.deepEqual(sent.map((outgoing) => [outgoing.text, outgoing.replySequence]), [
["这条还在处理,完成后我会直接回复。", 1],
["收到,我还在处理,稍等我一下。", 1],
["done", 2]
]);
}
@@ -162,14 +162,14 @@ test("running and queued notices are independent and queued work announces start
const second = gateway.receive(message("two", "second"), adapter);
await waitFor(() => runtime.turns.length === 1);
await clock.advanceTo(15_000);
assert.deepEqual(messagesFor(sent, "first").map((outgoing) => outgoing.text), ["这条还在处理,完成后我会直接回复。"]);
assert.deepEqual(messagesFor(sent, "second").map((outgoing) => outgoing.text), ["前面还有任务,这条还在排队,轮到后我马上处理。"]);
assert.deepEqual(messagesFor(sent, "first").map((outgoing) => outgoing.text), ["收到,我还在处理,稍等我一下。"]);
assert.deepEqual(messagesFor(sent, "second").map((outgoing) => outgoing.text), ["前面还有一件事没处理完,这条我记着,轮到后马上处理。"]);
runtime.turns[0].resolve("first done");
await waitFor(() => runtime.turns.length === 2);
assert.deepEqual(messagesFor(sent, "second").map((outgoing) => [outgoing.text, outgoing.replySequence]), [
["前面还有任务,这条还在排队,轮到后我马上处理。", 1],
["轮到这条了,我开始处理。", 2]
["前面还有一件事没处理完,这条我记着,轮到后马上处理。", 1],
["轮到这件事了,我现在开始处理。", 2]
]);
runtime.turns[1].resolve("second done");
await Promise.all([first, second]);
@@ -177,29 +177,32 @@ test("running and queued notices are independent and queued work announces start
assert.deepEqual(messagesFor(sent, "second").map((outgoing) => outgoing.replySequence), [1, 2, 3]);
});
test("running reminders fire at 60, 180, and 480 seconds with dynamic activity text", async () => {
test("running reminders use staged wording and wait from 8 to 18 minutes", async () => {
const { runtime, clock, gateway } = createGateway();
const sent: OutgoingMessage[] = [];
const turn = gateway.receive(message("work", "reminders"), recordingAdapter(sent));
await waitFor(() => runtime.turns.length === 1);
await clock.advanceTo(15_000);
runtime.idleSeconds = 10;
await clock.advanceTo(60_000);
runtime.idleSeconds = 60;
await clock.advanceTo(180_000);
runtime.idleSeconds = 180;
await clock.advanceTo(480_000);
assert.deepEqual(sent.map((outgoing) => outgoing.text), [
"这条还在处理,完成后我会直接回复。",
"这条还在处理中,刚刚还有进展;完成后我会直接回复。",
"这条还在处理中,最近 60 秒没新进展;完成后我会直接回复。",
"这条还在处理中,最近 3 分钟没新进展;完成后我会直接回复。"
"收到,我还在处理,稍等我一下。",
"还在弄,暂时还没出结果,弄好我马上回你。",
"这件事比预想中多花了一点时间,我还在继续处理。你不用一直盯着,弄好我会直接回你。",
"我还在处理这件事,确实花了些时间。想看看现在的状态可以发 /status,不想继续等也可以发 /cancel。"
]);
await clock.advanceTo(780_000);
assert.equal(sent.length, 4);
await clock.advanceTo(1_080_000);
assert.equal(sent.at(-1)?.text,
"我还在处理这件事,确实花了些时间。想看看现在的状态可以发 /status,不想继续等也可以发 /cancel。");
assert.equal(sent.length, 5);
runtime.turns[0].resolve("done");
await turn;
});
test("queued reminders use queue wording and sample the active ACP status", async () => {
test("queued reminders use staged queue wording without ACP activity details", async () => {
const { runtime, clock, gateway } = createGateway();
const sent: OutgoingMessage[] = [];
const adapter = recordingAdapter(sent);
@@ -207,10 +210,11 @@ test("queued reminders use queue wording and sample the active ACP status", asyn
const second = gateway.receive(message("two", "queued"), adapter);
await waitFor(() => runtime.turns.length === 1);
await clock.advanceTo(15_000);
runtime.idleSeconds = 45;
await clock.advanceTo(60_000);
assert.equal(messagesFor(sent, "queued").at(-1)?.text,
"前面的任务还在处理,最近 45 秒没新进展;这条仍在排队,轮到后我马上处理。");
assert.deepEqual(messagesFor(sent, "queued").map((outgoing) => outgoing.text), [
"前面还有一件事没处理完,这条我记着,轮到后马上处理。",
"前面的事情还没处理完,这条还在等。我没有漏掉,轮到后会接着做。"
]);
runtime.turns[0].resolve("one done");
await waitFor(() => runtime.turns.length === 2);
runtime.turns[1].resolve("two done");
@@ -275,7 +279,7 @@ test("prompt does not wait for a notice send and final delivery delay releases t
runtime.turns[1].resolve("second done");
await Promise.all([first, second]);
assert.deepEqual(messagesFor(sent, "first").map((outgoing) => outgoing.text), [
"这条还在处理,完成后我会直接回复。", "first done"
"收到,我还在处理,稍等我一下。", "first done"
]);
});
@@ -302,7 +306,7 @@ test("delivery failures are logged safely and do not block later sends", async (
} finally {
console.error = originalError;
}
assert.deepEqual(sent.map((outgoing) => outgoing.text), ["这条还在处理,完成后我会直接回复。", "done"]);
assert.deepEqual(sent.map((outgoing) => outgoing.text), ["收到,我还在处理,稍等我一下。", "done"]);
assert.deepEqual(errors, ["Gateway delivery send failed (platform=qq)"]);
});