Files
writing-agent/src/preset/store.ts
T
chenmoranzhiandCursor 39fe2732fb 把思考强度收到接口配置里,并支持分组、嗅探和切换同一接口下的模型。
预设不再保存思考强度。设置页会在首屏套用主题。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-30 12:00:27 +08:00

80 lines
2.4 KiB
TypeScript

import { readdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
import path from "node:path";
import type { PresetPackage } from "../types/preset.js";
import { ensureUserDataDirs, getPresetsDir } from "../config/user-data-dir.js";
import { importSillyTavernPreset } from "./importer.js";
/** 旧预设里的思考强度不再使用;读到就从文件里删掉。 */
function withoutReasoningEffort(preset: PresetPackage, filePath: string): PresetPackage {
if (preset.generation?.reasoningEffort === undefined) return preset;
const generation = { ...preset.generation };
delete generation.reasoningEffort;
const next = { ...preset, generation };
writeFileSync(filePath, JSON.stringify(next, null, 2), "utf8");
return next;
}
function presetPath(id: string): string {
return path.join(getPresetsDir(), `${id}.json`);
}
export function listPresets(): PresetPackage[] {
ensureUserDataDirs();
let files: string[];
try {
files = readdirSync(getPresetsDir()).filter((f) => f.endsWith(".json"));
} catch {
return [];
}
const presets: PresetPackage[] = [];
for (const file of files) {
try {
const filePath = path.join(getPresetsDir(), file);
const raw = readFileSync(filePath, "utf8");
presets.push(withoutReasoningEffort(JSON.parse(raw) as PresetPackage, filePath));
} catch {
/* skip corrupt files */
}
}
return presets.sort((a, b) => a.name.localeCompare(b.name, "zh-CN"));
}
export function getPreset(id: string): PresetPackage | null {
try {
const filePath = presetPath(id);
const raw = readFileSync(filePath, "utf8");
return withoutReasoningEffort(JSON.parse(raw) as PresetPackage, filePath);
} catch {
return null;
}
}
export function savePreset(preset: PresetPackage): PresetPackage {
ensureUserDataDirs();
writeFileSync(presetPath(preset.id), JSON.stringify(preset, null, 2), "utf8");
return preset;
}
export function deletePreset(id: string): void {
try {
unlinkSync(presetPath(id));
} catch {
/* ignore */
}
}
export function importAndSavePreset(
raw: unknown,
options: { name?: string } = {},
) {
const report = importSillyTavernPreset(raw, options);
savePreset(report.preset);
return report;
}
export function resolveActivePreset(activePresetId: string | null): PresetPackage | null {
if (!activePresetId) return null;
return getPreset(activePresetId);
}