预设兼容:按真实抓包对齐装配与包装层,补上声明式工具与预设正则。

- 装配只认 prompt_order.enabled;squash_system_messages 只合并相邻 system(新增 system 档,连接符按酒馆用单换行)
- 包装层:new_chat_prompt、示例对话(new_example_chat_prompt + <START> 切段 + name)、角色卡三块与 personality_format/scenario_format、{{user}}/{{char}} 取值、任务契约并进预设条目
- 工具协议:按 ToolBindings / 伪工具协议数据声明真 tools(presetToolPolicy=preset),工具描述用到的条目不再重复作为消息发出
- 正则:promptOnly 作用于对话历史(含 depth 过滤)、写入时脚本改写回复;{{//}} 注释按配平扫描
- tools/st-request-diff:真假上游抓包对比工具、三份预设的机制结论与实测报告
This commit is contained in:
2026-10-23 00:13:08 +08:00
parent ed09e5c831
commit 9dc927282f
94 changed files with 11558 additions and 413 deletions
+103
View File
@@ -0,0 +1,103 @@
import { describe, expect, it } from "vitest";
import { planWheelScroll } from "../web/chat-scroll.js";
describe("planWheelScroll", () => {
it("rolls the card first and leaves the big scroller alone", () => {
const plan = planWheelScroll({
cardScrollTop: 0,
cardScrollMax: 400,
deltaY: 100,
streamScrollTop: 0,
streamScrollMax: 2000,
});
expect(plan.cardDelta).toBe(100);
expect(plan.streamDelta).toBe(0);
expect(plan.rest).toBe(0);
});
it("hands the leftover to the big scroller once the card hits its bottom", () => {
const plan = planWheelScroll({
cardScrollTop: 380,
cardScrollMax: 400,
deltaY: 100,
streamScrollTop: 0,
streamScrollMax: 2000,
});
expect(plan.cardDelta).toBe(20);
expect(plan.streamDelta).toBe(80);
expect(plan.rest).toBe(0);
});
it("skips the card when it is already at the bottom", () => {
const plan = planWheelScroll({
cardScrollTop: 400,
cardScrollMax: 400,
deltaY: 100,
streamScrollTop: 0,
streamScrollMax: 2000,
});
expect(plan.cardDelta).toBe(0);
expect(plan.streamDelta).toBe(100);
});
it("scrolls up the card first, then the big scroller", () => {
const plan = planWheelScroll({
cardScrollTop: 10,
cardScrollMax: 400,
deltaY: -100,
streamScrollTop: 500,
streamScrollMax: 2000,
});
expect(plan.cardDelta).toBe(-10);
expect(plan.streamDelta).toBe(-90);
});
it("treats a card that cannot scroll as no card at all", () => {
const plan = planWheelScroll({
cardScrollTop: 0,
cardScrollMax: 0,
deltaY: 120,
streamScrollTop: 0,
streamScrollMax: 2000,
});
expect(plan.cardDelta).toBe(0);
expect(plan.streamDelta).toBe(120);
});
it("stops at the ends of both scrollers", () => {
const down = planWheelScroll({
cardScrollTop: 400,
cardScrollMax: 400,
deltaY: 100,
streamScrollTop: 2000,
streamScrollMax: 2000,
});
expect(down.cardDelta).toBe(0);
expect(down.streamDelta).toBe(0);
expect(down.rest).toBe(100);
const up = planWheelScroll({
cardScrollTop: 0,
cardScrollMax: 400,
deltaY: -100,
streamScrollTop: 0,
streamScrollMax: 2000,
});
expect(up.rest).toBe(-100);
});
it("keeps fractional trackpad deltas", () => {
const plan = planWheelScroll({
cardScrollTop: 12.5,
cardScrollMax: 400,
deltaY: 7.25,
});
expect(plan.cardDelta).toBeCloseTo(7.25, 5);
expect(plan.rest).toBeCloseTo(0, 5);
});
it("does nothing without a delta", () => {
const plan = planWheelScroll({ cardScrollMax: 400, streamScrollMax: 800 });
expect(plan).toEqual({ cardDelta: 0, streamDelta: 0, rest: 0 });
});
});