/** * 邮件会话 → DSH 会话 id 的派生约定。 * * 这组函数存在的原因是一个具体的静默失效:插件重启后 `sessionMap` 为空, * 人在 WebUI 改档位的 `session_update` 找不到目标会话就被忽略, * 运行时仍按旧档位执行 —— 人以为自己收紧了权限。 */ import { test } from "node:test"; import assert from "node:assert/strict"; import { dshSessionIdForMail, matchesMailSession, pickMailSession, } from "../lib/mail-session-id.js"; test("首次尝试的 id 是 mail-<邮件会话 id>", () => { assert.equal(dshSessionIdForMail("abc-123"), "mail-abc-123"); }); test("匹配首次尝试的 id", () => { assert.equal(matchesMailSession("mail-abc", "abc"), true); }); test("匹配模型降级重试的 -r", () => { assert.equal(matchesMailSession("mail-abc-r1", "abc"), true); assert.equal(matchesMailSession("mail-abc-r12", "abc"), true); }); test("不匹配别的会话(前缀相同也不行)", () => { assert.equal( matchesMailSession("mail-abcdef", "abc"), false, "mail-abc 的前缀不能吃掉 mail-abcdef", ); assert.equal(matchesMailSession("mail-abd", "abc"), false); assert.equal(matchesMailSession("other-abc", "abc"), false); assert.equal(matchesMailSession("", "abc"), false); }); test("不匹配非数字后缀(避免误吞其它会话)", () => { assert.equal(matchesMailSession("mail-abc-rx", "abc"), false); assert.equal(matchesMailSession("mail-abc-r", "abc"), false); assert.equal(matchesMailSession("mail-abc-retry", "abc"), false); }); test("pickMailSession 优先首次尝试,而不是数组顺序", () => { // 数组顺序可能来自 ctx.agents.list(),与尝试顺序无关 assert.equal( pickMailSession(["mail-abc-r2", "mail-abc-r1", "mail-abc"], "abc"), "mail-abc", ); }); test("pickMailSession 没有首次尝试时取序号最小的重试", () => { assert.equal( pickMailSession(["mail-abc-r3", "mail-abc-r1", "mail-abc-r2"], "abc"), "mail-abc-r1", ); }); test("pickMailSession 找不到时返回 undefined(调用方据此跳过)", () => { assert.equal(pickMailSession(["other-1", "mail-def"], "abc"), undefined); assert.equal(pickMailSession([], "abc"), undefined); assert.equal(pickMailSession(undefined, "abc"), undefined); }); test("接管的平台会话推不出 id:不能被误判成邮件会话", () => { // 平台自己生成的 id(如 DSH 界面里开的会话)与邮件会话无关, // 匹配函数必须说「不是」,否则会给错误的会话改档位。 assert.equal(matchesMailSession("session-7f3a91", "abc"), false); assert.equal(pickMailSession(["session-7f3a91"], "abc"), undefined); });