- 装配只认 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:真假上游抓包对比工具、三份预设的机制结论与实测报告
53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
/**
|
|
* 直聊的滚轮分配:指针在哪张卡片上,就先滚那张卡片的正文;
|
|
* 卡片到顶 / 到底后,这一格滚轮剩下的距离交给外面的大滚动条。
|
|
* 只算数,不碰 DOM,方便单测。
|
|
*/
|
|
|
|
function clamp(value, min, max) {
|
|
return Math.min(max, Math.max(min, value));
|
|
}
|
|
|
|
/**
|
|
* @param {object} input
|
|
* @param {number} [input.cardScrollTop] 卡片正文当前滚动位置
|
|
* @param {number} [input.cardScrollMax] 卡片正文最多还能滚多少(0 = 不可滚)
|
|
* @param {number} [input.deltaY] 这一格滚轮的距离,向下为正
|
|
* @param {number} [input.streamScrollTop] 大滚动条当前位置
|
|
* @param {number} [input.streamScrollMax] 大滚动条最多还能滚多少
|
|
* @returns {{ cardDelta: number, streamDelta: number, rest: number }}
|
|
* `cardDelta` / `streamDelta` 是各自实际该滚的距离,`rest` 是两边都到头后没用掉的距离。
|
|
*/
|
|
export function planWheelScroll({
|
|
cardScrollTop = 0,
|
|
cardScrollMax = 0,
|
|
deltaY = 0,
|
|
streamScrollTop = 0,
|
|
streamScrollMax = 0,
|
|
} = {}) {
|
|
const plan = { cardDelta: 0, streamDelta: 0, rest: 0 };
|
|
let rest = Number(deltaY) || 0;
|
|
if (!rest) return plan;
|
|
|
|
if (cardScrollMax > 0) {
|
|
const next = clamp(cardScrollTop + rest, 0, cardScrollMax);
|
|
const applied = next - cardScrollTop;
|
|
if (applied) {
|
|
plan.cardDelta = applied;
|
|
rest -= applied;
|
|
}
|
|
}
|
|
|
|
if (rest && streamScrollMax > 0) {
|
|
const next = clamp(streamScrollTop + rest, 0, streamScrollMax);
|
|
const applied = next - streamScrollTop;
|
|
if (applied) {
|
|
plan.streamDelta = applied;
|
|
rest -= applied;
|
|
}
|
|
}
|
|
|
|
plan.rest = rest;
|
|
return plan;
|
|
}
|