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.
This commit is contained in:
xiaohan.yuan committed 2026-10-17 10:46:40 +08:00
1 parent 19460f0b13
commit 0dc088f1f7
54 files changed
+2038 -248

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
/**
* 设置 → 个性化(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
}