Files
ST-Bionic-Memory-Ecology/tests/smart-trigger.mjs
2026-03-23 13:37:24 +08:00

92 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
import vm from "node:vm";
async function loadSmartTriggerDecision() {
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const indexPath = path.resolve(__dirname, "../index.js");
const source = await fs.readFile(indexPath, "utf8");
const keywordMatch = source.match(
/const DEFAULT_TRIGGER_KEYWORDS = \[[\s\S]*?\];/m,
);
const fnMatch = source.match(
/export function getSmartTriggerDecision\(chat, lastProcessed, settings\) \{[\s\S]*?^\}/m,
);
if (!keywordMatch || !fnMatch) {
throw new Error("无法从 index.js 提取 smart trigger 实现");
}
const context = vm.createContext({});
const script = new vm.Script(`
${keywordMatch[0]}
${fnMatch[0].replace("export function", "function")}
this.getSmartTriggerDecision = getSmartTriggerDecision;
`);
script.runInContext(context);
return context.getSmartTriggerDecision;
}
const getSmartTriggerDecision = await loadSmartTriggerDecision();
const noTrigger = getSmartTriggerDecision(
[
{ is_user: true, mes: "今天天气不错。" },
{ is_user: false, mes: "是的,我们继续赶路。" },
],
-1,
{ triggerPatterns: "", smartTriggerThreshold: 3 },
);
assert.equal(noTrigger.triggered, false);
const keywordTrigger = getSmartTriggerDecision(
[
{ is_user: true, mes: "我们突然发现城堡地下有秘密。" },
{ is_user: false, mes: "原来失踪的人都被关在这里!" },
],
-1,
{ triggerPatterns: "", smartTriggerThreshold: 2 },
);
assert.equal(keywordTrigger.triggered, true);
assert.ok(keywordTrigger.score >= 2);
const customTrigger = getSmartTriggerDecision(
[
{ is_user: true, mes: "她轻声说出真相。" },
{ is_user: false, mes: "所有人都沉默了。" },
],
-1,
{ triggerPatterns: "真相|背叛", smartTriggerThreshold: 2 },
);
assert.equal(customTrigger.triggered, true);
assert.ok(customTrigger.reasons.some((r) => r.includes("自定义触发")));
const ignoresProcessedMessages = getSmartTriggerDecision(
[
{ is_user: true, mes: "之前突然出现了秘密。" },
{ is_user: false, mes: "这已经处理过。" },
{ is_user: true, mes: "现在只是平静地走路。" },
{ is_user: false, mes: "没有新的异常。" },
],
1,
{ triggerPatterns: "", smartTriggerThreshold: 2 },
);
assert.equal(ignoresProcessedMessages.triggered, false);
assert.equal(ignoresProcessedMessages.score, 0);
const ignoresBlankAndInvalidRegex = getSmartTriggerDecision(
[
{ is_system: true, mes: "系统消息" },
{ is_user: true, mes: " " },
{ is_user: false, mes: "Alpha城发生了什么" },
],
-1,
{ triggerPatterns: "([\n真相", smartTriggerThreshold: 2 },
);
assert.equal(ignoresBlankAndInvalidRegex.triggered, true);
assert.ok(ignoresBlankAndInvalidRegex.reasons.includes("情绪/冲突波动"));
console.log("smart-trigger tests passed");