Files
ycode/src/main/personalization.ts
T
xiaohan.yuan 0dc088f1f7 feat(settings): replicate the WorkBuddy personalization panel and wire identity, tone and prompts (TODO 13)
Recover the WorkBuddy 5.8.3 个性化 page from REA evidence (PersonalizationPanel-D16rRGjy.css + tokens): 45 module rules plus scoped light/dark tokens, the five-card 1160px layout (identity card 638x100 with inline editors, reply preference card 638x204, three 638x264 long-text cards with 598x160 previews) and the 640x520 editor modal.

Persist identity, tone, welcome tips, custom instructions, persona and long-term memory in config.json, expose personalization:get/update over IPC, and append the resulting personalization context to each turn's prompt for both the OMP and built-in kernels. Wire 欢迎语 to the streaming loading tips and keep 显示文件修改过程 visibly disabled because YCode has no incremental file-change renderer yet.

Verify with scripts/verify-personalization-settings.cjs: 29 assertions covering geometry, tone options, switches, inline identity editing with blur-discard, editor modal save/cancel, config persistence, reopen, dark surfaces and no renderer errors. Add a pure prompt-builder regression and keep every existing settings regression green.
2026-10-17 10:46:40 +08:00

29 lines
1.5 KiB
TypeScript
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.
/**
* 设置 → 个性化(TODO 13)的持久化与运行链路。
*
* REA 依据(WorkBuddy 5.8.3,设置窗口 900×680):
* - ev_af920edf33af5e811d58f05dad15210b29cd891f28e0fa74f6b18d63212241b1(浅色顶部 DOM/layout/computed style + 模块 CSS)
* - ev_88af0774005c02e9c75284ade2be45de4943ee5aaf73fe5b13ac8a38b85be786(深色同页)
* - ev_4f4f76054a930a186199ee28a5f0169f7de48a05a295b8e9eb630c796f07be4a(最终浅色顶部)
*
* 选项表、默认人设与个性化上下文拼装放在 @shared/personalization(纯函数,可离线回归);
* 本模块只负责读写 config.json 的 personalization 字段。
*/
import type { PersonalizationPatch, PersonalizationSettings } from '@shared/types'
import { normalizePersonalization } from '@shared/personalization'
import { getStoredPersonalization, setStoredPersonalization } from './config'
export { buildPersonalizationPrompt, DEFAULT_PERSONA, DEFAULT_PERSONALIZATION, TONE_OPTIONS } from '@shared/personalization'
export { normalizePersonalization } from '@shared/personalization'
export async function getPersonalization(): Promise<PersonalizationSettings> {
return normalizePersonalization(await getStoredPersonalization())
}
export async function updatePersonalization(patch: PersonalizationPatch): Promise<PersonalizationSettings> {
const current = await getPersonalization()
const next = normalizePersonalization({ ...current, ...patch })
await setStoredPersonalization(next)
return next
}