fix: use passive QQ event replies

This commit is contained in:
zenord
2026-08-18 22:20:55 +08:00
parent 4af5049605
commit ffedf616e3
9 changed files with 560 additions and 48 deletions
+79
View File
@@ -437,6 +437,85 @@ test("envelope parsers accept valid tails and reject invalid ones", () => {
assert.equal(parseWorkerResult(`x\n<GORI_WORKER_RESULT_V1>{"status":"DONE","summary":"s"}</GORI_WORKER_RESULT_V1>`), undefined);
});
test("start_next blocked by another user's pending confirmation appends a correction and exposes no details", async () => {
const harness = await createHarness();
try {
await harness.manager.prompt(request("create proposal: succeed", "user-a"));
const first = harness.proposals.list()[0]!;
await harness.manager.prompt(request("confirm", "user-a"));
await waitFor(() => harness.proposals.get(first.id)!.status === "awaiting_user_confirmation");
await harness.manager.prompt(request("create proposal: succeed", "user-b"));
const second = harness.proposals.list().find((proposal) => proposal.id !== first.id)!;
await harness.manager.prompt(request("confirm", "user-b"));
assert.equal(harness.proposals.get(second.id)!.status, "queued");
const blocked = await harness.manager.prompt(request("start next", "user-b"));
assert.match(blocked.text, /还不能开始/);
assert.match(blocked.text, /发起人确认/);
assert.match(blocked.text, /保留在队列里/);
assert.equal(harness.proposals.get(second.id)!.status, "queued");
assert.equal(harness.proposals.get(first.id)!.status, "awaiting_user_confirmation");
const bPrompt = readLog(harness.logFile).find((entry) => entry.method === "session/prompt" && entry.text?.startsWith("[User message]\nstart next"));
assert.ok(bPrompt?.text);
assert.match(bPrompt.text!, /blocked: another proposal is awaiting owner confirmation/);
assert.doesNotMatch(bPrompt.text!, /goal done/);
const bStatus = harness.manager.status("webhook", "chat-1", "user-b");
assert.equal(bStatus.schedulerState, "awaiting_confirmation");
assert.equal(bStatus.blockedReason, "another proposal is awaiting owner confirmation");
assert.equal(bStatus.myQueuedProposals, 1);
assert.equal(bStatus.myPendingConfirmations, 0);
assert.equal(bStatus.nextAction, "wait for the current proposal to settle");
const aStatus = harness.manager.status("webhook", "chat-1", "user-a");
assert.equal(aStatus.myPendingConfirmations, 1);
assert.equal(aStatus.blockedReason, "your proposal is awaiting your confirmation");
assert.equal(aStatus.nextAction, "confirm your pending proposal");
} finally {
await closeHarness(harness);
}
});
test("confirm and stop actions with no matching proposal append an ownership correction", async () => {
const harness = await createHarness();
try {
await harness.manager.prompt(request("create proposal: hang", "user-a"));
const confirmed = await harness.manager.prompt(request("confirm", "user-b"));
assert.match(confirmed.text, /没有可确认的提案/);
assert.match(confirmed.text, /自己发起/);
const stopped = await harness.manager.prompt(request("stop", "user-b"));
assert.match(stopped.text, /没有可停止的任务/);
assert.match(stopped.text, /自己发起/);
const cancelled = await harness.manager.prompt(request("cancel proposal", "user-b"));
assert.match(cancelled.text, /没有可取消的提案/);
assert.match(cancelled.text, /自己发起/);
assert.equal(harness.proposals.list()[0]!.status, "proposed");
} finally {
await closeHarness(harness);
}
});
test("start_next reports when the queue is empty instead of claiming a start", async () => {
const harness = await createHarness();
try {
const reply = await harness.manager.prompt(request("start next", "user-a"));
assert.match(reply.text, /还不能开始/);
assert.match(reply.text, /没有已确认并排队/);
const status = harness.manager.status("webhook", "chat-1", "user-a");
assert.equal(status.schedulerState, "idle");
assert.equal(status.blockedReason, "none");
assert.equal(status.nextAction, "none");
} finally {
await closeHarness(harness);
}
});
function processGroupExists(pgid: number): boolean {
try { process.kill(-pgid, 0); return true; }
catch (error) { return (error as NodeJS.ErrnoException).code === "EPERM"; }