feat(ui): show hidden floor count and render limit

This commit is contained in:
Youzini-afk
2026-04-25 16:37:12 +08:00
parent 02dc572a9d
commit 8c489bf1c7
9 changed files with 457 additions and 3 deletions

View File

@@ -0,0 +1,168 @@
import assert from "node:assert/strict";
import fs from "node:fs/promises";
import path from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
const indexPath = path.resolve(moduleDir, "../index.js");
const indexSource = await fs.readFile(indexPath, "utf8");
function extractSnippet(startMarker, endMarker) {
const start = indexSource.indexOf(startMarker);
const end = indexSource.indexOf(endMarker, start);
if (start < 0 || end < 0 || end <= start) {
throw new Error(`无法提取 index.js 片段: ${startMarker} -> ${endMarker}`);
}
return indexSource.slice(start, end).replace(/^export\s+/gm, "");
}
const renderLimitSnippet = extractSnippet(
"function getMessageRenderLimitSettings(",
"function getHideRuntimeAdapters(",
);
const tempModulePath = path.resolve(
moduleDir,
"../.tmp-message-render-limit.mjs",
);
await fs.writeFile(
tempModulePath,
`
let powerUser = { chat_truncation: 0 };
let reloadCount = 0;
let inputValue = "";
let counterValue = "";
const triggeredEvents = [];
function getContext() {
return {
power_user: powerUser,
reloadCurrentChat() {
reloadCount += 1;
},
};
}
function makeInput(kind) {
return {
length: 1,
val(value) {
if (arguments.length > 0) {
if (kind === "counter") {
counterValue = value;
} else {
inputValue = value;
}
return this;
}
return kind === "counter" ? counterValue : inputValue;
},
trigger(eventName) {
triggeredEvents.push(eventName);
return this;
},
};
}
function $(selector) {
if (selector === "#chat_truncation") return makeInput("input");
if (selector === "#chat_truncation_counter") return makeInput("counter");
return { length: 0 };
}
${renderLimitSnippet}
function getState() {
return {
counterValue,
inputValue,
powerUserChatTruncation: powerUser.chat_truncation,
reloadCount,
triggeredEvents: [...triggeredEvents],
};
}
export {
applyMessageRenderLimit,
getMessageRenderLimitSettings,
getState,
};
`,
"utf8",
);
try {
const module = await import(`${pathToFileURL(tempModulePath).href}?t=${Date.now()}`);
assert.deepEqual(
module.getMessageRenderLimitSettings({
enabled: true,
hideOldMessagesRenderLimitEnabled: true,
hideOldMessagesRenderLimit: "24",
}),
{ enabled: true, render_last_n: 24 },
);
assert.deepEqual(
module.getMessageRenderLimitSettings({
enabled: false,
hideOldMessagesRenderLimitEnabled: true,
hideOldMessagesRenderLimit: 24,
}),
{ enabled: false, render_last_n: 24 },
);
const applied = module.applyMessageRenderLimit(
{
enabled: true,
hideOldMessagesRenderLimitEnabled: true,
hideOldMessagesRenderLimit: 24,
},
{ reloadCurrentChat: true },
);
assert.deepEqual(applied, {
active: true,
renderLimit: 24,
applied: true,
skipped: false,
});
assert.deepEqual(module.getState(), {
counterValue: "24",
inputValue: "24",
powerUserChatTruncation: 24,
reloadCount: 1,
triggeredEvents: ["change"],
});
const skipped = module.applyMessageRenderLimit({
enabled: true,
hideOldMessagesRenderLimitEnabled: false,
hideOldMessagesRenderLimit: 24,
});
assert.equal(skipped.skipped, true);
assert.equal(module.getState().powerUserChatTruncation, 24);
const cleared = module.applyMessageRenderLimit(
{
enabled: true,
hideOldMessagesRenderLimitEnabled: false,
hideOldMessagesRenderLimit: 24,
},
{ clearWhenDisabled: true, reloadCurrentChat: true },
);
assert.deepEqual(cleared, {
active: false,
renderLimit: 0,
applied: true,
skipped: false,
});
assert.deepEqual(module.getState(), {
counterValue: "0",
inputValue: "0",
powerUserChatTruncation: 0,
reloadCount: 2,
triggeredEvents: ["change", "change"],
});
} finally {
await fs.unlink(tempModulePath).catch(() => {});
}